在状态机的编码方式中,我们常用到三种编码方式,分别是二进制编码、格雷码、独热码。
二进制编码:也称连续编码,属于压缩编码方式,可以使用较少的触发器对应更多的状态;
格雷码:属于压缩编码方式,由于其编码特性,相邻两个格雷码之间只有1bit不同,相邻状态切换时,只有一个触发器的输出会翻转,可以尽量避免多bit信号之间的数据歪斜。
独热码:使用N个触发器表示N个状态,每一时刻只有一个触发器的输出有效。
我们以一个实际的编码例子对比下三者:
二进制编码 | 000 | 001 | 010 | 011 | 100 |
格雷码 | 000 | 001 | 011 | 010 | 110 |
独热码 | 00001 | 00010 | 00100 | 01000 | 10000 |
三者的优缺点:
二进制编码 | 格雷码 | 独热码 | |
---|---|---|---|
优点 | 1.触发器利用率高 2.仅用较少的触发器就能表示较多的状态 | 1.触发器利用率高 2.可以避免多bit信号的数据歪斜 3.状态切换速度较快 | 1.状态切换速度快 2.译码简单 |
缺点 | 1.状态之间切换速度慢 2.译码复杂 | 译码复杂 | 会使用较多的触发器,触发器利用率不高 |
使用推荐:
高速系统下统一采用独热码;
低速系统下:
状态个数<4 | 状态个数在[4,24]区间 | 状态个数>24 |
---|---|---|
二进制码 | 独热码 | 格雷码 |
因为在低速系统下,如果状态个数较多,多bit之间的歪斜可以通过set_max_delay进行约束,相对高速系统来说时序会更容易满足,具体可参考之前的文章:
异步FIFO约束set_max_delay_异步fifo时序约束-CSDN博客