题解 | #根据状态转移写状态机-二段式#
根据状态转移写状态机-二段式
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