1.定义
状态机,全称是有限状态机(Finite Stata Machine,FSM),是一种在有限个状态之间按一定要求和规律转换的时序电路。状态机通过控制各个状态的跳转来控制流程。在Verilog中编写相关代码时,类似在学习C语言用到的case语句。
2 Moore、Mealy状态机。
根据状态机的输出是否与输入条件相关分为两类:Moore状态机、Mealy状态机。
Moore 状态机:组合逻辑的输出只取决于当前状态。
Mealy 状态机:组合逻辑的输出不仅取决于当前状态,还取决于输入状态。
3.三段式状态机
根据状态机的实际写法,状态机还可以分为一段式、二段式和三段式状机。
一段式:整个状态机写到一个 always 模块里面,在该模块中既描述状态转移,又描述状态的输入和输出。不推荐采用这种状态机,因为从代码风格方面来讲,一般都会要求把组合逻辑和时序逻辑分开;从代码维护和升级来说,组合逻辑和时序逻辑混合在一起不利于代码维护和修改,也不利于约束。
二段式:用两个 always 模块来描述状态机,其中一个 always 模块采用同步时序描述状态转移;另一个模块采用组合逻辑判断状态转移条件,描述状态转移规律以及输出。不同于一段式状态机的是,它需要定义两个状态,现态和次态,然后通过现态和次态的转换来实现时序逻辑。
三段式:在两个 always 模块描述方法基础上,使用三个 always 模块,一个 always 模块采用同步时序描述状态转移,一个 always 采用组合逻辑判断状态转移条件,描述状态转移规律,另一个 always 模块描述状态输出(可以用组合电路输出,也可以时序电路输出)。
实际应用中三段式状态机使用最多,因为三段式状态机将组合逻辑和时序分开,有利于综合器分析优化以及程序的维护;并且三段式状态机将状态转移与状态输出分开,使代码看上去更加清晰易懂,提高了代码的可读性,推荐使用三段式状态机。
三段式状态机的基本格式是:
第一个 always 语句实现同步状态跳转;
第二个 always 语句采用组合逻辑判断状态转移条件;(用always@(*)实现组合逻辑)
第三个 always 语句描述状态输出(可以用组合电路输出,也可以时序电路输出)。
注:以上参考正点原子FPGA开发文档。
待更新