题解 | #根据状态转移写状态机-二段式#

根据状态转移写状态机-二段式

https://www.nowcoder.com/practice/5b2ff27610d04993ae92374d51bfc2e6

参考题解。

有三点注意:

1、对于S4输出flag输出控制是由现态单独控制的,因此是摩尔机;

2、摩尔机最后添加了状态S4,从状态转移上看输出节拍会晚一拍,但由于是组合逻辑输出,因此实际上并没有晚一拍!!!

3、两段式和三段式的描述方法主要是针对摩尔机,应该注意:1)、是否要求检测到后同步输出结果(否则结果晚一拍) 2)、是否需要寄存器输出。这个2)什么意思?有大佬能解释下吗。

两段式就是输出块和次态切换块合并。

`timescale 1ns/1ns

module fsm2(
	input wire clk  ,
	input wire rst  ,
	input wire data ,
	output reg flag
);

//*************code***********//
	parameter S0=0, S1=1, S2=2, S3=3, S4=4;
	reg [2:0] cur_state, next_state;
	
	always@(posedge clk or negedge rst)begin
		if(~rst)
			cur_state <= 0;
		else 
			cur_state <= next_state;
	end

	always@(*)begin
		case(cur_state)
			S0: begin
				next_state = data? S1:S0;
				flag =0;
			end
			S1: begin
				next_state = data? S2:S1;
				flag =0;
				end
			S2: begin
				next_state = data? S3:S2;
				flag =0;
				end
			S3: begin
				next_state = data? S4:S3;
				flag =0;
				end
			S4: begin
				next_state = data? S1:S0;
				flag =1;
				end
			default: begin
				next_state = S0;
				flag =0;
				end
		endcase
	end

//*************code***********//
endmodule

全部评论

相关推荐

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