题解 | #根据状态转移写状态机-二段式#(错误示范)

本题要求使用二段式状态机完成题解,我查阅很多资料都显示二段式状态机是第一段时序逻辑用来表示状态的转移,第二段用组合逻辑用来表示状态转移的条件和输出,以下是我写出的代码,本题给予了正确的评价。

然而我仿真后发现,第二段次态状态机在同一个时钟周期后遇到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了。所以这种解法是完全错误的。

#fpga工程师实习生##verilog##verilog刷题##芯片#
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务