您好,欢迎访问三七文档
状态机编程FSM设计方法•分析控制器设计指标,建立系统算法模型,即状态转换图;•分析被控对象的时序,确定控制器的有限状态机的各个状态及输入、输出条件;•应用VHDL语言完成状态机的描述。FSM分类•Moore型:输出信号仅与现态相关•Mealy型:输出信号与现态和输入相关DFFsOutputComb.LogicFeedbackComb.LogicDFFsOutputComb.LogicFeedbackComb.LogicMooreMealy现态次态输入输出现态次态输出输入FSM构成FSM用来解决一般时序逻辑电路问题,包括同步/异步时序逻辑•状态寄存器–当前状态(现态)寄存器•组合逻辑电路–下一状态(次态)组合逻辑–输出组合逻辑Moore和Mealy状态机描述的区别就在于输出逻辑进程例子:0101序列检测码例子:0101序列检测码例子:0101序列检测码vhdl语言描述FSM的建立过程•定义状态机的状态•定义状态变量•描述状态机的进程定义状态机的状态•在使用状态机之前应该定义状态变量的枚举类型,可以定义在状态机描述的源文件中,或者是专门的程序包中。•例子:TYPEstateIS(state1,state2);定义状态变量•定义两个状态机变量:当前状态和次态,其中当前状态描述的是一组寄存器,而下一状态描述的是组合逻辑。•例:signalcurrent_state:state;signalnext_state:state;描述状态机的进程状态机的描述方式:三进程、二进程、单进程一般采用三个进程来描述状态机描述状态机寄存器的时序进程描述次态产生逻辑的组合逻辑进程描述输出组合逻辑进程易出错,可读性差,不利于优化状态机寄存器的时序进程process(reset,clk)beginifreset='1'thencurrent_state=初始状态;elsifrising_edge(clk)thencurrent_state=next_state;endif;endprocess;一定要有复位信号,否则状态机处于随机状态,无法开始正常工作FSM的复位•同步复位–双进程状态机•在第1个进程的开始处用IFTHEN语句判断RESET,在其后的ELSE语句里用CASE语句定义状态转换•或者在第2个进程里定义同步复位–单进程状态机•进程里定义同步复位•异步复位–双进程状态机•在第2个进程里定义异步复位–单进程状态机•进程里定义异步复位CASE_WHENIF…THENELSEPROCESS1CLK’EVENTANDCLK=‘1’PROCESS2次态现态输入输出次态转移逻辑进程process(current_state,其他输入信号)beginnext_state=current_state;casecurrent_stateiswhenstate1=.......next_state=某个状态;..........whenstate2=.......next_state=某个状态;..........endcase;endprocess;次态转移逻辑进程在case语句之前,给nenxt_state赋一个缺省值:next_state=current_state;其意义在于:当case语句中决定下个状态的逻辑比较复杂时,就不用给所有的情况赋值,不关心的情况就保持原状态。输出逻辑进程process(current_state,其他输入信号)beginoutput=缺省值;casecurrent_stateiswhenstate1=output=某个值;whenstate2=output=某个值;.........................endcase;endprocess;Mealy机就需要其他输入信号,这些信号和当前状态共同决定输出信号;Moore机则不需要,其输出只与当前状态有关。Stmch1.vhdlibraryieee;useieee.std_logic_1164.all;entitystmch1isport(clk,in1,rst:instd_logic;out1:outstd_logic);endstmch1;architecturebehaveofstmch1istypestate_valuesis(sx,s0,s1);signalstate,next_state:state_values;beginprocess(clk,rst)beginifrst='1'thenstate=s0;elsifrising_edge(clk)thenstate=next_state;endif;endprocess;process(state,in1)begin--setdefaultsforoutputandstateout1='0';next_state=sx;--catchmissing--assignmentsto--next_statecasestateiswhens0=ifin1='0'thenout1='1';next_state=s1;elseout1='0';next_state=s0;endif;whens1=ifin1='0'thenout1='0';next_state=s0;elseout1='1';next_state=s1;endif;whensx=next_state=sx;endcase;endprocess;endbehave;CombLogicDFFsin1stateclkrstout1next_states0/0s1/1input=0Reset=1input=0input=1input=1statmach.vhdLibraryIEEE;useIEEE.std_logic_1164.all;ENTITYstatmachISPORT(clk:INBIT;input:INBIT;reset:INBIT;output:OUTBIT);ENDstatmach;ARCHITECTUREaOFstatmachISTYPESTATE_TYPEIS(s0,s1);SIGNALstate:STATE_TYPE;BEGINPROCESS(clk,reset)BEGINIFreset='1'THENstate=s0;ELSIF(clk'EVENTANDclk='1')THENCASEstateISWHENs0=state=s1;WHENs1=IFinput='1'THENstate=s0;ELSEstate=s1;ENDIF;ENDCASE;ENDIF;ENDPROCESS;output='1'WHENstate=s1ELSE'0';ENDa;s0/0s1/1input=1input=0Reset=1
本文标题:状态机编程改
链接地址:https://www.777doc.com/doc-3577166 .html