三段式状态机:
用三个always语句块分别实现三个功能:同步状态转移、当前状态判断次态、输出
已10010串的检测为例 moore状态机
module fsmcheck (output z,
input clk,
input rst,
input a
);
reg [3:0] nextstate, currentstate;
paramtet S0 = 4'b0000;
paramter S1 = 4'b0001;
paramter S2 = 4'b0010;
paramter S3 = 4'b0011;
paramter S4 = 4'b0100;
paramter S5 = 4'b0101;
always @ (posedge clk or negedge rst)
begin
if(!rst)
currentstate <= S0;
else
currentstate <= nextstate;
end
always @ (posedge clk or negedge rst)
begin
if(!rst)
currentstate <= S0;
else
begin
case(currentstate)
S0: if(a==1)
nextstate <= S1;
else
nexrstate <= S0;
S1: if (a==0)
nextstate <= S2;
else
nextstate <= S1;
S2: if(a==0)
nextstate <= S3;
else
nextstate <= S1;
S3: if(a==1)
nextstate <= S4;
else
nextstate <= S0;
S4: if(a==0)
nextstate <= S5;
else
nextstate <= S1;
S5: if(a==0)
nextstate <= S3;
else
nextstate <= S1;
default: nextstate <= S0;
endcase
end
always @ ( rst or currentstate )
begin
if(!rst)
z=0;
else
case(currentstate)
S0: z=0;
S1: z=0;
S2: z=0;
S3: z=0;
S4: z=0;
S5: z=1;
endcase
end
endmodule