数字钟VHDL程序.docx

上传人:b****8 文档编号:8928507 上传时间:2023-02-02 格式:DOCX 页数:16 大小:538.23KB
下载 相关 举报
数字钟VHDL程序.docx_第1页
第1页 / 共16页
数字钟VHDL程序.docx_第2页
第2页 / 共16页
数字钟VHDL程序.docx_第3页
第3页 / 共16页
数字钟VHDL程序.docx_第4页
第4页 / 共16页
数字钟VHDL程序.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

数字钟VHDL程序.docx

《数字钟VHDL程序.docx》由会员分享,可在线阅读,更多相关《数字钟VHDL程序.docx(16页珍藏版)》请在冰豆网上搜索。

数字钟VHDL程序.docx

数字钟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秒时,输出报时信号。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1