HDLBits Design a Moore FSM Exams/ece241 2013 q4
网址:https://hdlbits.01xz.net/wiki/Exams/ece241_2013_q4
题目大意是设计一个记录水位的状态机,可以设计六个状态表示表格中的water level,其中Between s3 and s2与between s2 and s3分别用两个表示上升至该水位或下降至该水位,Above S3和Below S1用两个状态表示。
module top_module (
input clk,
input reset,
input [3:1] s,
output fr3,
output fr2,
output fr1,
output dfr
);
//A表示Below S1,B1表示上升到Between S1 and S2,C1表示S1-S2上升到S2-S3,
//D表示Above S3,B2表示下降到Between S1 and S2,C2表示D下降到S2-S3。
parameter A=0,B1=1,C1=2,D=3,C2=4,B2=5;
reg [2:0] state,next_state;
always @(posedge clk) begin
if(reset) state<=A;
else state<=next_state;
end
always @(*) begin
case(state)
A: next_state=s[1]?(s[2]?(s[3]?D:C1):B1):A;
B1: next_state=s[1]?(s[2]?(s[3]?D:C1):B1):A;
C1: next_state=s[1]?(s[2]?(s[3]?D:C1):B2):A;
D: next_state=s[1]?(s[2]?(s[3]?D:C2):B2):A;
C2: next_state=s[1]?(s[2]?(s[3]?D:C2):B2):A;
B2: next_state=s[1]?(s[2]?(s[3]?D:C1):B2):A;
endcase
/*
本题也可以不用判断所有s信号
case(state)
A: next_state=s[1]?B1:A;
B1: next_state=s[1]?(s[2]?C1:B1):A;
C1: next_state=s[2]?(s[3]?D:C1):B2;
D: next_state=s[3]?D:C2;
C2: next_state=s[2]?(s[3]?D:C2):B2;
B2: next_state=s[1]?(s[2]?C1:B2):A;
endcase
*/
end
//根据表格可以写出fr3,fr2,fr1
assign fr3=(state==A);
assign fr2=(state==A|state==B1|state==B2);
assign fr1=(state==A|state==B1|state==B2)|(state==C2|state==C1);
//B2,C2状态分别由下降得到,所以当处于这两个状态时dfr为1,
//A状态为水位最低的状态,dfr为1
assign dfr=(state==B2)|(state==C2)|(state==A);
endmodule