EDA课程数字钟设计报告.docx
《EDA课程数字钟设计报告.docx》由会员分享,可在线阅读,更多相关《EDA课程数字钟设计报告.docx(15页珍藏版)》请在冰豆网上搜索。
EDA课程数字钟设计报告
一、设计任务
设计一台能显示时、分、秒的数字钟。
具体要求如下:
(1)由实验箱上的时钟信号经分频产生秒脉冲;
(2)计时计数器用24进制计时电路;
(3)可手动校时,能分别进行时、分的校正;
(4)整点报时;
二、试验目的
(1)掌握时十进制、六进制和二十四进制计数器的设计方法。
(2)掌握多位计数器相连的设计方法。
(3)掌握多位共阴极扫描显示数码管的驱动及编码。
三、总体设计方案
本数字系统实现数字钟的基本的计时功能,输入8Hz的时钟,通过分频产生1Hz的时钟信号,采用24/12小时制计时,能显示时、分、秒。
本系统还具有校正功能,可以进行时分的校时,当计时器运行到59分59秒开始报时,另外还可以设定闹钟,当按下闹铃开关时,可在规定时间闹铃,当开关复位时,闹铃停止。
本数字钟实际上是一个对频率(1Hz)进行计数的计数电路。
由于计数的起始时间不可能与标准时间一致,故需要在电路上加一个校时电路,同时分频后的1Hz时间信号必须做到准确稳定。
通常使用石英晶体振荡器电路构成数字钟。
数字钟的基本组成
本数字钟的实现可分为以下几个模块:
(1)秒计数模块:
秒计数,在频率为1Hz的时钟下以60次为循环计数,并产生进位信号影响分计数;
(2)分计数模块:
分计数,在秒进位信号为高电平时,计数一次,同样以60次为一个循环计数,同时产生分进位信号影响时计数;
(3) 时计数模块:
时计数,在分进位信号为高电平时,计数一次,以24/12次为一个循环计数;
(4)频率产生模块:
产生8Hz的计数频率,通过分频得到1Hz频率;
(5) 时间显示模块:
数码管通过动态显示,同时进行一定频率的扫描显示时,分,秒。
(6) 时间设置模块:
设置调试使能端,可以调时,分,秒。
基本功能是在使能端为高电平时,可以使时和、分和秒循环计数;
(7) 整点报时模块:
在秒计数到50秒时,同时分计数到59分开始,蜂鸣器产生四个时钟周期的鸣叫,到整点是产生两个时钟周期的鸣叫。
(8) 闹钟模块:
在设定闹钟闹铃时间后,当闹钟使能端有效时,可在闹铃时间闹铃,通过人工拨0后停闹。
一个基本的数字钟电路主要由译码显示器、“时”,“分”,“秒”计数器和定时器组成。
干电路系统由秒信号发生器、“时”,“分”,“秒”计数器、译码器及显示器、电路组成。
分频器电路:
通常,数字钟的晶体振荡器输出频率较高,为了得到1Hz的秒信号输入,需要对振荡器的输出信号进行分频。
通常实现分频器的电路是计数器电路,当计数满时则产生相应的跳变,从而得到想要的的分频后频率。
时间计数单元:
时间计数单元有时计数、分计数和秒计数等几个部分。
时计数单元一般为12进制计数器或24进制计数器。
译码驱动及显示单元:
计数器实现了对时间的累计以8421BCD码形式输出,为了将计数器输出的8421BCD码显示出来。
试验箱上有几种模式可供选择,选择模式5则自带有显示译码器,代码中就可以直接送四位bcd码给相应端口就行。
校时电源电路:
当重新接通电源或走时出现误差时都需要对时间进行校正。
通常,校正时间的方法是:
首先截断正常的计数通路,然后再进行人工出触发计数将高电平信号加到需要校正的计数单元的输入端,相应的时分秒数值随着时钟脉冲信号跳变,校正好后,再按下使能键变为低电平,转入正常计时状态。
整点报时电路:
一般时钟都应具备整点报时电路功能,即在时间出现整点时,数字钟会自动报时,以示提醒。
其作用方式是发出连续的或有节奏的音频声波,较复杂的也可以是实时语音提示。
本设计的总体设计原理结构框图如下:
秒计数器
分计数器
分译码器
秒译码器
分显示器
秒显示器
时译码器
时计数器
时显示器
报时
时制转换电路
1HZ
分频器
振荡器
该系统由振荡器、分频器、“时、分、秒”计数器、译码器及显示器、校时电路、整点报时电路等组成。
石英晶体振荡器和分频器产生整个系统的时基信号,它直接决定计时系统的精度。
“秒计数器”采用六十进制计数器,每累计60秒向“分计数器”进位;“分计数器”采用六十进制计数器,每累计60分向“时计数器”进位;“时计数器”采用二十四进制计数器,按照“24翻1”规律计数。
“时、分、秒”计数器的输出经译码器送显示器显示。
校时电路用来当计时出现误差时对“时、分、秒”进行校对调整。
整点报时电路是根据计时系统的输出状态产生一脉冲信号,然后去触发音频发生器实现报时。
本程序实现的功能并不复杂,故本课程设计并未采用例化语句,而是将各个模块的功能整合到一起,采用一个结构体多个进程来实现。
四、调试过程
程序完成后,首先要做的便是仿真,观察仿真图,改变相应的输入参数值看是否达到所要求的结果。
输入时钟信号如下:
相应的产生仿真图如下:
从图中可以看出,仿真结果正常,分秒可以正常跳变。
其它功能也同样可以通过更改输入参数来观察输出的仿真结果,从而查看实现的功能。
如下所示:
从图中可以看出,闹铃功能正常实现。
图中实现的是调节分位的时间,其它位的时间调节方法一致。
从图中可以看出整点报时功能也能实现,产生高电平使得蜂鸣器发声。
调时功能测试,从图中可以看出,可以正常调节时间。
部分RTL图
五、实验心得:
本次课程设计是通过所学的EDA知识,自主设计使用物品,将所学的知识运用到实处,感觉收获很大,以前学的时候都是学的理论上的知识,并没有运用到实际做具体的功能器件上来,通过这次的课程设计使我将理论的知识联系到实际运用中来,巩固了以前学习的知识,并且有了新的收获,进一步熟悉了软件运用和实验箱的使用,增强了自我动手能力。
学习EDA课程已经过去一段时间,好多知识开始模糊,所以在实验过程中要经常翻阅书本查询相关知识,实验的过程也将书本的知识进一步强化,对书本的知识有了新的认识,受益匪浅。
在程序设计过程中容易将各个复合语句的范围用错,从而出现意想不到的结果,逻辑出现紊乱,有时是漏掉了某些语句或者是一些语法错误,这些在编译的时候都会有相应的出错提示,顺着提示去改正相对比较容易,不过也出现过几次错误出现的地方和提示出错的地方不一致,费了很大力气才解决,还有一种就是,编译可以通过,但是结果不与预想的一致,一般进程process…endprocess不会出错,原因主要是进程中的逻辑顺序或嵌套没有安排好,比如if…else……endif语句,如果if语句结束的位置用错,即endif的位置不对,不会提示出错但是不能达到想要的结果,这就需要从头认真分析各逻辑关系,重新考虑endif位置,总之课程设计虽然辛苦,但是却有其中的乐趣,尤其是解决问题后的成就感,学以致用,感觉很充实。
EDA是现代信息社会里很有用的一门学科,以后一定会再次用到,现在打好基础,为以后的学习和工作奠定基础,培养兴趣。
参考文献:
EDA技术与VHDL(第二版).潘松黄继业.清华大学出版社.2008
六、程序清单
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityshuzizhongis
port(clk1,set,naol,change,s1,s2,s3:
instd_logic;------秒分时校验---s1,s2,s3;闹铃设置naol,调时间启动键change
minite1:
outstd_logic_vector(3downto0);
minite2:
outstd_logic_vector(3downto0);
second1,second2,hour1,hour2:
outstd_logic_vector(3downto0);
cout:
outstd_logic);
endentity;
architectureoneofshuzizhongis
signalclk,temp:
std_logic;
begin
pro:
process(clk1)
variablen:
integer:
=0;
begin
ifclk1'eventandclk1='1'then
ifn=4thentemp<=nottemp;n:
=0;
elsen:
=n+1;
endif;
endif;
endprocesspro;
clk<=temp;
pro1:
process(clk,set,s1,s2,s3,change,naol)
variable
msecond1,msecond2,mminite1,mminite2,mhour11,mhour12,mhour21,mhour22:
std_logic_vector(3downto0);
variable
mminite10,mminite20,mhour110,mhour120,mhour210,mhour220:
std_logic_vector(3downto0);
begin
if(clk'eventandclk='1')then
if(naol='1')then--qidongdinshi
ifs2='1'then
mminite10:
=mminite10+1;
ifmminite10="1010"
thenmminite10:
="0000";
mminite20:
=mminite20+1;
ifmminite20="0110"
thenmminite20:
="0000";
endif;
endif;
endif;---------分校验
ifs3='1'then
mhour110:
=mhour110+1;
mhour210:
=mhour210+1;
ifmhour110="1010"thenmhour110:
="0000";
mhour120:
=mhour120+1;
endif;
ifmhour110="0011"andmhour120="0001"
thenmhour110:
="0001";mhour120:
="0000";
endif;
ifmhour210="1010"thenmhour210:
="0000";
mhour220:
=mhour220+1;
endif;
ifmhour210="0100"andmhour220="0010"
thenmhour210:
="0000";mhour220:
="0000";
endif;
endif;-------时校验
endif;
ifset='1'then-----启动校验
ifs1='1'
thenmsecond1:
=msecond1+1;
ifmsecond1="1010"
thenmsecond1:
="0000";
msecond2:
=msecond2+1;
ifmsecond2="0110"
thenmsecond2:
="0000";
endif;
endif;
endif;--------秒校验
ifs2='1'
then
mminite1:
=mminite1+1;
ifmminite1="1010"
thenmminite1:
="0000";
mminite2:
=mminite2+1;
ifmminite2="0110"
thenmminite2:
="0000";
endif;
endif;
endif;---------分校验
ifs3='1'then
mhour11:
=mhour11+1;
mhour21:
=mhour21+1;
ifmhour11="1010"thenmhour11:
="0000";
mhour12:
=mhour12+1;
endif;
ifmhour11="0011"andmhour12="0001"
thenmhour11:
="0001";mhour12:
="0000";
endif;
ifmhour21="1010"thenmhour21:
="0000";
mhour22:
=mhour22+1;
endif;
ifmhour21="0100"andmhour22="0010"
thenmhour21:
="0000";mhour22:
="0000";
endif;
endif;-------时校验
else
msecond1:
=msecond1+1;-----正常计时工作
ifmsecond1="1010"
thenmsecond1:
="0000";
msecond2:
=msecond2+1;
ifmsecond2="0110"
thenmsecond2:
="0000";
mminite1:
=mminite1+1;
ifmminite1="1010"
thenmminite1:
="0000";
mminite2:
=mminite2+1;
ifmminite2="0110"
thenmminite2:
="0000";
mhour11:
=mhour11+1;
mhour21:
=mhour21+1;
ifmhour11="1010"thenmhour11:
="0000";
mhour12:
=mhour12+1;
endif;
ifmhour11="0011"andmhour12="0001"
thenmhour11:
="0001";mhour12:
="0000";
endif;-------12小时制
ifmhour21="1010"thenmhour21:
="0000";
mhour22:
=mhour22+1;
endif;
ifmhour21="0100"andmhour22="0010"
thenmhour21:
="0000";mhour22:
="0000";
endif;----------24小时制
endif;endif;
endif;endif;
endif;
ifnaol='0'then
second1<=msecond1;
second2<=msecond2;
minite1<=mminite1;
minite2<=mminite2;
ifchange='0'thenhour1<=mhour11;hour2<=mhour12;
elsehour1<=mhour21;hour2<=mhour22;------12/24小时制转换
endif;else
second1<="0000";
second2<="0000";
minite1<=mminite10;
minite2<=mminite20;
ifchange='0'thenhour1<=mhour110;hour2<=mhour120;
elsehour1<=mhour210;hour2<=mhour220;------12/24小时制转换
endif;
endif;
if(msecond1="0000"ormsecond1="0001")and(msecond2="0000")and
(mminite1="0000")and(mminite2="0000")--and(msecond1<"0010")and
(msecond2="0000")
thencout<='1';
elseifchange='0'then
if(mminite1=mminite10)and(mminite20=mminite2)and
(mhour12=mhour120)and(mhour11=mhour110)and(msecond1<="0100")and
(msecond2="0000")
thencout<='1';elsecout<='0';--整点报时
endif;
elseif(mminite1=mminite10)and(mminite20=mminite2)
and(mhour22=mhour220)and(mhour21=mhour210)and(msecond1<="0101")and
(msecond2="0000")
thencout<='1';
else
cout<='0';
endif;
endif;
endif;
endif;
endprocess;
endarchitectureone;