欢迎来到天天文库
浏览记录
ID:56383144
大小:787.50 KB
页数:19页
时间:2020-06-14
《状态机编程改.ppt》由会员上传分享,免费在线阅读,更多相关内容在PPT专区-天天文库。
1、状态机编程FSM设计方法分析控制器设计指标,建立系统算法模型,即状态转换图;分析被控对象的时序,确定控制器的有限状态机的各个状态及输入、输出条件;应用VHDL语言完成状态机的描述。FSM分类Moore型:输出信号仅与现态相关Mealy型:输出信号与现态和输入相关DFFsOutputComb.LogicFeedbackComb.LogicDFFsOutputComb.LogicFeedbackComb.LogicMooreMealy现态次态输入输出现态次态输出输入FSM构成FSM用来解决一般时序逻辑电路问题,包括同步/异步时序逻辑状态寄存器当前状态(现态)寄存器组合逻辑电路下一状态
2、(次态)组合逻辑输出组合逻辑Moore和Mealy状态机描述的区别就在于输出逻辑进程例子:0101序列检测码例子:0101序列检测码例子:0101序列检测码vhdl语言描述FSM的建立过程定义状态机的状态定义状态变量描述状态机的进程定义状态机的状态在使用状态机之前应该定义状态变量的枚举类型,可以定义在状态机描述的源文件中,或者是专门的程序包中。例子:TYPEstateIS(state1,state2);定义状态变量定义两个状态机变量:当前状态和次态,其中当前状态描述的是一组寄存器,而下一状态描述的是组合逻辑。例:signalcurrent_state:state;signalne
3、xt_state:state;描述状态机的进程状态机的描述方式:三进程、二进程、单进程一般采用三个进程来描述状态机描述状态机寄存器的时序进程描述次态产生逻辑的组合逻辑进程描述输出组合逻辑进程易出错,可读性差,不利于优化状态机寄存器的时序进程process(reset,clk)beginifreset='1'thencurrent_state<=初始状态;elsifrising_edge(clk)thencurrent_state<=next_state;endif;endprocess;一定要有复位信号,否则状态机处于随机状态,无法开始正常工作FSM的复位同步复位双进程状态机在第
4、1个进程的开始处用IFTHEN语句判断RESET,在其后的ELSE语句里用CASE语句定义状态转换或者在第2个进程里定义同步复位单进程状态机进程里定义同步复位异步复位双进程状态机在第2个进程里定义异步复位单进程状态机进程里定义异步复位CASE_WHENIF…THENELSEPROCESS1CLK’EVENTANDCLK=‘1’PROCESS2次态现态输入输出次态转移逻辑进程process(current_state,其他输入信号)beginnext_state<=current_state;casecurrent_stateiswhenstate1=>.......next_st
5、ate<=某个状态;..........whenstate2=>.......next_state<=某个状态;..........endcase;endprocess;次态转移逻辑进程在case语句之前,给nenxt_state赋一个缺省值:next_state<=current_state;其意义在于:当case语句中决定下个状态的逻辑比较复杂时,就不用给所有的情况赋值,不关心的情况就保持原状态。输出逻辑进程process(current_state,其他输入信号)beginoutput<=缺省值;casecurrent_stateiswhenstate1=>output<=
6、某个值;whenstate2=>output<=某个值;.........................endcase;endprocess;Mealy机就需要其他输入信号,这些信号和当前状态共同决定输出信号;Moore机则不需要,其输出只与当前状态有关。Stmch1.vhdlibraryieee;useieee.std_logic_1164.all;entitystmch1isport(clk,in1,rst:instd_logic;out1:outstd_logic);endstmch1;architecturebehaveofstmch1istypestate_value
7、sis(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;--cat
此文档下载收益归作者所有