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).
前言
三个输入,包括一个时钟clk,一个高电平有效的同步置位信号reset,一个输入信号s;四个输出,包括一个输出信号dfr,以及一组输出信号fr3、fr2 和 fr1。
代码
module top_module (
input clk,
input reset,
input [3:1] s,
output fr3,
output fr2,
output fr1,
output dfr
);
parameter A=3'b000,B=3'b001,C=3'b011,D=3'b111,ON=1'b1,OFF=1'b0;
reg [3:1] state,next_state;
wire next_dfr;
always@(*)begin
if(s==D)begin
next_state=A;
next_dfr=OFF;
end
else if(s==C)begin
next_state=B;
next_dfr=(state==A)?ON:(state==C)?OFF:(dfr==ON)?ON:OFF;
end
else if(s==B) begin
next_state=C;
next_dfr=(state==B)?ON:(state==D)?OFF:(dfr==ON)?ON:OFF;
end
else begin
next_state=D;
next_dfr=ON;
end
end
always@(posedge clk)begin
if(reset) {state,dfr}<={D,ON};
else {state,dfr}<={next_state,next_dfr};
end
assign {fr3,fr2,fr1}=state;
endmodule
总结
对于输出信号fr3、fr2 和 fr1 定义了A 、B、C、D 四个状态,通过经典的三段式得到三个输出;对于输出信号dfr 定义了两个状态 ON 和 OFF,同样内嵌入三段式中,对于水位的上升与下降不可能跳跃式地完成,因此 dfr 的取值只用比较 state 值与 next_state 值得差异即可。