状态编码就是对最小化状态表中用字母或数字表示的状态指定一个
二进制代码。
代码简介
对最小化状态表中用字母或数字表示的状态指定一个
二进制代码,称状态编码或称状态分配。状态编码后的最小化状态表称为二进制状态表。
状态编码的方案不同,所得到的输出函数和激励函数的表达式也不相同,从而使设计出来的
时序逻辑电路其复杂程度也不相同。
状态编码的实现步骤
1、确定状态编码的长度,即二进制代码的位数,也就是
触发器的个数。
状态编码的长度是由最小化状态表中的状态个数确定。设最小化状态表的状态数为N,状态编码的长度为m,状态数N与状态编码长度m的关系为:2m-1 < N ≤2m。
2、最佳的或者接近最佳的状态分配方案,
这使所设计的
同步时序逻辑电路的输出函数和激励函数最简单。
状态编码方案的好坏还与所采用的触发器类型有关。也就是,某种状态编码方案,对某种触发器是最佳的编码方案,然而换成另一种触发器就不一定是最佳的状态编码方案。由此可见,一种最佳状态编码方案涉及的因素很多。
状态编码基本原则
1、状态表中的两个现态,如果在相同外部输入(X=0或X=1)条件下,这两个现态的次态相同,则尽可能给这两个现态分配相邻的代码。
2、状态表中的一个现态,如果在不同外部输入(X=0且X=1)条件下,这个现态的两个次态不相同,则尽可能给这两个次态分配相邻的代码。
3、状态表中两个现态,如果在不同外部输入条件下,这个次态有相同的外部输出,则尽可能给两个现态分配相邻的代码。
4、 状态表中出现次数最多的状态在状态编码上为逻辑0。
编码方法
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。