您好,欢迎访问三七文档
定时器1.实验任务设计要求:整体清零;可以定时最高到99min;以秒速度递增至预定时间,以分速度递减至零。总体框图如下图所示:clr用来整体复位清零;clk提供了秒信号,频率为1HZ(在仿真中取10MHZ);clky是用来扫描输出的,选用频率大于50HZ的方波(为便于观察结果,在仿真中取10MHZ);set是用来置位的,低电平时有效,将以秒的速度,从零递增到所需定时的时间,为高电平时以分的速度递减,实现定时,直到零,定时结束;alm输出高电平,可启动各种电路或发出警报。时间的变化都将在数码管上显示出来。2.模块及模块功能模块AAA见下图示。它是核心模块,用来实现定时器的逻辑功能,计数结果用十进制数输出。LIBRARYieee;USEieee.std_logic_1164.all;USEieee.std_logic_unsigned.all;ENTITYaaaIS可编程ASIC设计200711523朱红霞-1-PORT(clk,clr,set:instd_logic;alm:outstd_logic;q1,q0:outstd_logic_vector(3downto0));ENDaaa;ARCHITECTUREaaa_arcOFaaaISBEGINPROCESS(clk,clr)variablecnt1,cnt0:std_logic_vector(3downto0);variablecnt:integerrange0to59;BEGINIFclr='0'THEN--整体复位alm='0';cnt:=0;cnt1:=0000;cnt0:=0000;ELSIFclk'EVENTANDclk='1'THEN--设计数初值IFset='0'THENcnt:=0;IFcnt01001THENcnt0:=cnt0+1;ELSEcnt0:=0000;IFcnt11001THENcnt1:=cnt1+1;ELSEcnt1:=0000;ENDIF;ENDIF;ELSEIFcnt59THEN--60分频cnt:=cnt+1;ELSEcnt:=0;IFcnt00000THENcnt0:=cnt0-1;IFcnt1=0000ANDcnt0=0000THEN--判断计时是否结束alm='1';ENDIF;ELSEcnt0:=1001;IFcnt10000THENcnt1:=cnt1-1;ELSEcnt1:=1001;可编程ASIC设计200711523朱红霞-2-ENDIF;ENDIF;ENDIF;ENDIF;ENDIF;q0=cnt0;q1=cnt1;ENDPROCESS;ENDaaa_arc;模块CH如下图示。由于只用了两个数码管,所以片选信号直接接一个较快的时钟。此模块的功能是对应片选信号,送出要显示的数据。LIBRARYieee;USEieee.std_logic_1164.all;ENTITYchISPORT(sel:instd_logic;a1,a0:instd_logic_vector(3downto0);q:outstd_logic_vector(3downto0));ENDch;ARCHITECTUREch_arcOFchISBEGINPROCESS(sel,a0,a1)BEGINIFsel='0'THENq=a0;ELSEq=a1;ENDIF;ENDPROCESS;ENDch_arc;模块DISP如下图示。该模块为七段译码器。LIBRARYieee;USEieee.std_logic_1164.all;ENTITYdispISPORT(a:instd_logic_vector(3downto0);q:outstd_logic_vector(6downto0));ENDdisp;可编程ASIC设计200711523朱红霞-3-ARCHITECTUREdisp_arcOFdispISBEGINPROCESS(a)BEGINCASEaISWHEN0000=q=0111111;WHEN0001=q=0000110;WHEN0010=q=1011011;WHEN0011=q=1001111;WHEN0100=q=1100110;WHEN0101=q=1101101;WHEN0110=q=1111101;WHEN0111=q=0000111;WHEN1000=q=1111111;WHEN1001=q=1101111;WHENothers=q=0000000;ENDCASE;ENDPROCESS;ENDdisp_arc;3.仿真结果分析总体仿真结果如下:可编程ASIC设计200711523朱红霞-4-由图可见,clr=’0’可实现整体复位功能。set=’0’,输出以秒的速度从零递增。本图中当递增到26后,set=’1’,输出经60分频后以分的速度递减,实现定时,直到零,定时结束。定时结束后,clm=’1’,此时可启动各种电路或发出报警,定时结束。可编程ASIC设计200711523朱红霞-5-clr=’0’,整体复位,clm=’0’。该设计采用动态扫描电路,经过二选一模块将结果显示出来。从上图可见,q交替输出两位结果。sel=’1’时输出高位,sel=’0’时输出低位。可编程ASIC设计200711523朱红霞-6-自动售货机控制器一、设计一个自动售货机的控制电路。该自动售货机销售价格为25美分的糖果,利用有限状态机进行电路设计。控制器的输入输出如图所示:输入信号是nickel_in(投入5美分),dime_in(投入10美分),quarter_in(投入25美分)。另外两个必要的输入是clk(时钟)和rst(复位)。控制器相应的有3个输出:candy_out用于控制发放糖果,nickel_out用于控制找回5美分的零钱,dime_out用于控制找回10美分的零钱。可编程ASIC设计200711523朱红霞-7-上图给出了有限状态机的状态转移图。圆圈里的数代表顾客投进来的总钱数(接受5美分、10美分或25美分的硬币)。状态0是空闲状态。从它开始,如果投入5美分硬币,将跳转到状态5;如果投入10美分硬币,将跳转到状态10;如果投入25美分硬币,将跳转到状态25。随着投币数量的增加,状态不断跳转,如果投入的币值达到25美分,就可以进入状态25,然后售货机会发放糖果,并跳转回状态0。如果投入的币值超过了25美分,那么售货机要进入与找零钱相关的状态。例如,当投入的币值达到40美分时,需要先退出5美分硬币(进入状态35),然后再退出10美分,发放糖果并进入状态0。二、该设计的VHDL源码如下:在代码中定义了枚举类型state,它包含10个状态,所以至少需要用4位对其进行编码(将产生4个寄存器)。在默认状态下,编译器将按照它们的排列顺序对其进行编码,所以有st0=”0000”(十进制的0),st5=”0001”(十进制的1),…和st45=”1001”(十进制的9)。在仿真中,这些数字将替代状态的名称出现在仿真波形中。LIBRARYieee;USEieee.std_logic_1164.all;ENTITYvending_machineISPORT(clk,rst:INSTD_LOGIC;nickel_in,dime_in,quarter_in:INBOOLEAN;candy_out,nickel_out,dime_out:OUTSTD_LOGIC);ENDvending_machine;025510152040453035ninininiqiqiqiqiqinododino+codo+cocodidididini自动售货机控制器的顶层电路图和状态转移图信号说明:ni=nickel_in,di=dime_in,qi=quarter_in,no=nickel_out,do=dime_out,co=candy_out可编程ASIC设计200711523朱红霞-8-ARCHITECTUREfsmOFvending_machineISTYPEstateIS(st0,st5,st10,st15,st20,st25,st30,st35,st40,st45);SIGNALpresent_state,next_state:STATE;BEGINPROCESS(rst,clk)BEGINIF(rst='1')THENpresent_state=st0;ELSIF(clk'EVENTANDclk='1')THENpresent_state=next_state;ENDIF;ENDPROCESS;PROCESS(present_state,nickel_in,dime_in,quarter_in)BEGINCASEpresent_stateISWHENst0=candy_out='0';nickel_out='0';dime_out='0';IF(nickel_in)THENnext_state=st5;ELSIF(dime_in)THENnext_state=st10;ELSIF(quarter_in)THENnext_state=st25;ELSEnext_state=st0;ENDIF;WHENst5=candy_out='0';nickel_out='0';dime_out='0';IF(nickel_in)THENnext_state=st10;ELSIF(dime_in)THENnext_state=st15;ELSIF(quarter_in)THENnext_state=st30;ELSEnext_state=st5;ENDIF;WHENst10=candy_out='0';nickel_out='0';dime_out='0';IF(nickel_in)THENnext_state=st15;ELSIF(dime_in)THENnext_state=st20;ELSIF(quarter_in)THENnext_state=st35;ELSEnext_state=st10;可编程ASIC设计200711523朱红霞-9-ENDIF;WHENst15=candy_out='0';nickel_out='0';dime_out='0';IF(nickel_in)THENnext_state=st20;ELSIF(dime_in)THENnext_state=st25;ELSIF(quarter_in)THENnext_state=st40;ELSEnext_state=st15;ENDIF;WHENst20=candy_out='0';nickel_out='0';dime_out='0';IF(nickel_in)THENnext_state=st25;ELSIF(dime_in)THENnext_state=st30;ELSIF(quarter_in)THENnext_state=st45;ELSEnext_state=st20;ENDIF;WHENst25=candy_out='1';nickel_out='0';dime_out='0';next_state=st0;WHENst30=candy_out='1';nickel_out='1';dime_out='0';next_state=st0;WHENst35=candy_out='1';nickel_out='0';dime_out='1';next_state=st0;WHENst40=candy_out='0';nickel_out='1';dime_out='0';next_state=st35;WHENst45=candy_out='0';nickel_out='0';dime_out='1';next_state=st35;可编程ASIC设计200711523朱红霞-10-ENDCAS
本文标题:定时器VHDL设计
链接地址:https://www.777doc.com/doc-7296901 .html