数字钟VHDL程序.docx
《数字钟VHDL程序.docx》由会员分享,可在线阅读,更多相关《数字钟VHDL程序.docx(16页珍藏版)》请在冰豆网上搜索。
![数字钟VHDL程序.docx](https://file1.bdocx.com/fileroot1/2023-2/1/4ef1ff7c-05c5-4ed0-badc-9021ea7b4578/4ef1ff7c-05c5-4ed0-badc-9021ea7b45781.gif)
数字钟VHDL程序
大连理工大学本科实验报告
题目:
数字钟的VHDL设计
课程名称:
数字电路课程设计
学院(系):
电子信息与电气工程学部专业:
电子信息工程
班级:
学生姓名:
学号:
完成日期:
成绩:
2013年12月15日
数字钟的VHDL设计
1.设计任务及要求:
设计任务:
设计一台能显示时、分、秒的数字钟。
具体要求如下:
(1)设计一个数字钟,能够显示当前时间,分别用6个数码管显示小时、分钟、秒钟的时间,秒针的计数频率为IHz,可由系统脉冲分频得到。
(2)在整点进行提示,可通过LED闪烁实现,闪烁频率及花型可自己设计。
(3)能够调整小时和分钟的时间,调整的形式为通过按键进行累加。
(4)具有闹钟功能,闹钟时间可以任意设泄(设泄的形式同样为通过按键累加),并且在设建的时间能够进行提示,提示同样可以由LED闪烁实现
设计要求:
(1)编写设计报告,要求包括方案选择、程序代码淸单、调试过程、测试结果及心得体会。
2∙设计原理
图1数字钟的系统框图
该系统山振荡器、分频器、“时、分、秒”计数器、译码器及显示器、校时电路、整点报时电路等组成。
石英晶体振荡器和分频器产生整个系统的时基信号,它直接决定计时系统的精度秒计数器”采用六十进制计数器,每累计60秒向“分计数器”进位;“分计数器”采用六十进制计数器,每累计60分向“时计数器”进位「时计数器”采用二十四进制计数器,按照“24翻Γ规律计数。
“时、分、秒”计数器的输出经译码器送显示器显示。
校时电路用来当计时出现误差时对“时、分、秒”进行校对调整。
整点报时电路是根据计时系统的输出状态产生一脉冲信号,然后去触发音频发生器实现报时。
3.设计过程
3.1.设计思路
时钟脉冲信号作为数字钟的时间基准,再经分频器输岀标准秒脉冲。
秒i∣∙数器计满60后向分计数器进位,分计数器计满60后向小时计数器进位,小时计数器是计满24后,系统自动复位重新开始汁数。
计数器的输出经译码电路后送到显示器显示。
可以用校时电路进行校时。
整点报时电路在每小时的最后50秒开始报时间隔一秒报一次时直至下一小时开始。
3.2.数字钟的设计方案
数字钟的设计包括编码模块、分频模块、秒计时模块、分计时模块、小时讣时模块、闹钟模块和报时模块。
该数字钟可以实现3个功能:
计时功能、报时功能、闹铃和设置时间功能。
3.2.1.编码模块
编码模块主要是对时、分、秒的设宜输入。
3.2.2.分频模块
在数字钟的设汁中,外部输入时钟信号ClkI的频率为50Mhz,其分频后的频率为elk,使其分频结果为Ihz,用来提供给秒计时模块、分计时模块、小时计时模块。
3.2.3.秒计时模块
将“秒计时脉冲”CIk接信号源单元的IHZ脉冲信号,此时秒显示将从00计时到59,然后回到00,重新计时。
在秒位进行计时的过程中。
秒计时器是由一个60进制的计数器构成的,具有置数和计数功能。
其中reset为宜数信号,当reset为1时,秒计时器置数。
CIk为驱动秒计时器的时钟,SeC2、SeCl为秒计时器的髙位和低位输出。
3.2.4.分计时模块
分计时电路:
将“分计时脉冲”CIk接信号源单元的CI脉冲信号,此时分显示将从00计时到59,然后回到00,重新计时。
在分位进行计时的过程中。
分计时器是由一个60进制的计数器构成的,具有置数和计数功能。
其中rese为置数信号,当reset为1时,分计时器置数。
fen4、fen3为分计时器的高位和低位输出。
3.2.5.小时计时模块
将“小时汁时脉冲”Clk接信号源单元的c2脉冲信号,此时小时显示将从00汁时到23,然后回到00,重新计时。
时计时器是由一个24进制的计数器构成的,具有置数和计数功能。
其中的reset为宜数信号,当reset为1时,时计时器置数。
Shi6、shi5为时计时器的高位和低位输出。
3.2.6.报时模块
当分位到59时,秒位计到51秒、53秒、55秒、57秒、59秒时报时一次,而后小时位加IO
3.2.7.VHDL引脚分配图
4.源程序
4.1.数字钟整体程序
整个程序分为六个部分,分别为分频部分、校时部分、秒部分、分部分、小时部分和报时部分。
4.2.VHDL程序及波形分析
4.2.1.VHDL程序
Iibraryieee;—COUnt60
USeieee・Std_IOgiC-1164・all;
USeieee・std_logic_unsigned.all;
entityCOUnt60is
POrt(elk:
inStd-IOgic;
reset:
inStd-IOgic;
set:
inStd-IOgic;
inc:
inStd-IOgic;
OUt1:
OUtStdIOgiCVeCtOr(3downto0):
out2:
OUtStd-IOgiC-VeCtOr(3downto0);
c:
OUtStd-IOgic;
alight:
OUtStd-IOgiC);
end;
architecturerun2OfCOUnt60is
SignaItsl,ts2,asl,as2:
Std-IOgiC-VeCtor(3downtoO):
二"0000〃;
SignaItclk,aclk:
Std-IOgic;
begin
PrOCeSS(inc,elk,Set)—根据设置模式,处理inc上的脉冲信号
begin
ifSet-O'then—时间调整模式
aclk<=,0,;
ifclk=,Γandinc二ithen—CIk=I则tclk<=O>通过挖洞方式添加一个脉冲tclk<=0';
elsifCIk='O'andinc=ithen—clk=O,K∣∣tclk<=l,产生一个高电平,添加一脉冲
tdk<=r;
else
tclk<=clk;
endif;
elsifset=*Γthen--闹铃调整模式
tclk<=clk;
aclk<=inc;—inc上的脉冲直接修改闹铃立时值
endifJ
endprocess;
PrOCeSS(tclk,reset)
begin
if(reset=O')thentsl<="OOOO';ts2<="0000,z;
elsif(tclk,eventandtclk=,Γ)then
iftsl=zz1001,zthentsl<="OOOO∖
ifts2="010Γthents2<="0000,z;
elsets2<=ts2+l;
endif;
elsetsl<=tsl+l;--讣数过程
endif;
endif;
endprocess;--结束进程
PrOCeSS(aclk,reset)
begin
if(reset=O,)thenasl<='0000';as2<="0000";
elsif(aclk,eventandaclk=,Γ)then
辻asl=zz100f,thenasl<="0000";
ifas2="01Orthenas2<='0000';
elseas2<=as2+l;
endifJ
elseasl<=asl+l;--计•数过程
end辻;
endif;
endprocess;--结束进程
PrOCeSS(tsl,ts2,asl,as2)—显示时间或闹铃立时值begin
ifSet='0'then―显示时间
OUtK=tsl;
out2<=ts2;
else—显示定时值
OUtl<=asl;
out2<=as2;
endif;
endprocess;
PrOCeSS(tsl,ts2,asl,as2)—判断定时值与时间值相等,输出闹铃触发信号begin
辻(tsl=zZIOOrZandts2=,z01Or)then
C<=1,;
elsec<=j0,;
end辻;
iftsl=aslandts2=as2then
alight<=,Γ;
else
alight<=,0';
endif;
endprocess;
endrun2;
Iibraryieee;—COUnt24
USeieee・Std-IOgic_l164・all;
USeieee・std_logic_unsigned.all;
entityCOUnt24is
POrt(elk:
inStd-IOgic;
reset:
inStd-IOgic;
set:
inStd-IOgic;
inc:
inStd-IOgic;
OUt1:
OUtStd-IOgiC-VeCtOr(3downto0);
out2:
OUtStd-IOgiC-VeCtOr(3downtoO);
c:
OUtStd-IOgic;
alight:
OUtStd-IOgiC);
end;
architecturerunlOfCOUnt24is
SignaItsl,ts2,asl,as2:
Std-IOgiC-VeCtor(3downtoO):
="OooO";
SignaItclk,aclk:
Std-IOgic;
begin
PrOCeSS(inc,elk,Set)—根据设置模式,处理inc上的脉冲信号
begin
ifSet-O'then―时间调整模式
aclk<=,0,;
ifclk=*Γandinc=ithen—CIk=I贝IJtclk<=O>通过挖洞方式添加一个脉冲tclk<=0';
elsifCW0,andinc=ithen—clk=O,则tclk<=l,产生一个高电平,添加一脉冲
tclk<=j1,;
else
tclk<=clk;
endif;
elsifset='Γthen—闹铃调整模式
tclk<=clk;
aclk<=inc;—inc上的脉冲直接修改闹铃左时值
endifJ
endprocess;
PrOCeSS(tclk,reset)
begin
if(reset=O')thentsl<='OOOO";ts2<='0000";
elsif(tclk,eventandtclk=,Γ)then
ifts2<'OOlOZZthen
if(tsI=A,10Or)thentsl<=z0000^ts2<=ts2+l;
elsetsl<=tsl+l;
endifJ
elsif(ts2="0010θthen
if(tsl="OOIr)then
tsl<="OoOO";ts2<二"0000";—计数过程
elsetsl<=tsl+l;
endif;
end辻;
endif;
endprocess;--结束进程
PrOCeSS(aclk,reset)
begin
辻(reset=θ,)thenasl<="0000";as2<='OOOOzZ;
elsif(aclk,eventandaclk=,Γ)then
ifas2辻(asl="100Γ)thenasl<=zz0000';as2<=as2+l;
elseasl<=asl+l;
endif;
elsif(as2="0010")then
if(asl=,zOOIr)then
asl<=zzOOOO";as2<=z,0000";—计数过程
elseasl<=asl+l;
endif;
endif;
endif;
endprocess;--结束进程
PrOCeSS(tsl,ts2,asl,as2)—显示时间或闹铃定时值
begin
ifset='O'then―显示时间
OUtl<=tsl;
out2<=ts2;
else―显示定时值
OUtl<=asl;
out2<=as2;
endif;
endprocess;
PrOCeSS(tsl,ts2,asl,as2)—判断定时值与时间值相等,输出闹铃触发信号
begin
辻tsl二"0010〃andts2="0011"then
c<=1,;
elsecU'O';
endif;
iftsl=aslandts2=as2then
alight<=,Γ;
else
alight<≡,O';
endif;
endprocess;
endrunl;
Iibraryieee;—XianShi
USeieee・Std-IOgic_l164・all;
USeieee・std_logic_unsigned.all;
entityXianShiis
POrt(elk:
inStd-IOgiC-VeCtOr(3dourntoO);
Qq:
OUtStd-IOgiC-VeCtOr(6downto0));
end;
architecturerun3OfXianShiis
begin
PrOCeSS(CIk)
begin
CaSeClkis
When"OOOO"=>qqC="IOOOoOO";
When"0001〃二>qq<="1111001";
When"0010"二>qqWhen"0011"=>qqC="OIIooO0";
When"0100"二>qq<="0011001";
When"0101〃二>qq<="0010010";
When"0110"二>qqWhen"0111〃二>qq<="1111000";
When"1000z,=>qq<="0000000zz;
WhenOtherS=>qq<=ZZOOIOOOOZz;
endcase;
endprocess;
end;
libraryieee;—ShiZhOng
USeieee・Std-IOgic_l164・all;
USeieee・Std-IOgiC-UnSigned・all;
entityShiZhOngis
POrt(elk:
inStd-IOgic;--PIN-N2
reset:
instd_logic;—PIN_N25
Set:
inStd-IOgic;--PIN-N26
incl,inc2,inc3:
instd_logic;—PIN.G26,PIN.N23,PDLP23
shi6,shi5,fen4,fen3,miao2,miaol:
OUtStd-IOgiC-VeCtOr(6downto0);
alight,Iightl,Iight2:
oUtStd-IOgiC);--闹铃
end;
architecturerunOfShiZhOngis
SignaIsshi6,sshi5,sfen4,sfen3,SmiaO2,SmiaOI:
Std-IOgiC-VeCtOr(3downto0);
SignaIcl,c2,c3,clkls,clk2ms,ClkIms:
Std-IOgic;
SignaIalightl,alight2,alight3:
Std-IOgiC;
COmPOnentCOUnt60
POrt(elk:
inStd-IOgic;
reset:
inStd-IOgic;
set:
inStd-IOgiC;
inc:
inStd-IOgiC;
outl:
outStd-IOgiC-VeCtOr(3downto0);
out2:
OUtstd_IOgiC-VeCtOr(3downto0);
c:
OUtstd_logic;
alight:
OUtStd-IOgiC);
endCOmPOnent;
COmPOnentCOUnt24
POrt(Clk:
inStd-IOgic;
reset:
inStd-IOgic;
set:
inStd-IOgic;
inc:
instd-logic;
OUt1:
OUtStd-IOgiC-VeCtOr(3downto0);
out2:
OUtStd-IOgiC-VeCtOr(3downto0);
c:
OUtStd-IOgic;
alight:
OUtStd-IOgiC);
endCOmPOnent;
COmPOnentXianShi
POrt(elk:
inStd-IOgiC-VeCtOr(3downtoO);
Qq:
OUtStd-IOgiC-VeCtOr(6downtoO)
);
endCOmPOnent;
begin
PrOCeSS(CIk)
VariableCOUnt1:
integerrangeOto49999999;
begin
if(clk,eventandclk=*Γ)thenCOUnt1:
=COUnt1+1;—在Clk的上升沿计数ifCOUnt1<=24999999thenclkls<=,0,;
elsifCOUntl<=49999999thenclkls<=f;
elseCOUntI:
=0;
end辻;
endif;
endprocess;―产生周期为IS的时钟信号
PrOCeSS(CIk)
VariableCOUnt2:
integerrangeOto99999;
begin
if(elk*eventandclk=*Γ)thenCOUnt2:
=COUnt2+1:
--在Clk的上升沿计数辻COUnt2<=49999thenclk2ms<=:
,O';
elsifCOUnt2<=99999thenclk2ms<=,f;
elseCOUnt2:
=0;
endif;
endif;
endprocess;--产生周期为2ms的时钟信号500HZ
PrOCeSS(CIk)
VariableCOUnt3:
integerrangeOto49999;
begin
if(elk*eventandclk=*Γ)thenCOUnt3:
=COUnt3+1;--在CIk的上升沿计数ifCOUnt3<=24999thenCIkImS<=,O';
elsifCOUnt3<=49999thenCIkImS<=>1,;
elseCOUnt3:
=0;
endif;
endif;
endprocess;—产生周期为ImS的时钟信号IOOOHZ
PrOCeSS(alightl,alight2,alight3)
begin
ifalightl='Γandalight2=,Γandalight3=,Γ
thenalight<=,Γ;
elsealight<=*0,;
endif;
endprocess;
PrOCeSS(Sfen4,Sfen3,SmiaO2,SmiaOl)begin
ifsfen4=zZOlOrandSfen3="10OrthenifSmiaO2=z'0IOIzZthen
ifsmiaol=z,0001,zthen
IightI<=clk2ms;
elsifSmiaOI=ZZOOlIzZthen
IightI<=clk2ms;
elsifSmiaOI=zzOlOlzzthen
IightI<=clk2ms;
elsifSmiaOI=,'0InZZthen
Iightl<=clk2ms;
elsifSmiaOI=ZZIOOIzZthen
Iight2<=clklms;else
IightK=0,;
Iight2<=0,;
map(clkls,reset,set,incl,SmiaO1,SlniaO2fcl,alightl);map(cl,reset,SetJinc2,Sfen3,Sfen4,c2falight2);map(c2,reset,SetJinc3,sshi5,sshi6,c3,alight3);map(smiaol,miaol);
map(smiao2,miao2);
map(sfen3,fen3);
map(sfen4,fen4);
map(sshi5,shi5);
map(sshi6,shi6);
60进制仿真波形
24进制仿真波形
C∙.s¾√A・■•∏J?
€UH>κJCI.ζΛΛ>:
•:
UAtg込s■6.a<4∙'∙v>∙∙^■•勾
5.实验结果及说明
本实验采用VHDL语言描述系统功能,并在QUARTUSIII具软件中进行仿真,下载到EDA实验箱进行验证。
配置文件下载成功后,上电后,秒满59向分进1后又从00开始计数,分满59向小时进1后从00开始计数,小时满24从00开始计数。
按键reset后,计时停止,可以用键key[2hkey[lhkey[0]分别对小时、分、秒进行重新设置时间数码管显示为设置的新时间,再按键reset后,系统就再设置的时间上开始计数。
当时间到59分51、53、55、55、59秒时,输出报时信号。