采用三段式状态机,将组合逻辑与时序逻辑分开
第一部分描述状态转移
第二部分描述状态转移条件
第三部分描述输出
module fsm (
input clk,
input rst_n,
input x,
output z
);
reg [1:0] current_state;
reg [1:0] nstate;
always @ (posedge clk or negedge rst_n)
if(!rst_n)
current_state<=S0;
else
current_state<=nstate;
parameter S0=4'b0001;
parameter S1=4'b0010;
parameter S2=4'b0100;
parameter S3=4'b1000;
always @(x or current_state) begin
case (current_state)
S0:begin
if(x==1)
nstate<=S1;
else
nstate<=S0;
end
S1:begin
if(x==0)
nstate<=S2;
else
nstate<=S1;
end
S2:begin
if(x==1)
nstate<=S3;
else
nstate<=S0;
end
S3:begin
if(x==1)
nstate<=S1;
else
nstate<=S2;
end
default:begin
nstate<= S0;
end
endcase
end
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
z<=1'b0;
end
else begin
if(nstate==S3)
z<=1'b1;
else
z<=1'b0;
end
endmodule