FPGA设计及应用 课件 第5章 有限状态机_第1页
FPGA设计及应用 课件 第5章 有限状态机_第2页
FPGA设计及应用 课件 第5章 有限状态机_第3页
FPGA设计及应用 课件 第5章 有限状态机_第4页
FPGA设计及应用 课件 第5章 有限状态机_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

FPGA设计及应用西安科技大学通信与信息工程学院2有限状态机(FiniteStateMachine,FSM)是数字控制系统中用于行为建模与分析的基本工具。它通过离散状态间的转换机制,为复杂控制逻辑提供结构化的表达方式,是实现精确时序控制的关键技术。有限状态机为数字电路设计提供了一种形式化的描述方法,有助于工程师更好地理解和设计复杂系统的控制逻辑。该模型在设计任务顺序非常明确的电路或数字系统中应用广泛。有限状态机的概述有限状态机主要包括四个要素:现态、次态、输入信号和输出信号。有限状态机的基本组成包括状态寄存器、状态译码器和输出译码器。图1有限状态机结构图有限状态机的基本结构现态:指有限状态机当前所处的状态。次态:由现态、输入信号及状态转移函数共同决定,是机即将转移的新状态;转移后,次态变为新现态。输入信号:通常指外部输入,它会触发有限状态机进行状态转换。输出信号:由现态或现态与输入信号共同决定。

有限状态机VHDL代码结构:组合逻辑部分:process内部

通常包括状态译码器和输出译码器,状态译码器根据输入信号和现态,通过组合逻辑电路推导出次态;而输出译码器则依据现态生成相应的输出信号。时序逻辑部分:

主要由状态寄存器构成,用于保存系统的状态,并在时钟信号的驱动下实现由现态向次态的更新。

在使用FSM方式设计VHDL代码时,通常会在结构体说明部分插入一个用户自定义的枚举数据类型,其中包含所有可能出现的电路状态。组合逻辑电路时序逻辑电路clkrstoutputinputpr_statenx_state

有限状态机依据输出生成方式可分为两类:Moore型与Mealy型。图2Moore状态机图3Mealy状态机Moore型:仅与当前状态相关;输入状态改变时,需要经过时钟同步后输出才会改变;Mealy型:当前状态、当前输入相关;当输入改变时输出也会立即改变,不依赖时钟;即Moore型状态机比Mealy型状态机输出要多一个时钟周期。状态转换图是描述有限状态机的基础方法,以有向图形式呈现状态间的转移关系。图4有限状态机的状态转换图有限状态机的表示方法有限状态机有三种常用的表示方法:状态转换图、状态转换表和VHDL描述。本章重点介绍节点:代表有限状态机的具体状态有向连线:明确指示状态之间的转移方向连线标注内容:在连线附近标注两类关键信息:

1.触发状态转移的输入信号

2.当前状态下的输出信号在Moore型有限状态机中,输出直接标注在状态节点上,输入标注在有向连线上;在Mealy型有限状态机中,输入和输出一起标注在有向连线的附近。Moore型有限状态机和Mealy型有限状态机在状态转换图的表示方式上存在差异。图5Moore型有限状态机转换图图6Mealy型有限状态机转换图有限状态机的VHDL设计描述通常包括四个主要组成部分:说明部分、时序逻辑部分、组合逻辑部分以及辅助进程。

在结构体的ARCHITECTURE与BEGIN之间,常用type语句定义枚举类型描述有限状态机的所有状态,通过具名标识符赋予清晰语义(建议用描述性命名),提升代码可读性和可维护性;再用signal语句定义现态、次态等状态变量,数据类型设为该枚举类型,完成状态相关数据的初始化与声明。有限状态机的VHDL设计描述1.说明部分有限状态机的说明部分模板。ARCHITECTURE<architecture_name>OF<entity_name>ISTYPEfsm_statesIS(s0,s1,s2,s3,s4);--定义一个枚举类型SIGNALcurrent_state,next_state:fsm_states;--定义新状态变量……BEGIN……创建名为fsm_states的新数据类型,含s0、s1、s2、s3、s4五个枚举元素,即定义该五状态的集合设current_state和next_state两个变量,数据类型均为fsm_states,故两变量取值仅能是s0~s42.时序逻辑部分时序逻辑电路的具体描述主要在PROCESS内部进行。时序逻辑部分负责有限状态机的运行,并根据外部时钟信号进行状态更新。有限状态机的运行依赖外部时钟信号实现同步控制,因而需要构建一个对时钟信号敏感的进程作为核心驱动单元。实现仅在时钟沿到来时,状态机的状态才会更新。主控时序进程将次态next_state传给现态current_state,现态值由其他进程决定,不涉及下一状态计算。该进程由触发器组成,常含rst等输入控制信号,用于清零或置位。有限状态机的时序逻辑部分模板。标准的设计寄存器数目少:默认的编码方式下,log2nPROCESS(rst,clk)--主控时序进程BEGINIFrst='1'THENcurrentstate<=s0;ELSIFclk='1'ANDclk'EVENTTHENcurrent_state<=next_state;--有效时钟跳变触发状态转移ENDIF;ENDPROCESS;表现为位宽组合逻辑部分负责实现次态和输出译码的功能,其主要任务是根据有限状态机的外部控制信号(含外部输入与内部信号)以及当前状态,计算次态信号(next_state)的值,并生成对应的输出信号或控制信号。根据现态信号current_state确定当前状态;在该状态下生成控制信号comb_outputs,并将其传递给外部系统;计算并更新次态信号next_state的值。3.组合逻辑部分具体步骤如下:有限状态机的组合逻辑部分模板。

ELSE...;ENDIF;WHENs3=>IF(state_inputs=...)THENcomb_outputs<=<value>;next_state<=s4;ELSE...;ENDIF;...ENDCASE;ENDPROCESS;PROCESS(current_state,state_inputs)BEGINCASEcurrent_stateIS--根据当前状态进行分支判断

WHENs0=>--多个条件转移分支IF(state_inputs=...)THEN--根据输入条件判断转移方向comb_outputs<=<value>;--设置组合逻辑输出next_state<=s1;--确定下一状态ELSE...;ENDIF;WHENs1=>IF(state_inputs=...)THENcomb_outputs<=<value>;next_state<=s2;ELSE...;ENDIF;WHENs2=>IF(state_inputs=...)THENcomb_outputs<=<value>;next_state<=s3;process的敏感信号列表完整列出IN/OUT组合无边沿赋值,无寄存器生成利用有限状态机实现时序逻辑电路设计通常包括以下四个基本步骤。进行状态化简。合并相同输入下迁移和输出一致的等价状态,减少状态数,简化转换逻辑。状态编码。根据状态的数目对每个状态进行状态编码或分配,选择合适的编码方案以简化电路设计,同时考虑电路的复杂度和性能。有限状态机描述。使用VHDL语言描述有限状态机,包括定义状态、输入和输出信号,以及详细描述状态转移条件和行为。理解问题。将实际逻辑关系转化为时序逻辑关系,构建状态转换图/表。具体步骤为:1.界定输入输出变量与电路状态总量

2.

定义并有序编号各状态有限状态机的设计步骤010203043.

完成状态转换图绘制或转换表编排有限状态机的设计模板根据对有限状态机的VHDL设计描述部分,我们将介绍两种设计模板:设计模板1和设计模板2。输出方式:组合逻辑直接生成输出特性:随输入即时变化,可能有毛刺敏感信号:current_state、state_inputs输出方式:经中间寄存器temp,时钟沿更新输出特性:无毛刺,稳定性高敏感信号:仅current_state16LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;----------------------------------------------------------------ENTITY<entity_name>ISPORT(clk:INSTD_LOGIC;--时钟信号

rst:INSTD_LOGIC;--复位信号

state_inputs:IN<DATA_TYPE>;--输入信号

comb_outputs:OUT<DATA_TYPE>;--输出信号

);END<entity_name>;----------------------------------------------------------------ARCHITECTURE<architecture_name>OF<entity_name>IS

TYPE

<state_name>IS(s0,s1,s2,s3,s4,...);--定义一个枚举类型

SIGNALcurrent_state,next_state:<state_name>;BEGIN-----------------------时序逻辑部分-----------------------PROCESS(rst,clk)BEGINIFrst='1'THENcurrent_state<=s0;--异步清零

ELSIFclk='1'ANDclk'EVENTTHEN

current_state<=next_state;

--有效时钟状态转移

ENDIF;ENDPROCESS;-----------------------组合逻辑部分-----------------------PROCESS(current_state,state_inputs)BEGINCASEcurrent_stateISWHENs0=>comb_outputs<=<value>;IF(state_inputs=...)THEN

next_state<=s1;ELSE...;ENDIF;WHENs1=>comb_outputs<=<value>;IF(state_inputs=...)THEN

next_state<=s2;ELSE...;ENDIF;WHENs2=>comb_outputs<=<value>;IF(state_inputs=...)THENcomb_outputs<=<value>;next_state<=s3;ELSE...;ENDIF;WHENs3=>comb_outputs<=<value>;IF(state_inputs=...)THEN

next_state<=s4;ELSE...;ENDIF;...ENDCASE;ENDPROCESS;END<architecture_name>;两个进程并发执行有限状态机的设计模板1。使用单个寄存器存储状态编码,其输出仅由当前状态决定定义了一组状态变量(均为同一枚举类型)有限状态机的设计模板2。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;----------------------------------------------------------------ENTITY<entity_name>ISPORT(clk:INSTD_LOGIC;--时钟信号rst:INSTD_LOGIC;--复位信号state_inputs:IN<DATA_TYPE>;--输入信号

comb_outputs:OUT<DATA_TYPE>;--输出信号 );END<entity_name>;----------------------------------------------------------------ARCHITECTURE<architecture_name>OF<entity_name>ISTYPE<state_name>IS(s0,s1,s2,s3,s4,...);--定义一个枚举类型SIGNALcurrent_state,next_state:<state_name>;SIGNALtemp:<DATA_TYPE>;BEGIN-----------------------时序逻辑部分-----------------------PROCESS(rst,clk)BEGINIFrst='1'THENcurrent_state<=s0;--异步清零ELSIFclk='1'ANDclk'EVENTTHENcomb_outputs<=temp;current_state<=next_state;--有效时钟状态转移ENDIF;ENDPROCESS;-----------------------组合逻辑部分-----------------------PROCESS(current_state)BEGINCASEcurrent_stateISWHENs0=>IF(state_inputs=...)THEN

temp<=<value>;next_state<=s1;ELSE...;ENDIF;WHENs1=>IF(state_inputs=...)THEN

temp<=<value>;next_state<=s2;ELSE...;ENDIF;WHENs2=>IF(state_inputs=...)THEN

temp<=<value>;next_state<=s3;ELSE...;ENDIF;WHENs3=>IF(state_inputs=...)THEN

temp<=<value>;next_state<=s4;ELSE...;ENDIF;...ENDCASE;ENDPROCESS;END<architecture_name>;仅在指定时钟边沿触发时将temp的值赋予输出端口。引入内部信号temp作为数据暂存载体,用于在状态迁移过程中暂存输出数据,其赋值遵循时钟同步原则状态寄存器:用于存储状态编码输出寄存器:负责缓存输出结果,输出结果的更新遵循同步时序逻辑Moore型有限状态机的输出仅由当前状态唯一确定,与输入条件无关,可以将其输出视为当前状态的函数。【例1】一个简单的Moore型有限状态机示例。根据图7给出的Moore型有限状态机转换图,使用VHDL描述并设计该有限状态机。图7Moore型有限状态机转换图Moore型有限状态机设计直接对comb_outputs赋值LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYfsmISPORT(clk:INSTD_LOGIC;--时钟信号rst:INSTD_LOGIC;--复位信号state_inputs:INSTD_LOGIC_VECTOR(0TO1);--输入信号

comb_outputs:OUTINTEGERRANGE0TO15--输出信号 );ENDfsm;

ARCHITECTUREbehaviorOFfsmISTYPEfsm_statesIS(s0,s1,s2,s3,s4);--定义一个枚举类型SIGNALcurrent_state,next_state:fsm_states;--定义新状态变量BEGIN-----------------------时序逻辑部分-----------------------PROCESS(rst,clk)BEGINIFrst='1'THENcurrent_state<=s0;--异步清零ELSIFclk='1'ANDclk'EVENTTHEN

current_state<=next_state;--有效时钟触发状态转移ENDIF;ENDPROCESS;定义了一组状态变量(均为同一枚举类型)-----------------------组合逻辑部分-----------------------PROCESS(current_state,state_inputs)BEGINCASEcurrent_stateISWHENs0=>comb_outputs<=3;IFstate_inputs="00"THEN next_state<=s0;ELSEnext_state<=s1;ENDIF;WHENs1=>

comb_outputs<=6;IFstate_inputs="01"THENnext_state<=s1;ELSEnext_state<=s2;ENDIF;WHENs2=>

comb_outputs<=9;IFstate_inputs="10"THENnext_state<=s0;ELSEnext_state<=s3;ENDIF;WHENs3=>

comb_outputs<=12;IFstate_inputs="11"THENnext_state<=s3;ELSEnext_state<=s4;ENDIF; WHENs4=>

comb_outputs<=15;IFstate_inputs="11"THENnext_state<=s4;ELSEnext_state<=s0;ENDIF; ENDCASE;ENDPROCESS;ENDbehavior;使用模版1不涉及输出信号comb_outputs的赋值根据VHDL代码可以生成如图8、图9所示的RTL视图以及仿真时序图。仿真结果表明,该有限状态机准确地实现了图7所示状态转换图的功能。图8简单有限状态机的RTL视图图9简单有限状态机的仿真时序图【例2】运用Moore型有限状态机设计方法完成自动售货机VHDL设计。设计要求如下:该自动售货机支持两种硬币:1元和5角。若投入1元5角硬币应输出货物且不找零,若投入2元硬币应输出货物并找5角零钱。图10自动售货机的状态转换图状态定义:s0表示初态,即未投入硬币; s1表示共投入5角硬币; s2表示共投入1元硬币; s3表示共投入1元5角硬币; s4表示共投入2元硬币。输入信号:state_input(0)表示是否投入1元硬币(1为投入,0为未投入),state_input(1)表示是否投入5角硬币(1为投入,0为未投入)。输入信号的组合代表所投入的金额,如“10”表示投入1元。输出信号:comb_outputs(0)表示是否输出货物(1为输出,0为不输出), comb_outputs(1)表示是否找5角零钱(1为找零钱,0为不找零钱)。输出信号的组合表示输出货物和找零钱的情况,如“01”表示不输出货物且找5角零钱。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmooreISPORT(clk:INSTD_LOGIC;rst:INSTD_LOGIC;state_inputs:INSTD_LOGIC_VECTOR(0TO1);comb_outputs:OUTSTD_LOGIC_VECTOR(0TO1) );ENDmoore;

ARCHITECTUREbeOFmooreISTYPEstatesIS(s0,s1,s2,s3,s4);--定义一个枚举类型SIGNALcurrent_state,next_state:states;BEGIN-----------------------时序逻辑部分-----------------------PROCESS(rst,clk)BEGINIFrst='1'THENcurrent_state<=s0;--发生reset异步复位ELSIFclk='1'ANDclk'EVENTTHEN--发生clk时钟上升沿current_state<=next_state;--有效时钟状态转移ENDIF;ENDPROCESS;-----------------------组合逻辑部分-----------------------PROCESS(current_state,state_inputs)BEGINCASEcurrent_stateISWHENs0=>

comb_outputs<="00";--现态s0,输出00IF--输入不同,次态不同state_inputs="00"THENnext_state<=s0;ELSIFstate_inputs="01"THENnext_state<=s1;ELSIFstate_inputs="10"THENnext_state<=s2;ENDIF;WHENs1=>

comb_outputs<="00";IFstate_inputs="00"THENnext_state<=s1;ELSIFstate_inputs="01"THENnext_state<=s2;ELSIFstate_inputs="10"THENnext_state<=s3;ENDIF;WHENs2=>

comb_outputs<="00";IFstate_inputs="00"THENnext_state<=s2;ELSIFstate_inputs="01"THENnext_state<=s3;ELSIFstate_inputs="10"THENnext_state<=s4;ENDIF;WHENs3=>

comb_outputs<="10";IFstate_inputs="00"THENnext_state<=s0;ELSIFstate_inputs="01"THENnext_state<=s1;ELSIFstate_inputs="10"THENnext_state<=s2;ENDIF;WHENs4=>comb_outputs<="11";IFstate_inputs="00"THENnext_state<=s0;ELSIFstate_inputs="01"THENnext_state<=s1;ELSIFstate_inputs="10"THENnext_state<=s2;ENDIF;ENDCASE;ENDPROCESS;ENDbehavior;使用模版1图11自动售货机的仿真时序图基础设定:输入“01”代表投入5角硬币,“10”代表投入1元硬币。初始状态:有限状态机初始状态为s0。状态转换与输出:(一)s0输入“10”(1元)→转至s2;s2再输入“01”(5角)→转至s3,输出“10”(出货物、不找零)。(二)两次输入“10”(共2元)→状态s0→s2→s4,s4时输出“11”(出货物、找零)。(三)三次输入“01”(共1.5元)→状态s0→s1→s2→s3,s3时输出“10”(出货物、不找零)。相较于Moore型有限状态机,Mealy型有限状态机的输出更为复杂。它不仅取决于当前状态,还受输入条件的影响,可将其输出视为当前状态和输入条件的函数。【例3】根据例1的需求,设计Mealy型有限状态机。图12Mealy型有限状态机转换图Mealy型有限状态机设计根据例3的需求,可以得到如图12所示的Mealy型有限状态机转换图。设计Mealy型有限状态机,采用设计模板2进行VHDL代码编写。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYfsmISPORT(clk:INSTD_LOGIC;--时钟信号rst:INSTD_LOGIC;--复位信号state_inputs:INSTD_LOGIC_VECTOR(0TO1);--输入信号comb_outputs:OUTINTEGERRANGE0TO15--输出信号 );ENDfsm;

ARCHITECTUREbehaviorOFfsmISTYPEfsm_statesIS(s0,s1,s2,s3,s4);--定义一个枚举类型SIGNALcurrent_state,next_state:fsm_states;--定义新状态变量

SIGNALtemp:INTEGERRANGE0TO15;BEGIN-----------------------时序逻辑部分-----------------------PROCESS(rst,clk)BEGINIFrst='1'THENcurrent_state<=s0;--异步清零ELSIFclk='1'ANDclk'EVENTTHEN

comb_outputs<=temp;current_state<=next_state;--有效时钟触发状态转移ENDIF;ENDPROCESS;-----------------------组合逻辑部分-----------------------PROCESS(current_state,state_inputs)BEGINCASEcurrent_stateISWHENs0=>IFstate_inputs="00"THENtemp<=3;next_state<=s0;ELSEtemp<=6;next_state<=s1;ENDIF;WHENs1=>IFstate_inputs="01"THEN

temp<=6;next_state<=s1;ELSEtemp<=9;next_state<=s2;ENDIF;WHENs2=>IFstate_inputs="10"THEN

temp<=3;next_state<=s0;

ELSEtemp<=12;next_state<=s3;ENDIF;WHENs3=>IFstate_inputs="11"THEN

temp<=12;next_state<=s3;ELSEtemp<=15;next_state<=s4;ENDIF; WHENs4=>IFstate_inputs="11"THEN

temp<=15;next_state<=s4;ELSEtemp<=3;next_state<=s0;ENDIF; ENDCASE;ENDPROCESS;ENDbehavior;根据VHDL代码可以生成如图13、图14所示的RTL视图以及仿真时序图。仿真结果表明,该有限状态机实现了图12所示状态转换图的功能。将图13与图8进行对比可得,设计模板2比设计模板1多了一个新的寄存器。此外,图12与图7展示了Moore型有限状态机与Mealy型有限状态机在状态转换图上的差异。图13简单有限状态机的RTL视图图14简单有限状态机的仿真时序图【例4】Mealy型有限状态机,“111”序列检测器的VHDL代码描述。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmealyISPORT(clk,rst:INSTD_LOGIC;input:INSTD_LOGIC;output:OUTSTD_LOGIC );ENDENTITYmealy;

ARCHITECTUREbehaviorOFmealyISTYPEstatesIS(s0,s1,s2);SIGNALcurrent_state,next_state:states;

SIGNALtemp:STD_LOGIC;BEGINPROCESS(clk,rst)BEGINIFrst='1'THENcurrent_state<=s0;ELSIFclk='1'ANDclk'EVENTTHEN

output<=temp; current_state<=next_state; ENDIF;ENDPROCESS;

PROCESS(input,current_state)BEGINCASEcurrent_stateISWHENs0=>IFinput='1'THENtemp<='0';next_state<=s1;ELSEtemp<='0';next_state<=s0;ENDIF;WHENs1=>IFinput='1'THENtemp<='0';next_state<=s2;ELSEtemp<='0';next_state<=s0;ENDIF;WHENs2=>IFinput='1'THENtemp<='1';next_state<=s2;ELSEtemp<='0';

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论