题解 | #根据状态转移写状态机-二段式#(错误示范)
本题要求使用二段式状态机完成题解,我查阅很多资料都显示二段式状态机是第一段时序逻辑用来表示状态的转移,第二段用组合逻辑用来表示状态转移的条件和输出,以下是我写出的代码,本题给予了正确的评价。
然而我仿真后发现,第二段次态状态机在同一个时钟周期后遇到data高后到下一个状态,又遇到data低后又回到本状态,导致次态状态机在时钟上升沿一直处于初始状态,现态状态机也就一直处于初始状态。
`timescale 1ns/1ns
module fsm2(
input wire clk ,
input wire rst ,
input wire data ,
output reg flag
);
//*************code***********//
parameter S0 = 5'b00001,
S1 = 5'b00010,
S2 = 5'b00100,
S3 = 5'b01000,
S4 = 5'b10000;
reg [4:0] current_state, next_state;
always@(posedge clk or negedge rst)
if(!rst)
current_state <= S0;
else
current_state <= next_state;
always@(*) begin
next_state = S0;
flag = 1'b0;
case(current_state)
S0 :
if(data)
next_state = S1;
else
next_state = S0;
S1 :
if(data)
next_state = S2;
else
next_state = S1;
S2 :
if(data)
next_state = S3;
else
next_state = S2;
S3 :
if(data)
next_state = S4;
else
next_state = S3;
S4 :
if(data)
begin
next_state = S1;
flag = 1'b1;
end
else
begin
next_state = S0;
flag = 1'b1;
end
default :
begin
next_state = S0;
flag = 1'b0;
end
endcase
end
//*************code***********//
endmodule
然而经过仿真验证后发现,第二段次态状态机在同一个时钟周期后遇到data高后到下一个状态,又遇到data低后又回到本状态,导致次态状态机在时钟上升沿一直处于初始状态,现态状态机也就一直处于初始状态,输出flag自然也就一直为0了。所以这种解法是完全错误的。

查看12道真题和解析