数字钟VHDL程序.docx
- 文档编号:8928507
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:16
- 大小:538.23KB
数字钟VHDL程序.docx
《数字钟VHDL程序.docx》由会员分享,可在线阅读,更多相关《数字钟VHDL程序.docx(16页珍藏版)》请在冰豆网上搜索。
数字钟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"二>qq When"0011"=>qqC="OIIooO0"; When"0100"二>qq<="0011001"; When"0101〃二>qq<="0010010"; When"0110"二>qq When"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秒时,输出报时信号。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字 VHDL 程序
![提示](https://static.bdocx.com/images/bang_tan.gif)