第6章状态机程序设计

上传人:沈*** 文档编号:235416292 上传时间:2023-11-08 格式:PPT 页数:38 大小:852.52KB
返回 下载 相关 举报
第6章状态机程序设计_第1页
第1页 / 共38页
第6章状态机程序设计_第2页
第2页 / 共38页
第6章状态机程序设计_第3页
第3页 / 共38页
点击查看更多>>
资源描述
第第6 6章章 状态机程序设计状态机程序设计6.16.1有限状态机引论有限状态机引论6.1.16.1.1有限状态机概念有限状态机概念 在一个复杂的控制系统中,可以将控制过程分为几步或几个状态,在每个状态下,控制系统的动作简单明确。我们只要根据系统的要实现的功能,画出状态转换图及每个状态下的动作或输出函数,即可实现有效控制。这种控制方式在数字系统中称为状态机,实际上就是控制系统理论中比较重要的步进控制。例:AD574转换控制器 控制逻辑:CE CS RC X12/8 A0 工作状态0XXXX禁止X1XXX禁止100X0启动12位转换100X1启动8位转换1011X12位数据输出10100高8位数据输出10101低4位数据输出操作时序状态转换图要求控制器在现场信号作用下自动进行状态转换,并根据当前状态发出相应控制信号以控制现场。状态机就是完成这一目的。有限状态机及其设计技术是实用数字系统设计中的重要组成部分,是实现高效率高可靠逻辑控制的重要途径。6.1.2 状态机的优点 无论与基于无论与基于VHDLVHDL的其他设计方案相比,还是与可完成相的其他设计方案相比,还是与可完成相似功能的似功能的CPUCPU相比,状态机都有其难以超越的优越性,相比,状态机都有其难以超越的优越性,它主要表现在以下几方面:它主要表现在以下几方面:1 1、控制灵活、方便:状态机的工作方式是根据控制信号、控制灵活、方便:状态机的工作方式是根据控制信号按照预先设定的状态顺序运行的,因此状态机在其运行按照预先设定的状态顺序运行的,因此状态机在其运行方式上类似于控制灵活和方便的方式上类似于控制灵活和方便的CPUCPU。2 2、结构简单,便于设计:设计方案相对固定结构简单,便于设计:设计方案相对固定3 3、易构成性能良好的同步时序逻辑模块,避免竞争冒险、易构成性能良好的同步时序逻辑模块,避免竞争冒险现象。现象。4 4、运行速度比、运行速度比CPUCPU要高出三至四个数量级。要高出三至四个数量级。5 5、可靠性:状态机由纯硬件电路构成;由非法状态跳出,、可靠性:状态机由纯硬件电路构成;由非法状态跳出,只要只要2 2、3 3个时钟周期,所耗时间短个时钟周期,所耗时间短 6.1.3 状态机的分类 1 1)从状态机的信号输出方式上分有)从状态机的信号输出方式上分有MealyMealy型和型和MooreMoore型两型两种状态机。种状态机。MealyMealy属于异步输出状态机。其输出是当前状态和所有输属于异步输出状态机。其输出是当前状态和所有输入信号的函数,它的输出是在输入变化后立即发生的,入信号的函数,它的输出是在输入变化后立即发生的,不依赖时钟的同步。不依赖时钟的同步。MooreMoore属于同步输出状态机,其输出则仅为当前状态的函属于同步输出状态机,其输出则仅为当前状态的函数,这类状态机在输入发生变化还必须等待时钟的到来,数,这类状态机在输入发生变化还必须等待时钟的到来,时钟使状态发生变化时才导致输出的变化,所以比时钟使状态发生变化时才导致输出的变化,所以比MealyMealy机要多等待一个时钟周期。机要多等待一个时钟周期。2 2)从程序结构上分,有单进程状态机和多进程状态机。)从程序结构上分,有单进程状态机和多进程状态机。3 3)从编码方式上分有顺序编码状态机、一位热码编码状)从编码方式上分有顺序编码状态机、一位热码编码状态机或其他编码方式状态机。态机或其他编码方式状态机。6.2 6.2 典型状态机设计典型状态机设计 典型状态机设计由状态信号定义、准备下一状态进程、状典型状态机设计由状态信号定义、准备下一状态进程、状态切换进程、输出进程等四部分构成。态切换进程、输出进程等四部分构成。【例例6-16-1】用用FPGA/CPLDFPGA/CPLD控制控制AD574AD574进行进行1212位位A/DA/D转换,并转换,并将转换结果保存在将转换结果保存在Q0Q11Q0Q11中中 CE CS RC X12/8 A0 工作状态0XXXX禁止X1XXX禁止100X0启动12位转换100X1启动8位转换1011X12位数据输出10100高8位数据输出10101低4位数据输出分析:12位A/D转换,12位结果输出,X12/8接高电平,A0接低电平;2个片选信号用1个CE,CS接低电平。LIBRARY IEEELIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_1164.ALL;ENTITY AD574 ISENTITY AD574 ISPORT(DPORT(D:IN STD_LOGIC_VECTOR(11 DOWNTO 0)IN STD_LOGIC_VECTOR(11 DOWNTO 0);Q Q:OUT STD_LOGIC_VECTOR(11 DOWNTO 0)OUT STD_LOGIC_VECTOR(11 DOWNTO 0);CLKCLK,STATUSSTATUS:IN STD_LOGIC;IN STD_LOGIC;CE CE,RCRC:OUT STD_LOGIC)OUT STD_LOGIC);END AD574END AD574;ARCHITECTURE ARCHITECTURE behavbehav OF AD574 IS OF AD574 IS TYPE states IS(s0TYPE states IS(s0,sl sl,s2s2,s3s3,s4s4,s5)s5);SIGNAL SIGNAL c_stc_st,n_stn_st:statesstates;SIGNAL LOCKSIGNAL LOCK:STD_LOGICSTD_LOGIC;BEGINBEGIN1、状态信号定义:采用枚举数据类型定义系统中有哪些状态,并定义当前状态信号、下一状态信号。一般放在结构体的ARCHITECTURE和BEGIN之间。在数字系统中,每一状态对应一个二进制数,称状态编码。如AD574控制有5个状态,可用3位二进制表示:(000、001、010、011、100)。但设计者在状态机的设计中,为了更利于阅读、编译和VHDL综合器的优化,往往将表征每一状态的二进制数组用文字符号来代表,即所谓状态符号化。如(s0,sl,s2,s3,s4,s5),或者(READY,START,WAIT_H,WAIT_L,READ,LOCK)等更直观的符号表示。PROCESSPROCESS(c_stc_st,STATUSSTATUS)-准备下一状态准备下一状态 BEGIN -BEGIN -实现状态图连接实现状态图连接 CASE CASE c_stc_st IS IS WHEN s0=WHEN s0=n_stn_st=n_stn_st=s2IF(STATUS=1)THEN WHEN s2=IF(STATUS=1)THEN n_stn_st=s3=s3;ELSE ELSE n_stn_st=s2 IF(STATUS=1)THEN WHEN s3=IF(STATUS=1)THEN n_stn_st=s3=s3;ELSE ELSE n_stn_st=s4 WHEN S4=n_stn_st=s5WHEN S5=n_stn_st=s0WHEN OTHERS=n_stn_st=s0=s0;END CASEEND CASE;END PROCESSEND PROCESS;2、准备下一状态进程:n n根据外部输入的控制信号,和当前状态的状态值确定下一状态(next state)的取向,即next state的取值内容。n n相当于用VHDL语言实现状态转换图的连接。n n常用CASE语句。n n进程敏感表为当前状态和状态机的输入信号。-状态切换进程PROCESS (CLK)BEGIN IF(CLKEVENT AND CLK=1)THEN c_stCECE=0;RC=0RC=0;LOCK=0;LOCKCECE=1;RC=0;LOCK=0RC=0;LOCKCECE=0;RC=0RC=0;LOCK=0LOCKCECE=0;RC=0RC=0;LOCK=0LOCKCECE=1;RC=1RC=1;LOCK=0LOCKCECE=1;RC=1RC=1;LOCK=1LOCKCECE=0;RC=0RC=0;LOCKLOCK=0=0;END CASEEND CASE;END PROCESSEND PROCESS;4、输出进程:n n根据当前状态和输入,送出控制信号。PROCESS(LOCK)-数据保存 BEGIN IF LOCK=1AND LOCKEVENT THEN Q12 WHEN s0=n_stn_st=s1;=s1;CE=0;RC=0;LOCK=0;CE=0;RC=0;LOCK WHEN S1=n_stn_st=s2;CE=1;RC=0;LOCK=0;=s2;CE=1;RC=0;LOCKIF(STATUS=1)THEN WHEN s2=IF(STATUS=1)THEN n_stn_st=s3;=s3;ELSE ELSE n_stn_st=s2;END 1F;=s2;END 1F;CE=0;RC=0;LOCK=0;CE=0;RC=0;LOCK IF(STATUS=1)THEN WHEN s3=IF(STATUS=1)THEN n_stn_st=s3;=s3;ELSE ELSE n_stn_st=s4;END 1F;=s4;END 1F;CE=0;RC=0;LOCK=0;CE=0;RC=0;LOCK WHEN S4=n_stn_st=s5;CE=1;RC=1;LOCK=0;=s5;CE=1;RC=1;LOCK WHEN S5=n_stn_st=s0;CE=1;RC=1;LOCK=1;=s0;CE=1;RC=1;LOCK WHEN OTHERS=n_stn_st=s0;=s0;CE=0;RC=0;LOCK=0;CE=0;RC=0;LOCKN_STN_STN_STN_ST IF EOC=1 THEN N_ST IF EOC=1 THEN N_ST=S2;ELSE N_ST=S3;END IF;ELSE N_ST IF EOC=0 THEN N_ST IF EOC=0 THEN N_ST=S3;ELSE N_ST=S4;END IF;ELSE N_ST N_ST N_STN_STN_ST N_ST N_ST=S0;ALE=0;START=0;OE=0;LOCK=0;END CASE;END CASE;END PROCESS;END PROCESS;PROCESS(PROCESS(clkclk)-STATE SWITCH,SEL+1)-STATE SWITCH,SEL+1 BEGINBEGIN IF(CLKEVENT AND CLK=1)THEN IF(CLKEVENT AND CLK=1)THEN C_ST=N_ST;C_ST=N_ST;SEL=SEL+1;SELD4D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 NULL;WHEN OTHERS=NULL;END CASE;END CASE;END PROCESS;END PROCESS;PROCESS(LOCK)-save data BEGIN IF(LOCKEVENT AND LOCK=1)THEN D8=D;END IF;END PROCESS;-字型转换进程(略)HEXLED D4LED8END BODY;【例6-3】根据状态转换图给出状态机设计,S0S3为状态号,圈内为输出。带复位信号,复位为S0.LIBRARY 1EEE;USE IEEESTD_ LOGIC_1164ALL;ENTITY s_ machine IS port(clk,reset:IN STD_LOGIC;inputs:IN STD_LOGIC_VECTOR(0 TO 1);outputs:OUT INTEGER range(0 to 15);END s_ machine;ARCHITECTURE behav OF s_machine IS Type states is (s0,s1,s2,s3);SIGNAl c_s,n_s:states;BEGINPROCESS (reset,clk)-状态切换 BEGIN IF reset=1 THEN c_ s =s0;ELSIF clk=lAND clkEVENT THEN C_ s outputs outputs=5;IF inputs=”00”THEN n_ s=s0;IF inputs=”00”THEN n_ s=s0;ELSE n_ s=s1 ELSE n_ s outputs outputs=8;IF inputs=”00”THEN n_ s=s1;IF inputs=”00”THEN n_ s=s1;ELSE n_s=s2 ELSE n_s outputs outputs=12;IF inputs=”11”THEN n_s=s0;IF inputs=”11”THEN n_s=s0;ELSE n_s=s3;END IF;ELSE n_s OUTPUTS OUTPUTS=14;If inputs=“11”If inputs=“11”THenTHen n_s=s3;n_s=s3;ELSE n_s=s0;END IF ELSE n_swhen others=n_sn_s=s0;=s0;END case;END case;END PROCESS;END PROCESS;END END behavbehav;6.3 6.3 状态机的改进状态机的改进6.3.1、状态机输出毛刺现象的克服当状态机的输出信号由组合电路发出时,一般情况下难免出现毛刺现象,如果这些输出被用于作为时钟信号,极易产生错误的操作。单进程Moore状态机比较容易构成能避免出现毛刺现象的状态机。【例6-5】例6-4,单进程LIBRARY IEEELIBRARY IEEE;USE IEEEUSE IEEESTD_LOGIC_1164STD_LOGIC_1164ALLALL;ENTITY ENTITY MOORElMOOREl IS ISPORT(DATAINPORT(DATAIN:IN STD_LOGIC_VECTOR(1 DOWNTO 0)IN STD_LOGIC_VECTOR(1 DOWNTO 0);CLKCLK,RSTRST:IN STD_LOGICIN STD_LOGIC;Q Q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)OUT STD_LOGIC_VECTOR(3 DOWNTO 0);END END MOORElMOOREl;ARCHITECTURE behav OF MOOREl ISTYPE ST_TYPE IS (ST0,STl,ST2,ST3);SIGNAL C_ST;ST_TYPE ;BEGIN PROCESS (CLK,RES)BEGIN IF RST=1 THEN C_ST=ST0;QIF DATAIN=”00”THEN C_ST=ST0;ELSE C_ST=ST1;END IF;QIF DATAIN=“00”THEN C_ST=ST1;ELSE C_ST=ST2;END IF;QIF DATAIN=”11”THEN C_ST=ST0;ELSE C_ST=ST3;END IF;QIF DATAIN=”11”THEH C_ST=ST3;ELSE C_ST=ST0;END IF;QIF DATAIN=“11”THEN C_ST=ST0;ELSE C_ST=ST3;END IF;QC_ST=ST0;Q=“0000”;END CASE;END IF;END PROCESS;END behav;对二进程、三进程状态机,为了解决输出信号毛刺现象,对二进程、三进程状态机,为了解决输出信号毛刺现象,可以将输出信号由时钟信号锁存后再输出。可以将输出信号由时钟信号锁存后再输出。ARCHITECTURE ARCHITECTURE behavbehav OF CLKLOCK IS OF CLKLOCK IS TYPE TYPE states IS (s0 states IS (s0,s1s1,s2s2,s3s3);SIGNALSIGNAL STX STX:statesstates;BEGINBEGIN PROCESS(CLK,RESET)PROCESS(CLK,RESET)-决定转换状态的进程决定转换状态的进程 BEGIN BEGIN IFIF RESET=1THEN RESET=1THEN STX STX=S0s0=IF IF DATAIN=”00”THEN STX=S0 DATAIN=”00”THEN STX=S0;ELSEELSE STX=S1 STXWHEN s1=IF DATAIN=”00”THEN STX=s1 IF DATAIN=”00”THEN STX=s1;ELSE STX=S2ELSE STXWHEN s2=IF DATAIN=”11”THEN STX=s0;IF DATAIN=”11”THEN STX=s0;ELSE STX=S3 ELSE STXWHEN s3=IF DATAIN=”11”THEN STX=S3 IF DATAIN=”11”THEN STX=S3;ELSE STX=S0 ELSE STXSTXSTX=st0;END CASE END CASE ;END IFEND IF;END PROCESS END PROCESS;END behav;END behav;对二进程、三进程状态机,为了解决输出信号毛刺现象,对二进程、三进程状态机,为了解决输出信号毛刺现象,可以将输出信号由时钟信号锁存后再输出。可以将输出信号由时钟信号锁存后再输出。ARCHITECTURE ARCHITECTURE behavbehav OF CLKLOCK IS OF CLKLOCK ISTYPE states IS (s0TYPE states IS (s0,s1s1,s2s2,s3)s3);SIGNAL STXSIGNAL STX:statesstates;BEGINBEGIN PROCESS(CLK,RESET)BEGIN-PROCESS(CLK,RESET)BEGIN-决定转换状态的进程决定转换状态的进程 IF RESET=1THEN STX=S0IF RESET=1THEN STXIF DATAIN=”00”THEN STXIF DATAIN=”00”THEN STX=S0;ELSE STX=S1ELSE STXIF DATAIN=”00”THEN STXIF DATAIN=”00”THEN STX=s1;ELSE STX=S2ELSE STXIF DATAIN=”11”THEN STXIF DATAIN=”11”THEN STX=s0;ELSE STX=S3 ELSE STXIF DATAIN=”11”THEN STXIF DATAIN=”11”THEN STX=S3;ELSE STX=S0ELSE STXSTXSTX Q Q Q Q Q Q Q QNULL;WHEN OTHERS=NULL;END CASE END CASE;END IFEND IF;END PROCESSEND PROCESS;END END behavbehav;6.3.2 6.3.2 状态编码状态编码用文字符号如s0、s1定义各状态变量的状态机称为符号化状态机。其状态变量具体编码由VHDL综合器根据具体情况确定自动对编码方式进行选择。状态机的状态编码方式也可人为控制。为了满足一些特殊需要,在状态机设计程序中,可直接将各状态用具体的二进制数进行定义,而不使用文字符号定义。1 1、状态位直接输出型编码:最典型的应用实例就是计数、状态位直接输出型编码:最典型的应用实例就是计数器。计数器本质上是一个主控时序进程与主控组合进程器。计数器本质上是一个主控时序进程与主控组合进程合二为一的状态机,它的输出就是各状态的状态码。合二为一的状态机,它的输出就是各状态的状态码。2 2、顺序编码、顺序编码 这种编码方式最为简单,且使用的触发器数量最少,剩这种编码方式最为简单,且使用的触发器数量最少,剩余的非法状态最少,容错技术最为简单。余的非法状态最少,容错技术最为简单。这种顺序编码方式的缺点是,尽管节省了触发器,却增这种顺序编码方式的缺点是,尽管节省了触发器,却增加了从状态向输出转换的译码组合逻辑。加了从状态向输出转换的译码组合逻辑。3 3、一位热码编码、一位热码编码(One-hot encoding)(One-hot encoding)一位热码编码方式一位热码编码方式(表表7-3)7-3)就是用就是用n n个触发器来实现具有个触发器来实现具有n n个状态的状态机,状态机中的每一个状态都由其中一个状态的状态机,状态机中的每一个状态都由其中一个触发器的状态表示。即当处于该状态时,对应的触发个触发器的状态表示。即当处于该状态时,对应的触发器为器为1 1,其余的触发器都置,其余的触发器都置0 0。用了较多的触发器,但编码方式大为简化状态译码逻辑,用了较多的触发器,但编码方式大为简化状态译码逻辑,提高了状态转换速度,提高了状态转换速度,6.3.3 6.3.3 状态机剩余状态处理状态机剩余状态处理 n n 在状态机设计中,不管使用何种编码,总是不可避免地出现大量剩余状态,即未被使用的编码组合,称为非法状态。如果不对这些非法状态进行处理,在外界不确定的干扰或随机上电的初始启动后,状态机都有可能进入不可预测的非法状态,导致失控。因此,状态机的剩余状态的处理,即状态机系统容错技术的应用是设计者必须慎重考虑的问题。n n解决的方法是利用OTHERS语句对未提到的状态作统一处理,即CASE语句最后一个条件为:n n WHEN OTHERS=next state=st0;
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!