第4章有限状态机FSM(简称状态机)的VHDL设计一、有限状态机的基本概念1、有限状态机的基本结构和功能有限状态机(FiniteStateMachine,简称FSM)是一种十分重要的时序逻辑电路,由状态寄存器和组合逻辑电路组成,是数字逻辑电路以及数字系统的重要组成部分,尤其应用于数字系统核心部件(控制单元)的设计,以实现高效率高可靠性的逻辑控制。有限状态机可实现以下两种基本操作:(1)状态机内部状态转换。由状态译码器根据当前状态和输入信号确定。(2)产生输出信号序列。由输出译码器根据状态机当前状态和输入信号确定。输出组合逻辑电路状态译码器状态寄存器输出译码器反馈状态输出状态机结构示意图次态组合逻辑电路输入2、有限状态机的分类在实际的应用中,根据有限状态机是否使用输入信号,经常将其分为Moore型有限状态机和Mealy型有限状态机两种类型。1、Moore型有限状态机其输出信号仅与当前状态有关,即可以把Moore型有限状态的输出看成是当前状态的函数。2、Mealy型有限状态机其输出信号不仅与当前状态有关,而且还与所有的输入信号有关,即可以把Mealy型有限状态机的输出看成是当前状态和所有输入信号的函数。次态组合逻辑电路(NS)当前状态寄存器(CS)输出组合逻辑电路(OL)输入输出时钟Moore状态机结构示意图次态组合逻辑电路(NS)当前状态寄存器(CS)输出组合逻辑电路(OL)输入输出时钟Mealy状态机结构示意图二、一般有限状态机的设计用VHDL语言描述状态机的常用方法有两种:三进程(PROCESS)语句描述分别对次态组合逻辑电路、输出组合逻辑电路和状态寄存器进行描述。两进程(PROCESS)语句描述将两个组合逻辑电路用一个进程语句语句描述,用另一个进程语句描述状态寄存器。当然也可以用单进程描述。1、一般有限状态机的VHDL组成:主要使用TYPE语句定义新的数据类型,如:TYPEstatesIS(st0,st1,st2,st3,st4,st5);SIGNALpresent_state,next_state:states;:负责状态机运转和在外部时钟驱动下实现内部状态转换的进程。时序进程的实质是一组触发器,因此,该进程中往往也包括一些清零或置位的输入控制信号,如Reset信号。:根据状态机外部输入的状态控制信号(包括来自外部的和状态机内部的非进程的信号)和当前的状态值current_state来确定下一状态next_state的取值内容,以及对外部或对内部其他进程输出控制信号的内容。:辅助逻辑部分主要是用于配合状态机的主控组合逻辑和主控时序逻辑进行工作,以完善和提高系统的性能。说明部分主控时序逻辑部分主控组合逻辑部分辅助逻辑部分LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYtwo_process_state_machineISPORT(clk,reset:INSTD_LOGIC;state_inputs:INSTD_LOGIC;comb_outputs:OUTSTD_LOGIC_VECTOR(0TO1));ENDtwo_process_state_machine;ARCHITECTUREbehvOFtwo_process_state_machineISTYPEstatesIS(st0,st1,st2,st3);--定义states为枚举型数据类型,构造符号化状态机SIGNALcurrent_state,next_state:states;BEGINREG:PROCESS(reset,clk)--时序逻辑进程BEGINIFreset='1'THEN--异步复位current_state=st0;ELSIFclk='1'ANDclk'EVENTTHEN--出现时钟上升沿时进行状态转换current_state=next_state;ENDIF;ENDPROCESS;2、一般有限状态机的设计实例例3.1二进程一般状态机的描述。COM:PROCESS(current_state,state_inputs)--组合逻辑进程BEGINCASEcurrent_stateISWHENst0=comb_outputs=00;--系统输出及其初始化IFstate_inputs='0'THEN--根据外部输入条件决定状态转换方向next_state=st0;ELSEnext_state=st1;ENDIF;WHENst1=comb_outputs=01;IFstate_inputs=‘0’THENnext_state=st1;ELSEnext_state=st2;ENDIF;WHENst2=comb_outputs=10;IFstate_inputs=‘0’THENnext_state=st2;ELSEnext_state=st3;ENDIF;WHENst3=comb_outputs=11;IFstate_inputs=‘0’THENnext_state=st3;ELSEnext_state=st0;ENDIF;ENDCASE;ENDPROCESS;ENDARCHITECTUREbehv;resetst3st0st1st21/011/101/110/110/000/000/010/10state_inputsclkresetst0st1st2clkresetstate_inputscomb_outputs[0..1]current_state例3.1的状态转换图例3.1的时序仿真图例3.1的RTL图三、摩尔(Moore)状态机设计摩尔型有限状态机输出只与当前状态有关,而与当前的输入信号值无关,并且仅在时钟边沿到来时才发生变化,是严格的现态函数。例3.2四状态摩尔型有限状态机的描述。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYfour_state_moore_state_machineISPORT(Clk:INSTD_LOGIC;Input:INSTD_LOGIC;reset:INSTD_LOGIC;output:OUTSTD_LOGIC_VECTOR(1DOWNTO0));ENDENTITY;ARCHITECTURErtlOFfour_state_moore_state_machineIS--定义枚举类型的状态机TYPEstate_typeIS(s0,s1,s2,s3);以下分别用三进程,两进程和单进程描述结构体三进程:SIGNALCS,NS:STATE_TYPE;BEGINREG:PROCESS(CLK,RESET)--寄存器进程BEGINIFRESET=‘0’THENCS=S0;ELSIFCLK'EVENTANDCLK='1‘THENCS=NS;ENDIF;ENDPROCESS;FUNC1:PROCESS(INPUT,CS)--次态组合逻辑译码进程BEGINCASECSISWHENS0=IFINPUT='1'THENNS=S1;ELSENS=S0;ENDIF;WHENS1=IFINPUT='1'THENNS=S2;ELSENS=S1;ENDIF;WHENS2=IFINPUT='1'THENNS=S3;ELSENS=S2;ENDIF;WHENS3=IFINPUT='1'THENNS=S0;ELSENS=S3;ENDIF;ENDCASE;ENDPROCESS;Func2:PROCESS(cs)--由当前状态决定的输出组合逻辑进程BEGINCASECSISWHENs0=output=00;WHENs1=output=01;WHENs2=output=10;WHENs3=output=11;ENDCASE;ENDPROCESS;ENDrtl;可以把分别描述的三个进程自由组合成两个进程,甚至组合成一个进程。双进程:组合部分(次太译码和输出译码)和时序部分(寄存器)SINGALCS,NS:STATE_TYPE;BEGINREG:PROCESS(CLK,RESET)--寄存器进程BEGINIFRESET=‘0’THENCS=S0;ELSIFCLK'EVENTANDCLK='1‘THENCS=NS;ENDIF;ENDPROCESS;FUNC:PROCESS(INPUT,CS)--次态组合逻辑译码和输出译码进程BEGINCASECSISWHENS0=IFINPUT='1'THENNS=S1;ELSENS=S0;ENDIF;output=00;WHENS1=IFINPUT='1'THENNS=S2;ELSENS=S1;ENDIF;output=01;WHENS2=IFINPUT='1'THENNS=S3;ELSENS=S2;ENDIF;output=“10;WHENS3=IFINPUT='1'THENNS=S0;ELSENS=S3;ENDIF;output=“11;单进程SIGNALstate:state_type;--定义一个信号保存当前工作状态BEGINPROCESS(clk,input,reset)BEGINIFreset='1'THENstate=s0;ELSIF(clk'EVENTandclk='1')THENCASEstateISWHENs0=IFinput='1'THENstate=s1;ELSEstate=s0;ENDIF;output=00;WHENs1=IFinput='1'THENstate=s2;ELSEstate=s1;ENDIF;output=01;WHENs2=IFinput='1'THENstate=s3;ELSEstate=s2;ENDIF;output=“10;WHENs3=IFinput='1'THENstate=s0;ELSEstate=s3;ENDIF;output=“11;ENDCASE;ENDIF;ENDPROCESS;ENDrtl;例3.2的时序仿真图四、米立状态机设计米立状态机的输出是当前状态和输入信号的函数,输出随输入变化而随时发生变化。因此,从时序的角度上看,米立状态机属于异步输出的状态机,输出不依赖于系统时钟,也不存在摩尔状态机中输出滞后一个时钟周期来反映输入变化的问题。例3.3四状态米立状态机的描述。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYfour_state_mealy_state_machineISPORT(clk:INSTD_LOGIC;input:INSTD_LOGIC;reset:INSTD_LOGIC;output:OUTSTD_LOGIC_VECTOR(1DOWNTO0));ENDENTITY;ARCHITECTURErtlOFfour_state_mealy_state_machineIS--双进程结构体TYPEstate_typeIS(s0,s1,s2,s3);--定义枚举类型的状态机SIGNALstate:state_type;--定义一个信号保存当前工作状态BEGINREG:PROCESS(clk,reset)--次态组合译码和寄存器进程BEGINIFreset=‘1’THENstate=s0;--高电平有效的系统异步复位ELSIF(rising_edge(clk))THENCASEstateIS--依据当前状态和输入信号同步决定下一个状态WHENs0=IFinput='0'THENstate=s0;ELSEstate=s1;ENDIF;WHENs1=IFinput='0'THENstate=s1;ELSEstate=s2;ENDIF;WHENs2=IFinput='0'THENstate=s2;ELSEstate=s3;ENDIF;WHENs3=IFinput='0'THENstate=s3;ELSEstate=s0;ENDIF;ENDCASE;ENDIF;E