简析
状态机可以分为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