由题目意思可知:该有限状态机总共有6种状态即传感器(s3,s2,s1)状态,分别如下
A2:001->000
B1:000->001
B2:011->001
C1:001->011
C2:111->011
D1:011->111
其中000代表在水位s 1以下传感器(s3,s2,s1)均为0,111代表在水位s3以上传感器(s3,s2,s1)均置为1,其他依次类推。
然后分析FR3,FR2,FR1,dfr分别对应6种状态,其中dfr代表是否增加水量,dfr=1代表需水量增加,dfr=0代表需水量不变或者下降。
A2:由于该状态末尾为000所以水位在s1以下,所以(FR3,FR2,FR1)=(1,1,1)。该状态初为001,末尾为000。因此所需要的水量由001所需(FR3,FR2,FR1)=(0,1,1)变为了所需水量000的(FR3,FR2,FR1)=(1,1,1)所以需水量增加dfr=1;
B1:尾态为001在水位s2与s1之间,所以(FR3,FR2,FR1)=(0,1,1)。该状态初为000,尾为001。因此所需水量由000所需(FR3,FR2,FR1)=(1,1,1)变为了所需水量001的(FR3,FR2,FR1)=(0,1,1)所需水量减少了因此dfr=0;
D1:尾态为111水位在s3以上,所以(FR3,FR2,FR1)=(0,0,0)。该状态初为011,尾为111。因此所需水量由011所需(FR3,FR2,FR1)=(0,0,1)变为了所需水量111的(FR3,FR2,FR1)=(0,0,0)所需水量减少dfr=0;
同理分析B2,C1,C2
经上述分析可得代码如下
module top_module (
input clk,
input reset,
input [3:1] s,
output fr3,
output fr2,
output fr1,
output dfr
);
// set parameter
//A2:001->000,B1:000->001,B2:011->001,C1:001->011,C2:111->011,D1:011->111
parameter A2=0, B1=1, B2=2, C1=3, C2=4, D1=5;
wire[2:0] state, next;
// state transition (combination logic)
always@(*)begin
case(state)
A2: next = s[1]? B1:A2;
B1: next = s[2]? C1:(s[1]? B1:A2);
B2: next = s[2]? C1:(s[1]? B2:A2);
C1: next = s[3]? D1:(s[2]? C1:B2);
C2: next = s[3]? D1:(s[2]? C2:B2);
D1: next = s[3]? D1:C2;
endcase
end
always@(posedge clk)begin
if(reset)
state <= A2;
else
state <= next;
end
// output control()sequential logic
always@(*)begin
case(state)
A2: {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;
D1: {fr3,fr2,fr1,dfr} = 4'b0000;
endcase
end
endmodule
代码需注意always仅在同步复位时需要设置上升沿触发。其余时候每当状态变化,各输出相应变化。
状态转化分析:
当处在A2状态时,当s[1]等于1时表示下一状态由000->001即状态B2,当s[1]等于0时表示还处在当前状态001->000
当处在B1状态时,当s[2]等于1时表示下一状态由001->011即状态C1,当s[2]等于0并且s[1]等于1时保持000->001 B2,当s[2]等于0并且s[1]等于0时状态由001->000即A2.
以此类推。