状态机所包含的N种状态通常需要用某种编码方式表示,即状态编码,或状态分配。
选择合适的编码方案,将有助于电路的面积和资源的利用。
状态编码最常见的三种类型是:顺序二进制编码、格雷码和独热码、约翰逊编码
顺序编码(Sequential State Machine Encoding)
二进制编码为最紧凑的编码,采用顺序的二进制数编码的每个状态。
eg. state0 state1 state2 state3 表示为 '00' '01' '10' '11'
优点在于它使用状态向量的位数最小。但其从一个状态转换到另一个状态时,可能会有多位比特位发生变化,[有中间态产生] 瞬变次数多,易产生毛刺,引发逻辑错误
格雷码(Gray Code )
在相邻状态的转换中,每次只有一位比特位发生变化,可以减少产生毛刺和一些暂态的可能,但不适合于有很多状态跳转的情况。
递归生成码表
这种方法基于格雷码是反射码的事实,利用递归的如下规则来构造:
-
1位格雷码有两个码字
-
(n+1)位格雷码中的前2n个码字等于n位格雷码的码字,按顺序书写,加前缀0
-
n+1位格雷码的集合 = n位格雷码集合(顺序)加前缀0 + n位格雷码集合(逆序)加前缀1
2位格雷码 | 3位格雷码 | 4位格雷码 | 4位自然二进制码 |
---|---|---|---|
00 | 000 | 0000 | 0000 |
01 | 001 | 0001 | 0001 |
11 | 011 | 0011 | 0010 |
10 | 010 | 0010 | 0011 |
110 | 0110 | 0100 | |
111 | 0111 | 0101 | |
101 | 0101 | 0110 | |
100 | 0100 | 0111 | |
1100 | 1000 | ||
1101 | 1001 | ||
1111 | 1010 | ||
1110 | 1011 | ||
1010 | 1100 | ||
1011 | 1101 | ||
1001 | 1110 | ||
1000 | 1111 |
独热编码
即 One-Hot 编码,又称一位有效编码,每个码元值只有一位是'1',其他位都是'0',
如S0=3'b001,S1=3'b010,S2=3'b100
即N个状态需要N个触发器。独热码状态机的速度仅与到某特定状态的转移数量有关而与状态数量无关,速度很快。且由于其状态译码简单,所以节省和简化了组合逻辑电路。FPGA器件由于寄存器数量多而逻辑门资源紧张,采用独热编码可以有效提高FPGA资源的利用率和电路的速度。独热码还具有设计简单、修改灵活和易于调试、易于综合、易于寻找关键路径、易于进行静态时序分析等优点。因此尽量采用独热编码。
NEXT PAGE:
在综合器中指定编码方式