第四章有限状态机
有限状态机(ASM)(FSM)

(OR ASM)
Sequential circuits are also called finite state machines (FSMs), which is a more formal name that is often found in technical literature. The name derives from the fact that the function behavior of these circuits can be represented using a finite number of states.
begin
if clk'event and clk='1' then
presentstate<=nextstate;
end if;
end process switch_to_nextstate;
when s3=>nextstate<=s4; change_state_mode: process(presentstate)--主控组合进程 y<="100"; begin cout<='0'; case presentstate is when s4=>nextstate<=s0; when s0=>nextstate<=s1; y<="000"; y<="001"; cout<='1'; cout<='0'; when when s1=>nextstate<=s2; others=>nextstate<=s0; y<="010"; cout<='0'; y<="XXX";
有限状态机

1.1概述有限状态机是指输出取决于过去输入部分和当前输入部分的时序逻辑电路。
有限状态机又可以认为是组合逻辑和寄存器逻辑的一种组合。
状态机特别适合描述那些发生有先后顺序或者有逻辑规律的事情,其实这就是状态机的本质。
状态机就是对具有逻辑顺序或时序规律的事件进行描述的一种方法在实际的应用中根据状态机的输出是否与输入条件相关,可将状态机分为两大类,即摩尔(Moore) 型状态机和米勒(Mealy) 型状态机。
Mealy型状态转移图1.2状态机的描述方法状态机的描述方法多种多样,将整个状态机写到1个always 模块里,在该模块中既描述状态转移,又描述状态的输入和输出,这种写法一般被称为一段式FSM 描述方法;还有一种写法是使用两个always 模块,其中一个always 模块采用同步时序的方式描述状态转移,而另一个模块采用组合逻辑的方式判断状态转移条件,描述状态转移规律,这种写法被称为两段式FSM 描述方法;还有一种写法是在两段式描述方法的基础上发展而来的,这种写法使用3 个always模块,一个always 模块采用同步时序的方式描述状态转移,一个采用组合逻辑的方式判断状态转移条件,描述状态转移规律,第三个always 模块使用同步时序电路描述每个状态的输出,这种写法称为三段式写法。
1.3 FSM的状态编码二进制码(Binary)和格雷码(Gray)属于压缩状态编码,这种编码的优点是使用的状态向量最少,但是需要较多的逻辑资源用来状态译码。
二进制码从一个状态转换到相邻状态时,可能有多个比特位发生变化,易产生中间状态转移问题,状态机的速度也要比采用其它编码方式慢。
格雷码两个相邻的码值仅有一位就可区分,这将会减少电路中相邻物理信号线同时变化的情况,因而可以减少电路中的电噪声。
Johnson码也有同样的特点,但是要用较多的位数。
独热码(One-hot)指对任意给定的状态,状态寄存器中只有l位为1,其余位都为0。
有限状态机

可综合的设计中应注意
不使用初始化语句;不使用带有延时的描述; 不使用循环次数不确定的循环语句。
应尽量采用同步方式设计电路。
用always过程块描述组合逻辑,应在敏感 信号列表中列出块中出现的所有输入信号。
基于状态机的设计要点
3.状态编码的定义
在Verilog语言中,有两种方式可用于定义状态编码,分别用
parameter和'define语句实现,比如要为state0、state1、state2
、state3四个状态定义码字为:00、01、11、10,可采用下面
两种方式。
方式1:用parameter参数定义
采用一个always模块描述,状态编码用二进制编码:
• module fsm(clk,ina,out); input clk,ina; output out; reg out; parameter s0 = 3'b00,s1 =3'b01,s2 =3'b10,s3=3'b11; reg[0:1]state; always @ (posedge clk) begin state<=s0;out =0; case(state) s0: begin state<=(ina)?s1:s0;out=0; end s1:begin state<=(ina)?s2:s0;out=0; end s2:begin state<=(ina)?s3:s0;out=0; end s3:begin state<=(ina)?s3:s0;out=1; end endcase end endmodule
1、有限状态机
有限状态机的设计
什么是有限状态机( FSM ) FSM的种类和不同点 设计举例
程序设计之有限状态机

程序设计之有限状态机程序设计之有限状态机状态机?以前听说过,忘了是老师说的,还是老大说得了。
当时的认识也就是字面的意思,无非是和状态以及状态转换有关系。
也许在写过或者读过的一些代码中有遇到过有限状态机的程序,但是当时是一定没有想到这就是状态机吧。
最近在学习一些东西的时候竟然多次遇到,觉得还是有必要写点关于程序设计中有限状态机的东西。
,这里是一篇对状态机从定义到实现都有很好解释的文章,摘录部分如下:*************************************************************** ************************依据状态之间是否有包含关系,分以下两种(1)常规状态机。
状态机中的所有状态是不相交的、互斥的。
(2)层次状态机。
状态机中的状态之间要么是互斥的,要么是真包含的,可以用树性结构来描述这些状态集,包含其它状态的状态称为枝节点,不包含其它状态的状态称为叶节点,为方便单树描述,总是设计一个状态包含所有的状态节点,称为根节点。
状态机的状态只能停留在叶节点,而不能停留在枝节点,每个枝节点需要指定一个子节点为它的默认子节点,以便状态机进入枝节点的时候能够停留到叶节点。
一般都用switch/case if/else方式实现。
在少量状态(3个及其以下)的时候,不需要引入专门的状态机模块。
常规状态机模块实现涉及到的结构由上而下为:顶层结构是状态机:当前状态id,缺省操作,状态表,状态表:状态数组状态结构:状态id,状态名,进入操作,退出操作,缺省操作,状态事件表(数组)状态事件结构:操作,事件,下一状态的id*************************************************************** ************************从代码易读及美观角度来说,建议用switch/case来实现。
从经验来看,在一些稍大的程序设计中一般都会有状态机的实现,特别是在分层实现,协议栈实现,编解码方面。
有限状态机

有限状态机
有限状态机应用举例—序列检测器
Mealy状态转移图
有限状态机
有限状态机应用举例—序列检测器
Mealy型verilog源代码
module mealyfsm(clk,rst,a,z); input clk; input rst; input a; output z; reg z; reg [3:0] temp_z; reg [3:0] currentstate,nextstate; parameter S0 = 4'b0000; parameter S1 = 4'b0001; parameter S2 = 4'b0010; parameter S3 = 4'b0011; parameter S4 = 4'b0100;
2
3
4
有限状态机
什么是有限状态机 FSM:Finite State Machine
1 2 3
应用市场上的电子产品进入非正常状态/(不需要考虑的状态) 的可能很多,不可能一一去列举
于是采用以“不变应万变”的方式,只考虑需要的状态,不需要 的状态不管。
需要考虑的状态一一列举出来(有限性Finite),不需要考虑 的状态都统一当异常处理(default)
有限状态机
mealyfsm测试模块testbench
module tb_fsm; reg clk,rst; reg a; wire z; mealyfsm fsm(.clk(clk),.rst(rst),.a(a),.z(z)); initial begin clk = 0; rst = 1; #5 rst = 0; #3 rst = 1; #20 a = 1; #100 a = 1; #100 a = 0; #100 a = 0; #100 a = 1; #100 a = 0; #100 a = 0; #100 a = 1; #100 a = 0; #100 a = 0; #100 a = 0; #100 a = 0; #100 a = 1; #100 a = 0; #100 a = 0; #100 a = 1; #100 a = 0; #100 a = 1; #100 a = 0; end always #50 clk = ~clk; endmodule
实验四_有限状态机设计(2学时)

实验四有限状态机设计(2学时)实验内容一:状态机是指用输入信号和电路状态(状态变量)的逻辑函数去描述时序逻辑电路功能的方法,也叫时序机。
有限状态机是指在设计电路中加入一定的限制条件,一般用来实现数字系统设计中的控制部分。
根据时序电路输出信号的特点可将时序电路划为Mealy 型和Moore 型两种。
Moore型电路中,输出信号仅仅取决于存储电路的状态。
Mealy型电路中,输出信号不仅取决于存储电路的状态,而且还取决于输入变量。
图1是某Mealy型电路的状态转换图,图中圆圈内的S0、S1等代表电路的状态,状态转换箭头旁斜杠“/”上边的数字代表输入信号,斜杠“/”下边的数字代表输出信号。
假设电路的当前状态为S0,当输入信号为0时,电路的下一个状态仍为S0,输出信号为0;当输入信号为1时,电路的下一个状态为S1,输出为1。
图1 Mealy状态机下面的程序中使用两个进程来描述该状态机。
第一个进程负责状态转化,在CP上升沿到达时,当前状态(PresetState)向下一个状态(NextState)的转换;第二个进程负责检测输入信号(DIN)和当前状态(PresetState)的值,并由CASE-WHEN 语句决定输出信号(OP)和下一个状态值(NextState)的值。
请补充下图中虚线“…”部分省略掉的程序,然后对完整程序进行编译,并用Tools->Netlist Views->State Machine Viewer和RTL Viewer工具查看该状态机的状态图和RTL顶层图。
……实验内容二:论文《基于VHDL的一个简单Mealy状态机》中设计了一个Mealy状态机用来检测数据流“1101010”,用以验证状态机在数据检测上的应用。
请在读懂文中程序的基础上,在Quartus Ⅱ软件中通过编译仿真得到状态图和波形图,仿真中输入波形的设置应能体现该状态机的用途。
实验报告:本次实验占用两个学时,请于12周周四(5月12日)上课时交实验报告。
有限状态机原理

有限状态机原理
有限状态机原理是一种计算模型,它包含一组有限个状态及其之间的转移规则。
它可以被用来描述不同对象或者系统在不同状态下的行为和变化。
有限状态机由三个主要部分组成:状态集合、转移规则和起始状态。
状态集合是有限的,每个状态代表系统的一个特定状态。
转移规则定义了状态之间的转移条件,根据当前的输入确定下一个状态。
起始状态是系统的初始状态,从这个状态开始执行转移规则。
有限状态机可以描述不同的行为和变化情况,通过根据输入选择对应的转移规则来改变状态。
在执行过程中,有限状态机会根据输入和当前状态确定下一个状态,并在转移后更新当前状态。
有限状态机可以根据实际需求进行设计和实现,可以是确定性的(每个输入对应唯一的转移规则)或者非确定性的(一个输入可以对应多个转移规则)。
有限状态机广泛应用于各个领域,例如计算机科学、计算机网络、自动化控制等。
它可以用于设计和实现各种系统和算法,如编译器、路由器、电梯控制和游戏引擎等。
总之,有限状态机原理是一种描述对象或系统不同状态和行为变化的模型,通过状态集合、转移规则和起始状态来描述系统的行为。
它在计算机科学和其他领域有着广泛的应用。
什么是有限状态机

1.什么是有限状态机,Moore机和Mealy机的各自特点和他们之间的区别是什么?答:有限状态机是指输出取决于过去输入部分和当前输入部分的时序逻辑电路。
Mealy机属于同步输出状态机,他的输出是当前状态和所有输入信号的的函数,其输出会在输出仅为当前状态的函数,与当前输入信号无关。
当然,当前状态是和上一时刻时输入信号相关的,当前输入的变化必须等待下一时钟到来使状态发生变化时才能导致输出的变化。
因此,Moore机比Mealy机多等待一个时钟周期才会引起输出的变化,由于Mealy机的输出不与时钟同步,当状态译码比较复杂时,易在输出端产生不可避免的毛刺。
********************************************************************* 2.一个复杂的电路可以划分为几个不同的抽象级别:系统级,算法级,寄存器传输级,逻辑门级,晶体管开关级。
********************************************************************* 3.reg和wire的区别Reg型变量需要被明确赋值,并且在重新赋值前,一直保持原值,wire对应于连续赋值,如assign,reg对应于过程赋值,如always,initial。
********************************************************************* 4.阻塞和非阻塞的区别非阻塞赋值在整个过程块结束后才能完成赋值操作,阻塞赋值在该语句结束时就立即完成赋值操作,阻塞语句是顺序执行的,而非阻塞语句是同时执行的。
********************************************************************* 5.举例说明触发器在什么情况下会在综合过程中生成锁存器在写组合逻辑电路的always块中,, always块中要使用的输入信号在always 后面的敏感信号表中有遗漏,组合逻辑电路设计时不能有反馈。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4.3 基于FPGA的数字系统设计原则和技巧 4.3.1基本原则 1.面积和速度的折衷考虑
面积大,频率低 功能模块-1
面积小,延时大 Buffer DFF
功能模块-2
面积大,延时小
面积小,频率高 功能模块 (两倍时钟频率)
DFF
DFF
图 速度换面积之功能模块时分复用
图 面积换速度之逻辑复用
4.3 基于FPGA的数字系统设计原则和技巧 2.写代码时考虑硬件结构 1)在编写代码进行硬件设计时一定要具备硬 件设计思想,勾画出硬件情况,然后使用 语言描述出来,这样综合工具才能快速有 效地综合出最优结构。 2)评价Verilog代码的优劣不在于代码段的整 洁简短,而在于代码是否能由综合工具流 畅合理地转换成速度快和面积小的硬件形 式。
4.1.4 FSM的Verilog代码编写方法 3.非法状态处理办法
使用Verilog语言对非法状态的处理有以下两种方法: (1),用“default”语句对未提到的状态做统一处理。 当状态转移条件不满足,或者状态发生突变时, 通过default能保证系统不会陷入死循环。这是对 状态机健壮性的重要要求,也即状态机要具备自 恢复功能。 (2),使用“full case”的编码方式将所有的状态转 移变量的所有向量组合情况都在代码中有相应的 说明和处理,大多数综合工具都支持Verilog编码 状态机的这种完备状态属性。
图 fsm1功能仿真图
4.2 FSM设计实例 交通灯信号控制器设计
某十字路口,在A方向和B方向上各有两组信号灯。每 组六盏灯,分别是直行绿(G)、直行黄(Y)、直行红 (R)、左弯绿、左弯黄和左弯红。四组信号灯共计24盏 灯。另外,设置了四组倒计时显示牌,倒计时显示使用2 位的八段码实现。A方向上的两组信号灯显示情况一样, 同样B方向上的两组信号灯显示情况一样。
同一方向的信号灯亮灭相关性如下所示:
1)直行绿灯亮时必有左转红灯亮; 2)直行黄灯亮必有左转黄灯亮; 3)直行红灯亮则必有左转绿灯亮或者左转红灯亮。
交叉方向的信号灯亮灭相关性如表所示:
表 交叉方向信号灯亮灭相关性对应表
方向A 方向B
直行红灯亮 直行绿灯亮 直行红灯亮 &左转绿灯 亮 直行黄灯亮
要么直行绿灯亮,要么直行黄灯亮, 要么直行红灯亮&左转绿灯亮 直行红灯亮 直行红灯亮
4.1.4 FSM的Verilog代码编写方法 三段式:在两个always模块描述方法的基础 上,使用三个always模块。一个always模 块采用同步时序描述状态转移(使用状态 寄存器);另一个always模块采用组合逻 辑判断状态转移条件,描述状态转移规律 (次态逻辑);最后一个always模块描述 现态反馈 状态输出,输出可以是组合电路输出,也 状 可以是时序电路输出(输出逻辑)。 输 态 次态 输出
输出
当前 状态
时序逻辑 (寄存器)
下一 状态
图 时序电路基本结构
4.1 FSM设计方法
对于同步时序电路,根据输入端情况可 分为两种电路结构:一是没有输入端的同 步时序电路,比如计数器、分频器等;另 外一种是有输入端控制的电路,称之为有 限状态机。有限状态机由组合逻辑电路和 若干寄存器组成,根据电路的输入和电路 当前状态决定电路的输出。
表 状态机编码方式
格雷码 000 001 011 000 001 010 状态 S0 S1 S2 顺序编码 独热编码 10000 01000 00100
S3
S4
011
100
010
110
00010
00001
4.1.4 FSM的Verilog代码编写方法 状态编码的选择原则
设计条件和要 求 要求面积优先 编码方式 顺序编码 说明
4.1.2设计FSM的基本步骤
设计有限状态机的基本步骤如下: 1.画出状态转移图; 2.确定状态编码和编码方式; 3.给出状态方程和输出方程; 4.编写Verilog代码。
4.1.3 设计FSM的基本原则 遵循以下基本指导原则: 1)所设计的状态机要安全,不能进入死循环, 不能进入非预知状态。即使是由于某种扰 动进入非设计状态,也要能很快恢复到正 常的状态循环中来; 2)状态机的设计要满足设计的面积和速度的 要求;
Clock Reset
图 1001序列信号检测器引脚图
4.2 FSM设计实例 1.画出状态转移图
起始状态 0 0 1 0
0 1 1 第三状态 0 最后状态 1 第一状态 0
1
1
0 第二状态 0
0
图 1001序列检测器状态转移图
4.2 FSM设计实例 2.给出状态转换表、输出方程和状态方程
当前状态 下一状态 Data_in=0 状态名称 当前输出Q Data_in=1
直行红灯亮
4.2 FSM设计实例
te m p_ A =0
State_A=001 LAMP_A=010010
tem p_A =0
temp_A=1 Reset=1 State_A=000 LAMP_A<=00100 1
temp_A=1 State_A=010 LAMP_A<=100100
temp_A=1
3)状态机输出逻辑复用
如果在状态机中有多个状态都会执行某项操作,则在状态
4.2 FSM设计实例 1001序列信号检测器设计
1001序列信号检测器是用来检测序列信号“1001”的。电路输 入为一位串行数据,当检测到比特流“1001”时,电路输出为1, 否则输出为0。
Data_in Detected 1001序列检测器
tem p_A =1 State_A=100 LAMP_A<=100001
temp_A=1 State_A=011 LAMP_ABiblioteka =010010temp_A=0
图 交通灯信号控制器A方向状态转移 图
temp _A=0
A= p_ tem 0
4.2 FSM设计实例
功能仿真
4.2 FSM设计实例
图 设计在FPGA中的资源占用情况
4.1 FSM设计方法
时序电路如图所示:
组合逻辑接收电路输入信 号并输出结果,时序逻辑 将组合逻辑的输出存储并 反馈回组合逻辑,以此来 形成电路的当前状态 (current state),当前状态 和电路输入信号经过组合 逻辑作用形成电路的下一 状态(next state)传递给 时序电路。
输入
组合逻辑
4.1.1使用FSM设计数字系统的优点
1)有限状态机能够按照输入信号的控制和预先设定 的执行顺序在各个状态间顺畅地切换,具有明显 的顺序特征,能够很好地执行顺序逻辑; 2)有限状态机设计方法非常规范,设计方案相对固 定,并能被多数综合工具支持; 3)采用有限状态机设计,易于构成性能良好的同步 时序逻辑,有利于消除大规模逻辑电路中常见的 竞争冒险现象; 4)使用Verilog硬件语言进行有限状态机设计,程 序层次分明、结构清晰、易读好懂。模块的修改、 优化和移植也非常方便; 5)在高速运算与控制方面,和CPU相比,状态机
当前输入D
Q2 Q1 Q0
Start_S First_S Second_S Third_S 000 001 010 011
D2 D1 D0
000 010 011 000 000 000 表
D2 D1 D0
001 001 001 100 001序列检测器状态转换表 1001 000
State 101/110/111 D1Error =Data_inQ 2 (Q1 Q0 )
编码最简单,使用触发器最少,剩余非法 状态最少,但增加了状态译码组合逻辑。
要求速度优先
当状态数<5时 当状态机后有 大型输出译码 器时 当触发器资源 丰富时
虽然使用了较多触发器,但简化了状态译 码组合逻辑,并且在同一时间只有一个状 独热编码 态寄存器发生变化,所以是最快的方式, 而且适用大多数FPGA。 一般是默认的编码方式。 顺序编码 在这种情况下,虽然必须通过译码决定状 顺序编码或 态的值,但仍可能比独热码速度快。 格雷码 独热码 最快的方式,由于简化了状态译码逻辑, 故提高了状态转换速度。
100 D2Last_S =Data_in(Q 2Q1Q0 )
Detected (Q2 Q1 Q0)
D0 =Data_in(Q2Q1 Q0 )+Data_in((Q2 Q1 )+(Q1 Q0 ))
4.2 FSM设计实例 3.代码实现-1
4.2 FSM设计实例 3.代码实现-2
4.2 FSM设计实例
4.1.4 FSM的Verilog代码编写方法 1. 代码分段方法
一段式:整个状态机写到一个always模块里,在该 模块中既描述状态转移,又描述状态的输入和输 出;
二段式:用两个always模块来描述状态机,其中一 个always模块采用同步时序描述状态转移,另外 一个模块采用组合逻辑判断状态转移条件,描述 状态转移规律以及输出;
LAMPA1 R
LAMPA1[5:0]
Y G
ACOUNT1[7:0] LAMPA2[5:0]
LAMPB1
R
Y
G
Clock Reset 交通灯 控制逻辑
ACOUNT2[7:0] LAMPB1[5:0] BCOUNT1[7:0] LAMPB2[5:0] BCOUNT2[7:0]
G G Y R LAMPA2
输入 次态逻辑 寄 存 现态&使能 器 出 逻 辑
图 三段式状态机设计结构图
表4-1 状态机编码方式
4.1.4 FSM的Verilog代码编写方法 2.编码方式 状态机的编码方式可分为顺序编码 (sequential encoding,也称为二进制编 码)、格雷码(gray encoding)和独热码 (one-hot encoding)。