三段式状态机:
用三个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