您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 基于vhdl数字秒表
基于VHDL语言的数字秒表实现1设计方案1.1�系统功能要求设计一块数字秒表,能够精确反映计时时间,并完成复位、计时功能。秒表计时的最大范围为1小时,精度为0.01秒,并可显示计时时间的分、秒、0.1秒等度量。(1)具有秒表系统功能要求显示功能,用6个数码管分别显示分、秒、0.01秒;计时范围为00:00:00~59:59:99。(2)计时精度是0.01s;(3)具有启/停开关,复位开关。1.2�总体框图根据系统设计要求,系统的底层设计主要由六十进制计数器模块、二十四进制计数器模块、分频模块、LED显示模块组成。系统顶层设计图如图所示:图中左边为三个输入信号en,clk,reset;分为启/停开关,时钟信号和复位开关。主要模块有:模60计数器(count60),模100计数器(count100),分频器(clk_div),复位控制(control),译码器(yima),防抖模块(fdou),状态变换模块(change)。右边是六个LED显示输出信号。2�模块功能设计由模60计数器模块与模100计数器模块进行计数;实验室仪器可产生标准的1kHz的时钟信号,通过分频器模块产生所需的100Hz的时钟信号;复位模块可进行计数器复位操作;译码器是为了将四位二进制信号转换为LED所需的七位二进制编码;防抖模块用于消除用户按键时的抖动消除,为方便仿真,此处原始时钟信号3周期以上可产生信号;状态变换模块是为了用户按键后信号的变换及保持。2.1模60计数器该模块部分VHDL源程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYcount60ISPORT(en,Reset,clk:inSTD_LOGIC;qa:outSTD_LOGIC_VECTOR(3DOWNTO0);qb:outSTD_LOGIC_VECTOR(3DOWNTO0);rco:OUTSTD_LOGIC);ENDcount60;ARCHITECTUREaOFcount60ISBEGINprocess(clk)variabletma:STD_LOGIC_VECTOR(3DOWNTO0);variabletmb:STD_LOGIC_VECTOR(3DOWNTO0);beginIfReset='0'thentma:=0000;tmb:=0000;elsifclk'eventandclk='1'thenifen='1'thenrco=tmb(2)andtmb(0)andtma(3)andtma(0);iftma=1001thentma:=0000;iftmb=0101thentmb:=0000;elsetmb:=tmb+1;endif;elsetma:=tma+1;endif;endif;endif;qa=tma;qb=tmb;endprocess;ENDa;2.2模100计数器该模块部分VHDL源程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYcount100ISPORT(en,Reset,clk:inSTD_LOGIC;qa:outSTD_LOGIC_VECTOR(3DOWNTO0);qb:outSTD_LOGIC_VECTOR(3DOWNTO0);rco:OUTSTD_LOGIC);ENDcount100;ARCHITECTUREaOFcount100ISBEGINprocess(clk)variabletma:STD_LOGIC_VECTOR(3DOWNTO0);variabletmb:STD_LOGIC_VECTOR(3DOWNTO0);beginIfReset='0'thentma:=0000;tmb:=0000;elsifclk'eventandclk='1'thenifen='1'thenrco=tmb(3)andtmb(0)andtma(3)andtma(0);iftma=1001thentma:=0000;iftmb=1001thentmb:=0000;elsetmb:=tmb+1;endif;elsetma:=tma+1;endif;endif;endif;qa=tma;qb=tmb;endprocess;ENDa;2.3分频器模块该模块部分VHDL源程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYclk_divISPORT(clk:INSTD_LOGIC;clk_out:OUTSTD_LOGIC);ENDclk_div;ARCHITECTURErtlOFclk_divISSIGNALclk_temp:STD_LOGIC;BEGINPROCESS(clk)VARIABLEcounter:INTEGERRANGE0TO15;BEGINIF(clk'EVENTANDclk='1')THENIF(counter=9)THENCounter:=0;Clk_out='1';ELSECounter:=counter+1;Clk_out='0';ENDIF;ENDIF;ENDPROCESS;ENDrtl;2.4复位控制该模块部分VHDL源程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYcontrolISPORT(CLK,RST:instd_logic;CLK_OUT:outstd_logic);ENDcontrol;ARCHITECTUREbehavOFcontrolISsignalclk_data:std_logic;SIGNALCNT:INTEGER:=0;BEGINPROCESS(CLK)BEGINIFRST='0'THENCNT=0;ELSIFCLK'EVENTANDCLK='1'THENIFCNT=2THENclk_data=NOTclk_data;CNT=0;ELSECNT=CNT+1;ENDIF;ENDIF;CLK_OUT=clk_data;ENDPROCESS;ENDbehav;2.5译码器该模块部分VHDL源程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYyimaISPORT(num:inSTD_LOGIC_VECTOR(3downto0);led:outSTD_LOGIC_VECTOR(6downto0));ENDyima;ARCHITECTUREaOFyimaISBEGINprocess(num)begincasenumiswhen0000=led=0111111;when0001=led=0000110;when0010=led=1011011;when0011=led=1001111;when0100=led=1100110;when0101=led=1101101;when0110=led=1111101;when0111=led=0100111;when1000=led=1111111;when1001=led=1101111;whenothers=led=0000000;endcase;endprocess;ENDa;2.6防抖模块该模块部分VHDL源程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYfdouISPORT(CLK,DIN:INSTD_LOGIC;DOUT:OUTSTD_LOGIC);ENDENTITYfdou;ARCHITECTUREARCOFfdouISSIGNALCP:STD_LOGIC;SIGNALJSQ:INTEGERRANGE0TO3;BEGINPROCESS(CLK)BEGINIF(CLK'EVENTANDCLK='1')THENIFDIN='1'THENIFJSQ=3THENJSQ=JSQ;ELSEJSQ=JSQ+1;ENDIF;IFJSQ=1THENCP='1';ELSECP='0';ENDIF;ELSEJSQ=0;ENDIF;ENDIF;DOUT=CP;ENDPROCESS;ENDARC;2.7状态变换模块该模块部分VHDL源程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYchangeISPORT(clk_in,clk:INSTD_LOGIC;clk_out:OUTSTD_LOGIC);ENDENTITYchange;ARCHITECTUREaOFchangeISSIGNALcp:STD_LOGIC;BEGINPROCESS(CLK)BEGINIF(CLK'EVENTANDCLK='1')THENIF(clk_in='1')THENcp='0';ELSEcp='1';ENDIF;ENDIF;clk_out=CP;ENDPROCESS;ENDa;3仿真波形及分析各部分模块完成后,用Quartus对程序编译、仿真、得到的仿真波形,各模块仿真波形及顶层仿真波形如下:3.1模60计数器模块仿真clk:时钟信号rst:复位信号低电平清零en:置数端低电平不让它继续计数qb、qa:分别为输出数的十位个位,qb取值范围为0-5,qa取值范围为0-9rco:进位信号,当qb=5,qa=9,rco=0时,clk上升沿来到后,qb=0,qa=0,rco=1;当qb=0,qa=0,rco=1时,clk上升沿来到后,qb=0,qa=1,rco=03.2模100计数器模块仿真clk:时钟信号cst:复位信号低电平清零en:置数端低电平不让它继续计数qb、qa:分别为输出数的十位个位,qb取值范围为0-9,qa取值范围为0-9rco:进位信号,当qb=9,qa=9,rco=0时,clk上升沿来到后,qb=0,qa=0,rco=1;当qb=0,qa=0,rco=1时,clk上升沿来到后,qb=0,qa=1,rco=03.3分频器模块仿真因时钟脉冲(为1khz)通过分频器分频后频率(为100hz)。cLK:输入分频前的时钟信号clk_out:输出分频后的时钟信号3.4复位模块仿真clk:时钟信号clk_out:输出信号rst:复位信号3.5译码器模块仿真num[3..0]:输入标准四位二进制码led[6..0]:输出七位二进制码,控制led管脚电压。3.6防抖模块仿真CLK:对比时钟信号(这里采用的正是原始信号,只用预仿真,实际情况需要改善信号或者增大防抖的信号周期)DIN:用户按键输入信号DOUT:输出信号。3.7状态变换模块仿真clk:对比时钟信号clk_in:原状态clk_out:次状态。3.8顶层模块仿真clk:原始时钟信号reset:复位信号en:启动/暂停信号led1-led7:输出控制LED灯管脚的信号。
本文标题:基于vhdl数字秒表
链接地址:https://www.777doc.com/doc-4000808 .html