状态机状态编码方法

常用的编码有三种:二进制编码、Gray码、one-hot编码。另外,还可以自定义编码,比如在高速设计中以状态编码作为输出。


一.二进制编码


顺序二进制编码,即将状态依次编码为顺序的二进制数。顺序二进制编码是最紧密的编码,优点在于它使用的状态向量位数最少。例如对于6 个状态的状态机,只需要 3 位二进制数来进行编码,因此只需要 3 个触发器来实现,节约了逻辑资源(在实际应用中,往往需要较多组合逻辑对状态向量进行解码以产生输出,因此实际节约资源的效果并不明显)。 在上面的例子中,3 位二进制数总共有8 种可能的编码模式,其中 6 种用来表示有效状态,剩下的2 种是无效编码。 

有人认为顺序二进制编码还有一个好处。当芯片受到粒子辐射或者由于异步输入等问题可能会造成状态跳转失常。如果失常中状态机跳转到无效的编码状态则可能会出现死机,除非复位否则永远无法回到 IDLE 状态。而因为顺序二进制编码最紧密,所以无效编码最少。失常时有更大的概率跳转到的有效状态,并最终回到IDLE 状态。 这种预想的好处并不会发生在实际中。首先,失常的跳转到有效状态并不意味着能够最终回到IDLE 状态。例如在某个有效状态,状态机循环等待某输入信号,并作出应答。如果状态机失常的跳转到该状态,同样会陷入死等,因为输入信号并不会到来。其次,失常的跳转到有效状态,意味着可能在不正确的时机产生输出,这样会将故障传播到其他模块。在很多应用中人们宁愿死机不输出任何信号也不愿意输出错误的信号。 可见使用顺序二进制编码并不能使得状态机具有所想象的容错能力。


二.Gray码


Gray码在发生状态跳转时,状态向量只有一位发生变化。理论上说 Gray状态机在状态跳转时不会有任何毛刺。但是实际上综合后的状态机是否还有这个好处也很难说。Gray码状态机设计中最大的问题是,在状态机很复杂状态跳转的分支很多时,要合理的分配状态编码保证每个状态跳转都仅有 1 位发生变化,这是很困难的事情。

三.one-hot编码


虽然独热码多用了触发器,但所用组合电路可省一些,因而使电路的速度和可靠性有显著提高,而总的单元数并无显著增加。同时独热码在状态跃迁时仅需要改变状态变量的某一位,在一定程度上简化了比较逻辑,从而减少了毛刺产生的概率。同时采用独热编码后有了多余的状态,就有了一些不可达到的状态。

此,在case 语句的最后需要增加default 分支项。 one-hot编码有很多变体。比如将 IDLE 状态编码为0,其他状态按照正常的one-hot编码。即对于除IDLE 外的每个给定状态,对应的状态向量只有一位置1,其他位置0。这种变体的好处是在复位时可简单的将状态向量的各个触发器清 0。 

另一种常见的变体称为"almost one-hot" 编码。假设状态机有功能几乎相同的两组状态(例如,处理对某设备的读访问和写访问),可以使用1 个状态位来指示状态机当前正处在两组状态中的哪一组,而剩下的状态位采用普通的one-hot编码(例如一组状态为4'b0001, 4'b0010, 4'b0100,另一组为4'b1001, 4'b1010, 4'b1100)。因此要对给定状态进行完整的解码需要考察两个状态位。这种机制具有使用纯one-hot编码的大多数好处,但逻辑更小。 one-hot 状态机有一个缺点,它的状态每次发生跳转,很多状态位都会发生变化。首先,状态机的输出往往是由状态位组合生成的。同时变化的状态位越多,组合输出稳定前所需的时间就越长,产生的毛刺就越多。如果该输出不经同步就直接连接到寄存器的时钟、使能、或锁存器的使能等控制端口,将很容易导致数据的破坏(正统解决方案是加一级寄存器来同步状态机的输出,该方案可能会产生一个周期的延迟,而且如果该输出稳定前所需的时间过长还是会违背寄存器的建立时间)。其次,对于有异步输入的系统,在时钟沿到来时有多个状态位发生变化,即有多个寄存器可能受异步输入的影响,使得亚稳态发生的概率有所增加(虽然这并不是one-hot编码的问题,根本的解决方案还是避免异步输入)。

你可能感兴趣的:(FPGA基础)