凡亿助教-六六
凡事用心,一起进步
打开APP
公司名片
凡亿课堂 | 面试指南
当前位置: 首页 面试指南
FPGA状态机怎么设计?一段式/两段式/三段式、状态编码、复位怎么选?
浏览量:182
2026-10-11 15:25:54
一句话答案

FPGA状态机推荐三段式:第一段时序逻辑描述状态寄存器(现态→次态),第二段组合逻辑描述状态转移条件(次态计算),第三段时序或组合逻辑描述输出;状态编码用独热码(One-hot)速度快面积大,二进制码面积小速度慢,格雷码适合低功耗;复位用同步复位,避免异步复位的恢复时间问题。

本文概述

状态机(FSM)是FPGA设计中最常用的时序电路,用于控制逻辑、协议处理、数据通路调度。设计质量直接影响系统稳定性和资源利用率。三段式是工业界推荐写法,状态转移和输出分离,可读性好、易于综合和时序收敛。

核心要点

  • 状态机三要素:现态(current state)、次态(next state)、输出(output)

  • 一段式:状态转移+输出都在一个always块,简单但时序混乱,不推荐

  • 两段式:一个时序块(状态寄存器)+一个组合块(转移+输出),输出可能有毛刺

  • 三段式:状态寄存器(时序)+转移逻辑(组合)+输出逻辑(时序/组合),推荐

  • 状态编码:独热码(One-hot)速度快、译码简单,二进制码省资源,格雷码切换功耗低

  • 同步复位优于异步复位,避免复位释放时的恢复时间(recovery time)违例

  • 状态机必须有默认状态(default),防止进入非法状态挂死

FPGA状态机设计和状态转移图

面试官问:FPGA状态机你怎么写?一段式两段式三段式区别?状态编码怎么选?

面试官考察点

考察状态机设计规范、Verilog写法、状态编码选择、复位策略、可综合性和时序意识。

回答思路

先讲状态机三要素,再对比三种写法(重点讲三段式),然后讲状态编码选择,最后讲复位和默认状态等工程细节。

参考回答

FPGA状态机我推荐三段式写法,结构清晰、综合效果好:

三段式结构:

// 第一段:时序逻辑,状态寄存器
always @(posedge clk) begin
    if (!rst_n) current_state <= IDLE;
    else current_state <= next_state;
end

// 第二段:组合逻辑,状态转移
always @(*) begin
    next_state = current_state;  // 默认保持,避免latch
    case(current_state)
        IDLE: if(start) next_state = WORK;
        WORK: if(done)  next_state = IDLE;
        default: next_state = IDLE;
    endcase
end

// 第三段:输出逻辑(时序输出,无毛刺)
always @(posedge clk) begin
    if (!rst_n) begin
        valid <= 1'b0;
        cnt_en <= 1'b0;
    end else begin
        case(next_state)  // 用next_state提前一拍输出
            IDLE: begin valid <= 1'b0; cnt_en <= 1'b0; end
            WORK: begin valid <= 1'b1; cnt_en <= 1'b1; end
            default: ...
        endcase
    end
end

三种写法对比:

写法结构优点缺点
一段式一个always块代码少时序组合混杂,难维护,不推荐
两段式时序+组合结构较清晰组合输出可能有毛刺
三段式时序+组合+时序输出清晰、无毛刺、易综合代码略多

状态编码选择:

① 独热码(One-hot):每个状态一位,如IDLE=4'b0001, WORK=4'b0010。状态比较只看一位,速度快、译码简单,但状态多时占用触发器多。FPGA触发器资源丰富,一般优先用独热码。
② 二进制码:IDLE=2'b00, WORK=2'b01。省触发器,但需要全译码,组合逻辑深,状态多时速度慢。
③ 格雷码:相邻状态只有一位变化,降低动态功耗和切换噪声,适合低功耗或异步跨时钟域场景。

工程要点:

① 组合逻辑块必须给所有变量赋默认值(next_state=current_state),否则综合出latch。
② case必须有default,防止状态机进入非法状态后挂死。
③ 用同步复位,异步复位释放时可能违反recovery time,导致状态不确定。
④ 输出用时序逻辑(第三段用posedge clk),避免组合逻辑输出的毛刺。
⑤ 状态名用parameter或localparam定义,不要直接用数字。

面试官可能追问

追问 1:组合逻辑为什么会产生latch?
组合逻辑中如果某个变量在某些条件下没有赋值,综合器会认为它需要保持原值,就会生成latch(电平敏感存储)。latch会导致时序分析困难和功能异常。解决方法是给所有输出赋默认值。
追问 2:独热码和二进制码资源差多少?
N个状态,独热码用N个触发器+N个2选1MUX,二进制码用log2(N)个触发器+复杂译码。FPGA中触发器便宜、LUT也便宜,独热码的速度优势通常更重要,所以FPGA设计一般用独热码。ASIC中触发器贵,用二进制码。
追问 3:Moore和Mealy状态机区别?
Moore输出只取决于当前状态,输出稳定无毛刺;Mealy输出取决于当前状态和输入,输出可能随输入变化产生毛刺,但状态数少、响应快。三段式第三段用next_state+输入就是Mealy,只用next_state就是Moore。
追问 4:状态机进入非法状态怎么办?
case加default回到IDLE或安全状态;也可以加状态监测逻辑,检测到非法状态自动复位。独热码中如果出现两位同时为1就是非法状态,可以加校验。
追问 5:大状态机怎么优化?
状态太多时拆分成子状态机或分层状态机;用独热码减少译码延迟;关键路径上的输出寄存;避免一个状态里做太多判断条件,拆成多个状态。

常见失分表达

✗ 用一段式写复杂状态机 — 一段式时序组合混杂,难以维护和时序分析,工业界不推荐。
✗ 组合逻辑不赋默认值 — 会生成latch,是FPGA设计的常见低级错误。
✗ case没有default — 状态机可能进入非法状态后挂死,必须有default处理。

准备动作

1
用三段式写一个UART发送状态机
2
对比独热码和二进制码的综合结果(看Technology Map)
3
理解Moore/Mealy输出差异
4
检查自己的代码有没有latch(综合报告warning)

核心关键词

FPGA状态机,三段式状态机,一段式,两段式,独热码,One-hot,二进制编码,格雷码,Moore,Mealy,同步复位,VerilogFSM,状态编码


声明:本网站所收集的部分公开资料来源于互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。仅供学习交流使用,不构成商业目的。版权归原作者所有,如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时删除。 侵权投诉

相关文章

Arm2440和6410有什么区别?

2023-10-27 11:11:02

PCB仿真面试:模型为什么要还原焊盘、过孔和走线几何?寄生参数会怎样影响结果

2026-10-23 14:08:33

I²C总线上挂的设备越来越多,通信开始不稳定,硬件工程师怎样定位总线电容问题?

2026-08-01 21:53:16

PCB表面处理工艺怎么选?沉金、喷锡、OSP与无铅焊接怎么取舍?PCB工程师面试

2026-09-09 13:30:31

嵌入式系统有哪几个组成部分?

2024-03-27 11:17:25