状态机分一段式(时序+组合混写)、两段式(时序状态寄存器+组合输出)、三段式(时序状态寄存器+组合次态+时序输出);推荐三段式,输出寄存器化无毛刺;状态编码用二进制(省资源)或独热码(快、译码简单)。
本文概述
状态机是 FPGA 设计核心,面试常考:一段两段三段区别、状态编码、输出毛刺。回答要讲清三段式结构和优势。
核心要点
一段式:一个 always 块混写时序和组合,简单但易出毛刺
两段式:时序状态寄存器 + 组合逻辑(次态+输出),输出可能有毛刺
三段式:时序状态寄存器 + 组合次态 + 时序输出,输出寄存器化无毛刺,推荐
状态编码:二进制(省触发器)、独热码(译码简单、快)、格雷码(减少翻转)
状态机要完整:复位态、所有转移、默认态

面试官考察点
FPGA 基础题。面试官看你是否理解状态机写法。重点听:输出寄存器化、三段结构。
回答思路
讲三段式结构,输出用寄存器所以无毛刺。
参考回答
三段式结构。
// 第一段:时序逻辑,状态寄存器
always @(posedge clk) begin
if(!rst_n) curr_state <= IDLE;
else curr_state <= next_state;
end
// 第二段:组合逻辑,次态判断
always @(*) begin
case(curr_state)
IDLE: if(start) next_state = WORK;
WORK: if(done) next_state = IDLE;
default: next_state = IDLE;
endcase
end
// 第三段:时序逻辑,输出寄存器
always @(posedge clk) begin
case(next_state) // 或 curr_state
IDLE: out <= 0;
WORK: out <= 1;
endcase
end
为什么输出无毛刺。
一段/两段式输出是组合逻辑,状态转移瞬间多个信号变化可能产生竞争冒险(毛刺);
三段式输出用寄存器(D 触发器),只在时钟沿更新,时钟之间保持稳定;
寄存器输出没有组合逻辑毛刺,适合驱动外部器件(如 SPI 时钟、片选)。
| 写法 | 结构 | 输出 | 适用 |
|---|---|---|---|
| 一段式 | 1 个 always | 组合/时序混合 | 简单状态机 |
| 两段式 | 时序+组合 | 组合(可能毛刺) | 内部逻辑 |
| 三段式 | 时序+组合+时序 | 寄存器(无毛刺) | 推荐,外部输出 |
状态编码。
| 编码 | 特点 | 适用 |
|---|---|---|
| 二进制 | 触发器少,译码复杂 | 状态多、资源紧张 |
| 独热码 one-hot | 每个状态 1 个触发器,译码简单 | 状态少、速度要求高 |
| 格雷码 | 每次只变 1 位,减少翻转功耗 | 低功耗、异步跨时钟 |
注意。
状态机一定要有默认态(default),防止综合出锁存器;
复位态要明确,上电进入 IDLE;
状态转移条件要完整,不要有死状态;
复杂状态机可以分子状态机(分层)。

扫码关注




























