修改编码_状态机的编码

通过RTL改善时序之状态机的编码

今天要讨论的内容对很多PLD的开发人员来说是个老生常谈了。我们就当是梳理复习了。毕竟“苟日新,日日新”嘛!

状态机是我们在做逻辑设计里经常要用到的电路结构。但很多人并没有认识到状态机的编码方式会对时序有很大的影响。在状态机的设计里,信号的输出是根据状态机寄存器的状态及相关的其它信号译码决定的。(在这里,我们不去讨论Moore机和Mealy机的区别)。这个译码逻辑越复杂,对时序的影响越大。

状态机的编码主要有二进制(binary)编码,格雷码(gray)和独热码(one-hot)这几种。

二进制编码采用二进制计数的方式标注每一个状态,一个由N个寄存器组成的二进制状态机可以标注2N个状态。可以看到,使用二进制编码,编码的效率是最高的,最节省寄存器资源。但二进制编码有一个明显的缺点,相邻的两个状态之间会出现多个寄存器同时翻转的情况。比如从状态“0111”到“1000”,4个寄存器在进入下一状态的时候都会翻转。由于物理上4个寄存器的位置和延时有细微的差别,在状态翻转的时候,就可能出现竞争冒险的情况,造成状态机译码逻辑的输入不是“1000”而是其他的状态(比如1111)。为了规避二进制编码的这个缺陷,提出了格雷码(gray)。

格雷码(Gray Code)是由贝尔实验室的弗兰克·格雷(Frank Gray,1887-1969)在20世纪40年代提出,并在1953年取得美国专利“Pulse Code Communication”。格雷码是二进制编码的改进,他的寄存器的利用效率和二进制编码是一样的。也是N个寄存器可以标注2N个状态。区别在于格雷码保证在相邻的两个状态之间,只有一个状态机的寄存器会翻转。以4个状态的状态机为例:

二进制编码的顺序是:00,01,10,11

格雷码的编码顺序是:00,01,11,10

dc79a38b71b0b0c3456b5e40dc48bd52.png

可以看到,在二进制编码中,在第二个状态到第三个状态,第四个状态到第一个状态跳转的时候,两个寄存器都发生了翻转。而在格雷码中,有且只有一个状态寄存器会翻转。

格雷码有效的解决了二进制编码相邻状态多个寄存器翻转的问题。但有两个问题依然存在:

译码逻辑复杂,需要对每个状态机寄存器的所有状态做判断

如果状态的跳转不是顺序的,格雷码状态机会遇到和二进制编码一样的问题

独热码不同于二进制编码和格雷码。独热码用N个寄存器标注N个状态,每一个状态里,只有一个状态寄存器为1。任意两个状态机之间,有且只有两个状态机寄存器会翻转。独热码标注一个4状态的状态机是这样的:

独热码:0001,0010,0100,1000

dc79a38b71b0b0c3456b5e40dc48bd52.png

独热码一个显而易见的缺点是占用的寄存器资源比二进制编码和格雷码多。但我们衡量一个编码的好坏不能仅仅从它占用的寄存器资源来评估,特别是现在的PLD内部的寄存器资源越来越丰富的情况下。独热码最大的好处是它的译码逻辑要比前两者都简单,相应的需要译码的组合逻辑也更少。由译码带来的延时就更小。我们在改进时序的时候,要改进的就是组合逻辑的延时。所以在可能的情况下,尽量用独热码来实现状态机是提高时序的有效手段。

现在的综合工具都会提供状态机自动编码的手段。在综合的时候,工具会根据你的状态机设计改变你的状态机编码方式。也就是你在RTL设计的时候,虽然定义的状态机是二进制或格雷码,最终在综合的时候,已经变成的独热码。通过检测综合的报告,你可以看到哪些状态机被综合工具修改了。在综合工具的GUI里,你可以修改状态机编码的策略。

ced4f2806f0e2556543deec8f571d406.png

你也可以在RTL代码中,指定状态机的编码方式,不让综合工具修改你设计好的状态机编码。语法格式是:

Reg [3:0] fsm_current,fsm_next /* synthesis syn_encoding = "sequential|gray|onehot" */;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值