比较二进制、灰色和 One-Hot 编码
本文比较了使用二进制、格雷和单热编码在 FPGA 中实现状态机的实现。这些编码通常由综合和实现工具评估和应用,因此了解软件做出这些决定的原因很重要。
有限状态机 (FSM) 是几乎所有数字系统中非常常见的部分。这就是为什么综合工具经常检查您的代码以检测 FSM 并执行可能修改状态编码的优化。如果您在源代码中仔细选择并指定了实现您的状态的值并不重要,综合工具可能会用其他值替换这些值,这些值甚至可能与您的原始编码具有不同的位长。
如果你想复习在 Verilog 中实现状态机,你应该阅读我的文章,标题为在 Verilog 中创建有限状态机。
状态编码:Gray vs. Binary vs. One-Hot
FSM 状态的三种最流行的编码是 binary、Gray 和 one-hot。
二进制编码
二进制编码是您在按顺序为状态分配值时可以直观使用的直接方法。这样,您就可以使用尽可能少的位来编码您的状态。
one-hot 编码示例。图片来自史蒂夫·阿拉尔
灰度编码
格雷码由一个序列组成,其中一个值和下一个值之间只有一位变化。除了还使用最少的位数外,如果最佳地遵循状态序列,这种编码可以最大限度地减少动态功耗。
格雷码轮。图片来自玛丽克里斯蒂亚诺
One-Hot 编码
最后,one-hot 编码包括使用代表每个状态的一位,因此在任何时间点,状态都将在代表当前状态的位中编码为 1,在所有其他位中编码为 0。由于使用的位数和无效状态的数量过多,这起初可能看起来效率不高。然而,one-hot 编码非常擅长简化触发器的激励逻辑,因为不需要解码状态。这些位是 美国。
one-hot 编码示例。图片来自史蒂夫·阿拉尔
有关状态编码的更多信息,您可能需要查看 Steve Arar 撰写的在 VHDL 中编码有限状态机的状态的文章。
哪种编码最好?
这是一个棘手的问题,主要是因为每种编码都有其优点和缺点,因此归结为一个取决于大量因素的优化问题。
- 如果一个非常简单的系统在不同编码之间产生非常相似的结果,那么原始编码是最佳选择。
- 如果 FSM 在一条路径上循环遍历其状态(如计数器),那么格雷码是一个非常好的选择。
- 如果 FSM 有一组任意的状态转换或预期以高频运行,那么单热编码可能是可行的方法。
现在,所有这些说法都只是有根据的猜测,找到最佳状态分配是一个复杂的问题。因此,我的官方建议是让编译器为您决定。也就是说,我决定在三种不同的开发工具和三种不同的状态机中对这三种编码的结果进行比较。
在下一篇文章中,我们将讨论我的实验结果。
嵌入式