module top_module (
input clk,
input reset,
input [3:1] s,
output fr3,
output fr2,
output fr1,
output dfr
);
parameter A=3'd0,B0=3'd1,B1=3'd2,C0=3'd3,C1=3'd4,D=3'd5;//6种状态,B0,B1分别代表从低水位往高水位和从高水外往低水位。
reg [2:0] state;
reg [2:0] next_state;
always@(*)
begin
case(state)
A:next_state=s[1]?B0:A;
B0:begin
if(s[2])
next_state=C0;
else
begin
if(s[1]) next_state=B0;
else next_state=A;
end
end
B1:begin
if(s[2])
next_state=C0;
else
begin
if(s[1]) next_state=B1;
else next_state=A;
end
end
C0:begin
if(s[3])
next_state=D;
else
begin
if(s[2]) next_state=C0;
else next_state=B1;
end
end
C1:begin
if(s[3])
next_state=D;
else
begin
if(s[2]) next_state=C1;
else next_state=B1;
end
end
D:next_state=s[3]?D:C1;
endcase
end
always@(posedge clk)
begin
if(reset)
state<=A;
else
state<=next_state;
end
always@(*)
begin
case(state)
A:{fr3,fr2,fr1,dfr}=4'b1111;
B0:{fr3,fr2,fr1,dfr}=4'b0110;
B1:{fr3,fr2,fr1,dfr}=4'b0111;
C0:{fr3,fr2,fr1,dfr}=4'b0010;
C1:{fr3,fr2,fr1,dfr}=4'b0011;
D:{fr3,fr2,fr1,dfr}=4'b0000;
endcase
end
endmodule