FPGA 状态机编码实战指南:二进制、格雷码与独热码对比
本文详细对比在 FPGA 上实现有限状态机 (FSM) 时的二进制、格雷码和独热编码。理解综合工具如何评估并可能转换这些编码,对实现最优性能和功耗效率至关重要。
有限状态机无处不在于数字设计。综合工具例行分析 RTL 以检测 FSM,并可能重写状态编码以满足时序、面积或功耗目标。即使您手动分配状态码,工具也可能基于其优化策略替换为不同值——有时甚至改变位宽。
如需 Verilog 构建 FSM 复习,请参阅我的文章《Verilog 中创建有限状态机》。
编码选项:二进制、格雷码与独热码
三种最常见 FSM 编码为二进制、格雷码和独热码。各有独特权衡。
二进制编码
二进制编码用最少位数表示所有状态。这是最节省空间的选择,但状态转换可能涉及多位翻转,可能增加动态功耗。

二进制编码示例。图片由 Steve Arar 提供
格雷码编码
格雷码确保相邻状态间仅一位变化。当 FSM 遵循可预测序列时,格雷码可降低翻转活动,减少动态功耗。

格雷码轮。图片来自 Marie Christiano
独热码编码
独热码用专用触发器位表示每个状态。虽消耗更多逻辑资源并引入大量无效组合,但消除了状态解码需求,简化组合逻辑,常在高时钟频率下改善时序收敛。

独热码示例。图片由 Steve Arar 提供
如需 VHDL 状态编码深度见解,请参阅 Steve Arar 的《VHDL 中有限状态机状态编码》。
选择正确编码
确定最优编码取决于上下文,涉及面积、时序、功耗平衡。通用指南包括:
- 设计规模小且性能差异可忽略时,保留原指定编码。
- 按固定顺序遍历状态的 FSM(如计数器),格雷码常具优势。
- FSM 跳转任意或需高频运行时,独热码可提供最佳时序收敛。
鉴于权衡微妙,我建议让综合工具选择编码。尽管如此,我仍跨三大主流开发工具和三个不同状态机开展对比实验,展示各编码实际表现。结果将在下文讨论。
嵌入式