简析

状态机可以分为Moore状态机和Mealy状态机。

  • Moore状态机:输出只由当前状态决定
  • Mealy状态机:输出由当前状态和当前的输入共同决定。

三段式状态机是指当前状态切换、次态切换和输出更新分别由不同的块控制。
本题是一个Mealy状态机。在所有状态下,当输入data==0时,次态不变;当输入data==1时,次态顺序切换。

`timescale 1ns/1ns

module fsm1(
	input wire clk  ,
	input wire rst  ,
	input wire data ,
	output reg flag
);
//*************code***********//
    parameter S0=0, S1=1, S2=2, S3=3;
    reg [1:0] state, nstate;
    
    //当前状态切换
    always@(posedge clk or negedge rst) begin
        if(~rst)
            state <= S0;
        else
            state <= nstate;
    end
    
    //次态切换
   always@* begin
        if(~rst)
            nstate = S0;
        else
            case(state)
                S0     : nstate = data? S1: S0;
                S1     : nstate = data? S2: S1;
                S2     : nstate = data? S3: S2;
                S3     : nstate = data? S0: S3;
                default: nstate = S0;
            endcase
    end

  	//输出更新
    always@(posedge clk or negedge rst) begin
        if(~rst)
            flag <= 0;
        else
            case(state)
                S0     : flag <= 0;
                S1     : flag <= 0;
                S2     : flag <= 0;
                S3     : flag <= data;
                default: flag <= 0;
            endcase
    end
//*************code***********//
endmodule