您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 基于CPLD的VHDL时钟设计
摘要:数字钟学习的目的是掌握各类计数器及它们相连的设计方法;掌握多个数码管显示的原理与方法;掌握模块化设计方式;掌握用VHDL语言的设计思想以及整个数字系统的设计。此数字钟具有时,分,秒计数显示功能,以24小时为计数循环;能实现清零,调时,调分以及整点报时等功能。本设计是一个显示时(2位)分(2位)秒(2位)共六个数字的多功能电子钟。信号发生器输出的40Mhz作为系统频率(时钟),因此将其分频得1Hz的秒钟信号,秒计满60即得1分钟,分满60即得1小时信号,小时满24即得一天。关键词:数字钟,计数器,数码管,模块化设计,VHDL。一、设计分析1.1设计要求1)具有时、分、秒计数显示功能,以24小时循环计时。2)时钟计数显示时有LED灯的花样显示。3)具有调节小时、分钟及清零的功能。4)具有整点报时功能。1.2性能指标及功能设计1)时钟计数:完成时、分、秒的正确计时并且显示所计的数字;对秒、分60进制计数,即从0到59循环计数,时钟——24进制计数,即从0到23循环计数,并且在数码管上显示数值。2)时间设置:手动调节分钟、小时,可以对所设计的时钟任意调时间,这样使数字钟真正具有使用功能。我们可以通过实验板上的键7和键4进行任意的调整,因为我们用的时钟信号均是1HZ的,所以每LED灯变化一次就来一个脉冲,即计数一次。3)清零功能:reset为复位键,低电平时实现清零功能,高电平时正常计数。可以根据我们自己任意时间的复位。4)蜂鸣器在整点时有报时信号产生,蜂鸣器报警。产生“滴答.滴答”的报警声音。5)LED灯在时钟显示时有花样显示信号产生。即根据进位情况,LED不停的闪烁,从而产生“花样”信号。1.3系统方框图二、设计方案本设计采用自顶向下的设计方法和模块化设计方式,它由秒计数模块,分计数模块,小时计数模块,报警模块,秒分时设置模块和译码模块,程序包,entity模块(顶层模块)八部分组成。优点:设计简单方便,层次清晰,工程的建立方便,无需单独设计各个组件模块产生原理图文件后再进行电路连接设计。三、设计原理和过程3.1硬件设计本设计使用VHDL硬件开发板,可编程逻辑器件EMP1270T144C5系列。设计过程中用到的外围电路的设计如下:3.1.1电源部分3.1.2可编程器件EMP1270T144C53.1.3CPLD–JTAG接口3.1.4晶振和蜂鸣器3.1.4LED数码管显示3.1.5DIP开关与按键输入(具体电路见附录)3.2软件设计3.2..1程序包my_pkg的设计说明为了简化程序设计增加可读性,系统采用模块化的设计方法,重复使用的组件以元件(component)的形式存在,以便相关块的调用。主程序内用不同的功能模块构成一完整的结构。下面列出my_pkg组件包的代码。------------------------------自定义的包集合(用到的几个模块元件声明)------------------------------数字时钟控制单元时调整分调整使能端信号CLK信号时显示分显示秒显示24进制60进制60进制LED显示整点报时花样显示libraryieee;useieee.std_logic_1164.all;packagemy_pkgiscomponentdiv40M---------------------------------------------------------------------元器件1Port(clk:instd_logic;f1hz:outstd_logic);endcomponent;componentcount60---------------------------------------------------------------------元器件2Port(clr,clk:instd_logic;one:bufferstd_logic_vector(3downto0);ten:bufferstd_logic_vector(3downto0);full:outstd_logic;dout:bufferstd_logic_vector(7downto0));endcomponent;componentcount24--------------------------------------------------------------------元器件3Port(clr,clk:instd_logic;one:bufferstd_logic_vector(3downto0);ten:bufferstd_logic_vector(3downto0);full:outstd_logic);endcomponent;componentscan6-----------------------------------------------------------------------元器件4port(clr,clk:inSTD_LOGIC;h_ten,h_one,m_ten,m_one,s_ten,s_one:inSTD_LOGIC_vector(3downto0);cs:outSTD_LOGIC_vector(5downto0);mux_out:outSTD_LOGIC_vector(3downto0));endcomponent;componentbin2led---------------------------------------------------------------------元器件5port(bin:instd_logic_vector(3downto0);led:outstd_logic_vector(7downto0));endcomponent;componentsh1k-------------------------------------------------------------------------元器件6Port(clk:instd_logic;--fromsystemclock(40MHz)f1hz:outstd_logic);--1Hzoutputsignalendcomponent;componentalarm_set------------------------------------------------------------------------元器件7Port(rst,hz1:instd_logic;--systemclock1Hzalarm,ok:instd_logic;--keeppushingtodeclarealarmsetsec_tune:instd_logic;sec_one,sec_ten:outstd_logic_vector(3downto0));endcomponent;endmy_pkg;3.2.2count60组件由此提供分(秒)计数值,当分计数器计数到59再来一个脉冲信号秒计数器清零从新开始计数,而进位则作为小时计数器的计数脉冲,使小时计数器计数加1,同时分计数器在分设置时钟信号的响应下设置分计数器的数值。在count60组件中,个位(one)和十位(ten)分别计数,都设为二进制四位矢量形式,当个位从0计到9时,在下一个clk上升沿来临后,十位进1,个位变0,十位从0到5计数,在十位为5,个位9的时候,下一个上升沿来临后,十位个位都变0,进位full加1。因此在程序设计中需要两个进程process来分别完成计数,秒计数以1Hz的输入为触发信号,分计数以秒的full信号为触发信号。具体的count60的组件代码如下:-----------------------------------------60进制计数模块------------------------------------Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;Entitycount60isPort(clr,clk:instd_logic;one:bufferstd_logic_vector(3downto0);ten:bufferstd_logic_vector(3downto0);full:outstd_logic;dout:bufferstd_logic_vector(7downto0));endcount60;architecturebehavofcount60isbeginprocess(clr,clk)beginif(clr='0')thenone=0000;elsif(rising_edge(clk))thenif(one=1001)thenone=0000;elseone=one+1;endif;endif;endprocess;process(clr,clk)beginif(clr='0')thenten=0000;elsif(rising_edge(clk))thenif(one=1001)thenif(ten=0101)thenten=0000;elseten=ten+1;endif;endif;endif;endprocess;dout=ten&one;process(clk)-----------------满59进位(置full值beginif(rising_edge(clk))theniften=0101thenifone=1001thenfull='1';elsefull='0';endif;elsefull='0';endif;endif;endprocess;endbehav;设定clk与clr两个系统的输入后,课观察到one和ten的波形,在计数值达到59后,即ten为0101,one为1001以后,即进位到00000000,full进1,波形如下。3.2.3count24组件由此提供时计数值,当时计数器计数到23再来一个脉冲信号秒计数器清零从新开始计数,而进位则作为小时计数器的计数脉冲,使小时计数器计数加1,同时分计数器在分设置时钟信号的响应下设置时计数器的数值。在count24组件中,个位(one)和十位(ten)分别计数,都设为二进制四位矢量形式,在ten小于2的时候,个位从0计到9时,满9ten加1,在ten为2的时候,one从0到3计数,one为3时候,在下一个clk上升沿来临后,ten与one都变0,进位full加1。因此在程序设计中需要多个个进程process来分别完成计数,时计数以分的full的输入为触发信号,分计数以秒的full信号为触发信号。具体的count24的组件代码如下:-----------------------------------------------24进制计数----------------------------------------------Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;Entitycount24isPort(clr,clk:instd_logic;one:bufferstd_logic_vector(3downto0);ten:bufferstd_logic_vector(3downto0);full:outstd_logic);endcount24;architecturebehavofcount24isbeginprocess(clr,clk)-------------------------计数0到23beginif(clr='0')thenten=0000;one=0000;elsif(rising_edge(clk))thenif(ten0010)thenif(one1001)thenone=one+0001;endif;ifone=1001thenone=0000;ten
本文标题:基于CPLD的VHDL时钟设计
链接地址:https://www.777doc.com/doc-3832852 .html