EDA技术主讲:牛军浩第八章有限状态机设计技术8.1状态机的一般形式8.2Moore型状态机及其设计8.3Mealy型状态机设计8.4状态机图形编辑设计8.5不同编码类型状态机8.6安全状态机设计8.7硬件数字技术排除毛刺教学目的有限状态机是实现高效率、高可靠和高速控制逻辑系统的重要途径。主要应用于那些操作和控制流程非常明确的系统设计,如数字通信、自动化控制、家电设计领域。8.1状态机的一般形式•就理论而言,任何时序模型都可以归结为一个状态机;•用HDL语言可以设计不同表达方式和不同功能的状态机,且多数状态机都有相对固定的语句和程序表达方式;•把握这些固定的语句表达部分,就能根据实际需要写出各种不同风格和不同目的的状态机。1.状态机特点和优势(1)高效的顺序控制模型(2)容易利用现有的EDA工具进行优化设计(3)系统性能稳定,性能良好的同步时序逻辑模块(4)设计实现效率高(5)高速性能(6)高可靠性能8.1状态机的一般形式2.状态机的分类(1)从信号输出方式上分:Mealy型和Moore型(2)从描述结构上分:单过程状态机和多过程状态机(3)从状态表达方式上分:有符号化和确定状态编码(4)从编码方式上分:有顺序编码、一位热码或其他8.1状态机的一般形式3.状态机的结构(1)说明部分使用TYPE语句定义新的数据类型,此数据类型为枚举型,其元素通常用状态机的状态名定义。一般放在ARCHITECTURE和BEGIN之间。8.1状态机的一般形式ARCHITECTURE...ISTYPEFSM_STIS(s0,s1,s2,s3);SIGNALcurrent_state,next_state:FSM_ST;...3.状态机的结构(2)主控时序进程负责状态机的运转和在时钟驱动下进行状态转换的进程状态机是随外部时钟信号,以同步时序方式工作的。状态机的变化是由始终CLK的跳变决定的,如上升沿或下降沿,当有效沿到来时,状态机才会向下一个状态跳变。一般主控时序进程不负责下一状态具体取值,如S0,S1,S2,S3中的某一状态,当有效沿到来,时序进程只是机械地将代表次态的信号NextState中的内容送入现态的信号CurrentState中,而NextState内容完全由其他进程决定。8.1状态机的一般形式3.状态机的结构8.1状态机的一般形式comb_outputsstate_inputsresetclkFSM:s_machineCOMnext_statecurrent_statePROCESSREGPROCESS一般状态机结构框图3.状态机的结构(3)主控组合进程通过信号Current_Steta中的状态值,进入相应的状态,并在此状态中根据外部信号指令,如stata_inputs等向内或外发出控制信号,如comb_outputs,同时确定下一个状态的走向,也就是向next_state中附入相应的状态值。此状态值通过next_state传给REG时序进程,直到下一个时钟到来再进入另一次的状态转换周期。8.1状态机的一般形式3.状态机的结构(4)辅助进程用于配合状态机工作的组合进程或时序进程。比如:为完成某种算法的进程、配合状态机工作的其它时序进程、为稳定输出设置的数据锁存器等等。8.1状态机的一般形式LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYFSM_EXPISPORT(clk,reset:INSTD_LOGIC;state_inputs:INSTD_LOGIC_VECTOR(1DOWNTO0);comb_outputs:OUTINTEGERRANGE0TO15);ENDFSM_EXP;ARCHITECTUREbehvOFFSM_EXPISTYPEFSM_STIS(s0,s1,s2,s3);--数据类型定义,状态符号化SIGNALcurrent_state,next_state:FSM_ST;BEGINREG:PROCESS(reset,clk)--主控时序进程BEGINIFreset='1'THENcurrent_state=s0;--检测异步复位信号ELSIFclk='1'ANDclk'EVENTTHENcurrent_state=next_state;ENDIF;ENDPROCESS;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=00THENnext_state=s1;ELSEnext_state=s2;ENDIF;WHENs2=comb_outputs=12;IFstate_inputs=11THENnext_state=s0;ELSEnext_state=s3;ENDIF;WHENs3=comb_outputs=14;IFstate_inputs=11THENnext_state=s3;ELSEnext_state=s0;ENDIF;ENDcase;ENDPROCESS;ENDbehv;Mealy型状态机的输出时当前状态和所有输入信号的函数,不依赖时钟的同步。Moore型状态机的输出仅为当前状态的函数,必须等待时钟变化才能输出。8.2Moore状态机Moore状态机的应用实例---A/D采样控制器设计一般传统方法用CPU或单片机完成,编程简单,控制灵活,但是控制周期长、速度慢。尤其当A/D本身速度比较快时,单片机或CPU的速度极大限制了A/D高速性能的应用。以AD674为例:AD674采样周期约为20us,也就是从启动到完成将模拟信号和转换为12位数字信号的时间。通常对于模拟信号的采样必须至少一个周期,假设为采样50个点,AD674要用时20us╳50=1ms。若应用单片机或CPU采样以单片机为例,过程如下:AD674初始化;启动采样等待约20us;读数命令;将转换好的12位数从AD674读入单片机;存入外部RAM;外部RAM地址加1。整个控制周期至少30条指令,每条指令平均2个时钟周期,单片机CLK为12MHZ,一个机器周期为1us,每条指令耗时2us,30条指令执行周期60us,再加上AD674采样周期20us,一个采样周期计80us,50个周期4ms。用单片机控制AD674这样速度并不高的AD器件尚且不能满足,则对于更高速的如TL5540(40MHZ,0.025us)就更加无能为力。若使用状态机控制A/D采样,包括数据存入RAM(FPGA内部RAM存储速率小于10ns),整个采样周期需要4-5个状态完成,若CLK为100MHZ,从一个状态到另一个状态的时间就是10ns,则一个采样周期约为50ns,远小于单片机的采样周期。这就是状态机的优点。5.2.1多进程状态机采样状态机结构框图LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYADCINTISPORT(D:INSTD_LOGIC_VECTOR(7DOWNTO0);--来自0809转换好的8位数据CLK:INSTD_LOGIC;--状态机工作时钟EOC:INSTD_LOGIC;--转换状态指示,低电平表示正在转换ALE:OUTSTD_LOGIC;--8个模拟信号通道地址锁存信号START:OUTSTD_LOGIC;--转换开始信号OE:OUTSTD_LOGIC;--数据输出3态控制信号ADDA:OUTSTD_LOGIC;--信号通道最低位控制信号LOCK0:OUTSTD_LOGIC;--观察数据锁存时钟Q:OUTSTD_LOGIC_VECTOR(7DOWNTO0));--8位数据输出ENDADCINT;(接下页)ARCHITECTUREbehavOFADCINTISTYPEstatesIS(st0,st1,st2,st3,st4);--定义各状态子类型SIGNALcurrent_state,next_state:states:=st0;SIGNALREGL:STD_LOGIC_VECTOR(7DOWNTO0);SIGNALLOCK:STD_LOGIC;--转换后数据输出锁存时钟信号BEGINADDA=‘1’;--当ADDA=‘0’,模拟信号进入通道IN0;当ADDA='1',则进入通道IN1Q=REGL;LOCK0=LOCK;COM:PROCESS(current_state,EOC)BEGIN--规定各状态转换方式CASEcurrent_stateIS(接下页)WHENst0=ALE='0';START='0';LOCK='0';OE='0';next_state=st1;--0809初始化WHENst1=ALE='1';START='1';LOCK='0';OE='0';next_state=st2;--启动采样WHENst2=ALE='0';START='0';LOCK='0';OE='0';IF(EOC=‘1’)THENnext_state=st3;--EOC=1表明转换结束ELSEnext_state=st2;--转换未结束,继续等待ENDIF;WHENst3=ALE='0';START='0';LOCK='0';OE='1';next_state=st4;--开启OE,输出转换好的数据WHENst4=ALE='0';START='0';LOCK='1';OE='1';next_state=st0;WHENOTHERS=next_state=st0;ENDCASE;ENDPROCESSCOM;(接下页)REG:PROCESS(CLK)BEGINIF(CLK'EVENTANDCLK='1')THENcurrent_state=next_state;ENDIF;ENDPROCESSREG;--由信号current_state将当前状态值带出此进程:REGLATCH1:PROCESS(LOCK)--此进程中,在LOCK的上升沿,将转换好的数据锁入BEGINIFLOCK='1'ANDLOCK'EVENTTHENREGL=D;ENDIF;ENDPROCESSLATCH1;ENDbehav;图5-6ADC0809采样状态机工作时序COM1:PROCESS(current_state,EOC)BEGINCASEcurrent_stateISWHENst0=next_state=st1;WHENst1=next_state=st2;WHENst2=IF(EOC='1')THENnext_state=st3;ELSEnext_state=st2;ENDIF;WHENst3=next_state=st4;--开启OEWHENst4=next_state=st0;WHENOTHERS=next_state=st0;ENDCASE;ENDPROCESSCOM1;COM2:PROCESS(current_state)BEGINCASEcurrent_stateISWHENst0=ALE='0';START='0';LOCK='0';OE='0';WHENst1=ALE='1';START='1';LOCK='0';OE='0';WHENst2=ALE='0';START='0';LOCK='0';OE='0';WHENst3=ALE='0';START='0';LOCK='0';OE='1';WHENst4=ALE='0';START='0';LOCK='1';OE='1';WHENOTHERS=ALE='0';START='0';LOCK='0';ENDCASE;ENDPRO