题目原题:
Also include an active-high synchronous reset that resets the state machine to a state equivalent to if the water level had been low for a long time (no sensors asserted, and all four outputs asserted).
为了方便说明代码,我画了一张水箱的图:
从高处往低处跃迁和从低处往高处跃迁是不同的。所以对于中间的水位会衍生出两种状态,这两种状态的区别在于是否要打开dfr(额外的水流速率控制器),加大水量。实现代码如下:
module top_module (
input clk,
input reset,
input [3:1] s,
output fr3,
output fr2,
output fr1,
output dfr
);
parameter A=0,B1=1,B2=2,C1=3,C2=4,D=5;
reg [3:1] state,next_state;
//1:首先进行下一状态的推导
always@(*)begin
case(state)
A:next_state = s[1]?B1:A;
B1:next_state = s[1]?(s[2]?C1:B1):A;
B2:next_state = s[1]?(s[2]?C1:B2):A;
C1:next_state = s[2]?(s[3]?D:C1):B2;
C2:next_state = s[3]?D:(s[2]?C2:B2);
D:next_state = s[3]?D:C2;
default:next_state <= A;
endcase
end
//2: 然后进行状态的flip(即随着时钟心跳的状态更新)
always @(posedge clk)begin
if(reset)
state <= A;
else
state <= next_state;
end
//3: 最后进行状态到输出的推导,得到输出。
always @(*)begin
case(state)
A:{fr3,fr2,fr1,dfr} = 4'b1111;
B1:{fr3,fr2,fr1,dfr} =4'b0110;
B2:{fr3,fr2,fr1,dfr} =4'b0111;
C1:{fr3,fr2,fr1,dfr} =4'b0010;
C2:{fr3,fr2,fr1,dfr} =4'b0011;
D:{fr3,fr2,fr1,dfr} =4'b0000;
default: {fr3, fr2, fr1, dfr} = 'x;
endcase
end
endmodule
//打完收工,你可以看到,这个三部曲已经表演结束,期待你对自己的掌声,再会。