状态机及其VHDL设计.docx

上传人:b****4 文档编号:6587107 上传时间:2023-05-10 格式:DOCX 页数:17 大小:95.39KB
下载 相关 举报
状态机及其VHDL设计.docx_第1页
第1页 / 共17页
状态机及其VHDL设计.docx_第2页
第2页 / 共17页
状态机及其VHDL设计.docx_第3页
第3页 / 共17页
状态机及其VHDL设计.docx_第4页
第4页 / 共17页
状态机及其VHDL设计.docx_第5页
第5页 / 共17页
状态机及其VHDL设计.docx_第6页
第6页 / 共17页
状态机及其VHDL设计.docx_第7页
第7页 / 共17页
状态机及其VHDL设计.docx_第8页
第8页 / 共17页
状态机及其VHDL设计.docx_第9页
第9页 / 共17页
状态机及其VHDL设计.docx_第10页
第10页 / 共17页
状态机及其VHDL设计.docx_第11页
第11页 / 共17页
状态机及其VHDL设计.docx_第12页
第12页 / 共17页
状态机及其VHDL设计.docx_第13页
第13页 / 共17页
状态机及其VHDL设计.docx_第14页
第14页 / 共17页
状态机及其VHDL设计.docx_第15页
第15页 / 共17页
状态机及其VHDL设计.docx_第16页
第16页 / 共17页
状态机及其VHDL设计.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

状态机及其VHDL设计.docx

《状态机及其VHDL设计.docx》由会员分享,可在线阅读,更多相关《状态机及其VHDL设计.docx(17页珍藏版)》请在冰点文库上搜索。

状态机及其VHDL设计.docx

状态机及其VHDL设计

第7章 状态机与其VHDL设计

容提要:

有限状态机〔FiniteStateMachine,简称FSM〕是一类很重要的时序电路,是许多数字系统的核心部件,也是实时系统设计中的一种数学模型,是一种重要的、易于建立的、应用比拟广泛的、以描述控制特性为主的建模方法,它可以应用于从系统分析到设计的所有阶段。

有限状态机的优点在于简单易用,状态间的关系清晰直观。

建立有限状态机主要有两种方法:

“状态转移图〞和“状态转移表〞。

标准状态机通常可分为Moore和Mealy两种类型。

本章主要介绍了基于VHDL的常见有限状态机的类型、结构、功能与表达方法,重点是如何有效地设计与实现。

学习要求:

了解状态机的根本结构、功能和分类,掌握有限状态机的一般设计思路与方法、状态机编码方案的恰当选取、Moore和Mealy状态机的本质区别与设计实现。

关键词:

状态机(StateMachine),Moore,Mealy,VHDL设计(VHDLDesign)

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

状态转移图、状态转移表这两种有限状态机的建立方法是等价的,都描述了同一硬件结构,它们可以相互转换,但各有优缺点,分别适合于不同场合。

一般状态机的VHDL设计

7.2.1状态机的一般组成

用VHDL设计有限状态机方法有多种,但最一般和最常用的状态机设计通常包括说明局部,主控时序局部,主控组合局部和辅助进程局部。

1)说明局部

说明局部中使用TYPE语句定义新的数据类型,此数据类型为枚举型,其元素通常都用状态机的状态名来定义。

状态变量定义为信号,便于信息传递,并将状态变量的数据类型定义为含有既定状态元素的新定义的数据类型。

说明局部一般放在结构体的ARCHITECTURE和BEGIN之间。

2)主控时序进程

是指负责状态机运转和在时钟驱动正负现状态机转换的进程。

状态机随外部时钟信号以同步方式工作,当时钟的有效跳变到来时,时序进程将代表次态的信号next_state中的容送入现态信号current_state中,而next_state中的容完全由其他进程根据实际情况而定,此进程中往往也包括一些清零或置位的控制信号。

3)主控组合进程

根据外部输入的控制信号〔包括来自外部的和状态机容的非主控进程的信号〕或〔和〕当前状态值确定下一状态next_state的取值容,以与对外或对部其他进程输出控制信号的容。

4)辅助进程

用于配合状态机工作的组合、时序进程或配合状态机工作的其他时序进程。

在一般状态机的设计过程中,为了能获得可综合的,高效的VHDL状态机描述,建议使用枚举类数据类型来定义状态机的状态,并使用多进程方式来描述状态机的部逻辑。

例如可使用两个进程来描述,—个进程描述时序逻辑,包括状态存放器的工作和存放器状态的输出,另一个进程描述组合逻辑,包括进程间状态值的传递逻辑以与状态转换值的输出。

必要时还可以引入第三个进程完成其它的逻辑功能。

下例描述的状态机由两个主控进程构成,其中进程REG为主控时序进程,为主控组合进程。

[例7.1]

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYs_machineIS

PORT(clk,reset:

INSTD_LOGIC;

State_inputs:

INSTD_LOGIC_VECTOR(0TO1);

b_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将当前状态值带出此进程,进入进程

:

PROCESS(current_state,state_Inputs)--组合逻辑进程

BEGIN

CASEcurrent_stateIS--确定当前状态的状态值

WHENst0=>b_outputs<="00";--初始状态译码输出"00"

IFstate_inputs="00"THEN

--根据外部的状态控制输入"00"

next_state<=st0;

--在下一时钟后,进程REG的状态将维持为st0

ELSE

next_state<=st1;

--否如此,在下一时钟后,进程REG的状态将为st1

ENDIF;

WHENst1=>b_outputs<="01";

--对应状态st1的译码输出"01"

IFstate_inputs="00"THEN

--根据外部的状态控制输人"00"

next_state<=st1;

--在下一时钟后,进程REG的状态将维持为st1

ELSE

next_state<=st2;

--否如此,在下一时钟后,进程REG的状态将为st2

ENDIF;

WHENst2=>b_outputs<="10";--以下依次类推

IFstate_inputs="11"THEN

next_state<=st2;

ELSE

next_state<=st3;

ENDIF;

WHENst3=>b_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〞,输出b_outputs=“01〞。

第4个脉冲上升沿到来时current_state=“st1〞,state_inputs=“00〞,输出b_outputs=“01〞。

综合后的RTL图如图7.5所示。

 

 

一般来说,程序的不同进程间是并行运行的,但由于敏感信号设置的不同和电路的延迟,在时序上进程间的动作是有先后的。

如对上例中的状态转换行为来说,有进程REG和,它们的敏感信号表分别为〔reset,clk〕和〔current_state,state_inputs〕,在clk上升沿到来时,进程REG将首先运行,完成状态转换的赋值操作。

如果外部控制信号state_inputs不变,只有当来自进程REG的信号current_state改变时,进程才开始动作,并将根据current_state和state_inputs的值来决定下一有效时钟沿到来后,进程REG的状态转换方向。

这个状态机的两位组合逻辑输出b_outputs是对当前状态的译码。

我们可以通过这个输出值来了解状态机部的运行情况,同时还可以利用外部控制信号state_inputs任意改变状态机的状态变化模式。

注意:

在上例中,有两个信号起到了互反响的作用,完成了两个进程间的信息传递的功能,这两个信号分别是current_state〔进程REG->进程)和next_state(进程->进程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个可能的非法状态。

然而,只要设计中不违反状态位触发器的建立和保持时间,状态机将不会进入非法状态。

摩尔状态机的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所示。

图 Moore的工作时序图

图 Moore的RTL图

米立状态机的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结构要求至少有两个进程,或者是一个状态机进程加一个独立的并行贩值语句。

图 Mealy的工作时序图

图 Mealy的RTL图

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2