这次只看三段式状态机的组成部分,不讲具体功能。写好三段式状态机,只需要记住三个always,基本上,脑海里就可以直接填写内容了。
三个always:
第一个always完成复位,状态切换到下一状态;
第二always状态转移的条件;
第三个always状态转移的条件之下输出的结果;
module fsm_example (
input wire clk, // 时钟信号
input wire rst_n, // 异步复位信号,低电平有效
input wire in_signal, // 输入信号
output reg out_signal // 输出信号
);
// 使用 parameter 定义状态编码
parameter S0 = 2'b00; // 状态0
parameter S1 = 2'b01; // 状态1
parameter S2 = 2'b10; // 状态2
// 状态寄存器
reg [1:0] state, next_state;
// 1. 状态寄存 (状态的切换逻辑)
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
state <= S0; // 复位时进入初始状态
end else begin
state <= next_state; // 更新当前状态
end
end
// 2. 下一状态逻辑
always @(*) begin
case (state)
S0: begin
if (in_signal)
next_state = S1;
else
next_state = S0;
end
S1: begin
if (in_signal)
next_state = S2;
else
next_state = S0;
end
S2: begin
if (in_signal)
next_state = S0;
else
next_state = S2;
end
default: next_state = S0;
endcase
end
// 3. 输出逻辑
always @(*) begin
case (state)
S0: out_signal = 1'b0;
S1: out_signal = 1'b1;
S2: out_signal = 1'b0;
default: out_signal = 1'b0;
endcase
end
endmodule