HDLBits Exams/ece241 2013 q4 水库题

题目和简述

HDLBits Exams/ece241 2013 q4 水库题_第1张图片
题目内容翻译:
大型水库可为多个用户提供服务。为了使水位足够高,三个传感器以5英寸的间隔垂直放置。当水位高于最高传感器(S3)时,输入流量应为零。当液位低于最低传感器(S1)时,流量应最大(标称流量阀和辅助流量阀均打开)。当水位在上下传感器之间时,流速由两个因素决定:水位和最后一个传感器变化之前的水位。每种水位都有一个与之相关的标称流速,如下表所示。如果传感器变化表明先前的液位低于当前的液位,则应进行标称流速。如果先前的水平高于当前水平,则应通过打开辅助流量阀(由ΔFR控制)来增加流量。
绘制水库控制器的摩尔模型状态图。清楚地指出每个状态的所有状态转换和输出。 FSM的输入为S1,S2和S3。输出为FR1,FR2,FR3和ΔFR。

解题思路

这里我把四个水阀的状态合并成一个四位二进制,根据题目中的提供的信息,可以得到下面图中的水阀状态一共是有S0-S7一共8种,但是S1和S6实际上是不存在的状态,从状态跳转图也可以很清楚看出来是不稳定的。
最主要的是辅助流量阀ΔFR的值,这里需要注意的是,如果水位从4变到5,即其依旧保持在S2与S3之间,这个时候表示传感器其实是没有探测到水位变化的,所以说ΔFR的值是并不会变化的。
具体的水阀开关和状态跳转在下图中给了明确表示,为了避免看起来复杂,我把每个状态分开了。虽然S1和S6状态不存在,但是我还是画出来方便理解。可以看到他们会自动跳转到S0和S7。代码中我也会列出方便理解。
HDLBits Exams/ece241 2013 q4 水库题_第2张图片

代码

module top_module (
    input clk,
    input reset,
    input [3:1] s,
    output fr3,
    output fr2,
    output fr1,
    output dfr
); 
    
    parameter	S0	=	4'b0000;
    parameter	S1	=	4'b0001;
    parameter	S2	=	4'b0010;
    parameter	S3	=	4'b0011;
    parameter	S4	=	4'b0110;
    parameter	S5	=	4'b0111;
    parameter	S6	=	4'b1110;
    parameter	S7	=	4'b1111;
    
    reg	[3:0]	state,next_state;
    
    always@(*)begin
        case(state)
            S0:next_state<=	(s==7)?S0:(s>=3)?S3:(s>=1)?S5:S7;
            S1:next_state<= (s==7)?S1:(s>=3)?S3:(s>=1)?S5:S7;
            S2:next_state<= (s==7)?S0:(s>=3)?S2:(s>=1)?S5:S7;
            S3:next_state<= (s==7)?S0:(s>=3)?S3:(s>=1)?S5:S7;
            S4:next_state<= (s==7)?S0:(s>=3)?S2:(s>=1)?S4:S7;
            S5:next_state<= (s==7)?S0:(s>=3)?S2:(s>=1)?S5:S7;
            S6:next_state<= (s==7)?S0:(s>=3)?S2:(s>=1)?S4:S7;
            S7:next_state<= (s==7)?S0:(s>=3)?S2:(s>=1)?S4:S7;
        endcase
    end
    
    always@(posedge clk)begin
        if(reset)begin
            state	<=	S7;
        end
        else begin
            state	<=	next_state;
        end
    end
    
    assign	{fr3,fr2,fr1,dfr}	=	state;

endmodule

你可能感兴趣的:(HDLBits,传感器)