FPGA状态机怎么设计?三段式和一段式有什么区别?FPGA面试

浏览量:3
时间: 2026-09-16 10:02:04
一句话答案

状态机分三段式(现态寄存器+次态组合+输出组合)和一段式(全写在一个 always),推荐三段式:时序清晰、易综合、时序收敛好;输出用寄存器输出避免毛刺,状态编码用 one-hot 或 binary 看资源和速度。

本文概述

状态机是 FPGA 设计核心,面试常考:一段/二段/三段式区别、独热码 vs 二进制、输出毛刺、复位。回答要能写出三段式骨架并说出为什么推荐三段式。

核心要点

  • 三段式:1)现态寄存器时序逻辑 2)次态组合逻辑 3)输出寄存器时序逻辑,推荐

  • 一段式:所有逻辑写一个 always,组合时序混在一起,难维护、时序差

  • 状态编码:binary(省资源)、gray(低功耗)、one-hot(快、触发器多)

  • 输出用寄存器输出(Moore 型)避免组合逻辑毛刺,Mealy 型输出跟输入和状态都有关

  • 复位用异步复位同步释放,状态机复位到 IDLE

屏幕显示 FSM 状态转移图和三段式 Verilog 代码,FPGA 开发板连示波器

面试官:写一个三段式状态机骨架,检测按键短按/长按,你会怎么写?

面试官考察点

面试官看你是否真写过状态机、是否理解三段式结构,而不是背概念。重点听:三个 always、状态编码、输出寄存器。

回答思路

先讲三段式结构,再给骨架代码,最后讲按键消抖和长短按判断。

参考回答

三段式结构。

逻辑描述
第一段时序现态寄存器:current_state <= next_state
第二段组合次态逻辑:根据 current_state 和输入算 next_state
第三段时序输出寄存器:根据 current_state 输出,避免毛刺

骨架代码。

reg [2:0] current_state, next_state;
// 第一段:现态寄存器
always @(posedge clk or negedge rst_n)
  if(!rst_n) current_state <= IDLE;
  else current_state <= next_state;
// 第二段:次态组合
always @(*) begin
  case(current_state)
    IDLE: if(key_press) next_state = WAIT_HOLD;
    WAIT_HOLD: if(key_release) next_state = IDLE;
              else if(hold_cnt>=THRESH) next_state = LONG;
    default: next_state = IDLE;
  endcase
end

为什么推荐三段式。

  • 时序清晰:三段分开,每段功能单一,易读易维护;

  • 时序收敛好:第二段组合逻辑短,第三段寄存器输出,FPGA 综合器容易优化;

  • 无毛刺:输出用寄存器,不是组合逻辑直接输出,避免毛刺。

状态编码选择。

编码资源速度适用
Binary少(n 个状态需 log2n 触发器)较慢状态多、资源紧
One-hot多(n 个触发器)快(无译码)状态少、速度高(Xilinx 推荐)
Gray低功耗、跨时钟域

按键长短按判断。IDLE 检测到按下→WAIT_HOLD,同时启动计数器;到阈值(如 1s)进 LONG;释放则判 SHORT。按键要先消抖(20ms 稳定)。

面试官可能追问

追问 1:Moore 和 Mealy 型区别?
Moore 输出只取决于当前状态,稳定无毛刺;Mealy 输出取决于状态和输入,可能有毛刺、反应快一拍。FPGA 推荐 Moore。
追问 2:一段式有什么问题?
组合时序混在一个 always,综合器难优化、容易出锁存器、时序收敛差。大型状态机难维护。
追问 3:状态机为什么会出毛刺?
输出用组合逻辑(assign)时,状态跳转瞬间输出可能出现小毛刺;用寄存器输出就没有。
追问 4:one-hot 为什么省译码?
每个状态一个触发器,进哪个状态哪个为 1,不用译码逻辑,组合路径短。但触发器用得多。
追问 5:状态机跨时钟域怎么办?
状态机本身在一个时钟域;如果状态信号要传到另一个时钟域,用格雷码编码+打两拍。

常见失分表达

✗ 状态机就写在一个 always 里 — 一段式在 FPGA 里时序差、难维护。
✗ 输出直接 assign — 组合输出有毛刺,时序逻辑设计应该寄存器输出。
✗ 复位用同步复位 — 异步复位同步释放是 FPGA 标准做法,同步复位释放时可能亚稳态。

准备动作

1
写一个三段式 UART 发送状态机,仿真跑通
2
对比一段式和三段式综合后的资源/时序报告
3
准备一个状态机出毛刺的调试案例
4
了解 Xilinx one-hot 编码建议和状态机推导(state machine extraction)

核心关键词

三段式状态机Mooreone-hot状态编码寄存器输出异步复位


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

分类:面试准备经验要求:初中级难度:基础题型:准备类📖 本文概述产品公司和PCB外包公司面试有什么区别?如何针对性准备是PCB工程师面试准备的高频搜索问题。本... 详情>>

2026-08-02 10:06:26
开关电源输入端EMI滤波电路PCB布局怎么设计?硬件工程师面试高频题

分类:硬件工程师面试经验级别:中级难度:★★★☆题型:EMC/电源设计本文概述开关电源输入端EMI滤波电路的PCB布局核心原则是"一字型顺序流过、最短回流路径、... 详情>>

2026-08-08 14:46:58
射频巴伦Balun怎么设计与选型?射频工程师面试单端差分转换与阻抗变换

射频电路 · 中级 · 技术基础适合岗位:射频工程师、硬件工程师 | 经验:1-5年 | 难度:中级本文概述射频巴伦(Balun)面试题考察单端-差分转换原理、... 详情>>

2026-08-29 12:19:19
UART通信偶发乱码怎样排查?嵌入式面试别只会重设波特率

题库分类:嵌入式单片机适合经验:0—5年难度:中高级题型:串口排查题 + 软硬件协同题面试题单片机UART大部分时间正常,但高温、长线或高负载时偶发乱码和丢包,... 详情>>

2026-08-01 17:48:12
STM32的I2C通信怎么配置与实现?嵌入式面试主从模式与调试

STM32的I2C通信怎么配置与实现?嵌入式面试主从模式与调试嵌入式单片机中级技术基础题本文概述STM32的I2C外设配置是嵌入式开发常见任务,面试中需要讲清I... 详情>>

2026-09-02 09:07:44
开班信息