简介
对最小化状态表中用字母或数字表示的状态指定一个二进制代码,称状态编码或称状态分配。状态编码后的最小化状态表称为二进制状态表。
状态编码的方案不同,所得到的输出函数和激励函数的表达式也不相同,从而使设计出来的时序逻辑电路其复杂程度也不相同。
状态编码的实现步骤1、确定状态编码的长度,即二进制代码的位数,也就是触发器的个数。
状态编码的长度是由最小化状态表中的状态个数确定。设最小化状态表的状态数为N,状态编码的长度为m,状态数N与状态编码长度m的关系为:2m-1 2、最佳的或者接近最佳的状态分配方案,
这使所设计的同步时序逻辑电路的输出函数和激励函数最简单。
状态编码方案的好坏还与所采用的触发器类型有关。也就是,某种状态编码方案,对某种触发器是最佳的编码方案,然而换成另一种触发器就不一定是最佳的状态编码方案。由此可见,一种最佳状态编码方案涉及的因素很多。
状态编码基本原则1、状态表中的两个现态,如果在相同外部输入(X=0或X=1)条件下,这两个现态的次态相同,则尽可能给这两个现态分配相邻的代码。
2、状态表中的一个现态,如果在不同外部输入(X=0且X=1)条件下,这个现态的两个次态不相同,则尽可能给这两个次态分配相邻的代码。
3、状态表中两个现态,如果在不同外部输入条件下,这个次态有相同的外部输出,则尽可能给两个现态分配相邻的代码。
4、 状态表中出现次数最多的状态在状态编码上为逻辑0。1
状态编码方法1、二进制编码
顺序二进制编码,即将状态依次编码为顺序的二进制数。顺序二进制编码是最紧密的编码,优点在于它使用的状态向量位数最少。例如对于6 个状态的状态机,只需要 3 位二进制数来进行编码,因此只需要 3 个触发器来实现,节约了逻辑资源(在实际应用中,往往需要较多组合逻辑对状态向量进行解码以产生输出,因此实际节约资源的效果并不明显)。 在上面的例子中,3 位二进制数总共有8 种可能的编码模式,其中 6 种用来表示有效状态,剩下的2种是无效编码。
有人认为顺序二进制编码还有一个好处。当芯片受到粒子辐射或者由于异步输入等问题可能会造成状态跳转失常。如果失常中状态机跳转到无效的编码状态则可能会出现死机,除非复位否则永远无法回到 IDLE 状态。而因为顺序二进制编码最紧密,所以无效编码最少。失常时有更大的概率跳转到的有效状态,并最终回到IDLE 状态。 这种预想的好处并不会发生在实际中。首先,失常的跳转到有效状态并不意味着能够最终回到IDLE 状态。例如在某个有效状态,状态机循环等待某输入信号,并作出应答。如果状态机失常的跳转到该状态,同样会陷入死等,因为输入信号并不会到来。其次,失常的跳转到有效状态,意味着可能在不正确的时机产生输出,这样会将故障传播到其他模块。在很多应用中人们宁愿死机不输出任何信号也不愿意输出错误的信号。 可见使用顺序二进制编码并不能使得状态机具有所想象的容错能力。
2、Gray码
Gray码在发生状态跳转时,状态向量只有一位发生变化。理论上说 Gray状态机在状态跳转时不会有任何毛刺。但是实际上综合后的状态机是否还有这个好处也很难说。Gray码状态机设计中最大的问题是,在状态机很复杂状态跳转的分支很多时,要合理的分配状态编码保证每个状态跳转都仅有 1 位发生变化,这是很困难的事情。
3、one-hot编码
虽然独热码多用了触发器,但所用组合电路可省一些,因而使电路的速度和可靠性有显著提高,而总的单元数并无显著增加。同时独热码在状态跃迁时仅需要改变状态变量的某一位,在一定程度上简化了比较逻辑,从而减少了毛刺产生的概率。同时采用独热编码后有了多余的状态,就有了一些不可达到的状态。
为此,在case 语句的最后需要增加default 分支项。 one-hot编码有很多变体。比如将 IDLE 状态编码为0,其他状态按照正常的one-hot编码。即对于除IDLE 外的每个给定状态,对应的状态向量只有一位置1,其他位置0。这种变体的好处是在复位时可简单的将状态向量的各个触发器清 0。
另一种常见的变体称为"almost one-hot" 编码。假设状态机有功能几乎相同的两组状态(例如,处理对某设备的读访问和写访问),可以使用1 个状态位来指示状态机当前正处在两组状态中的哪一组,而剩下的状态位采用普通的one-hot码。因此要对给定状态进行完整的解码需要考察两个状态位。这种机制具有使用纯one-hot编码的大多数好处,但逻辑更小。 one-hot 状态机有一个缺点,它的状态每次发生跳转,很多状态位都会发生变化。首先,状态机的输出往往是由状态位组合生成的。同时变化的状态位越多,组合输出稳定前所需的时间就越长,产生的毛刺就越多。如果该输出不经同步就直接连接到寄存器的时钟、使能、或锁存器的使能等控制端口,将很容易导致数据的破坏(正统解决方案是加一级寄存器来同步状态机的输出,该方案可能会产生一个周期的延迟,而且如果该输出稳定前所需的时间过长还是会违背寄存器的建立时间)。其次,对于有异步输入的系统,在时钟沿到来时有多个状态位发生变化,即有多个寄存器可能受异步输入的影响,使得亚稳态发生的概率有所增加,虽然这并不是one-hot编码的问题,根本的解决方案还是避免异步输入。2