引用b站大佬rong晔手册
1.Moore 型状态机: 输出只由当前状态决定,即次态=f(现状,输入),输出=f(现状);
Mealy 型状态机: 输出不但与当前状态有关,还与当前输入值有关,即次态=f(现状,输入),
输出=f(现状,输入);
Moore型时序电路:Moore机比Mealy机滞后一个时钟周期,Moore机的输出只由当前状态决定,因此当前输入只能在下一状态,就是下一个时钟周期才能发挥作用。
Mealy型时序电路:Mealy机输出受当前输入决定。Mealy机能够对输入进行实时监测。
Mealy机状态少,Moore机结构简单。
2.三段式状态机
一段式:整个状态机写到一个 always 模块里面,在该模块中既描述状态转移,又描述状态的输入和输出;
二段式:用两个 always 模块来描述状态机,其中一个 always 模块采用同步时序描述状态转移;另一个模块采用组合逻辑判断状态转移条件,描述状态转移规律以及输出;
三段式: 在两个 always 模块描述方法基础上,使用三个 always 模块,一个 always 模块采用同步时序描述状态转移,一个 always 采用组合逻辑判断状态转移条件,描述状态转移规律,另一个 always 模块描述状态输出(可以用组合电路输出,也可以时序电路输出)。
三段式状态机模板:
//第一个进程,同步时序 always 模块,格式化描述次态寄存器迁移到现态寄存器
always @ (posedge clk or negedge rst_n) //异步复位
if(!rst_n)
current_state <= IDLE;
else
current_state <= next_state; //注意,使用的是非阻塞赋值
//第二个进程,组合逻辑 always 模块,描述状态转移条件判断
always @ (current_state) //电平触发,现存状态为敏感信号
begin
next_state = x; //要初始化,使得系统复位后能进入正确的状态
case(current_state)
S1: if(...)
next_state = S2; //阻塞赋值(为什么这里用阻塞赋值)
S2: if(...)
next_state = S3; //阻塞赋值
……
endcase
end
//第三个进程,同步时序 always 模块,格式化描述次态寄存器输出
always @ (posedge clk or negedge rst_n)
begin
...//初始化
case(next_state)
S1:
out1 <= 1'b1; //注意是非阻塞逻辑
S2:
out2 <= 1'b1;
default:... //default 的作用是免除综合工具综合出锁存器
endcase
end
3.设计原则:
当要求输出对输入快速响应及希望电路尽量简单时,选择Mealy型电路。当要求时序输出稳定,能接受输出序列晚一个周期,及选择Moore型电路不增加电路复杂性时,适宜选择Moore型电路。 作者:Rong晔 https://www.bilibili.com/read/cv7680709/?from=readlist 出处:bilibili