状态机及其VHDL设计样本.docx
《状态机及其VHDL设计样本.docx》由会员分享,可在线阅读,更多相关《状态机及其VHDL设计样本.docx(17页珍藏版)》请在冰点文库上搜索。
![状态机及其VHDL设计样本.docx](https://file1.bingdoc.com/fileroot1/2023-6/15/273896bc-f4b1-48e9-9cca-08baa34a8e19/273896bc-f4b1-48e9-9cca-08baa34a8e191.gif)
状态机及其VHDL设计样本
第7章 状态机及其VHDL设计
内容提纲:
有限状态机(FiniteStateMachine,简称FSM)是一类很重要时序电路,是许多数字系统核心部件,也是实时系统设计中一种数学模型,是一种重要、易于建立、应用比较广泛、以描述控制特性为主建模办法,它可以应用于从系统分析到设计所有阶段。
有限状态机长处在于简朴易用,状态间关系清晰直观。
建立有限状态机重要有两种办法:
“状态转移图”和“状态转移表”。
原则状态机普通可分为Moore和Mealy两种类型。
本章重要简介了基于VHDL常用有限状态机类型、构造、功能及表达办法,重点是如何有效地设计与实现。
学习规定:
理解状态机基本构造、功能和分类,掌握有限状态机普通设计思路与办法、状态机编码方案恰当选用、Moore和Mealy状态机本质区别及设计实现。
关键词:
状态机(StateMachine),Moore,Mealy,VHDL设计(VHDLDesign)
7.1状态机基本构造和功能
状态机基本构造如图7.1所示。
除了输人信号、输出信号外,状态机还包括一组寄存器记忆状态机内部状态。
状态机寄存器下一种状态及输出,不但同输入信号关于,并且还与寄存器当前状态关于,状态机可以以为是组合逻辑和寄存器逻辑特殊组合。
它涉及两个重要某些:
即组合逻辑某些和寄存器。
组合逻辑某些又可分为状态译码器和输出译码器,状态译码器拟定状态机下一种状态,即拟定状态机勉励方程,输出译码器拟定状态机输出,即拟定状态机输出方程。
寄存器用于存储状态机内部状态。
状态
图7.1 状态机基本构造
状态机基本操作有两种:
1.状态机内部状态转换。
状态机经历一系列状态,下一状态由状态译码器依照当前状态和输入条件决定。
2.产生输出信号序列。
输出信号由输出译码器依照当前状态和输入条件拟定。
用输入信号决定下一状态也称为“转移”。
除了转移之外,复杂状态机还具备重复和历程功能。
从一种状态转移到另一状态称为控制定序,而决定下一状态所需逻辑称为转移函数。
在产生输出过程中,依照与否使用输入信号可以拟定状态机类型。
两种典型状态机是米立(Mealy)状态机和摩尔(Moore)状态机。
摩尔状态机输出只是当前状态函数,而米立状态机输出普通是当前状态和输入信号函数。
对于这两类状态机,控制定序都取决于当前状态和输入信号。
大多数实用状态机都是同步时序电路,由时钟信号触发进行状态转换。
时钟信号同所有边沿触发状态寄存器和输出寄存器相连,使状态变化发生在时钟上升或下降沿。
在数字系统中.那些输出取决于过去输入和当前输入某些都可以作为有限状态机。
有限状态机所有“历史”都反映在当前状态上。
当给FSM一种新输入时,它就会产生一种输出。
输出由当前状态和输入共同决定,同步FSM也会转移到下一种新状态,也是随着FSM当前状态和输入而定。
FSM中,其内部状态存储在寄存器中,下一状态值由状态译码器中一种组合逻辑——转移函数产生,状态机输出由另一种组合逻辑——输出函数产生。
建立有限状态机重要有两种办法:
状态转移图(状态图)和状态转移表(状态表)。
它们是等价,互相之间可以转换。
状态转移图 如图7.2所示,图中每个椭圆表达状态机一种状态,而箭头表达状态之间一种转换,引起转换输入信号及当前输出表达在转换箭头上。
摩尔状态机和米立状态机表达办法不同,摩尔状态机状态译码输出写在状态圈内,米立状态机状态译码输出写在箭头旁,如图7.3所示。
如果可以写出FSM状态转移图,就可以使用VHDL状态机语句对它进行描述。
状态转移表 形式如表7.1所示。
表中行列出了所有也许输入信号组合和内部状态以及相应次状态和输出,因而状态表规定了状态机转换函数和输出函数。
然而,状态表不适合具备大量输入系统,由于随着输入增长其状态数和系统复杂性会明显增长。
表7.1状态转移表
现态
输入
次态
输出
S0-Sn
I0-Im
S0-Sn
Q0-QP
状态转移图、状态转移表这两种有限状态机建立办法是等价,都描述了同一硬件构造,它们可以互相转换,但各有优缺陷,分别适合于不同场合。
7.2 普通状态机VHDL设计
7.2.1状态机普通构成
用VHDL设计有限状态机办法有各种,但最普通和最惯用状态机设计普通涉及阐明某些,主控时序某些,主控组合某些和辅助进程某些。
1)阐明某些
阐明某些中使用TYPE语句定义新数据类型,此数据类型为枚举型,其元素普通都用状态机状态名来定义。
状态变量定义为信号,便于信息传递,并将状态变量数据类型定义为具有既定状态元素新定义数据类型。
阐明某些普通放在构造体ARCHITECTURE和BEGIN之间。
2)主控时序进程
是指负责状态机运转和在时钟驱动正负现状态机转换进程。
状态机随外部时钟信号以同步方式工作,当时钟有效跳变到来时,时序进程将代表次态信号next_state中内容送入现态信号current_state中,而next_state中内容完全由其她进程依照实际状况而定,此进程中往往也涉及某些清零或置位控制信号。
3)主控组合进程
依照外部输入控制信号(涉及来自外部和状态机内容非主控进程信号)或(和)当前状态值拟定下一状态next_state取值内容,以及对外或对内部其她进程输出控制信号内容。
4)辅助进程
用于配合状态机工作组合、时序进程或配合状态机工作其她时序进程。
在普通状态机设计过程中,为了能获得可综合,高效VHDL状态机描述,建议使用枚举类数据类型来定义状态机状态,并使用多进程方式来描述状态机内部逻辑。
例如可使用两个进程来描述,—个进程描述时序逻辑,涉及状态寄存器工作和寄存器状态输出,另一种进程描述组合逻辑,涉及进程间状态值传递逻辑以及状态转换值输出。
必要时还可以引入第三个进程完毕其他逻辑功能。
下例描述状态机由两个主控进程构成,其中进程REG为主控时序进程,COM为主控组合进程。
[例7.1]
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYs_machineIS
PORT(clk,reset:
INSTD_LOGIC;
State_inputs:
INSTD_LOGIC_VECTOR(0TO1);
comb_outputs:
OUTSTD_LOGIC_VECTOR(0TO1));
ENDENTITYs_machine;
ARCHITECTUREbehvOFs_machineIS
TYPEstatesIS(st0,st1,st2,st3);--定义states为枚举型数据类型
SIGNALcurrent_state,next_state:
states;
BEGIN
REG:
PROCESS(reset,clk)--时序逻辑进程
BEGIN
IFreset='1'THEN --异步复位
Current_state<=st0;
ELSIFclk='1'ANDclk'EVENTTHEN
current_state<=next_state;
--当检测届时钟上升沿时转换至下一状态
ENDIF;
ENDPROCESS;
--由信号current_state将当前状态值带出此进程,进入进程COM
COM:
PROCESS(current_state,state_Inputs)--组合逻辑进程
BEGIN
CASEcurrent_stateIS--拟定当前状态状态值
WHENst0=>comb_outputs<="00";--初始状态译码输出"00"
IFstate_inputs="00"THEN
--依照外部状态控制输入"00"
next_state<=st0;
--在下一时钟后,进程REG状态将维持为st0
ELSE
next_state<=st1;
--否则,在下一时钟后,进程REG状态将为st1
ENDIF;
WHENst1=>comb_outputs<="01";
--相应状态st1译码输出"01"
IFstate_inputs="00"THEN
--依照外部状态控制输人"00"
next_state<=st1;
--在下一时钟后,进程REG状态将维持为st1
ELSE
next_state<=st2;
--否则,在下一时钟后,进程REG状态将为st2
ENDIF;
WHENst2=>comb_outputs<="10";--如下依次类推
IFstate_inputs="11"THEN
next_state<=st2;
ELSE
next_state<=st3;
ENDIF;
WHENst3=>comb_outputs<="11";
IFstate_inputs="11"THEN
next_state<=st3;
ELSE
next_state<=st0;
ENDIF;
ENDCASE;
ENDPROCESS;
ENDARCHITECTUREbehv;
图7.4为上述状态机工作时序图。
reset为异步复位信号,低电平有效,而clk为上升沿有效。
如在第3个脉冲上升沿到来时current_state=“st0”,state_inputs=“01”,输出comb_outputs=“01”。
第4个脉冲上升沿到来时current_state=“st1”,state_inputs=“00”,输出comb_outputs=“01”。
综合后RTL图如图7.5所示。
图7.4例7.1状态机工作时序图
图7.5 例7.1状态机RTL图
普通来说,程序不同进程间是并行运营,但由于敏感信号设立不同和电路延迟,在时序上进程间动作是有先后。
如对上例中状态转换行为来说,有进程REG和COM,它们敏感信号表分别为(reset,clk)和(current_state,state_inputs),在clk上升沿到来时,进程REG将一方面运营,完毕状态转换赋值操作。
如果外部控制信号state_inputs不变,只有当来自进程REG信号current_state变化时,进程COM才开始动作,并将依照current_state和state_inputs值来决定下一有效时钟沿到来后,进程REG状态转换方向。
这个状态机两位组合逻辑输出comb_outputs是对当前状态译码。
咱们可以通过这个输出值来理解状态机内部运营状况,同步还可以运用外部控制信号state_inputs任意变化状态机状态变化模式。
注意:
在上例中,有两个信号起到了互反馈作用,完毕了两个进程间信息传递功能,这两个信号分别是current_state〔进程REG->进程COM)和next_state(进程COM->进程REG)。
在VHDL中可以有两种方式来创立反馈机制:
虽然用信号方式和使用变量方式。
普通倾向于使用信号方式(如例7.1)。
普通而言,在进程中使用变量传递数据,然后使用信号将数据带出进程。
在设计过程中,如果但愿输出信号具备寄存器锁存功能,则需要为此输出写第3个进程,并把clk和reset信号放入敏感信号表中。
但必要注意避免由于寄存器引入而创立了不必要异步反馈途径。
依照VHDL综合器规则,对于所有也许输入条件,如果进程中输出信号没有被明确赋值时,此信号将自动被指定,即在未列出条件下保持原值,这就意味着引入了寄存器。
因而,咱们在程序综合过程中,应密切注意VHDL综合器给出警告信息,并依照警告信息对程序作必要修改。
普通来说,运用状态机进行设计有如下几种环节:
(1)分析设计规定,列出状态机所有也许状态,并对每一种状态进行编码。
(2)依照状态转移关系和输出函数画出状态转移图。
(3)由状态转移图,用VHDL语句对状态机描述。
7.2.2状态机编码方案
在状态机编码方案中,有两种重要编码办法:
二进制编码和一位热码(One—Hot)编码。
在二进制编码状态机中,状态位(B)与状态(S)数目之间关系为B=log2S,如两位状态位就有00,01,10,11四个不同状态,它们在不同控制信号下可以进行状态转换,但如果各触发器又没有精确地同步变化其输出值,那么在状态01变到10时则会浮现暂时11或00状态输出,此类险象也许使整个系统导致不可预测成果。
这时,采用格雷码二进制编码是特别有益,在该编码方案中,每次仅一种状态位值发生变化。
一位热码编码就是用n个触发器来实现n个状态编码方式,状态机中每一种状态都由其中一种触发器状态来表达。
如4个状态状态机需4个触发器,同一时间仅一种状态位处在逻辑1电平,四个状态分别为:
0001、0010、0100、1000。
在实际应用中,依照状态机复杂限度、所使用器件系列和从非法状态退出所需条件来选取最适合编码方案,使之能保证高效性能和资源运用。
对复杂状态机,二进制编码需用触发器数目比一位热码编码少。
如100个状态状态机按二进制编码仅用7个触发器就可以实现,而一位热码编码则规定100个触发器。
另一方面,虽然一位热码编码规定用较多触发器,但逻辑上普通相对简朴些。
在二进制编码状态机中,控制从一种状态转换到另一种状态逻辑与所有7个状态位以及状态机输入均关于。
此类逻辑普通规定到状态位输入函数是多输入变量。
然而,在一热恋位编码状态机中,到状态位输入经常是其他状态位简朴函数。
站在器件构造角度,不同构造支持其拟定编码类型。
MAX+plusII编译程序对所采用器件系列自动地选取最适当编码办法(除非在设计文献中规定了详细编码方案)。
例如,FLEX7000器件系列是寄存器增强型(Register-intensive),以此类器件为对象状态机最佳选用一位热码编码方案来实现。
由于一位热码编码状态机减少了送到每一种状态位逻辑电路复杂限度,因而可提高用FLEX7000器件实现状态机性能。
MAX5000和MAX7000器件系列最适合二进制状态机编码方案。
这两类器件都可以运用共享和并联扩展乘积项有效地实现复杂逻辑函数。
因而,在这两类器件小,可以容纳复杂组合逻辑函数而不会挥霍资源或损失性能。
此外,在选取编码方案时,必要考虑状态机也许进入潜在非法状态数目。
如果违背了状态位触发器建立或保持时间,又没有定义所有也许浮现状态,则你设计会终结在非法状态上。
MAX+plusII设计进入办法容许你定义非法状态和规定你状态机如何从非法状态中退出。
例如,用二进制编码实现一种14个状态状态机需4个状态位。
这将有16个也许状态,故该状态机仅有两个也许状态是非法状态。
然而一位热码编码状态机普通有更多潜在非法状态。
14个状态一位热码编码状态机需要14个状态。
一位热码编码状态机非法状态数目由方程式(2n-n)拟定,其中n为状态机状态个数。
因而,一位热码编码14位状态共有16370个也许非法状态。
然而,只要设计中不违背状态位触发器建立和保持时间,状态机将不会进入非法状态。
7.3 摩尔状态机VHDL设计
摩尔有限状态机输出只与当前状态关于,与输入信号当前值无关,是严格现态函数。
在时钟脉冲有效边沿作用后有限个门延后,输出达到稳定值。
虽然在时钟周期内输入信号发生变化,输出也会保持稳定不变。
从时序上看,Moore状态机属于同步输出状态机。
Moore有限状态机最重要特点就是将输入与输出信号隔离开来。
例7.2就是一种典型Moore型状态机实例。
状态机状态图如图7.6所示。
[例7.2]
LIBRARYieee;
USEieee.std_logic_1164.ALL;
USEieee.std_logic_unsigned.ALL;
ENTITYmooreIS
PORT(clk,datain,reset:
INstd_logic;
dataout:
OUTstd_logic_vector(3DOWNTO0));
ENDENTITYmoore;
ARCHITECTUREarcOFmooreIS
TYPEstate_typeIS(s1,s2,s3,s4);
SIGNALstate:
state_type;
BEGIN
state_process:
PROCESS(clk,reset)--时序逻辑进程
BEGIN
IFreset='1'THEN--异步复位
state<=s1;
ELSIFclk'eventandclk='1'THEN
--当检测届时钟上升沿时执行CASE语句
CASEstateIS
WHENS1=>IFdatain='1'THEN
state<=s2;
ENDIF;
WHENs2=>IFdatain='0'THEN
state<=s3;
ENDIF;
WHENs3=>IFdatain='1'THEN
state<=s4;
ENDIF;
WHENs4=>IFdatain='0'THEN
state<=s1;
ENDIF;
ENDCASE;
ENDIF;
ENDPROCESS;--由信号state将当前状态值带出此进程,进入进程output_p
output_p:
PROCESS(state)--组合逻辑进程
BEGIN
CASEstateIS--拟定当前状态值
WHENs1=>dataout<="0001";--相应状态s1数据输出为"0001"
WHENs2=>dataout<="0010";
WHENs3=>dataout<="0100";
WHENs4=>dataout<="1000";
ENDCASE;
ENDPROCESS;
ENDARCHITECTURarc;
上例VHDL描述中包括了两个进程:
state_process和output_p,分别为时序逻辑进程和组合逻辑进程。
图7.7是例7.2工作时序图,由图可见,状态机在异步复位信号后state=s1,在第500ns有效上升时钟沿到来时,state=s1,datain=1,从而state由s1转换为s2,输出dataout=0010,虽然在500ns后一种时钟周期内输入信号发生变化,输出也会维持稳定不变。
综合后成果见图7.8所示。
图7.7 Moore工作时序图
图7.8 MooreRTL图
7.4 米立状态机VHDL设计
Mealy状态机输出是现态和所有输入函数,随输入变化而随时发生变化。
从时序上看,Mealy状态机属于异步输出状态机,它不依赖于时钟,但Mealy状态机和Moore状态机设计基本上相似。
例7.2就是一种典型Mealy型状态机实例。
状态机状态图如图7.9所示。
例[7.3]
LIBRARYieee;
USEieee.std_logic_1164.ALL;
USEieee.std_logic_unsigned.ALL;
ENTITYmealyIS
PORT(clk,datain,reset:
INstd_logic;
dataout:
OUTstd_logic_vector(3DOWNTO0));
ENDENTITYmealy;
ARCHITECTUREarcOFmealyIS
TYPEstate_typeIS(s1,s2,s3,s4);
SIGNALstate:
state_type;
BEGIN
state_process:
PROCESS(clk,reset)--时序逻辑进程
BEGIN
IFreset='1'THEN--异步复位
state<=s1;
ELSIFclk'eventandclk='1'THEN
--当检测届时钟上升沿时执行CASE语句
CASEstateIS
WHENS1=>IFdatain='1'THEN
state<=s2;
ENDIF;
WHENs2=>IFdatain='0'THEN
state<=s3;
ENDIF;
WHENs3=>IFdatain='1'THEN
state<=s4;
ENDIF;
WHENs4=>IFdatain='0'THEN
state<=s1;
ENDIF;
ENDCASE;
ENDIF;
ENDPROCESS;
output_p:
PROCESS(state)--组合逻辑进程
BEGIN
CASEstateIS--拟定当前状态值
WHENs1=>
IFdatain='1'THENdataout<="0001";
ELSEdataout<="0000";
ENDIF;
WHENs2=>
IFdatain='0'THENdataout<="0010";
ELSEdataout<="0001";
ENDIF;
WHENs3=>
IFdatain='1'THENdataout<="0100";
ELSEdataout<="0001";
ENDIF;
WHENs4=>
IFdatain='0'THENdataout<="1000";
ELSEdataout<="0001";
ENDIF;
ENDCASE;
ENDPROCESS;
ENDARCHITECTUREarc;
上例VHDL描述中包括了两个进程:
state_process和output_p,分别为主控时序逻辑进程和组合逻辑进程。
图7.10是例7.3工作时序图,由图可见,状态机在异步复位信号来届时,datain=1,输出dataout=0001,在clk有效上升沿来到前,datain发生了变化,由1->0,输出dataout随后发生变化,由0000->0001,反映了Mealy状态机属于异步输出状态机而它不依赖于时钟鲜明特点。
综合后成果见图7.11所示。
Mealy状态机VHDL构造规定至少有两个进程,或者是一种状态机进程加一种独立并行贩值语句。
图7.10 Mealy工作时序图
图7.11 MealyRTL图