1.2.7 Verilog有限状态机

文章目录

  • 一、有限状态机概述
  • 二、有限状态机的设计思想
  • 三、有限状态机的设计
    • 1.状态机的编码
    • 2.状态机的复位
    • 3.状态机的条件跳转
    • 4.状态机的输出
  • 四、有限状态机的设计步骤
  • 五、状态机的3种描述风格
  • 六、有限状态机的判别标准

一、有限状态机概述

1.任何事物都可以用一种模型来描述:给定某个输入就有特定的输出,这个输出可能只与当前输入相关,也可能与以前的历史输入相关(数学上称为马尔可夫过程)。
2.对应到逻辑电路上,即,任何一个复杂的数字电路功能都可以通过对其输入输出行为的描述来进行准确描述。通过存储器加上组合电路就能够完整地描述任何复杂的数字电路功能
3.在数字逻辑设计中,这种建模方法被称为有限状态机(Finite State Machine,FSM)。有限状态机可以将任意模型简化为这样的描述:将要输出的结果是当前状态以及当前输入的组合

二、有限状态机的设计思想

有限状态机是由:一组状态(State),一个起始状态(Start State),一组输入以及根据输入和现有状态转换为下一个状态的转换函数(Transition)组成的状态模型,如图:
1.2.7 Verilog有限状态机_第1张图片
有限状态机是闭环系统,状态可以无线循环跳转,可以用有限的状态处理无限的事务。

三、有限状态机的设计

有限状态机的设计可分为四个部分:状态机的编码、状态机的复位、状态机的条件转移、状态机的输出

1.状态机的编码

状态机的编码主要是为了定义参数,增强程序可读性。常用的是顺序码,格雷码,独热码
1.格雷码:可以减少相邻状态瞬变的次数,有时若不能在所有状态中采用格雷码,则应在状态矢量中增加触发器的数量以减少开关的次数。
2.独热码:编码使用触发器较多,却可以减少组合逻辑的使用,在带多个输出且每个输出是几个状态的函数的状态机更是如此

2.状态机的复位

复位有两种:同步复位和异步复位。
1.同步复位:复位要与分频后的时钟信号同步,触发信号仅为分频后的时钟信号。
2.异步复位:复位与分频后的时钟信号和复位信号都参与触发。
此外,由于电路的外部干扰等,状态机存在进入未知状态的情况,此时需要对状态机进行自动复位,添加看门狗电路就是最佳选择。

3.状态机的条件跳转

这是状态机的核心部分。状态机的条件跳转是控制整个状态机在状态之间的切换,从而决定输出的情况

4.状态机的输出

状态机的输出有两种描述风格:摩尔(moore)型米利(mealy)型
1.moore型状态机的输出只与当前状态有关
2.mealy型状态机的输出不仅与当前状态有关,还与输入有关
因为mealy型状态机的输出与输入有关,输出信号中很容易出现毛刺,所以建议使用moore型状态机进行描述。

四、有限状态机的设计步骤

1.第一步:对描述的逻辑进行凑想,得到状态转换图,实际上就是将逻辑关系表示为时序逻辑函数的过程。通常包含以下步骤:
(1)分析给定的逻辑问题,确定输入变量,输出变量,以及电路的状态数。通常取原因(或条件)为输入变量,取结果为输出变量。
(2)定义输入,输出逻辑状态的含义,并将电路状态顺序编号。
(3)按照要求列出电路的状态转换表或画出状态转换图。
经过以上步骤,就把给定的逻辑问题抽象成了一个时序逻辑函数。
2.第二步:状态化简,可以有效降低电路实现的复杂度。电路的状态越少,存储电路就越简单。此步骤的目的在于将等价状态合并,从而得到最简的状态转换图。
3.第三步:状态分配,对每一个状态分配一个寄存器值。
4.第四步:选定触发器的类型并求出状态方程,驱动方程和输出方程。
5.第五步:按照方程得出逻辑图。

五、状态机的3种描述风格

1.描述风格有三种:一段式,二段式,三段式。其中三段式效果最佳。
2.三段式状态机的“三段”:
(1)更新状态寄存器
(2)状态的跳转过程
(3)输出结果
示例代码:

module FSM_style3(
input clk,
input rst_n,
input in1,
input in2,
input in3,
output reg out1,
output reg out2,
output reg out3
);

reg [3:0] state;  
reg [3:0] next_state; 

parameter state0 = 4'b0001,
		  state1 = 4'b0010,
		  state2 = 4'b0100,
		  state3 = 4'b1000;
//1.更新状态寄存器
always@(posedge clk or negedge rst_n)
	begin
		if(!rst_n)
			state <= state0;
		else
			state <= next_state;
	end
//2.状态的跳转过程
always@(*)
	begin
		case(state)
			state0:
				if(in1)
					next_state <= state1;
				else
					next_state <= state0;
			state1:
					next_state <= state2;
			state2:
				if(in2)
					next_state <= state3;
				else
					next_state <= state0;
			state3:
				if(in3)
					next_state <= state0;
				else
					next_state <= state3;
			default:
					next_state <= state0;
		endcase
	end
//3.输出结果
always@(*)
	begin
		{out1,out2,out3} = 3'b000;  //首先产生默认值,后续再改写,防止锁存器产生
		case(state)
			state1:{out1,out2,out3} = 3'b100;
			state2:{out1,out2,out3} = 3'b110;
			state3:{out1,out2,out3} = 3'b111;
		endcase
	end

endmodule

六、有限状态机的判别标准

1.状态机必须能便利所有状态,任何一个状态最终都能转移到缺省安全状态,状态机不会进入死循环,或者不会进入非预知的状态。
上述包含了两个含义:
(1)要求有限状态机完备,即使状态机因受到干扰而进入异常状态,也能很快恢复到正常状态;
(2)状态机不会因为代码编写风格问题,而出现跳转异常或临时状态(毛刺)。
因此,对于复杂的状态机,通常会设计一个看门狗电路(计时器定时清零电路),当状态机在规定的时间内没有跳转,就会复位到规定的合法状态。
2.状态机的设计要清晰易懂,易维护。么一个状态都有明确的转入状态和转出状态,而且转入,转出状态均是可达的。对于复杂的状态描述,最好采用一个主状态机和若干个从状态机分开描述。
3.状态机的设计要满足设计的面积和速度的要求。
4.建议对状态机的各个状态使用parameter或localparam,将状态定义为有意义的符号名。

你可能感兴趣的:(通信IC设计)