介绍及分类
状态机简写为FSM(Finite State Machine),也称为同步有限状态机。
数字系统有两大类有限状态机(Finite State Machine,FSM):摩尔(Moore)状态机和米勒(Mealy)状态机。
摩尔(Moore)状态机:
其最大特点是输出只由当前状态确定,与输入无关。Moore状态机的状态图中的每一个状态都包含一个输出信号。
换言之,在状态中包含了和输出的映射关系
米勒(Mealy)状态机:
它的输出不仅与当前状态有关系,而且与它的输入也有关系,因而在状态图中每条转移边需要包含输入和输出的信息。
这种和输入的关联会导致干扰,产生毛刺现象,所以通常使用Moore状态机。
状态编码
数字逻辑系统状态机设计中常见的编码方式有:二进制码(Binary码)、格雷码(Gray码)、独热码(One-hot码)。
编码方式选择:
- 格雷码:状态数>24,只有一个状态发生反转,降低毛刺和功耗
- 独热码:状态机状态<4
- 二进制码:状态机状态4-24
高速系统中无论状态个数,都建议使用独热码
状态机的编程风格
状态机有三种描述方式:一段式状态机、两段式状态机、三段式状态机。
一段式状态机
把整个状态机写在一个always模块中,既包含状态转移,又含有组合逻辑输入/输出时,称为一段式状态机,不推荐采用。
//一段式状态机的实现:在异步复位信号的控制下,一段式状态机进入IDLE
//状态,q_sig4被复位,一旦sig1或者sig2有效,状态机进入WAIT状态,如果
//sig1和sig2同时有效,那么状态机进入DONE状态,
//如果sig4还有效,那么q_sig4置位,同时状态机进入IDLE状态。
module one_seg_fsm(clk,reset,sig1,sig2,sig3,q_sig4,q_sm_state);
//数据声明部分
input clk,reset,sig1,sig2,sig3;
output reg q_sig4;
output reg [1:0] q_sm_state;
//参数声明
parameter IDLE = 2'b00;
parameter WAIT = 2'b01;
parameter DONE = 2'b10;
//状态跳转逻辑程序设计
always @(posedge clk or posedge reset)
begin
if(reset)
begin
q_sig4 <= 0;
q_sm_state <= IDLE;
end
else
begin
case(q_sm_state)
IDLE: begin
if(sig1 || sig2)
begin
q_sm_state <= WAIT;
q_sig4 <= 1'b0