FSM的分类:
Mealy状态机:时序逻辑电路的输出不但取决于状态,还取决于输入。
Moore状态机:时序逻辑电路的输出只取决于当前状态。
Tips:状态机输出变量在高钟下应打一拍,以实现流水线化的输出(pipelined outputs)
FSM的编码:
对于用FPGA实现的有限状态机建议采用独热码(one-hot code,实验室项目在用),因为虽然独热码采用了更多的触发器,但所用组合电路可省一些,因而使电路的速度和可靠性有显著提高,而总的单元数并无显著增加。采用独热码后有了多余的状态,就有一些不可达的状态。为此,在case语句的最后需要增加default分支项。这可以用默认项表示该项,也可以用确定项表示,以确保回到Idle状态。
FSM组合逻辑:
利用电平敏感的always块来设计纯组合逻辑电路时,在生成组合逻辑的always块中参与赋值的所有信号都必须有明确的值,即在赋值表达式右端参与赋值的信号都必须在always@(敏感电平列表)中列出。如果在赋值表达式右端引用了敏感电平列表中没有列出的信号,那么在综合时,将会为该没有列出的信号隐含地产生一个透明锁存器。这是因为该信号的变化不会立刻引起所赋值的变化,而必须等到敏感电平列表中某一个信号变化时,它的作用才显现出来,也就是相当于存在着一个透明锁存器,即把该信号的变化暂存起来,待敏感电平列表中某一个信号变化时再起作用,纯组合逻辑电路不可能做到这一点。这样,综合后所得的电路已经不是纯组合逻辑电路了,这时综合器会发出警告,提示设计中插入了锁存器。
参考文档:
1,《Verilog数字系统设计教程 第四版 夏宇闻》
2,Verilog中状态机编码方式的选择:二进制编码、格雷码编码、独热码编码
3,三段式状态机写法