数字时钟的VHDL设计
- 格式:doc
- 大小:78.00 KB
- 文档页数:10
数字系统设计与硬件描述语言期末考试作业题目:数字时钟的VHDL设计学院:信息学院专业:物联网工程学号:3011204286姓名:赵洋2013-11-06一、选题设计描述1.功能介绍设计一台能显示时、分、秒的数字钟。
由时钟信号经分频产生秒脉冲;计时计数器用24进制计时电路;可手动校时,能分别进行时、分的校正;具有整点报时功能。
2.算法简介设计原理图1数字钟的系统框图该系统由振荡器、分频器、“时、分、秒”计数器、译码器及显示器、校时电路、整点报时电路等组成。
振荡器和分频器产生整个系统的时基信号,它直接决定计时系统的精度。
“秒计数器”采用六十进制计数器,每累计60秒向“分计数器”进位;“分计数器”采用六十进制计数器,每累计60分向“时计数器”进位;“时计数器”采用二十四进制计数器,按照“24翻1”规律计数。
“时、分、秒”计数器的输出经译码器送显示器显示。
校时电路用来当计时出现误差时对“时、分、秒”进行校对调整。
设计过程1.设计思路时钟脉冲信号作为数字钟的时间基准,再经分频器输出标准秒脉冲。
秒计数器计满60后向分计数器进位,分计数器计满60后向小时计数器进位,小时计数器是计满24后,系统自动复位重新开始计数。
计数器的输出经译码电路后送到显示器显示。
可以用校时电路进行校时。
2.数字钟的设计方案数字钟的设计包括编码模块、分频模块、秒计时模块、分计时模块、小时计时模块和报时模块。
该数字钟可以实现3个功能:计时功能、报时功能和设置时间功能。
2.1. 编码模块编码模块主要是对时(sethour)、分(setmin)、秒(setsec)的设置输入。
2.2. 分频模块在数字钟的设计中,外部输入时钟信号clk1的频率为8hz,其分频后的频率为clk,使其分频结果为1hz,用来提供给秒计时模块、分计时模块、小时计时模块。
2.3. 秒计时模块将“秒计时脉冲”clk接信号源单元的1HZ脉冲信号,此时秒显示将从00计时到59,然后回到00,重新计时。
在秒位进行计时的过程中。
秒计时器是由一个60进制的计数器构成的,具有置数和计数功能。
其中rst为置数信号,当rst为1时,秒计时器置数。
clk为驱动秒计时器的时钟,sec1、sec0为秒计时器的高位和低位输出。
2.4.分计时模块分计时电路:将“分计时脉冲”clk接信号源单元的1HZ脉冲信号,此时分显示将从00计时到59,然后回到00,重新计时。
在分位进行计时的过程中。
分计时器是由一个60进制的计数器构成的,具有置数和计数功能。
其中rst为置数信号,当rst为1时,分计时器置数。
min1、min0为分计时器的高位和低位输出。
2.5.小时计时模块将“小时计时脉冲”clk接信号源单元的1HZ脉冲信号,此时小时显示将从00计时到24,然后回到00,重新计时。
时计时器是由一个24进制的计数器构成的,具有置数和计数功能。
其中的rst为置数信号,当rst为1时,时计时器置数。
hr1、hr0为时计时器的高位和低位输出。
3.2.6,报时模块当分位到59时,秒位计到51秒、53秒、55秒、57秒、59秒时报时一次,而后小时位加1。
二、程序源代码及说明源程序数字钟整体程序整个程序分为五个部分,分别为分频部分、校时部分、秒部分、分部分、小时部分。
VHDL程序如下:library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity clock_24 isPort (clk1 : in STD_LOGIC;--时钟ﻩrstﻩ:in STD_LOGIC;--复位,高有效ﻩsethr : in STD_LOGIC;--小时设置,增加1ﻩﻩsetmin: in STD_LOGIC;--分钟设置setsecﻩ:in STD_LOGIC;--秒设置ﻩhr0 ﻩ: out STD_LOGIC_VECTOR(3 downto 0);--小时个位hr1 : outSTD_LOGIC_VECTOR(3 downto 0);--小时十位min0 : outSTD_LOGIC_VECTOR(3 downto 0);--分钟个位min1ﻩ: out STD_LOGIC_VECTOR(3 downto 0);--分钟十位ﻩsec0 : out STD_LOGIC_VECTOR(3downto 0);--秒个位sec1: outSTD_LOGIC_VECTOR(3 downto 0);--秒十位ﻩspeakﻩ: out STD_LOGIC--报时输出);end clock_24;architecturertlof clock_24 issignal co_sec0: STD_LOGIC;--秒个位计数溢出标示signal co_sec1: STD_LOGIC;signal co_min0: STD_LOGIC;signal co_min1: STD_LOGIC;signal co_hr0: STD_LOGIC;signal cnt_sec0: STD_LOGIC_VECTOR(3 downto 0);--秒个位计数器signal cnt_sec1: STD_LOGIC_VECTOR(3 downto 0);signal cnt_min0: STD_LOGIC_VECTOR(3 downto 0);signalcnt_min1: STD_LOGIC_VECTOR(3 downto 0);signal cnt_hr0: STD_LOGIC_VECTOR(3 downto 0);signal cnt_hr1: STD_LOGIC_VECTOR(3 downto 0);signal state_hour:STD_LOGIC_VECTOR(1 downto 0);--小时个位当前状态,当state_hour="00","01"时,cnt_hr0计数从0到9,当state_hour="10"时,cnt_hr0计算从0到3.begincounter_second0:--秒个位计数器process(clk1,rst,setsec)beginﻩif(rst='1')then--异步复位ﻩcnt_sec0<="0000";elsif(clk1'eventand clk1='1')then--如果秒计数脉冲上升沿到来ﻩif(setsec='1')then--如果秒设置按下,则秒计数器增加1ﻩif(cnt_sec0>="1000") thenﻩﻩcnt_sec0<=cnt_sec0-"1000";ﻩelseﻩﻩﻩcnt_sec0<=cnt_sec0+"0010";end if;ﻩelseif(cnt_sec0="1001")then--如果cnt_sec0计数到9,则将cnt_sec0=0;ﻩﻩﻩﻩcnt_sec0<="0000";ﻩelse--否则将cnt_sec0增加1;ﻩﻩﻩcnt_sec0<=cnt_sec0+"0001";--否则计数器加1ﻩend if;ﻩﻩend if;ﻩﻩif(cnt_sec0="1000") then--产生进位标志ﻩco_sec0<='1';ﻩelseﻩﻩco_sec0<='0';ﻩend if;end if;end process counter_second0;counter_second1:--秒十位计数器process(clk1,rst)beginif(rst='1') thenﻩcnt_sec1<="0000";elsif(clk1'eventandclk1='1')thenﻩif(co_sec0='1')thenﻩﻩif(cnt_sec1="0101")then--如果溢出则置0ﻩﻩcnt_sec1<="0000";ﻩelseﻩcnt_sec1<=cnt_sec1+"0001";--否则计数器加1ﻩend if;ﻩend if;ﻩif(cnt_sec0="1000" and cnt_sec1="0101")then--产生进位标志ﻩco_sec1<='1';elseﻩco_sec1<='0';ﻩend if;endif;end process counter_second1;counter_miniute0:--分个位计数器process(clk1,rst,setmin)beginif(rst='1') thenﻩcnt_min0<="0000";elsif(clk1'event and clk1='1')thenif(setmin='1')thenﻩﻩcnt_min0<=cnt_min0+"0001";end if;ﻩif (co_sec1='1')thenﻩﻩif(cnt_min0="1001")then--如果溢出则置0ﻩﻩﻩcnt_min0<="0000";ﻩﻩelseﻩﻩﻩﻩcnt_min0<=cnt_min0+"0001";--否则计数器加1ﻩend if;ﻩﻩend if;ﻩif(cnt_min0="1001" andcnt_sec0="1000"andcnt_sec1="0101")then--产生进位标志ﻩco_min0<='1';elseﻩﻩﻩco_min0<='0';ﻩﻩend if;ﻩend if;end process counter_miniute0;counter_miniute1:--分十位计数器process(clk1,rst)beginﻩif(rst='1') thenﻩcnt_min1<="0000";elsif(clk1'event and clk1='1')thenif(co_min0='1')thenﻩif(cnt_min1="0101")then--如果溢出则置0ﻩﻩcnt_min1<="0000";ﻩelseﻩﻩﻩﻩcnt_min1<=cnt_min1+"0001";--否则计数器加1end if;end if;ﻩﻩif(cnt_min1="0101" and cnt_min0="1001"and cnt_sec0="1000"and cnt_sec1="0101")then--产生进位标志ﻩﻩco_min1<='1';elseﻩco_min1<='0';ﻩendif;ﻩend if;end process counter_miniute1;counter_hour0:--小时个位计数器process(clk1,rst,sethr)beginﻩif(rst='1') thenﻩcnt_hr0<="0000";state_hour<="00";ﻩelsif(clk1'event and clk1='1')thenif(sethr='1')thenﻩcnt_hr0<=cnt_hr0+"0001";ﻩﻩend if;ﻩﻩcase state_hour isﻩﻩﻩwhen "00"=>--如果当前是00,cnt_hr0的计数范围从0~9ﻩﻩif (co_min1='1')thenﻩﻩﻩif(cnt_hr0="1001")then--如果溢出则置0ﻩﻩcnt_hr0<="0000";ﻩﻩﻩstate_hour<="01";ﻩﻩﻩelseﻩﻩcnt_hr0<=cnt_hr0+"0001";--否则计数器加1ﻩﻩendif;ﻩﻩend if;ﻩif(cnt_hr0="1001" and cnt_min1="0101" and cnt_min0="1001" and cnt_sec0="1000" and cnt_sec1="0101")thenﻩﻩco_hr0<='1';--产生进位标志ﻩelseﻩﻩﻩco_hr0<='0';end if;ﻩﻩﻩwhen "01"=>--如果当前是01,cnt_hr0的计数范围从0~9ﻩﻩif (co_min1='1')thenﻩﻩif(cnt_hr0="1001")then--如果溢出则置0ﻩﻩﻩcnt_hr0<="0000";ﻩﻩstate_hour<="10";ﻩﻩﻩelsecnt_hr0<=cnt_hr0+"0001";--否则计数器加1end if;end if;ﻩﻩﻩﻩﻩﻩﻩﻩif(cnt_hr0="1001" and cnt_min1="0101" and cnt_min0="1001" and cnt_sec0="1000" and cnt_sec1="0101")thenco_hr0<='1';ﻩﻩelseﻩﻩﻩco_hr0<='0';ﻩﻩend if;ﻩﻩﻩwhen "10"=>--如果当前是10,cnt_hr0的计数范围从0~3 ﻩif(co_min1='1')thenﻩif(cnt_hr0="0011")then--如果溢出则置0ﻩﻩﻩﻩﻩcnt_hr0<="0000";ﻩﻩﻩﻩstate_hour<="00";ﻩﻩﻩelseﻩﻩﻩcnt_hr0<=cnt_hr0+"0001";--否则计数器加1ﻩﻩend if;end if;ﻩif(cnt_hr0="0011" and cnt_min1="0101" and cnt_min0="1001" and cnt_sec0="1000" and cnt_sec1="0101")thenﻩﻩﻩco_hr0<='1';--产生进位标志ﻩﻩelseﻩco_hr0<='0';ﻩﻩend if; ﻩﻩwhen others=>ﻩﻩstate_hour<="00";ﻩﻩend case;ﻩﻩend if;endprocesscounter_hour0;counter_hour1:--小时十位计数器process(clk1,rst)beginif(rst='1')thenﻩcnt_hr1<="0000";elsif(clk1'eventand clk1='1')thenﻩif(co_hr0='1')thenﻩﻩif(cnt_hr1="0010")then--如果溢出则置0ﻩﻩﻩcnt_hr1<="0000";ﻩﻩelseﻩﻩﻩcnt_hr1<=cnt_hr1+"0001";ﻩendif;end if;end if;end process counter_hour1;--在**-59-5*的时候speak=1,否则等于0with (cnt_min1="0101" and cnt_min0="1001" and cnt_sec1="0101") selectspeak<='1' when TRUE,ﻩ'0' when others;--将计数器的值赋给相应的输出引脚hr0<=cnt_hr0;hr1<=cnt_hr1;min0<=cnt_min0;min1<=cnt_min1;sec0<=cnt_sec0;sec1<=cnt_sec1;end rtl;三、仿真结果及分析整体仿真结果如下因整体不清晰,做了局部仿真截图如下由上调试过程可知,该数字钟实现了计时、重置时间和整点报时的功能。