您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 交通运输 > 74第七章_VHDL有限状态机设计
EDA技术实用教程第第77章章VHDLVHDL有限状态机设计有限状态机设计7.1VHDL状态机的一般设计7.1.0用户自定义数据类型定义语句TYPE语句用法如下:TYPE数据类型名IS数据类型定义OF基本数据类型;或TYPE数据类型名IS数据类型定义;以下列出了两种不同的定义方式:TYPEst1ISARRAY(0TO15)OFSTD_LOGIC;数组数据类型TYPEweekIS(sun,mon,tue,wed,thu,fri,sat);枚举数据类型数据类型定义详见p200TYPEm_stateIS(st0,st1,st2,st3,st4,st5);SIGNALpresent_state,next_state:m_state;布尔数据类型的定义语句是:TYPEBOOLEANIS(FALSE,TRUE);TYPEmy_logicIS('1','Z','U','0');SIGNALs1:my_logic;s1='Z';符号化状态机:用文字符号表示二进制数。确定化状态机:直接用数值表示。子类型SUBTYPE的语句格式如下:SUBTYPE子类型名IS基本数据类型RANGE约束范围;SUBTYPEdigitsISINTEGERRANGE0to9;没有定义新的数据类型7.1.1为什么要使用状态机状态机克服了纯硬件数字系统顺序方式控制不灵活的缺点状态机的结构模式相对简单,设计方案相对固定。状态机容易构成性能良好的同步时序逻辑模块(消除毛刺)状态机的VHDL表述丰富多样,程序层次分明,结构清晰。在高速运算和控制方面,状态机更有其巨大的优势。就可靠性而言,状态机的优势也是十分明显的。对比与VHDL的其他设计方案或CPU相比VHDL综合器易于优化(结构模式相对简单,设计方案相对固定)易构成性能良好的时序逻辑模块(消除毛刺)结构模式简单、层次分明、易读易懂、易排错运行模式类似于CPU,易于进行顺序控制利用同步时序和全局时钟线可实现高速FSM高可靠性,非法状态易控制(高速运算和控制方面,状态机更优势)(优势明显)7.1.1为什么要使用状态机与VHDL的其他设计方案或CPU相比7.1.2一般有限状态机的结构用VHDL设计的状态机有多种形式从信号输出方式分:Mealy型状态机和Moore型状态机从结构上分:单进程状态机和多进程状态机从状态表达方式上分:符号化状态机、确定状态编码状态机从编码方式上分:顺序编码状态机、一位热码编码状态机或其他编码方式状态机√√√√1.说明部分2.主控时序进程comb_outputsstate_inputsresetclkFSM:s_machineCOMnext_statecurrent_statePROCESSREGPROCESS图7-1状态机一般结构示意图ARCHITECTURE...ISTYPEFSM_STIS(s0,s1,s2,s3);SIGNALcurrent_state,next_state:FSM_ST;...FSM(FiniteState_Machine)负责状态机运转,在时钟驱动下负责状态转换的进程。一般状态机包含如下四个部分:3.主控组合进程根据外部输入的控制信号(包括来自状态机外部的信号和来自状态机内部其它非主控的组合或时序进程的信号),或(和)当前状态的状态值确定下一状态(next_state)的取向,即next_state的取值内容,以及确定对外输出或对内部其它组合或时序进程输出控制信号的内容。4.辅助进程用于配合状态机工作的组合进程或时序进程。comb_outputsstate_inputsresetclkFSM:s_machineCOMnext_statecurrent_statePROCESSREGPROCESS【例7-1】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYs_machineISPORT(clk,reset:INSTD_LOGIC;state_inputs:INSTD_LOGIC_VECTOR(0TO1);comb_outputs:OUTINTEGERRANGE0TO15);ENDs_machine;ARCHITECTUREbehvOFs_machineISTYPEFSM_STIS(s0,s1,s2,s3,s4);--数据类型定义SIGNALcurrent_state,next_state:FSM_ST;BEGINREG:PROCESS(reset,clk)--主控时序进程BEGINIFreset=‘0’THENcurrent_state=s0;--异步复位ELSIFclk='1'ANDclk'EVENTTHENcurrent_state=next_state;ENDIF;ENDPROCESS;--信号current_state将值带出此进程COM:PROCESS(current_state,state_Inputs)--接下页BEGINCASEcurrent_stateISWHENs0=comb_outputs=5;--输出仅取决于现态IFstate_inputs=00THENnext_state=s0;ELSEnext_state=s1;--输入决定次态ENDIF;WHENs1=comb_outputs=8;IFstate_inputs=01THENnext_state=s1;ELSEnext_state=s2;ENDIF;WHENs2=comb_outputs=12;IFstate_inputs=10THENnext_state=s0;ELSEnext_state=s3;ENDIF;WHENs3=comb_outputs=14;IFstate_inputs=11THENnext_state=s3;ELSEnext_state=s4;ENDIF;WHENs4=comb_outputs=9;next_state=s0;WHENOTHERS=next_state=s0;ENDcase;ENDPROCESS;ENDbehv;接上页对照图7-2例7-1状态机的工作时序图clkResetState_inputsCurrent_stateNext_stateComb_outputsx1xxs0x5000/xxs0s0/s15001/xxs1s1/s28010/xxs2s0/s312011/xxs3s3/s4140xxs4s09状态转换图输出仅取决于现态与输入无关;输入仅决定次态Moore型对照s0s1s2s0s1s27.1.3状态机设计初始控制与表述(1)打开“状态机萃取”开关Assignments/Settings/7.1.3状态机设计初始控制与表述(2)状态图观察Tools/NetlistViewers/StateMachineViewer图7-3例7-1状态图7.2Moore型有限状态机的设计7.2.1ADC采样控制设计及多进程有限状态机AD674:采样周期约为15us,采样50个点需花时15us×50=0.75ms51单片机:控制完成一次采样最少需30条指令,设单片机频率为12MHz,一次采样花时30×2+15(等待时间)=75us,采样50个点需花时75us×50约4msFPGA:控制完成一次采样需4~5个状态,若FPGA时钟频率为100MHz,一次采样需花时10ns×5=50ns采样50个点需花时50ns×50=2.5us图7-4ADC0809工作时序和芯片引脚图用状态机对AD0809进行采样控制的设计方法状态地址锁存转换启动输出有效输出的数字信号01243AD0809逻辑控制真值表ALESTARTLOCKOEEOC工作状态000010_初始化110001_启动采样000002_转换未结束000012_转换结束000113_输出转换好的数据001114_输出数据送到锁存器状态地址锁存转换启动输出有效内部锁存图7-5控制ADC0809采样状态图PROCESSREG时序进程PROCESSREG时序进程PROCESSCOM组合进程PROCESSCOM组合进程PROCESSLATCH1锁存器PROCESSLATCH1锁存器current_statenext_stateLOCK状态机FSMFPGA/CPLDCLK状态机工作时钟ADC0809Q[7..0]模拟信号输入采样数据输出A/D工作时钟clk=750KHzALESTARTOEADDAEOCD[7..0]图7-6采样状态机结构框图clk【例7-2】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYADC0809ISPORT(D:INSTD_LOGIC_VECTOR(7DOWNTO0);--A/D转换后的数据CLK,RST:INSTD_LOGIC;--状态机工作时钟和系统复位控制信号EOC:INSTD_LOGIC;--AD0809工作状态指示信号,‘0’表示正在转换ALE:OUTSTD_LOGIC;--AD0809模拟信号通道地址锁存信号START:OUTSTD_LOGIC;--转换启动信号OE:OUTSTD_LOGIC;--数据输出控制信号ADDA:OUTSTD_LOGIC;--模拟通道控制信号LOCK_T:OUTSTD_LOGIC;--锁存测试信号Q:OUTSTD_LOGIC_VECTOR(7DOWNTO0));--数据输出ENDADC0809;ARCHITECTUREbehavOFADC0809ISTYPEstatesIS(s0,s1,s2,s3,s4);SIGNALcurrent_state,next_state:states:=s0;SIGNALREGL:STD_LOGIC_VECTOR(7DOWNTO0);SIGNALLOCK:STD_LOGIC;BEGIN接下页接上页ADDA=‘0’;LOCK_T=LOCK;--模拟信号进入0809通道0COM:PROCESS(current_state,EOC)--决定各状态转换方式BEGINCASEcurrent_stateISWHENs0=ALE='0';START='0';LOCK='0';OE='0';next_state=s1;--0809初始化WHENs1=ALE='1';START='1';LOCK='0';OE='0';next_state=s2;--启动采样WHENs2=ALE='0';START='0';LOCK='0';OE='0';IF(EOC=‘1’)THENnext_state=s3;--转换结束ELSEnext_state=s2;--转换未结束,等待转换ENDIF;WHENs3=ALE='0';START='0';LOCK='0';OE='1';next_state=s4;--开启OE,输出有效WHENs4=ALE='0';START='0';LOCK='1';OE='1';next_state=s0;--锁存数据WHENOTHERS=next_state=s0;ENDCASE;ENDPROCESSCOM;接下页REG:PROCESS(CLK,RST)--时序进程BEGINIFRST=‘1’THENcurrent_state=s0;ELSIF(CLK'EVENTANDCLK='1')THENcurrent_state=next_state;ENDIF;ENDPROCESSREG;--信号current_state将值带出此进程LATCH1:PROCESS(LOCK)--数据锁存器进程BEGINIFLOCK='1'ANDLOCK'EVENTTHENREGL=D;ENDIF;ENDPROCESS;--在LOCK的上升沿将转换好的数据锁入Q=REGL;ENDbehav;接上页图7-6ADC0809采样状态仿真波形ALESTARTLOCKOEEOC工作状态000010_初始化1100X1_启动采样000002_转换未结束0
本文标题:74第七章_VHDL有限状态机设计
链接地址:https://www.777doc.com/doc-4404674 .html