基于VHDL语言的数字钟设计.docx
- 文档编号:12752773
- 上传时间:2023-04-21
- 格式:DOCX
- 页数:14
- 大小:49.09KB
基于VHDL语言的数字钟设计.docx
《基于VHDL语言的数字钟设计.docx》由会员分享,可在线阅读,更多相关《基于VHDL语言的数字钟设计.docx(14页珍藏版)》请在冰豆网上搜索。
基于VHDL语言的数字钟设计
信息与通信工程学院
数字电路与逻辑设计
实验题目:
基于VHDL语言的数字钟设计
班级:
姓名:
学号:
日期:
指导教师:
一.摘要
数字钟是一个将“时”、“分”、“秒”显示于人的视觉器官的计时装置。
它的基本功能是计时,计时周期为24小时,显示满刻度23时59分59秒;或者计时周期为12小时并配有上下午指示,显示满刻度为11时59分59秒,通过六个七段数码管显示出来。
本实验主要在理论分析和具体的软硬件实现上,基于VHDL语言编写源代码,使用软件QuartusII进行处理,再配合具体电路连接,实现一个多功能的数字钟。
关键词:
数字钟;VHDL语言;七段数码管
二.设计任务要求
设计实现一个数字钟。
1.24小时制,显示刻度从0:
0:
0到23:
59:
59。
2.12小时制,显示刻度从0:
0:
0到11:
59:
59。
3.12/24小时制可切换,12小时制下上下午有不同显示(上午发光二极管不亮,
下午发光二极管亮)。
4.可手动校对时间,能对时和分进行校正。
5.整点报时功能。
6.闹铃功能,可设置闹铃时间,当计时到预定时间时,蜂鸣器发出闹铃信号,
闹铃时间为5秒,可提前终止闹铃。
7.可认为设置时间为倒计时模式
8.可切到屏保模式,六个数码管显示为“supper”字样。
三.设计思路和总体设计框图
1.设计思路
程序设计主要分为四个模块,第一部分,做分频器,分出一秒的时钟用来计数,再分出一个中频时钟用来扫描显示数码管,我选择的频率是50kHZ;第二部分,做计数器,秒随时钟沿计数进1,分钟随着秒计数60次进一,而小时,由于有12/24小时制的切换,时的计数有两个信号来进行,一个信号hour1是分60进一在0到23循环计数,另一个信号hour2是分60进一在0到11循环计数;第三部分,做扫描显示六个七段数码管,通过选通信号6矢量cat来依次使六个数码管亮,数码管每两位对应相应的时分秒;第四部分,其他输入输出单元,比如数字钟的时间修正,闹铃等,这些都是基于前三个部分,做起来难度不大。
设计的关键是做好计数器和数码管显示,这是本实验最核心的部分。
2.总体设计框图
四.使用的硬件清单
maxII可编程器件EPM1270T144C5,6个共阴极7段数码管,一个频率为50MHZ的时钟,一个发光二极管,两个按键,4个拨码开关,一个蜂鸣器。
五.程序的状态转移图和逻辑流程图
状态转移图
fix
namename
fix
ch
clarm
ch
逻辑流程图
是
否
是
否
是是
否
六.完整的源程序
6数码管显示时钟,带调时功能,能设置闹钟,闹钟响可人为停止,整点报时,12/24小时制手动切换,可人为设置时间为倒计时,并修正了一个11:
59:
59(或23:
59:
59)跳变到00:
00:
00的bug(即11:
59:
59跳变到00:
00:
00时会先跳到11:
00:
00再跳到00:
00:
00的错误),不足是防抖动设计缺少经验。
--madebysupper
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitymemclockis
port(
clk:
instd_logic;
mfix,hfix:
instd_logic;
change:
instd_logic;
last:
instd_logic;
ld0:
outstd_logic;
name:
instd_logic;
alarm:
instd_logic;
cat:
outstd_logic_vector(5downto0);
spk:
outstd_logic;
light:
outstd_logic_vector(6downto0));
endmemclock;
architecturebehaveofmemclockis
signaltemp:
integerrange0to15;
signalj:
integerrange0to5;
signalclk1,clk2:
std_logic;
signalminute:
integerrange0to59;
signalsecond:
integerrange0to59;
signalhour,hour1:
integerrange0to23;
signalhour2:
integerrange0to11;
signalh0,h1,m0,m1,s0,s1:
integerrange0to15;
signaltmp2:
integerrange0to999;
signalho:
integerrange0to23;
signalmin:
integerrange0to59;
begin
p0:
process(clk)
begin
if(clk'eventandclk='1')then
tmp1<=0;
else
tmp1<=tmp1+1;
endif;
if(tmp2=999)then
tmp2<=0;
else
tmp2<=tmp2+1;
endif;
endif;
endprocess;
p5:
process(tmp1)
begin
clk1<='1';
else
clk1<='0';
endif;
iftmp2=999then
clk2<='1';
else
clk2<='0';
endif;
endprocess;
p1:
process(clk1)
begin
if(clk1'eventandclk1='1')then
if(last='1')then--backtothetime......
if(second=0)then
second<=59;
if(minute=0)then
minute<=59;
hour1<=hour1-1;
if(hour1=0)then
hour1<=23;
endif;
hour2<=hour2-1;
if(hour2=0)then
hour2<=11;
endif;
else
minute<=minute-1;
endif;
else
second<=second-1;
endif;
else
if(second=59)then--normaltimerules
second<=0;
if(minute=59)then
minute<=0;
hour1<=hour1+1;
if(hour1=23)then
hour1<=0;
endif;
hour2<=hour2+1;
if(hour2=11)then
hour2<=0;
endif;
else
minute<=minute+1;
endif;
else
second<=second+1;
endif;
endif;
if(change='1')then--12/24stylechange
if(hour2=23andminute=59andsecond=59)then
hour<=0;
else
hour<=hour2;
endif;
if(hour1>11)then
ld0<='1';
else
ld0<='0';
endif;
Else
If(hour1=23andminute=59andsecond)then
hour1<=0;
else
hour<=hour1;
endif;
ld0<='0';
endif;
if(alarm='0')then--alarmclock
if(mfix='1')then--minutechange
if(minute=59)then
minute<=0;
else
minute<=minute+1;
endif;
endif;
if(hfix='1')then--hourchange
if(hour1=23)then
hour1<=0;
else
hour1<=hour1+1;
endif;
if(hour2=11)then
hour2<=0;
else
hour2<=hour2+1;
endif;
endif;
else
if(mfix='1')then--alarmminchange
if(min=59)then
min<=0;
else
min<=min+1;
endif;
endif;
if(hfix='1')then--alarmhochange
if(ho=23)then
ho<=0;
else
ho<=ho+1;
endif;
endif;
endif;
if(minute=0andsecond<3)then--righttimering
spk<='1';
elsif(minute=minandhour=hoandsecond<5)then--alarmclock
if(alarm='1')then
spk<='0';
elsif(alarm='0')then
spk<='1';
endif;
else
spk<='0';
endif;
endif;
endprocess;
p2:
process(clk2)--encoder
begin
if(clk2'eventandclk2='1')then
if(j=5)then
j<=0;
else
j<=j+1;
endif;
if(alarm='0'andname='0')then--showalarmtime
h0<=(hour-h1)/10;
H1<=hourrem10;
M0<=(minute-m1)/10;
M1<=minuterem10;
S0<=(second-s1)/10;
S1<=secondrem10;
elsif(alarm='1'andname='0')then
h0<=(ho-h1)/10;
H1<=horem10;
M0<=(min-m1)/10;
M1<=minrem10;
S0<=0;
S1<=0;
elsif(name<='1')then
h0<=10;
h1<=11;
m0<=12;
m1<=13;
s0<=14;
s1<=15;
endif;
casejis
when1=>cat<="011111";temp<=h1;
when2=>cat<="101111";temp<=m0;
when3=>cat<="110111";temp<=m1;
when4=>cat<="111011";temp<=s0;
when5=>cat<="111101";temp<=s1;
when0=>cat<="111110";temp<=h0;
endcase;
Casetempis
When0=>light<="1111110";--'0'
When1=>light<="0110000";--'1'
When2=>light<="1101101";--'2
When3=>light<="1111001";--'3'
When4=>light<="0110011";--'4'
When5=>light<="1011011";--'5'
When6=>light<="1011111";--'6'
When7=>light<="1110000";--'7'
When8=>light<="1111111";--'8'
When9=>light<="1110011";--'9'
when10=>light<="1011011";
when11=>light<="0111110";
when12=>light<="1100111";
when13=>light<="1100111";
when14=>light<="1001111";
when15=>light<="1110111";
whenothers=>light<="0000000";
Endcase;
endif;
endprocess;
endbehave;
--madebyliaoning
七.时序仿真波形图
仿真的部分,之前已经说过,计数器和数码管显示是本实验核心的部分,所以将这两部分做下仿真,仿真得到预期的效果,再加入分频器下载到实验板上进行调试,之后再加入其他输入输出的功能。
计数器仿真:
观察时分秒的进制是否正确。
数码管仿真:
观察数码管的显示是否正确。
八.故障和故障分析
故障1:
验收时出现的bug,在11:
59:
59跳到00:
00:
00时会先显示11:
:
00:
00再显示00:
00:
00。
解决办法:
由于时的跳变比分秒慢一个时钟沿,导致这样的错误。
用补丁的办法解决,即我承认计数的标准算法在这个时刻是有漏洞的,那么我在算法外附加一个条件使它能弥补这一漏洞。
在计数结束后,加一个判断条件,假如在时钟沿来临时计数值是11,59,59,那么直接将计数值都归零,这样就可以很好的解决这个bug。
故障2:
数码管显示闪烁太快,看不清显示的数值。
解决办法:
这是分频的问题,闪烁太快说明频率太高,应增大分频系数。
故障3:
数码管显示秒是每次跳两秒,而不是跳1秒。
解决办法:
计数算法没有问题,数码管显示模块有时钟沿的冲突导致,可通过修改数码管扫描的分频来解决,需要仔细的调试。
九.实验心得与总结
在这次数字系统综合实验中,我设计并实现了数字钟这一课题,在基本功能的基础上增添了一些有意思的附加功能,在出现bug后也迅速的找到了解决的办法,从这方面上说,这次实验我还是做的不错的。
同时,反思这次实验中出现的问题,还是暴露了自己各方面的问题:
1.仿真做的不是太好,对仿真的理解不深,说明自己在仿真上的经验还是不够。
2.编程语言的理解不深,在编程过程中多次因为琐碎的语法问题耽误了很多宝贵的实验时间。
3.没有充分面向硬件进行设计,占用资源过多。
4.按键的防抖设计没有做充分的评估,导致验收时的操作并不尽如人意。
以上的问题,都是我宝贵的收获,是我必须深刻总结并且在以后的学习实验中厄待解决的,只有这样,我才能有不断的进步。
十.致谢
在这次数字系统综合实验中,实验老师张咏梅老师给予了我无私而切实有效的帮助,其严谨的态度、严格的要求以及强烈的专业素养都对我有十分深刻的影响,在此,对张咏梅老师表示衷心的感谢。
同时,也希望张咏梅老师在教学方式上有更温和的理解,毕竟不是每个学生都能体会到老师您的严格要求和热切期望,谨期盼老师您能够理解。
另外,各位同学在本次实验中给予我的帮助,特别是一些萍水相逢的同学,他们的无私和热忱让我十分感激,在此,对他们一并表示由衷的感谢。
十一.参考文献
《现代数字电路与逻辑设计实验教程》袁东明史晓东陈凌霄编着
北京邮电大学出版社
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 VHDL 语言 数字 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)