有限状态机设计注意点
0赞读FSM设计指导笔记
1.一段式VS两段式三段式
第二种编码将同步时序和组合逻辑分别放到不同的程序块(process,block)
中实现。这样做的好处不仅仅是便于阅读、理解、维护,更重要的是利于综合器优化代码,利于用户添加
合适的时序约束条件,利于布局布线器实现设计。
2.编码方式 one-hot、gray、binary
推荐在24 个状态以上会用格雷码,在5~24 个状态会用独热码,在4 个状态以
内用二进制码,肯定独热码比二进制码在实现FSM 部分会占更多资源,但是译码输出控制简单,所以如果
状态不是太多,独热码较好。状态太少译码不会太复杂,二进制就可以了。状态太多,前面独热码所占资
源太多,综合考虑就用格雷码了。CPLD 多使用gray-code FPGA 多使用one-hot 编码
3.编码风格
一个完备的状态机(健壮性强)应该具备初始化(reset)状态和默认(default)状态。当芯片加电或者复位后,状态机应该能够自动将所有判断条件复位,并进入初始化状态。需要注明的一点是,大多数FPGA 有GSR(Global Set/Reset)信号,当FPGA 加电后,GSR 信号拉高,
对所有的寄存器,RAM 等单元复位/置位,这时配置于FPGA 的逻辑并未生效,所以不能保证正确的
进入初始化状态。所以使用GSR 进入FPGA 的初始化状态,常常会产生种种不必一定的麻烦。一般
简单方便的方法是采用异步复位信号,当然也可以使用同步复位,但是要注意同步复位的逻辑设计。
状态的定义用 parameter 定义,不推荐使用`define 宏定义的方式
一定要使用”<=”非阻塞赋值方式 采用非阻塞赋值方式消除很多竞争冒险的隐患
//在 ISE 和Foundation 中都提供了state-maching 生成器,用生成器生成FSM 可以避免大多数问题,
而且代码规范。在了解状态机的设计原理后,就可以把主要精力放在如何进行算法的设计与优化。