一段式:整个状态机写到一个always模块里面,在该模块中既描述状态转移,又描述状态的输入和输出;
二段式:用两个always模块来描述状态机,其中一个always模块采用同步时序描述状态转移;另一个模块采用组合逻辑判断状态转移条件,描述状态转移规律以及输出;
三段式:在两个always模块描述方法基础上,使用三个always模块,一个always模块采用同步时序描述状态转移,一个always采用组合逻辑判断状态转移条件,描述状态转移规律,另一个always模块描述状态输出(可以用组合电路输出,也可以时序电路输出)。
三段式状态机示例模板:
//第一个进程,同步时序always模块,格式化描述次态寄存器迁移到现态寄存器
//异步复位
if(!rst_n)
else
//注意,使用的是非阻塞赋值
//第二个进程,组合逻辑always模块,描述状态转移条件判断
//电平触发,现存状态为敏感信号
begin
case(current_state)
//阻塞赋值
//阻塞赋值
...
endcase
end
//第三个进程,同步时序always模块,格式化描述次态寄存器输出
always @ (posedge clk or negedge rst_n)
begin
...//初始化
case(next_state)
//注意是非阻塞逻辑
//default的作用是免除综合工具综合出锁存器
endcase
end
文章来源: https://blog.csdn.net/ffdia/article/details/88773747