第5章VHDL状态机1、有限状态机及其设计技术,是使用数字系统设计中的重要组成部分,是实现高效、高可靠性逻辑控制的重要途径。2、面对先进的EDA技术,有限状态机在具体的设计技术和实现方法上又有了许多新的内容。3、本章重点介绍用VHDL设计不同类型有限状态机的方法,同时考虑设计中许多重点关注的问题。特点:用VHDL可以设计出不同表达方式和不同功能的状态机,然而它们都有相对固定的语句和表达方式。5.1状态机设计相关语句5.1.1类型定义语句TYPE数据类型名IS数据类型定义OF基本数据类型;或TYPE数据类型名IS数据类型定义;TYPEst1ISARRAY(0TO15)OFSTDLOGIC;TYPEweekIS(sun,mon, tue,wed,thu,fri, sat);TYPEm_stateIS (sto, stl, st2, st3, st4, st5);SIGNALpresent_statenext_state:m_stateTYPEBOOLEANIS(FALSE,TRUE):TYPEmy_logicIS(T,Z,"U",'O');SIGNAL sl :my_logic;sl<= Z';SUBTYPE子类型名IS基本数据类型RANGE约束范围;SUBTYPEdigitsISINTEGERRANGE0to9:TYPEweekIS(sun,mon,tue,wed,thu,fri,sat);5.1.2状态机的优势1.状态机克服了纯硬件数字系统顺序方式控制不灵活的缺点;2.由于状态机的结构相对简单,设计方案相对固定;3、状态机容易构成性能良好的同步时序逻辑模块;4、与VHDL的其他描述方式相比,状态机的VHDL表述丰富多样、程序层次分明,结构清晰,易读易懂;在排错、修改和模块移植方面也有其独到的好处;5、在高速运算和控制方面,状态机更有其巨大的优势。6、高可靠性。-
1 第 5 章 VHDL 状态机 1、有限状态机及其设计技术,是使用数字系统设计中的重要组成部分,是实现 高效、高可靠性逻辑控制的重要途径。 2、面对先进的 EDA 技术,有限状态机在具体的设计技术和实现方法上又有了许 多新的内容。 3、本章重点介绍用 VHDL 设计不同类型有限状态机的方法,同时考虑设计中许 多重点关注的问题。 特点: 用 VHDL 可以设计出不同表达方式和不同功能的状态机,然而它们都有相 对固定的语句和表达方式。 5.1 状态机设计相关语句 5.1.1 类型定义语句 TYPE 数据类型名 IS 数据类型定义 OF 基本数据类型 ;或 TYPE 数据类型名 IS 数据类型定义 ; TYPE st1 IS ARRAY ( 0 TO 15 ) OF STD_LOGIC ; TYPE week IS (sun,mon,tue,wed,thu,fri,sat) ; TYPE m_state IS ( st0,st1,st2,st3,st4,st5 ) ; SIGNAL present_state,next_state : m_state ; TYPE BOOLEAN IS (FALSE,TRUE) ; TYPE my_logic IS ( '1' ,'Z' ,'U' ,'0' ) ; SIGNAL s1 : my_logic ; s1 <= 'Z' ; SUBTYPE 子类型名 IS 基本数据类型 RANGE 约束范围; SUBTYPE digits IS INTEGER RANGE 0 to 9 ; TYPE week IS (sun,mon,tue,wed,thu,fri,sat) ; 5.1.2 状态机的优势 1.状态机克服了纯硬件数字系统顺序方式控制不灵活的缺点; 2.由于状态机的结构相对简单,设计方案相对固定; 3、状态机容易构成性能良好的同步时序逻辑模块; 4、与 VHDL 的其他描述方式相比,状态机的 VHDL 表述丰富多样、程序层次分 明,结构清晰,易读易懂;在排错、修改和模块移植方面也有其独到的好处; 5、在高速运算和控制方面,状态机更有其巨大的优势。 6、高可靠性
5.1.3状态机结构1.说明部分ARCHITECTURE..ISTYPEFSM STIS(sO,sl, $2, $3);SIGNAL current_state, next_state: FSM_ST;说明部分中使用TYPE语句定义新的数据类型,该类型为枚举型,其元素通常都用状态机的状态名来定义。状态变量应定义成信号,便于信息的传递;并将状态变量的数据类型定义为含有既定状态元素的行定义的数据类型。2.主控时序进程a5-1一般状态机结构框图3.主控组合进程4.辅助进程【例5-1]LIBRARYIEEE:USEIEEE.STD LOGIC1164.ALL:ENTITYsmachineISPORT(clk,reset:INSTD LOGIC:state_inputs:INSTD_LOGIC_VECTOR(OTO1);comb_outputs:OUTINTEGERRANGE0TO15),END s machine;ARCHITECTUREbehvOFs machineISTYPE FSM STIS (s0, s1, s2, s3);SIGNAL current_state, next_state: FSM_ST;BEGINREG:PROCESS(reset,clk)一主控时序进程BEGINIF reset= ‘{'THENcurrent state<=sO,--异步清零ELSIFclk-'I'ANDclk'EVENTTHENcurrent_state<= next state;END IF:2
2 5.1.3 状态机结构 1. 说明部分 ARCHITECTURE .IS TYPE FSM_ST IS (s0,s1,s2,s3); SIGNAL current_state, next_state: FSM_ST; . 说明部分中使用 TYPE 语句定义新的数据类型,该类型为枚举型,其元素通 常都用状态机的状态名来定义。 状态变量应定义成信号,便于信息的传递;并将状态变量的数据类型定义为 含有既定状态元素的行定义的数据类型。 2. 主控时序进程 5-1 一般状态机结构框图 3. 主控组合进程 4. 辅助进程 【例 5-1】 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY s_machine IS PORT ( clk,reset : IN STD_LOGIC; state_inputs : IN STD_LOGIC_VECTOR (0 TO 1); comb_outputs : OUT INTEGER RANGE 0 TO 15 ); END s_machine; ARCHITECTURE behv OF s_machine IS TYPE FSM_ST IS (s0, s1, s2, s3); SIGNAL current_state, next_state: FSM_ST; BEGIN REG: PROCESS (reset,clk)—主控时序进程 BEGIN IF reset = ‘1’ THEN current_state <= s0; -异步清零 ELSIF clk='1' AND clk'EVENT THEN current_state <= next_state; END IF; comb_outputs state_inputs resetclk FSM: s_machine COM next_state current_state PROCESS REG PROCESS
ENDPROCESS:主控时序进程负责状态机的运转和在时钟驱动下负责状态转换的进程。状态机是随外部时钟信号,以同步时序方式工作的。因此,状态机中必须包含一个对工作时钟信号敏感的进程,作为状态机的“驱动泵”。当时钟发生有效跳变时,状态机的状态才发生变化。一般地,主控时序进程可以不负责下一状态的具体取值。COM:PROCESS(current_state,state_inputs)-主控组合进程BEGINCASE current state ISWHENs0=>comb outputs<=5:IF state_inputs="Oo"THENInext state<=s:ELSE next state<=sl;END IF;WHEN sl=> comb_outputs<=8;IF state inputs ="0"THEN next state<=sl;ELSEnext state<=s2;END IF;WHEN s2 =>comb_outputs<= 12;IF state_inputs ="11" THEN next_state <= sO;ELSE next_state<= s3;END IF;WHEN s3 => comb_outputs<=14,IF state_inputs ="11" THEN next_state<= s3;ELSEnext state<=sO;END IF;END case;ENDPROCESS;END behv;主控组合进程完成的功能:状态译码1、根据信号current_state中的状态值,进入相应的状态;2、并在此状态中向外部发出控制信号comb_outputs;3、确定下一状态next_state的走向。2.5us3.0us500.0ns1.0us1.5us2.0us3.5us4.0usValue,4.50Name:0-reset0D-clkHOstate_inputs1203020H558X58XCXEY58CX8XCX5comb_outputsKEUHO00ycurrent_state0X12X3X01X2XX1X21X3图5-2例5-1状态机的工作时序3
3 END PROCESS; 主控时序进程负责状态机的运转和在时钟驱动下负责状态转换的进程。状态 机是随外部时钟信号,以同步时序方式工作的。因此,状态机中必须包含一个对 工作时钟信号敏感的进程,作为状态机的“驱动泵”。 当时钟发生有效跳变时,状态机的状态才发生变化。一般地,主控时序进程 可以不负责下一状态的具体取值。 COM:PROCESS(current_state, state_inputs) –主控组合进程 BEGIN CASE current_state IS WHEN s0 => comb_outputs<= 5; IF state_inputs = "00" THEN next_state<=s0; ELSE next_state<=s1; END IF; WHEN s1 => comb_outputs<= 8; IF state_inputs = "00" THEN next_state<=s1; ELSE next_state<=s2; END IF; WHEN s2 => comb_outputs<= 12; IF state_inputs = "11" THEN next_state <= s0; ELSE next_state <= s3; END IF; WHEN s3 => comb_outputs <= 14; IF state_inputs = "11" THEN next_state <= s3; ELSE next_state <= s0; END IF; END case; END PROCESS; END behv; 主控组合进程完成的功能:状态译码 1、根据信号 current_state 中的状态值,进入相应的状态; 2、并在此状态中向外部发出控制信号 comb_outputs; 3、确定下一状态 next_state 的走向。 图 5-2 例 5-1 状态机的工作时序
5.2Moore状态机5.2.1多进程状态机ALE800山0070Ea168848AZAASTART2254322298765EOCADC0809OE2345678902341UDLD[7.0]XDATAXZ77777788AN00图5-3ADC0809工作时序sto对0809初始化LOCK:0->1由LOCK信号锁存st4转换好的数据st1启动A/D转换OE='1'数据输出有效采样周期中等待st3st2EOC=1'转换结束EOC=O'正在转换图5-4控制ADC0809采样状态图O
4 5.2 Moore 状态机 5.2.1 多进程状态机 图 5-3 ADC0809 工作时序 图 5-4 控制 ADC0809 采样状态图
LOCK状态机FSMPROCESScurrent statePROCESSPROCESSREGCOMLATCHnext state时序进程组合进程锁存器ADC0809CLKALE状态机工作时钟START模拟信号输入OEQ[7..0]ADDA采样数据输出A/D工作时钟EOCclkclk=750KHzD[7..0]图5-5采样状态机结构框图【例5-2】LIBRARYIEEE:USE IEEE.STD_LOGIC_1164.ALL;ENTITY ADCINT ISPORT(D:INSTD_LOGIC_VECTOR(7DOWNTO0);--来自0809转换好的8位数据--状态机工作时钟CLK:INSTD LOGIC:EOC :INSTD LOGIC--转换状态指示,低电平表示正在转换ALE :OUT STD LOGIC;--8个模拟信号通道地址锁存信号START:OUTSTDLOGIC:--转换开始信号OE :OUT STD LOGIC;--数据输出3态控制信号ADDA :OUT STD LOGIC;--信号通道最低位控制信号LOCKO:OUTSTDLOGIC--观察数据锁存时钟Q:OUTSTD_LOGIC_VECTOR(7DOWNTO0));--8位数据输出END ADCINT:ARCHITECTUREbehavOFADCINTISTYPEstatesIS(sto,st1,st2,st3,st4);--定义各状态子类型SIGNALcurrent state,next state:states :=stO:SIGNAL REGL:STD LOGIC_VECTOR(7DOWNTO0);SIGNAL LOCK:STDLOGIC;-转换后数据输出锁存时钟信号BEGINADDA<='T;--当ADDA<=O',模拟信号进入通道INO;当ADDA<=1',则进入通道INIQ<=REGL:LOCKO<=LOCK:COM: PROCESS(current_state,EOC)BEGIN-规定各状态转换方式CASE current stateIS5
5 图 5-5 采样状态机结构框图 【例 5-2】 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY ADCINT IS PORT(D : IN STD_LOGIC_VECTOR(7 DOWNTO 0);-来自 0809 转换好的 8 位数据 CLK : IN STD_LOGIC; -状态机工作时钟 EOC : IN STD_LOGIC; -转换状态指示,低电平表示正在转 换 ALE : OUT STD_LOGIC; -8 个模拟信号通道地址锁存信号 START : OUT STD_LOGIC; -转换开始信号 OE : OUT STD_LOGIC; -数据输出 3 态控制信号 ADDA : OUT STD_LOGIC; -信号通道最低位控制信号 LOCK0 : OUT STD_LOGIC; -观察数据锁存时钟 Q : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); -8 位数据输出 END ADCINT; ARCHITECTURE behav OF ADCINT IS TYPE states IS (st0, st1, st2, st3,st4) ; -定义各状态子类型 SIGNAL current_state, next_state: states :=st0 ; SIGNAL REGL : STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL LOCK : STD_LOGIC; - 转换后数据输出锁存时钟信号 BEGIN ADDA <= '1';-当 ADDA<='0',模拟信号进入通道 IN0;当 ADDA<='1',则进入 通道 IN1 Q <= REGL; LOCK0 <= LOCK ; COM: PROCESS(current_state,EOC) BEGIN -规定各状态转换方式 CASE current_state IS