FPGA开发过程中,当系统行为依赖多个状态,不同时间触发不同的状态迁移,或者需要复杂决策逻辑控制,使用状态机(Finite State Machine, FSM)设计是一种比好的处理方式。
Verilog状态机通常分为Moore型和Mealy型。Moore型状态机的输出仅与当前状态有关,而Mealy型的输出与当前状态和输入信号有关。设计时需明确状态机的类型,避免混合逻辑导致输出不稳定。
常见编码方式包括二进制编码、格雷码和独热码(One-Hot)。独热码适合FPGA实现,每状态占用一个触发器,逻辑简单但资源消耗较大;格雷码适合低功耗设计;二进制编码节省资源但需注意状态跳转时的毛刺问题。
状态转移条件需用组合逻辑明确描述,避免锁存器生成。
推荐三段式状态机设计,步骤如下:
- 状态定义
// 常用编码方式(二进制状态编码 或 one-hot编码):
// 状态声明
parameter IDLE = 3'b001;
parameter START = 3'b010;
parameter RUN = 3'b100;
- 状态寄存器(采用时序逻辑,优化布线)
reg [2:0] current_state, next_state;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) current_state <= IDLE; // 异步复位
else current_state <= next_state; // 状态更新
end
- 状态转移逻辑(组合逻辑)
always @(*) begin
// 默认防止锁存器
next_state = current_state;
case (current_state)
IDLE:
if (start_signal) next_state = START;
START:
if (config_done) next_state = RUN;
else if (timeout) next_state = IDLE;
RUN:
if (stop_signal) next_state = IDLE;
default: next_state = IDLE; // 安全机制
endcase
end
- 输出逻辑(比如Moore型)
// Moore状态机:输出仅依赖当前状态
reg [1:0] status_led;
always @(*) begin
case (current_state)
IDLE: status_led = 2'b00;
START: status_led = 2'b01;
RUN: status_led = 2'b10;
default:status_led = 2'b11; // 错误指示
endcase
end
1853

被折叠的 条评论
为什么被折叠?



