WHENst4=>ALE<='0';START<='0';LOCK<='1';OE<='1';next_state<=st0;WHENOTHERS=>next_state<=st0;ENDCASE;
ENDPROCESSCOM;REG:PROCESS(CLK)BEGIN
IF(CLK'EVENTANDCLK='1')THENcurrent_state<=next_state;ENDIF;ENDPROCESSREG;--由信号current_state将当前状态值带出此进程:REGLATCH1:PROCESS(LOCK)--此进程中,在LOCK的上升沿,将转换好的数据锁入BEGIN
IFLOCK='1'ANDLOCK'EVENTTHENREGL<=D;ENDIF;ENDPROCESSLATCH1;ENDbehav;
8-5在不改变原代码功能的条件下用两种方法改写例8-2,使其输出的控制信号(ALE、START、OE、LOCK)没有毛刺。方法1:将输出信号锁存后输出;方法2:使用状态码直接输出型状态机,并比较这三种状态机的特点。--解:\8-2】根据图8-6状态图,采用Moore型状态机,设计ADC0809采样控制器\方法1(将输出控制
信号锁存后输出)的VHDL程序代码如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;ENTITYADCINTIS
PORT(D:INSTD_LOGIC_VECTOR(7DOWNTO0);--来自0809转换好的8位数据
CLK:INSTD_LOGIC;--状态机工作时钟EOC:INSTD_LOGIC;--转换状态指示,低电平表示正在转换ALE:OUTSTD_LOGIC;--8个模拟信号通道地址锁存信号START:OUTSTD_LOGIC;--转换开始信号
OE:OUTSTD_LOGIC;--数据输出三态控制信号ADDA:OUTSTD_LOGIC;--信号通道最低位控制信号LOCK0:OUTSTD_LOGIC;--观察数据锁存时钟
Q:OUTSTD_LOGIC_VECTOR(7DOWNTO0));--8位数据输出ENDADCINT;
ARCHITECTUREbehavOFADCINTIS
TYPEstatesIS(st0,st1,St2,st3,st4);--定义各状态子类型SIGNALcurrent_state,next_state:states:=st0;SIGNALREGL:STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALLOCK:STD_LOGIC;--转换后数据输出锁存时钟信号SIGNALALE0:STD_LOGIC;--8个模拟信号通道地址锁存信号SIGNALSTART0:STD_LOGIC;--转换开始信号SIGNALOE0:STD_LOGIC;--数据输出三态控制信号BEGIN
ADDA<='1';--当ADDA<='0',模拟信号进入通道IN0;当ADDA<='1',则进入通道INIQ<=REGL;--LOCK0<=LOCK;
COM:PROCESS(current_state,EOC,CLK)BEGIN--规定各状态转换方式CASEcurrent_stateIS
WHENst0=>ALE0<='0';START0<='0';LOCK<='0';OE0<='0';
next_state<=st1;--0809初始化
WHENst1=>ALE0<='1';START0<='1';LOCK<='0';OE0<='0';
next_state<=st2;--启动采样
WHENst2=>ALE0<='0';START0<='0';LOCK<='0';OE0<='0';
IF(EOC='1')THENnext_state<=st3;--EOC=1表明转换结束ELSEnext_state<=st2;ENDIF;--转换未结束,继续等待
WHENst3=>ALE0<='0';START0<='0';LOCK<='0';OE0<='1';
next_state<=st4;--开启OE,输出转换好的数据
WHENst4=>ALE0<='0';START0<='0';LOCK<='1';OE0<='1';next_state<=st0;WHENOTHERS=>next_state<=st0;ENDCASE;
IFCLK'EVENTANDCLK='1'THEN
ALE<=ALE0;START<=START0;LOCK0<=LOCK;OE<=OE0;--方法1:信号锁存后输出ENDIF;
ENDPROCESSCOM;REG:PROCESS(CLK)BEGIN
IF(CLK'EVENTANDCLK='1')THENcurrent_state<=next_state;ENDIF;ENDPROCESSREG;--由信号current_state将当前状态值带出此进程:REGLATCH1:PROCESS(LOCK)--此进程中,在LOCK的上升沿,将转换好的数据锁入BEGIN
IFLOCK='1'ANDLOCK'EVENTTHENREGL<=D;ENDIF;ENDPROCESSLATCH1;ENDbehav;
--解:\8-2】根据图8-6状态图,采用Moore型状态机,设计ADC0809采样控制器\方法2(使用状态码
直接输出型状态机)的VHDL程序代码(【例8-7】的根据状态编码表8-1给出ADC0809数据采样的状态机)如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;ENTITYAD0809ISPORT(D:INSTD_LOGIC_VECTOR(7DOWNTO0);
CLK,EOC:INSTD_LOGIC;
ALE,START,OE,ADDA:OUTSTD_LOGIC;
c_state:OUTSTD_LOGIC_VECTOR(4DOWNTO0);
Q:OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDAD0809;
ARCHITECTUREbehavOFAD0809IS
SIGNALcurrent_state,next_state:STD_LOGIC_VECTOR(4DOWNTO0);CONSTANTst0:STD_LOGIC_VECTOR(4DOWNTO0):=\CONSTANTst1:STD_LOGIC_VECTOR(4DOWNTO0):=\CONSTANTst2:STD_LOGIC_VECTOR(4DOWNTO0):=\CONSTANTst3:STD_LOGIC_VECTOR(4DOWNTO0):=\CONSTANTst4:STD_LOGIC_VECTOR(4DOWNTO0):=\SIGNALREGL:STD_LOGIC_VECTOR(7DOWNTO0);SIGNALLOCK:STD_LOGIC;BEGIN
ADDA<='1';Q<=REGL;START<=current_state(4);ALE<=current_state(3);OE<=current_state(2);LOCK<=current_state(1);c_state<=current_state;COM:PROCESS(current_state,EOC)BEGIN--规定各状态转换方式CASEcurrent_stateIS
WHENst0=>next_state<=st1;--0809初始化WHENst1=>next_state<=st2;--启动采样
WHENst2=>IF(EOC='1')THENnext_state<=st3;--EOC=1表明转换结束
ELSEnext_state<=st2;--转换未结束,继续等待ENDIF;
WHENst3=>next_state<=st4;--开启OE,输出转换好的数据WHENst4=>next_state<=st0;WHENOTHERS=>next_state<=st0;ENDCASE;
ENDPROCESSCOM;REG:PROCESS(CLK)BEGIN
IF(CLK'EVENTANDCLK='1')THENcurrent_state<=next_state;ENDIF;
ENDPROCESSREG;--由信号current_state将当前状态值带出此进程:REGLATCH1:PROCESS(LOCK)--此进程中,在LOCK的上升沿,将转换好的数据锁入BEGIN
IFLOCK='1'ANDLOCK'EVENTTHENREGL<=D;ENDIF;
ENDPROCESSLATCH1;ENDbehav;

