常用的编码有三种:二进制编码、Gray码、one-hot编码。另外,还可以自定义编码,比如在高速设计中以状态编码作为输出。
一.二进制编码
顺序二进制编码,即将状态依次编码为顺序的二进制数。顺序二进制编码是最紧密的编码,优点在于它使用的状态向量位数最少。例如对于6
个状态的状态机,只需要 3 位二进制数来进行编码,因此只需要 3
个触发器来实现,节约了逻辑资源(在实际应用中,往往需要较多组合逻辑对状态向量进行解码以产生输出,因此实际节约资源的效果并不明显)。在上面的例子中,3
位二进制数总共有8 种可能的编码模式,其中 6 种用来表示有效状态,剩下的2
种是无效编码。有人认为顺序二进制编码还有一个好处。当芯片受到粒子辐射或者由于异步输入等问题可能会造成状态跳转失常。如果失常中状态机跳转到无效的编码状态则可能会出现死机,除非复位否则永远无法回到
IDLE 状态。而因为顺序二进制编码最紧密,所以无效编码最少。失常时有更大的概率跳转到的有效状态,并最终回到IDLE
状态。这种预想的好处并不会发生在实际中。首先,失常的跳转到有效状态并不意
味着能够最终回到IDLE 状态。例如在某个有效状态,状态机循环等待某输入信号,并作出应答。如果状态机失常的跳转到该状态,同样会陷入死等,因为输入信号并不会到来。其次,失常的跳转到有效状态,意味着可能在不正确的时机产生输出,这样会将故障传播到其他模块。在很多应用中人们宁愿死机不输出任何信号也不愿意输出错误的信号。可见使用顺序二进制编码并不能使得状态机具有所想象的容错能力。
二.Gray码
Gray码在发生状态跳转时,状态向量只有一位发生变化。理论上说
Gray状态机在状态跳转时不会有任何毛刺。但是实际上综合后的状态机是否还有这个好处也很难说。Gray码状态机设计中最大的问题是,在状态机很复杂状态跳转的分支很多时,要合理的分配状态编码保证每个状态跳转都仅有
1 位发生变化,这是很困难的事情。
三.one-hot编码
味着能够最终回到IDLE 状态。例如在某个有效状态,状态机循环等待某输入信号,并作出应答。如果状态机失常的跳转到该状态,同样会陷入死等,因为输入信号并不会到来。其次,失常的跳转到有效状态,意味着可能在不正确的时机产生输出,这样会将故障传播到其他模块。在很多应用中人们宁愿死机不输出任何信号也不愿意输出错误的信号。可见使用顺序二进制编码并不能使得状态机具有所想象的容错能力。
二.Gray码
三.one-hot编码
