第7章有限状态机_第1页
第7章有限状态机_第2页
第7章有限状态机_第3页
第7章有限状态机_第4页
第7章有限状态机_第5页
已阅读5页,还剩119页未读 继续免费阅读

下载本文档

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

文档简介

1

第7章有限状态机设计27.1一般有限状态机描述1.VHDL数据类型VHDL是一种强数据类型语言。要求设计实体中的每一个常数、信号、变量、函数以及设定的各种参量都必须具有确定的数据类型,并且相同数据类型的量才能互相传递和作用。分为:

•预定义数据类型、

•用户自定义数据类型3(1)VHDL的预定义数据类型布尔量(boolean)布尔量具有两种状态:false和true

位(bit)

位矢量(bit_vector)字符(character)整数(integer)自然数(natural)和正整数(positive)

natural是integer的子类型,表示非负整数。

positive是integer的子类型,表示正整数。实数(REAL)

字符串(string)时间(TIME)

4(2)IEEE预定义标准逻辑位与矢量1)std_logic

类型由std_logic

类型代替bit类型可以完成电子系统的精确模拟,并可实现常见的三态总线电路。2)std_logic_vector

类型由std_logic

构成的数组。5(3)用户自定义类型用户自定义类型是VHDL语言的一大特色。可由用户定义的数据类型有:

•枚举类型

•整数和实数类型

•数组类型

•记录类型

•子类型6

用类型定义语句TYPE和子类型定义语句SUBTYPE实现用户自定义数据类型。

TYPE语句格式:例:typebooleanis(false,true);typestisarray(15downto0)ofstd_logic;

variablest1:st;typeweekis(sun,mon,tue,wed,thu,fri,sat);type数据类型名is数据类型定义[of基本数据类型];7SUBTYPE语句格式:例:subtypedigitsisintegerrange0to9;由subtype语句定义的数据类型称为子类型。子类型与基(父)类型具有相同的操作符和子程序。可以直接进行赋值操作。subtype子类型名is基本数据类型range约束范围;81)枚举类型枚举该类型的所有可能的值。格式:如:typestd_logicis('U','X','0','1','Z','W','L','H','-');如:typecoloris(blue,green,yellow,red);

typem_stateis(st0,st1,st2,st3,st4,st5); signalpresent_state,next_state:m_state;type类型名称is(枚举文字{,枚举文字});9枚举类型的编码:综合器自动实现枚举类型元素的编码,一般将第一个枚举量(最左边)编码为0,以后的依次加1。编码用位矢量表示,位矢量的长度将取所需表达的所有枚举元素的最小值。如:typecoloris(blue,green,yellow,red);编码为:blue=“00”;green=“01”;yellow=“10”;red=“11”;102)整数类型用户定义的整数类型是标准包中整数类型的子范围。格式:例:typemy_integerisintegerrange0to9;3)数组类型

数组:同类型元素的集合。VHDL支持多维数组。多维数组的声明:

typebyteisarray(7downto0)ofbit;

typevectorisarray(3downto0)ofbyte;type类型名称isrange整数范围;117.1一般有限状态机描述1.状态机状态机(statemachine)有限状态机FSM(finitestatemachine)状态机是组合逻辑与寄存器逻辑两者的特殊组合。状态机是描述一系列状态转换的时序电路。一般用状态图来表示状态机的运行情况较为明确。对那些任务顺序非常明确的电路(如数字控制模块)非常有用。状态图是一种流程控制的设计,在有限的状态中,根据判别信号的逻辑值决定后面要进入哪一个状态。先来看看下面的状态图。1213FSM(FiniteStateMachine)状态机是一种记录下给定时刻状态的设备,并根据输入,对每个给定的改变,改变其状态或引发一个动作。有限状态机是有有限个状态的机器有限状态机由有限的状态和相互之间的转移构成,在任何时候只能处于给定数目的状态中的一个。当接收到一个输入事件时,状态机产生一个输出,同时也可能伴随着状态的转移。有限状态机适用于表示时序控制电路,它可以描述出系统所处的状态、状态之间的转移以及引起状态转移的原因;可以描述同步或异步状态机。14

FSM分类

FSM根据输入输出关系可分为两类:摩尔(Moore)型状态机米利(Mealy)型状态机15

摩尔(Moore)型状态机

摩尔(Moore)型状态机的输出仅仅与当前状态相关。16摩尔(Moore)型状态图17

米利(Mealy)型状态机

米利(Mealy)型状态机的输出不仅与当前状态相关,而且也与输入信号相关。18

米利(Mealy)型状态图

194为什么要使用状态机状态机的工作方式是根据控制信号按照预先设定的状态进行顺序进行的。在速度和可靠性方面优于CPU。结构模式简单,设计方案固定,状态采取符号化枚举类型,为VHDL综合器发挥其强大的优化功能提供有利条件。状态机容易构成性能良好的同步时序逻辑模块,利于消除电路的毛刺现象。高速运算和控制方面,有巨大的优势。多个并行运行的状态机类似并行运行的多CPU的性能。其运算速度比CPU高3至5个数量级。高可靠性。状态机是纯硬件电路,从非法状态中跳出只数十纳秒。而CPU要通过复位从非法运行状态中恢复过来,需要数十毫秒。201.一个有限状态机的VHDL描述应该包括以下内容:至少包括一个状态信号,它们用来指定有限状态机的状态。状态转移指定和输出指定,它们对应于控制单元中与每个控制步有关的转移条件。时钟信号,它是用来进行同步的。同步或异步复位信号。7.1一般有限状态机的设计212一个有限状态机通常包含:说明部分主控时序进程(REG)主控组合进程(COM)辅助进程7.1一般有限状态机的设计ProcessREGProcessCOMcomb_outputsclkresetstate_inputsFSM:s_machinecurrent_statenext_state22说明部分一般放在结构体的说明部分:例如:一个符号化的状态机说明部分:TYPEFSM_STIS(s0,s1,s2,s3);SIGNALcurrent_state,next_state:FSM_ST;直接指定状态码(非符号化编码)的说明部分:SIGNALcurrent_state,next_state:std_logic_vector(1downto0);CONSTANTst0:std_logic_vector(3downto0):="00"CONSTANTst1:std_logic_vector(3downto0):="01"CONSTANTst2:std_logic_vector(3downto0):=“10"CONSTANTst3:std_logic_vector(3downto0):=“11"23主控时序进程部分是指负责状态机运转和在时钟驱动下负责状态转换的进程例如:含复位信号的主控时序进程IFreset='1'THENcurrent_state<=s0;ELSIFclk='1'andclk'eventTHEN

current_state<=next_state;ENDIF;24主控组合进程部分是指状态译码进程,是根据外部输入的控制信号和当前状态值确定下一状态(next_state)的取向。例如:CASEcurrent_sateIS whens0=>next_state<=s1; whens1=>next_state<=s2; whens2=>next_state<=s3; whens3=>next_state<=s0;ENDCASE;说明部分,主控时序进程设计固定。主控组合进程部分是区分状态机的主要部分。辅助进程 用来配合状态机工作的组合进程或时序进程。 例如:为了完成某种算法的进程。用了配合状态机的其他时序进程。为了稳定输出设置的数据锁存器。

25例:描述如图所示的状态机S2(12)S1(8)S0(5)S3(14)00非00非11非00非1111001126实体,FSM说明部分LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYs_machineIS

port(clk,reset:instd_logic;

state_inputs:instd_logic_vector(0to1);

comb_outputs:outintegerrange0to15);END;ARCHITECTUREbhvOFs_machineIS

TYPEfsm_stis(s0,s1,s2,s3);SIGNALcurrent_state,next_state:fsm_st;BEGIN27主控时序进程REGReg:PROCESS(reset,clk)BEGINIFreset='1'THEN

current_state<=s0;ELSIFclk='1'andclk'eventTHEN

current_state<=next_state;ENDIF;ENDPROCESS;28主控组合进程COMcom:process(current_state,state_inputs)begincasecurrent_stateis

whens0=>comb_outputs<=5;ifstate_inputs="00"thennext_state<=s0; elsenext_state<=s1;endif;whens1=>comb_outputs<=8;ifstate_inputs="00"thennext_state<=s1; elsenext_state<=s2;endif;whens2=>comb_outputs<=12; ifstate_inputs="11"thennext_state<=s0; elsenext_state<=s3;endif;whens3=>comb_outputs<=14; ifstate_inputs="11"thennext_state<=s3; elsenext_state<=s0;endif;endcase;endprocess;ENDbhv;29

上例属于Moore型状态机,状态机的输出仅与当前状态有关,是当前状态的函数.

当输入发生变化时,需等待时钟边沿的到来,才会引起状态的改变,从而导致输出的变化。30综合结果

状态QS0100001015S1010010008S20010110012S3000111101431多进程有限状态机用状态机实现对ADC0809的采样控制电路1.典型A/D转换器芯片ADC08098路模拟信号的分时采集,片内有8路模拟选通开关,以及相应的通道地址锁存用译码电路,其转换时间为100µs左右。ADC0809的内部逻辑结构图如图所示。

7.2Moore型有限状态机的设计32ADC0809内部逻辑结构ADC0809引脚图

33图中多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用一个A/D转换器进行转换,这是一种经济的多路数据采集方法。地址锁存与译码电路完成对A、B、C3个地址位进行锁存和译码,其译码输出用于通道选择,其转换结果通过三态输出锁存器存放、输出,因此可以直接与系统数据总线相连。

通道选择表

34信号引脚

ADC0809芯片为28引脚为双列直插式封装。主要信号引脚的功能说明如下:

IN7~IN0——模拟量输入通道

A、B、C——地址线。通道端口选择线,A为低地址,C为高地址,引脚图中为ADDA,ADDB和ADDC。其地址状态与通道对应关系见表。

ALE——地址锁存允许信号。对应ALE上升沿,A、B、C地址状态送入地址锁存器中。

START——转换启动信号。START上升沿时,复位ADC0809;START下降沿时启动芯片,开始进行A/D转换;在A/D转换期间,START应保持低电平。35D7~D0——数据输出线。为三态缓冲输出形式。

OE——输出允许信号。用于控制三态输出锁存器向外输出转换得到的数据。OE=0,输出数据线呈高阻;OE=1,输出转换得到的数据。

CLK——时钟信号。通常使用频率为500KHz的时钟信号。

EOC——转换结束信号。EOC=0,正在进行转换;EOC=1,转换结束。

Vcc——+5V电源。

Vref——参考电源参考电压用来与输入的模拟信号进行比较,作为逐次逼近的基准。其典型值为+5V(Vref(+)=+5V,Vref(-)=-5V)。36ADC0809的工作时序图

37PROCESSREG时序进程PROCESSCOM组合进程PROCESSLATCH锁存器current_statenext_stateLOCK状态机FSMCLKALESTARTOEADDAclkEOCD[7..0]ADC0809Q[7..0]模拟信号输入采样数据输出A/D工作时钟LOCK02采样状态机结构框图38对ADC0809初始化st0st1st2st3st4打开片选,启动转换采样周期中等待EOC='0'正在转换EOC='1'转换结束开启OE数据输出有效由LOCK:0->1发数据锁存信号2采样状态机状态转换图39ADC0809内部逻辑结构ADC0809引脚图

402采样状态机状态转换图ADDA<='1';st0:ALE<='0';START<='0';OE<='0';LOCK<='0';

st1:ALE<='1';START<='1';OE<='0';LOCK<='0';st2:ALE<='0';START<='0';OE<='0';LOCK<='0';st3:ALE<='0';START<='0';OE<='1';LOCK<='0';st4:ALE<='0';START<='0';OE<='1';LOCK<='1';ALE:地址锁存信号START:转换启动信号LOCK:输出锁存信号OE:输出允许信号ADDA:通道选择信号413.VHDL描述状态机(1)实体libraryieee;useieee.std_logic_1164.all;entityadcintis

port(D:instd_logic_vector(7downto0);

clk,EOC:instd_logic;ALE,START,OE,ADDA,LOCK0:outstd_logic; Q:outstd_logic_vector(7downto0));end;423.VHDL描述状态机(2)说明部分architecturebehavofadcintis Typestatesis(st0,st1,st2,st3,st4); signalcurrent_state,next_state:states; signalregl:std_logic_vector(7downto0); signallock:std_logic;begin433.VHDL描述状态机(3)主控时序进程部分Reg:process(clk)beginif(clk'eventandclk='1')then

current_state<=next_state; endif;endprocess;44(4)主控组合进程部分com:process(current_state,EOC)beginCASEcurrent_stateis whenst0=>ALE<='0';START<='0';OE<='0';LOCK<='0';

next_state<=st1;whenst1=>ALE<='1';START<='1';OE<='0';LOCK<='0';

next_state<=st2;whenst2=>ALE<='0';START<='0';OE<='0';LOCK<='0'; ifEOC='1'thennext_state<=st3;elsenext_state<=st2;endif;whenst3=>ALE<='0';START<='0';OE<='1';LOCK<='0';

next_state<=st4; whenst4=>ALE<='0';START<='0';OE<='1';LOCK<='1';

next_state<=st0;whenothers=>ALE<='0';START<='0';OE<='0';LOCK<='0';

next_state<=st0;ENDCASE;endprocesscom;453.VHDL描述状态机(5)辅助进程部分-锁存器latch1:process(lock)beginif(lock'eventandlock='1')then

regl<=D; endif;endprocesslatch1;463.VHDL描述状态机(6)其它ADDA<='1';Q<=regl;Lock0<=lock;endbehav;474.仿真波形485.综合RTL电路496.分解组合进程

组合进程可以分解为两个组合进程com1,com2,则效果相同.com1:process(current_state,EOC)beginCASEcurrent_stateiswhenst0=>ALE<='0';START<='0';OE<='0';LOCK<='0';whenst1=>ALE<='1';START<='1';OE<='0';LOCK<='0';whenst2=>ALE<='0';START<='0';OE<='0';LOCK<='0';whenst3=>ALE<='0';START<='0';OE<='1';LOCK<='0';whenst4=>ALE<='0';START<='0';OE<='1';LOCK<='1';whenothers=>ALE<='0';START<='0';OE<='0';LOCK<='0';ENDCASE;endprocesscom1;com2:process(current_state,EOC)beginCASEcurrent_stateiswhenst0=>next_state<=st1;whenst1=>next_state<=st2;whenst2=>ifEOC='1'thennext_state<=st3;elsenext_state<=st2;endif;whenst3=>next_state<=st4;whenst4=>next_state<=st0;whenothers=>next_state<=st0;ENDCASE;endprocesscom2;507.单进程Moore型有限状态机

组合进程可以与时序进程合并为一个。去掉next_statecomreg:process(clk,EOC)beginif(clk'eventandclk='1')thenCASEcurrent_stateiswhenst0=>ALE<='0';START<='0';OE<='0';lock<='0';current_state<=st1;whenst1=>ALE<='1';START<='1';OE<='0';lock<='0';current_state<=st2;whenst2=>ALE<='0';START<='0';OE<='0';lock<='0'; ifEOC='1'thencurrent_state<=st3;elsecurrent_state<=st2;endif;whenst3=>ALE<='0';START<='0';OE<='1';lock<='0';current_state<=st4;whenst4=>ALE<='0';START<='0';OE<='1';lock<='1';current_state<=st0;whenothers=>ALE<='0';START<='0';OE<='0';lock<='0';current_state<=st0;ENDCASE;endif;endprocess;51综合结果

可见输出增加了一个锁存器。可以有效地减小组合电路的毛刺现象。但输出会延迟一个时钟周期。52组合进程,时序进程分开的情况组合进程,时序进程合并的情况538.单进程Moore型有限状态机例8-4libraryieee;

useieee.std_logic_1164.all;entitymoore1is

port(clk,RST:in

std_logic;

DATAIN:instd_logic_vector(1downto0);

Q:outstd_logic_vector(3downto0));

end;architecturebhvofmoore1is

typest_typeis(st0,st1,st2,st3,st4);

signalc_st:st_type;

begin

process(clk,RST)

begin

ifRST='1'then

c_st<=st0;Q<="0000";

elsif

clk'eventandclk='1'then

casec_stis

whenst0=>ifdatain="10"thenc_st<=st1;elsec_st<=st0;endif;Q<="1001";

whenst1=>ifdatain="11"thenc_st<=st2;elsec_st<=st1;endif;Q<="0101";

whenst2=>ifdatain="01"thenc_st<=st3;elsec_st<=st0;endif;Q<="1100";

whenst3=>ifdatain="00"thenc_st<=st4;elsec_st<=st2;endif;Q<="0010";

whenst4=>ifdatain="11"thenc_st<=st0;elsec_st<=st3;endif;Q<="1001";

whenothers=>c_st<=st0;

endcase;

endif;

endprocess;end;54综合结果55改写为两进程Moore型有限状态机例7-4libraryieee;

useieee.std_logic_1164.all;entitymoore1is

port(clk,RST:in

std_logic;

DATAIN:instd_logic_vector(1downto0);

Q:outstd_logic_vector(3downto0));

end;architecturebhvofmoore1is

typest_typeis(st0,st1,st2,st3,st4);

signalc_st,n_st:st_type;

begin

process(clk,RST)

begin

ifclk'eventandclk='1'then

c_st<=n_st;endif;endprocess;

process(c_st)begin

ifRST='1'then

n_st<=st0;Q<="0000";elsecasec_stis

whenst0=>ifdatain="10"thenn_st<=st1;elsen_st<=st0;endif;Q<="1001";

whenst1=>ifdatain="11"thenn_st<=st2;elsen_st<=st1;endif;Q<="0101";

whenst2=>ifdatain="01"thenn_st<=st3;elsen_st<=st0;endif;Q<="1100";

whenst3=>ifdatain="00"thenn_st<=st4;elsen_st<=st2;endif;Q<="0010";

whenst4=>ifdatain="11"thenn_st<=st0;elsen_st<=st3;endif;Q<="1001";

whenothers=>n_st<=st0;

endcase;endif;

endprocess;end;56两进程综合结果57单进程两进程58

例8-57.3Mealy型有限状态机的设计1/101000/101111/101010/011010/010101/100000/110111/111010/100111/01001Q(输出)是DATAIN(输入)与状态的函数DATAIN/Q输入/输出59

例7-5实体与说明7.3Mealy型有限状态机的设计libraryieee;useieee.std_logic_1164.all;entitymealy1is

port(clk,datain,reset:instd_logic;Q:outstd_logic_vector(4downto0));end;architecturebhvofmealy1istypestatesis(st0,st1,st2,st3,st4);signalstx:states;begin60

例7-5主控时序与组合进程7.3Mealy型有限状态机的设计comreg:process(clk,reset)beginifreset='1'thenstx<=st0;

elsif

clk'eventandclk='1'thencasestxis whenst0=>ifdatain='1'thenstx<=st1;endif; whenst1=>ifdatain='0'thenstx<=st2;endif; whenst2=>ifdatain='1'thenstx<=st3;endif; whenst3=>ifdatain='0'thenstx<=st4;endif; whenst4=>ifdatain='1'thenstx<=st0;endif; whenothers=>stx<=st0;endcase;endif;endprocess;61

例7-5输出信号的进程7.3Mealy型有限状态机的设计com1:process(stx,datain)begincasestxis whenst0=>ifdatain='1'thenQ<="10000";elseQ<="01010";endif; whenst1=>ifdatain='0'thenQ<="10111";elseQ<="10100";endif; whenst2=>ifdatain='1'thenQ<="10101";elseQ<="10011";endif; whenst3=>ifdatain='0'thenQ<="11011";elseQ<="01001";endif; whenst4=>ifdatain='1'thenQ<="11101";elseQ<="01101";endif;endcase;endprocess;end;62

例7-5可见输出是当前输入与当前状态的函数。Q输出有些毛刺现象。7.3Mealy型有限状态机的设计63消除毛刺的方法是将Q锁存后再输出:将com1进程修改为:(mealy2.vhd)com1:process(stx,datain,clk)

variableQ2:std_logic_vector(4downto0);begincasestxis whenst0=>ifdatain='1'thenQ2:="10000";elseQ2:="01010";endif; whenst1=>ifdatain='0'thenQ2:="10111";elseQ2:="10100";endif; whenst2=>ifdatain='1'thenQ2:="10101";elseQ2:="10011";endif; whenst3=>ifdatain='0'thenQ2:="11011";elseQ2:="01001";endif; whenst4=>ifdatain='1'thenQ2:="11101";elseQ2:="01101";endif;endcase;ifclk'eventandclk='1'thenQ<=Q2;endif;endprocess;end;64输出Q锁存的情况65输出Q锁存的情况66将三进程合并一个进程:(mealy3.vhd)与mealy2.vhd效果相同comregcom1:process(clk,reset)beginifreset='1'thenstx<=st0;

elsif

clk'eventandclk='1'thencasestxis whenst0=>ifdatain='1'thenstx<=st1;endif;

ifdatain='1'thenQ<="10000";elseQ<="01010";endif; whenst1=>ifdatain='0'thenstx<=st2;endif;

ifdatain='0'thenQ<="10111";elseQ<="10100";endif; whenst2=>ifdatain='1'thenstx<=st3;endif;

ifdatain='1'thenQ<="10101";elseQ<="10011";endif; whenst3=>ifdatain='0'thenstx<=st4;endif;

ifdatain='0'thenQ<="11011";elseQ<="01001";endif; whenst4=>ifdatain='1'thenstx<=st0;endif;

ifdatain='1'thenQ<="11101";elseQ<="01101";endif; whenothers=>stx<=st0;endcase;endif;endprocess;67输出Q锁存的情况合并一个进程的情况68合并一个进程的情况69常用的描述方式有三种:三进程描述、双进程描述和单进程描述。三进程描述就是指在VHDL源代码的结构体中,用三个进程语句来描述有限状态机的行为:一个进程用来进行有限状态机中的次态逻辑的描述;一个进程用来进行有限状态机中的状态寄存器的描述;还有一个进程用来进行状态机中输出逻辑的描述。所谓双进程描述就是指在VHDL源代码的结构体中,用两个进程语句来描述有限状态机的行为:一个进程语句用来描述有限状态中次态逻辑、状态寄存器和输出逻辑中的任何两个;剩下的一个用另外的一个进程来进行描述。所谓单进程描述就是将有限状态机中的次态逻辑、状态寄存器和输出逻辑在VHDL源代码的结构体中用一个进程来进行描述。707.2Moore型有限状态机的设计7.2.2序列检测器之状态机设计

接下页7.2Moore型有限状态机的设计7.2.2序列检测器之状态机设计

接上页7.2Moore型有限状态机的设计7.2.2序列检测器之状态机设计

74前面为符号化编码,状态机各状态的编码也可以直接指定。7.4状态编码

状态位直接输出型编码ADDA<='1';st0:ALE<='0';START<='0';OE<='0';LOCK<='0';

st1:ALE<='1';START<='1';OE<='0';LOCK<='0';st2:ALE<='0';START<='0';OE<='0';LOCK<='0';st3:ALE<='0';START<='0';OE<='1';LOCK<='0';st4:ALE<='0';START<='0';OE<='1';LOCK<='1';75采样状态机状态转换图(复习)ADDA<='1';st0:ALE<='0';START<='0';OE<='0';LOCK<='0';

st1:ALE<='1';START<='1';OE<='0';LOCK<='0';st2:ALE<='0';START<='0';OE<='0';LOCK<='0';st3:ALE<='0';START<='0';OE<='1';LOCK<='0';st4:ALE<='0';START<='0';OE<='1';LOCK<='1';ALE:地址锁存信号START:转换启动信号LOCK:输出锁存信号OE:输出允许信号ADDA:通道选择信号76VHDL描述状态机(1)实体libraryieee;useieee.std_logic_1164.all;entityAD0809is

port(clk:in

std_logic; EOC:instd_logic; D:instd_logic_vector(7downto0); ALE:outstd_logic; START:outstd_logic; OE:outstd_logic;

ADDA:out

std_logic; lock0:outstd_logic;

C_state:outstd_logic_vector(4downto0); Q:outstd_logic_vector(7downto0));end;77VHDL描述状态机(2)说明部分architecturebhvofAD0809is signalcurrent_state,next_state:std_logic_vector(4downto0); constantst0:std_logic_vector(4downto0):="00000"; constantst1:std_logic_vector(4downto0):="11000"; constantst2:std_logic_vector(4downto0):="00001"; constantst3:std_logic_vector(4downto0):="00100"; constantst4:std_logic_vector(4downto0):="00110"; signallock:std_logic; signalregl:std_logic_vector(7downto0);begin78VHDL描述状态机(3)主控时序进程部分Reg:process(clk)beginif(clk'eventandclk='1')then

current_state<=next_state; endif;endprocess;79(4)主控组合进程部分

com:process(current_state,EOC) begin casecurrent_stateis whenst0=>next_state<=st1; whenst1=>next_state<=st2; whenst2=>ifEOC='0'then

next_state<=st2; elsenext_state<=st3; endif; whenst3=>next_state<=st4; whenst4=>next_state<=st0; whenothers=>next_state<=st0; endcase; endprocess;80VHDL描述状态机(5)辅助进程部分-锁存器latch1:process(lock)beginif(lock'eventandlock='1')then

regl<=D; endif;endprocesslatch1;81VHDL描述状态机(6)其它

ADDA<='1'; lock0<=lock; q<=regl; start<=current_state(4); ALE<=current_state(3); OE<=current_state(2); LOCK<=current_state(1);

c_state<=current_state;827.4状态编码

2.顺序编码前面的编码,状态码有5位,需要有5个触发器。但由于只有5种状态,所以要求触发器最少的话,其实只三个就够了。用顺序编码的话:ST0:000

ST1:001

ST2:010

ST3:011

ST4:100但不同状态下,有不同控制信号输出,此时需要相应的译码电路,需要大量的组合逻辑电路。837.4状态编码

3.一位热码编码用n个触发器来实现有n个状态的状态机。每一个状态都由其中一个触发器的状态表示。其它触发器置为0。用顺序编码的话:ST0:10000

ST1:01000ST2:00100

ST3:00010

ST4:00001但不同状态下,有不同控制信号输出,此时同样也需要相应的译码电路,但此时译码电路要简单很多。847.5状态机剩余状态处理仍以前面为例。用顺序编码的话:ST0:000

ST1:001

ST2:010

ST3:011

ST4:100三个触发器有8种状态,还有三种状态未使用即101,110,111,这是非法状态,解决方法:1.使用Whenothers=>next_state<=st0;这样的语句。2.为了安全起见,将剩余状态罗列出来。

when"101"=>next_state<=st0;when"110"=>next_state<=st0;when"111"=>next_state<=st0;3.有时剩余状态比较多,如使用1位循环热码。有2的5次方共32

种状态,而只用了5种状态。如果单独罗列就太多了。可使用如下方法检测是否进入非法状态。

alarm<=(st0and(st1orst2orst3orst4orst5))or(st1and(st0orst2orst3orst4orst5))or(st2and(st0orst1orst3orst4orst5))or(st3and(st0orst1orst2orst4orst5))or(st4and(st0orst1orst2orst3orst5))如时alarm为高电平则进入非法状态,由此信号启动状态机复位。8586第6章宏功能模块与IP应用LPM:LibraryofParameterizedModules参数可设置模块库在第6章中接触到的是原理图的使用方法,如LPM_counter数控分频器LPM_rom

87现在再来看LPM文本方式调用首先由MegaWizardPlug-InManager生成需要的vhd文件。然后由原理图调用此元件或

VHDL顶层设计中的例化元件来调用所以文本方式调用与原理图方式调用本质上是一样的。886.6.1LPM_RAM模块例如将前面的采样状态机,最后输出Q[7..0]8位数据,如果做成存储示波器,需要将这些数据存在RAM中,在一定的时候RAM中的数据输出显示.那么就可以用LPM_RAM模块实现一个双口RAM.89Ram2.vhdFile->MegaWizardPlug-InManagerCreateanewcustommegafunctionvariation(变异)Storage->LPM_RAM_DQ->VHDL->directory\ram2.vhdQ:数据位宽度8address:地址线宽为9其它默认值90LIBRARYieee;USEieee.std_logic_1164.all;ENTITYram2IS PORT (address:INSTD_LOGIC_VECTOR(8DOWNTO0);

inclock:INSTD_LOGIC; we :INSTD_LOGIC:='1'; data :INSTD_LOGIC_VECTOR(7DOWNTO0); q:OUTSTD_LOGIC_VECTOR(7DOWNTO0) );ENDram2;ARCHITECTURESYNOFram2ISSIGNALsub_wire0:STD_LOGIC_VECTOR(7DOWNTO0); COMPONENTlpm_ram_dq GENERIC(

lpm_width :NATURAL;

lpm_widthad :NATURAL;

lpm_indata :STRING;

lpm_address_control :STRING;

lpm_outdata :STRING;

lpm_hint :STRING ); 91 PORT(address:INSTD_LOGIC_VECTOR(8DOWNTO0);

inclock:INSTD_LOGIC; q :OUTSTD_LOGIC_VECTOR(7DOWNTO0); data :INSTD_LOGIC_VECTOR(7DOWNTO0); we :INSTD_LOGIC); ENDCOMPONENT;BEGIN q<=sub_wire0(7DOWNTO0);

lpm_ram_dq_component:lpm_ram_dq GENERICMAP( LPM_WIDTH=>8, LPM_WIDTHAD=>9, LPM_INDATA=>"REGISTERED", LPM_ADDRESS_CONTROL=>"REGISTERED", LPM_OUTDATA=>"UNREGISTERED", LPM_HINT=>"USE_EAB=ON" ) PORTMAP( address=>address,inclock=>inclock, data=>data,we=>we,q=>sub_wire0 );ENDSYN;92仿真可见We=‘1’时,时钟信号的上降沿在相应的address写入数据,输出为00,下降沿时输出当前数据q.We=‘0’时,时钟信号的上升沿时读出相应address的数据q.936.6.1LPM_ROM模块正弦信号发生器设计ROM:readonlymemory在ROM中存放正弦信号数据,需要时从ROM中按顺序读出.#include"stdio.h"#include"math.h"main(){int

i;floats;for(i=0;i<64;i++){s=(cos(atan(1)*8*i/63)+1)*255/2;printf("%x:%3.0f;",i,s);}}正弦信号波形数据生成0326325594将C程序编译生成.exe文件如rom.exe在dos下运行rom.exe>rom.txt保存在sindata.mif的文件内容如下:WIDTH=8;--数据宽度DEPTH=64;--数据深度--此时地址线宽度可设为6位ADDRESS_RADIX=HEX;DATA_RADIX=DEC;CONTENTBEGIN00:255;01:254;02:252;03:249;04:245;05:239;06:233;07:225;08:217;09:207;0A:197;0B:186;0C:174;0D:162;0E:150;0F:137;10:124;11:112;12:99;13:87;14:75;15:64;16:53;17:43;18:34;19:26;1A:19;1B:13;1C:8;1D:4;1E:1;1F:0;20:0;21:1;22:4;23:8;24:13;25:19;26:26;27:34;28:43;29:53;2A:64;2B:75;2C:87;2D:99;2E:112;2F:124;30:137;31:150;32:162;33:174;34:186;35:197;36:207;37:217;38:225;39:233;3A:239;3B:245;3C:249;3D:252;3E:254;3F:255;END;95LPM_ROM定制,命名sindata.vhdFile->MegaWizardPlug-InManagerCreateanewcustommegafunctionvariation(变异)Storage->LPM_ROM->VHDL->directory\sindata.vhdQ:数据位宽度8address:地址线宽为6ROM中初始化文件sindata.mif,采用相对路径.96LIBRARYieee;USEieee.std_logic_1164.all;ENTITYsindataIS PORT (address:INSTD_LOGIC_VECTOR(5DOWNTO0);

inclock:INSTD_LOGIC; q:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDsindata;ARCHITECTURESYNOFsindataIS SIGNALsub_wire0 :STD_LOGIC_VECTOR(7DOWNTO0); COMPONENTlpm_rom GENERIC(

lpm_width :NATURAL;

lpm_widthad:NATURAL;

lpm_address_control :STRING;

lpm_outdata :STRING;

lpm_file :STRING ); 97 PORT(address :INSTD_LOGIC_VECTOR(5DOWNTO0);

inclock :INSTD_LOGIC; q:OUTSTD_LOGIC_VECTOR(7DOWNTO0)); ENDCOMPONENT;BEGIN q<=sub_wire0(7DOWNTO0);

lpm_rom_component:lpm_rom GENERICMAP( LPM_WIDTH=>8, LPM_WIDTHAD=>6, LPM_ADDRESS_CONTROL=>"REGISTERED", LPM_OUTDATA=>"UNREGISTERED", LPM_FILE=>"sin_data.mif“) PORTMAP( address=>address,

inclock=>inclock, q=>sub_wire0 );ENDSYN;98仿真结果:996.6.1LPM_FIFO模块FIFO:firstinfirstoutFile->MegaWizardPlug-InManagerCreateanewcustommegafunctionvariation(变异)Storage->LPM_FIFO->VHDL->directory\fifo2.vhd

数据位宽度8,数据深度512100LIBRARYieee;USEieee.std_logic_1164.all;ENTITYfifo2IS

PORT(data :INSTD_LOGIC_VECTOR(7DOWNTO0);

wrreq :INSTD_LOGIC;

rdreq :INSTD_LOGIC; clock :INSTD_LOGIC;

aclr :INSTD_LOGIC; q :OUTSTD_LOGIC_VECTOR(7DOWNTO0); full :OUTSTD_LOGIC);ENDfifo2;ARCHITECTURESYNOFfifo2IS SIGNALsub_wire0 :STD_LOGIC_VECTOR(7DOWNTO0); SIGNALsub_wire1 :STD_LOGIC; COMPONENTlpm_fifo GENERIC(lpm_width :NATURAL;

lpm_numwords :NATURAL;

lpm_widthu :NATURAL;

lpm_showahead :STRING;

lpm_hint :STRING);101 PORT(rdreq:INSTD_LOGIC;

aclr:INSTD_LOGIC; clock:INSTD_LOGIC; q:OUTSTD_LOGIC_VECTOR(7DOWNTO0);

wrreq:INSTD_LOGIC; data:INSTD_LOGIC_VECTOR(7DOWNTO0);

ful:OUTSTD_LOGIC); ENDCOMPONENT;BEGIN q<=sub_wire0(7DOWNTO0); full<=sub_wire1;

lpm_fifo_component:lpm_fifo GENERICMAP( LPM_WIDTH=>8, LPM_NUMWORDS=>512, LPM_WIDTHU=>9, LPM_SHOWAHEAD=>"OFF", LPM_HINT=>"USE_EAB=ON,MAXIMIZE_SPEED=5“) PORTMAP(rdreq=>rdreq,aclr=>aclr, clock=>clock,wrreq=>wrreq, data=>data,q=>sub_wire0, full=>sub_wire1 );ENDSYN;102仿真结果:103104105106107108109com与reg进程分开时(mealy4.vhd)与mealy1.vhd结果一样libraryieee;useieee.std_logic_1164.all;entitymealy4is

port(clk,datain,reset:instd_logic;Q:outstd_logic_vector(4downto0));end;architecturebhvofmealy4is typestatesis(st0,st1,st2,st3,st4);signalcurrent_state,next_state:states;begin

reg:process(clk,reset)begin ifreset='1'thencurrent_state<=st0;elseifclk'eventandclk='1'then

current_state<=next_state;endif;endif;endprocess; 110com与reg进程分开时com:process(current_state,datain)begin casecurrent_stateiswhenst0=>ifdatain='1'thennext_state<=st1;Q<="10000";elsenext_state<=st0;Q<="01010";endif; whenst1=>ifdatain='0'thennext_state<=st2;Q<="10111"; elsenext_state<=st1;Q<="10100";endif; whenst2=>ifdatain='1'thennext_state<=st3;Q<="10101"; elsenext_state<=st2;Q<="10011";endif; whenst3=>ifdatain='0'thennext_state<=st4;Q<="11011"; elsenext_state<=st3;Q<="01001";endif; whenst4=>ifdata

温馨提示

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

评论

0/150

提交评论