数字时钟的VHDL设计.docx
- 文档编号:4379609
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:11
- 大小:64.05KB
数字时钟的VHDL设计.docx
《数字时钟的VHDL设计.docx》由会员分享,可在线阅读,更多相关《数字时钟的VHDL设计.docx(11页珍藏版)》请在冰豆网上搜索。
数字时钟的VHDL设计
数字系统设计与硬件描述语言
期末考试作业
题目:
数字时钟的VHDL设计
学院:
信息学院
专业:
物联网工程
学号:
3011204286
:
洋
2013-11-06
一、选题设计描述
1.功能介绍
设计一台能显示时、分、秒的数字钟。
由时钟信号经分频产生秒脉冲;
计时计数器用24进制计时电路;
可手动校时,能分别进行时、分的校正;
具有整点报时功能。
2.算法简介
设计原理
1HZ
图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程序如下:
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entityclock_24is
Port(
clk1:
inSTD_LOGIC;--时钟
rst:
inSTD_LOGIC;--复位,高有效
sethr:
inSTD_LOGIC;--小时设置,增加1
setmin:
inSTD_LOGIC;--分钟设置
setsec:
inSTD_LOGIC;--秒设置
hr0:
outSTD_LOGIC_VECTOR(3downto0);--小时个位
hr1:
outSTD_LOGIC_VECTOR(3downto0);--小时十位
min0:
outSTD_LOGIC_VECTOR(3downto0);--分钟个位
min1:
outSTD_LOGIC_VECTOR(3downto0);--分钟十位
sec0:
outSTD_LOGIC_VECTOR(3downto0);--秒个位
sec1:
outSTD_LOGIC_VECTOR(3downto0);--秒十位
speak:
outSTD_LOGIC--报时输出
);
endclock_24;
architecturertlofclock_24is
signalco_sec0:
STD_LOGIC;--秒个位计数溢出标示
signalco_sec1:
STD_LOGIC;
signalco_min0:
STD_LOGIC;
signalco_min1:
STD_LOGIC;
signalco_hr0:
STD_LOGIC;
signalt_sec0:
STD_LOGIC_VECTOR(3downto0);--秒个位计数器
signalt_sec1:
STD_LOGIC_VECTOR(3downto0);
signalt_min0:
STD_LOGIC_VECTOR(3downto0);
signalt_min1:
STD_LOGIC_VECTOR(3downto0);
signalt_hr0:
STD_LOGIC_VECTOR(3downto0);
signalt_hr1:
STD_LOGIC_VECTOR(3downto0);
signalstate_hour:
STD_LOGIC_VECTOR(1downto0);--小时个位当前状态,当state_hour="00","01"时,cnt_hr0计数从0到9,当state_hour="10"时,cnt_hr0计算从0到3.
begin
counter_second0:
--秒个位计数器
process(clk1,rst,setsec)
begin
if(rst='1')then--异步复位
cnt_sec0<="0000";
elsif(clk1'eventandclk1='1')then--如果秒计数脉冲上升沿到来
if(setsec='1')then--如果秒设置按下,则秒计数器增加1
if(cnt_sec0>="1000")then
cnt_sec0<=cnt_sec0-"1000";
else
cnt_sec0<=cnt_sec0+"0010";
endif;
else
if(cnt_sec0="1001")then--如果cnt_sec0计数到9,则将cnt_sec0=0;
cnt_sec0<="0000";
else--否则将cnt_sec0增加1;
cnt_sec0<=cnt_sec0+"0001";--否则计数器加1
endif;
endif;
if(cnt_sec0="1000")then--产生进位标志
co_sec0<='1';
else
co_sec0<='0';
endif;
endif;
endprocesscounter_second0;
counter_second1:
--秒十位计数器
process(clk1,rst)
begin
if(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
endif;
endif;
if(cnt_sec0="1000"andt_sec1="0101")then--产生进位标志
co_sec1<='1';
else
co_sec1<='0';
endif;
endif;
endprocesscounter_second1;
counter_miniute0:
--分个位计数器
process(clk1,rst,setmin)
begin
if(rst='1')then
cnt_min0<="0000";
elsif(clk1'eventandclk1='1')then
if(setmin='1')then
cnt_min0<=cnt_min0+"0001";
endif;
if(co_sec1='1')then
if(cnt_min0="1001")then--如果溢出则置0
cnt_min0<="0000";
else
cnt_min0<=cnt_min0+"0001";--否则计数器加1
endif;
endif;
if(cnt_min0="1001"andt_sec0="1000"andt_sec1="0101")then--产生进位标志
co_min0<='1';
else
co_min0<='0';
endif;
endif;
endprocesscounter_miniute0;
counter_miniute1:
--分十位计数器
process(clk1,rst)
begin
if(rst='1')then
cnt_min1<="0000";
elsif(clk1'eventandclk1='1')then
if(co_min0='1')then
if(cnt_min1="0101")then--如果溢出则置0
cnt_min1<="0000";
else
cnt_min1<=cnt_min1+"0001";--否则计数器加1
endif;
endif;
if(cnt_min1="0101"andt_min0="1001"andt_sec0="1000"andt_sec1="0101")then--产生进位标志
co_min1<='1';
else
co_min1<='0';
endif;
endif;
endprocesscounter_miniute1;
counter_hour0:
--小时个位计数器
process(clk1,rst,sethr)
begin
if(rst='1')then
cnt_hr0<="0000";
state_hour<="00";
elsif(clk1'eventandclk1='1')then
if(sethr='1')then
cnt_hr0<=cnt_hr0+"0001";
endif;
casestate_houris
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;
endif;
if(cnt_hr0="1001"andt_min1="0101"andt_min0="1001"andt_sec0="1000"andt_sec1="0101")then
co_hr0<='1';--产生进位标志
else
co_hr0<='0';
endif;
when"01"=>--如果当前是01,cnt_hr0的计数围从0~9
if(co_min1='1')then
if(cnt_hr0="1001")then--如果溢出则置0
cnt_hr0<="0000";
state_hour<="10";
else
cnt_hr0<=cnt_hr0+"0001";--否则计数器加1
endif;
endif;
if(cnt_hr0="1001"andt_min1="0101"andt_min0="1001"andt_sec0="1000"andt_sec1="0101")then
co_hr0<='1';
else
co_hr0<='0';
endif;
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
endif;
endif;
if(cnt_hr0="0011"andt_min1="0101"andt_min0="1001"andt_sec0="1000"andt_sec1="0101")then
co_hr0<='1';--产生进位标志
else
co_hr0<='0';
endif;
whenothers=>
state_hour<="00";
endcase;
endif;
endprocesscounter_hour0;
counter_hour1:
--小时十位计数器
process(clk1,rst)
begin
if(rst='1')then
cnt_hr1<="0000";
elsif(clk1'eventandclk1='1')then
if(co_hr0='1')then
if(cnt_hr1="0010")then--如果溢出则置0
cnt_hr1<="0000";
else
cnt_hr1<=cnt_hr1+"0001";
endif;
endif;
endif;
endprocesscounter_hour1;
--在**-59-5*的时候speak=1,否则等于0
with(cnt_min1="0101"andt_min0="1001"andt_sec1="0101")select
speak<='1'whenTRUE,
'0'whenothers;
--将计数器的值赋给相应的输出引脚
hr0<=cnt_hr0;
hr1<=cnt_hr1;
min0<=cnt_min0;
min1<=cnt_min1;
sec0<=cnt_sec0;
sec1<=cnt_sec1;
endrtl;
三、仿真结果及分析
整体仿真结果如下
因整体不清晰,做了局部仿真截图如下
由上调试过程可知,该数字钟实现了计时、重置时间和整点报时的功能。
在给数字钟重置时间后,数字钟便开始从所置的时间计时,到达59秒时,秒计时器回到0秒,并且给分钟加1;当到达59分时,分计时器回到0分钟,并且给小时加1;当到达23小时时,时计时器回到0小时。
四、心得体会
通过这次设计,进一步加深了对VHDL的了解,让我对它有了更加浓厚的兴趣。
特别是当每一个子模块编写调试成功时,心里特别的开心。
但是在编写顶层文件的程序时,遇到了不少问题,特别是各元件之间的连接,以及信号的定义,总是有错误,在细心的检查下,终于找出了错误和警告,排除困难后,程序编译就通过了,心里终于舒了一口气。
总的来说,这次设计的数字钟还是比较成功的,有点小小的成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字 时钟 VHDL 设计