一、FSM的独热结构改进设计
在数字电路设计中,我们经常需要设计不同的状态机。
很多现有的书中介绍了一些常用的状态机结构,并且介绍了一些这些状态机的优缺点。
比如一段式,适用于简单的状态机,优点是写在一起代码量少,缺点包括不限于可读性差、适用范围小等。。。
两段式将一段式的代码进行了拆分,分为状态的跳变和每个状态的信号变化两个部分。
优点在于相对于一段式,进一步优化了可读性和设计的灵活性,代码的复用性也得到了一些提高。
三段式就是书中介绍的最优结构状态机。三段式用一个时序逻辑描述状态的跳变。另一个时序逻辑描述状态指针的变化情况。一个组合逻辑来具体描述每一个状态中我们进行怎样的电路变化。三段式相对于一段式和二段式来说进一步优化了电路的可读性和修改设计时的便利性,而且也提高了代码的复用性。
那么问题来了,FSM的优化到这里就结束了吗?我们是不是就不能继续做优化了呢?
当然不是。
二、FSM的独热结构初级优化
针对上面的三段式,我们还可以进一步优化。我们都知道,在电路中,状态机的变化是一组寄存器的赋值,这一组寄存器的赋值未必是准确的。事实上如果状态机太过复杂,比如一个状态机有128个状态,那么考虑到最坏的情况,显示状态机状态的寄存器存在一个周期同时改变16bit数值的可能性。在高速电路中,这样的设计会降低电路的可靠性。
基于这个考虑,有些人想出了一个非常简单的方式:使用独热码来作为状态机状态标识电路。比如我可以这样:
parameter IDLE = 8'b0;
parameter rx = 8'b1;
parameter tx = 8'b10;
...
parameter error = 8'b1000_0000;
这样我们的状态切换稳定性就得到了保障,任意状态之间的切换最坏也只需要改变两个bit,在高速电路中这个优化是非常有必要的。
那么问题来了,是不是状态机我们只能优化到这样呢?
当然不是,我们可以顺着这个思路进一步优化我们的FSM。
三、FSM的独热结构进阶优化
简单的分析一个常用的三段式:
parameter IDLE = 6'b000_001; parameter STA0 = 6'b000_010;
parameter STA1 = 6'b000_100; parameter STA2 = 6'b001_000;
parameter STA3 = 6