状态机程序设计.ppt
第6章 状态机程序设计,6.1有限状态机引论有限状态机概念 在一个复杂的控制系统中,可以将控制过程分为几步或几个状态,在每个状态下,控制系统的动作简单明确。我们只要根据系统的要实现的功能,画出状态转换图及每个状态下的动作或输出函数,即可实现有效控制。这种控制方式在数字系统中称为状态机,实际上就是控制系统理论中比较重要的步进控制。,例:AD574转换控制器,控制逻辑:,操作时序,状态转换图,要求控制器在现场信号作用下自动进行状态转换,并根据当前状态发出相应控制信号以控制现场。状态机就是完成这一目的。有限状态机及其设计技术是实用数字系统设计中的重要组成部分,是实现高效率高可靠逻辑控制的重要途径。,6.1.2 状态机的优点,无论与基于VHDL的其他设计方案相比,还是与可完成相似功能的CPU相比,状态机都有其难以超越的优越性,它主要表现在以下几方面:1、控制灵活、方便:状态机的工作方式是根据控制信号按照预先设定的状态顺序运行的,因此状态机在其运行方式上类似于控制灵活和方便的CPU。2、结构简单,便于设计:设计方案相对固定3、易构成性能良好的同步时序逻辑模块,避免竞争冒险现象。4、运行速度比CPU要高出三至四个数量级。5、可靠性:状态机由纯硬件电路构成;由非法状态跳出,只要2、3个时钟周期,所耗时间短,6.1.3 状态机的分类,1)从状态机的信号输出方式上分有Mealy型和Moore型两种状态机。Mealy属于异步输出状态机。其输出是当前状态和所有输入信号的函数,它的输出是在输入变化后立即发生的,不依赖时钟的同步。Moore属于同步输出状态机,其输出则仅为当前状态的函数,这类状态机在输入发生变化还必须等待时钟的到来,时钟使状态发生变化时才导致输出的变化,所以比Mealy机要多等待一个时钟周期。2)从程序结构上分,有单进程状态机和多进程状态机。3)从编码方式上分有顺序编码状态机、一位热码编码状态机或其他编码方式状态机。,6.2 典型状态机设计,典型状态机设计由状态信号定义、准备下一状态进程、状态切换进程、输出进程等四部分构成。【例6-1】用FPGA/CPLD控制AD574进行12位A/D转换,并将转换结果保存在Q0Q11中,分析:12位A/D转换,12位结果输出,X12/8接高电平,A0接低电平;2个片选信号用1个CE,CS接低电平。,LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY AD574 ISPORT(D:IN STD_LOGIC_VECTOR(11 DOWNTO 0);Q:OUT STD_LOGIC_VECTOR(11 DOWNTO 0);CLK,STATUS:IN STD_LOGIC;CE,RC:OUT STD_LOGIC);END AD574;ARCHITECTURE behav OF AD574 IS TYPE states IS(s0,sl,s2,s3,s4,s5);SIGNAL c_st,n_st:states;SIGNAL LOCK:STD_LOGIC;BEGIN,1、状态信号定义:采用枚举数据类型定义系统中有哪些状态,并定义当前状态信号、下一状态信号。一般放在结构体的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)等更直观的符号表示。,PROCESS(c_st,STATUS)-准备下一状态 BEGIN-实现状态图连接 CASE c_st IS WHEN s0=n_stn_stIF(STATUS=1)THEN n_st IF(STATUS=1)THEN n_stn_stn_stn_st=s0;END CASE;END PROCESS;,2、准备下一状态进程:,根据外部输入的控制信号,和当前状态的状态值确定下一状态(next state)的取向,即next state的取值内容。相当于用VHDL语言实现状态转换图的连接。常用CASE语句。进程敏感表为当前状态和状态机的输入信号。,-状态切换进程,PROCESS(CLK)BEGIN IF(CLKEVENT AND CLK=1)THEN c_st=n_st;END IF;END PROCESS;,3、状态切换进程:,负责状态机运转和在时钟驱动下负责状态转换的进程。此进程只是机械地将代表次态的信号next_state中的内容送入现态的信号current中。当然此进程中也可以放置一些同步或异步清零或置位方面的控制信号。,PROCESS(c_st)-输出控制信号的进程 BEGIN CASE c_st IS WHEN s0=CECECECECECECE=0;RC=0;LOCK=0;END CASE;END PROCESS;,4、输出进程:,根据当前状态和输入,送出控制信号。,PROCESS(LOCK)-数据保存 BEGIN IF LOCK=1AND LOCKEVENT THEN Q12=D;END IF;END PROCESS;END behav;,从例6-1可观察到,准备下一状态进程与输出进程结构类似,可合并为一个进程。,【例6-2】用FPGA/CPLD控制AD574进行12位A/D转换,并将转换结果保存在Q0Q11中。采用二进程状态机。,PROCESS(c_st,STATUS)-准备下一状态 BEGIN CASE c_st IS WHEN s0=n_stn_stIF(STATUS=1)THEN n_st IF(STATUS=1)THEN n_stn_stn_stn_st=s0;CE=0;RC=0;LOCK=0;END CASE;END PROCESS;,【例6-3】ADC0809,LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY AD0809 IS PORT(D:IN STD_LOGIC_VECTORY(7 DOWNTO 0);ALE,START,OE:OUT STD_LOGIC;CLK,EOC:IN STD_LOGIC;LED7:OUT STD_LOGIC_VECTORY(6 DOWNTO 0);SEL:BUFFER INTEGER RANGE(2 DOWNTO 0)END ENTITY;,ARCHITECTURE BODY OF AD0809 ISTYPE STATES IS(S0,S1,S2,S3,S4,S5);SIGNAL C_ST,N_ST:STATES;SIGNAL D8;STD_LOGIC_VECTORY(7 DOWNTO 0);SIGNAL D4;STD_LOGIC_VECTORY(3 DOWNTO 0);SIGNAL LOCK;STD_LOGIC;BEGIN,PROCESS(C_ST,EOC)-N_STATE-OUT CONTRAL BEGIN CASE C_ST IS WHEN S0=N_STN_ST IF EOC=1 THEN N_ST IF EOC=0 THEN N_ST N_STN_ST N_ST=S0;ALE=0;START=0;OE=0;LOCK=0;END CASE;END PROCESS;,PROCESS(clk)-STATE SWITCH,SEL+1 BEGIN IF(CLKEVENT AND CLK=1)THEN C_ST=N_ST;SEL=SEL+1;END IF;END PROCESS;,PROCESS(SEL)-选择待显示的数据 BEGIN CASE SEL IS WHEN 0=D4 D4 D4 D4 D4 D4 D4 D4 NULL;END CASE;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=n_ s;END IF;END PROCESS;,PROCESS(c_ s,inputs)-下一状态、Begin CASE c_ s IS WHEN s0=outputs outputs outputs OUTPUTSn_s=s0;END case;END PROCESS;END behav;,6.3 状态机的改进,、状态机输出毛刺现象的克服当状态机的输出信号由组合电路发出时,一般情况下难免出现毛刺现象,如果这些输出被用于作为时钟信号,极易产生错误的操作。单进程Moore状态机比较容易构成能避免出现毛刺现象的状态机。,【例6-5】例6-4,单进程,LIBRARY IEEE;USE IEEESTD_LOGIC_1164ALL;ENTITY MOOREl ISPORT(DATAIN:IN STD_LOGIC_VECTOR(1 DOWNTO 0);CLK,RST:IN STD_LOGIC;Q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);END MOOREl;,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_STIF DATAIN=”00”THEN C_STIF DATAIN=“00”THEN C_STIF DATAIN=”11”THEN C_STIF DATAIN=”11”THEH C_STIF DATAIN=“11”THEN C_STC_ST=ST0;Q=“0000”;END CASE;END IF;END PROCESS;END behav;,对二进程、三进程状态机,为了解决输出信号毛刺现象,可以将输出信号由时钟信号锁存后再输出。,ARCHITECTURE behav OF CLKLOCK IS TYPE states IS(s0,s1,s2,s3);SIGNAL STX:states;BEGIN PROCESS(CLK,RESET)-决定转换状态的进程 BEGIN IF RESET=1THEN STX IF DATAIN=”00”THEN STX=S0;ELSE STX=S1;END IF;,例6-6】例6-4,输出带时钟同步。,WHEN s1=IF DATAIN=”00”THEN STX IF DATAIN=”11”THEN STX IF DATAIN=”11”THEN STXSTX=st0;END CASE;END IF;END PROCESS;END behav;,对二进程、三进程状态机,为了解决输出信号毛刺现象,可以将输出信号由时钟信号锁存后再输出。,ARCHITECTURE behav OF CLKLOCK ISTYPE states IS(s0,s1,s2,s3);SIGNAL STX:states;BEGIN PROCESS(CLK,RESET)BEGIN-决定转换状态的进程 IF RESET=1THEN STXIF DATAIN=”00”THEN STXIF DATAIN=”00”THEN STXIF DATAIN=”11”THEN STXIF DATAIN=”11”THEN STXSTX=st0;END CASE;END IF;END PROCESS COMREG;,例6-6】例6-4,输出带时钟同步。,PROCESS(STX,CLK)-输出控制信号的进程 BEGIN IF CLKEVENT AND CLK=1THEN CASE STX IS WHEN s0=Q Q Q QNULL;END CASE;END IF;END PROCESS;END behav;,6.3.2 状态编码,用文字符号如s0、s1定义各状态变量的状态机称为符号化状态机。其状态变量具体编码由VHDL综合器根据具体情况确定自动对编码方式进行选择。状态机的状态编码方式也可人为控制。为了满足一些特殊需要,在状态机设计程序中,可直接将各状态用具体的二进制数进行定义,而不使用文字符号定义。,1、状态位直接输出型编码:最典型的应用实例就是计数器。计数器本质上是一个主控时序进程与主控组合进程合二为一的状态机,它的输出就是各状态的状态码。2、顺序编码 这种编码方式最为简单,且使用的触发器数量最少,剩余的非法状态最少,容错技术最为简单。这种顺序编码方式的缺点是,尽管节省了触发器,却增加了从状态向输出转换的译码组合逻辑。3、一位热码编码(One-hot encoding)一位热码编码方式(表7-3)就是用n个触发器来实现具有n个状态的状态机,状态机中的每一个状态都由其中一个触发器的状态表示。即当处于该状态时,对应的触发器为1,其余的触发器都置0。用了较多的触发器,但编码方式大为简化状态译码逻辑,提高了状态转换速度,,6.3.3 状态机剩余状态处理,在状态机设计中,不管使用何种编码,总是不可避免地出现大量剩余状态,即未被使用的编码组合,称为非法状态。如果不对这些非法状态进行处理,在外界不确定的干扰或随机上电的初始启动后,状态机都有可能进入不可预测的非法状态,导致失控。因此,状态机的剩余状态的处理,即状态机系统容错技术的应用是设计者必须慎重考虑的问题。解决的方法是利用OTHERS语句对未提到的状态作统一处理,即CASE语句最后一个条件为:WHEN OTHERS=next state=st0;,