第1节 有限状态机(FSM)设计
第1节 有限状态机(FSM)设计
- 有限状态机是重要的逻辑设计方法,通过状态转移图可以将复杂的控制时序分解为状态之间的转换关系。
- 状态机类型:
--Moore型:状态机的输出仅是当前状态的函数,且仅在时钟跳变时发生变化;
--Mealy型:状态机的输出是当前状态和当前输入的函数,任何输入信号的变化都可能引起输出信号的变化,不与时钟同步。
- 状态机的编码:
--二进制编码 vs. One-Hot编码
--例:4个状态
-二进制编码:00, 01, 10, 11(或格雷码等)
-One-Hot编码:0001, 0010, 0100, 1000
--二进制编码使用较少的触发器和较多的组合逻辑;适用于CPLD和小型状态机设计;
--One-Hot编码使用较多的触发器和较少的组合逻辑;适用于FPGA和大型状态机设计;
--可通过设置软件的选项来选择状态机编码;
- 有限状态机设计的方法有两大类:
--将状态转移和状态操作和判断写在一个模块里;
--将状态转移写成一个单独的模块,将状态的操作和判断写到另一个模块中;
- 状态机较复杂时,后者是比较好的设计方式。
--便于阅读、理解、维护;
--状态转移是用寄存器实现的,是同步时序部分;状态的判断是组合逻辑;
--利于综合工具优化代码;
--利于用户添加时序约束;
--利于布局布线软件对设计的实现。
- 一个健壮的状态机应该具备初始化状态和默认状态(缺省状态);
--当芯片加电或复位后,状态机应该能够自动将所有判断条件复位,并进入初始化状态;
--状态机应该有一个默认状态,当转移条件不满足或状态发生突变时,保证逻辑不会陷入死循环。这就要求尽量使用完备的条件判断语句。
--VHDL中,使用case语句时,要用when others建立默认状态,使用if…then…else语句时,用else指定默认状态;
--Verilog中,使用case语句时,要用default建立默认状态,使用if…else语句时也要完备。
- 指定默认的输出值:
--能够防止无意生成的锁存器;
--输出经过一个寄存器,以获得更好的时序环境;
- 状态机输出逻辑复用
--如果在状态机中有多个状态都会执行某项操作,则可以在状态机外部定义这个操作的具体内容,在状态机中仅仅调用这个操作即可。
--相当于前面提到的资源共享。
<<上一节 下一节>>