Verilog中状态机的不同编码方式
本站分享资源仅供学习交流使用,请支持正版。学习资源请于下载后24小时内删除。
前言
上课讲了同步状态机及多种编码风格,然而老师并没有展开来细讲 (;´д`)ゞ
参考资料
安利一本书:《FPGA之道》,写的蛮不错。
参考第5章2小节。
状态编码
状态编码,是使用特定数量的寄存器,通过特定形式的取值集合,将状态集合表示出来的过程。这一工作通常是由编译器完成的,我们可以通过修改编译选项或者添加综合约束的方式来影响状态编码的结果。
编码类型
常见的编码风格有:
- Binary
- Gray
- Johnson
- One-hot
- Sequential
- Define your own
- ...
下面简单展开讲讲。
Binary
先讲最简单的二进制码,不过我感觉独热码更简单一些
顾名思义,就是二进制。优点是编码简单,符合计数规则。
Gray
格雷码这玩意设计时用于通信,现在则用来减少组合逻辑电路中竞争与冒险的出现。毕竟它相邻的两个状态中,只有一位不同,可以大大降低竞争冒险风险。
但是它的缺点也很明显,即状态机必须为顺序变化的,要么正序要么倒序。因此它适合分支较少的状态机。
Johnson
上课没说,可能以前学过确实忘了。
和Gray码不同,前者用N位寄存器表示2N个状态,而Johnson码用N位寄存器表示2N个不同的状态。对于6个状态,Johnson码为:
1 | S0 = 000 |
显然,对于两个相邻状态,寄存器也仅仅有一位不同。
One-hot
独热码的特点是状态寄存器在任何状态时的取值都仅仅有一位有效。如:
1 | S0=0001; |
由此可见,One-hot编码方式结果其实就是2-4译码器的输出,因此在状态选择时需要的译码电路也最简单,译码速度也最快,还能够避免译码时引起了毛刺,因此对FPGA设计速度性能和功耗非常有利,在大型电路中使用的较多。
但One-hot占用寄存器资源较多,因此适合在寄存器充裕的时候使用,且切换状态时会产生不稳定态。
Sequential
这玩意书上没做过多介绍。查了一下《FPGA之道》:
“Sequential选项表示采用尽最大努力优化当前状态到下一状态的等式处理,使得产生次态的逻辑最简。”
说白了就是简化输出表达式,但是一般不会考虑资源占用问题。
Define your own
做 你 自 己


![[忆语游心] 生化危机4-重制版](https://webpn.esing.dev/img/re4_0_260502_1947_8tvn.jpg)

