基于VHDL语言的数字钟设计Word文档下载推荐.docx

上传人:b****2 文档编号:3400990 上传时间:2023-05-01 格式:DOCX 页数:14 大小:49.09KB
下载 相关 举报
基于VHDL语言的数字钟设计Word文档下载推荐.docx_第1页
第1页 / 共14页
基于VHDL语言的数字钟设计Word文档下载推荐.docx_第2页
第2页 / 共14页
基于VHDL语言的数字钟设计Word文档下载推荐.docx_第3页
第3页 / 共14页
基于VHDL语言的数字钟设计Word文档下载推荐.docx_第4页
第4页 / 共14页
基于VHDL语言的数字钟设计Word文档下载推荐.docx_第5页
第5页 / 共14页
基于VHDL语言的数字钟设计Word文档下载推荐.docx_第6页
第6页 / 共14页
基于VHDL语言的数字钟设计Word文档下载推荐.docx_第7页
第7页 / 共14页
基于VHDL语言的数字钟设计Word文档下载推荐.docx_第8页
第8页 / 共14页
基于VHDL语言的数字钟设计Word文档下载推荐.docx_第9页
第9页 / 共14页
基于VHDL语言的数字钟设计Word文档下载推荐.docx_第10页
第10页 / 共14页
基于VHDL语言的数字钟设计Word文档下载推荐.docx_第11页
第11页 / 共14页
基于VHDL语言的数字钟设计Word文档下载推荐.docx_第12页
第12页 / 共14页
基于VHDL语言的数字钟设计Word文档下载推荐.docx_第13页
第13页 / 共14页
基于VHDL语言的数字钟设计Word文档下载推荐.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基于VHDL语言的数字钟设计Word文档下载推荐.docx

《基于VHDL语言的数字钟设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于VHDL语言的数字钟设计Word文档下载推荐.docx(14页珍藏版)》请在冰点文库上搜索。

基于VHDL语言的数字钟设计Word文档下载推荐.docx

闹铃时间为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

逻辑流程图

是是

六.完整的源程序

6数码管显示时钟,带调时功能,能设置闹钟,闹钟响可人为停止,整点报时,12/24小时制手动切换,可人为设置时间为倒计时,并修正了一个11:

59(或23:

59)跳变到00:

00:

00的bug(即11:

59跳变到00:

00时会先跳到11:

00再跳到00:

00的错误),不足是防抖动设计缺少经验。

--madebysupper

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitymemclockis

port(

clk:

instd_logic;

mfix,hfix:

change:

last:

ld0:

outstd_logic;

name:

alarm:

cat:

outstd_logic_vector(5downto0);

spk:

light:

outstd_logic_vector(6downto0));

endmemclock;

architecturebehaveofmemclockis

signaltemp:

integerrange0to15;

signalj:

integerrange0to5;

signalclk1,clk2:

std_logic;

signalminute:

integerrange0to59;

signalsecond:

signalhour,hour1:

integerrange0to23;

signalhour2:

integerrange0to11;

signalh0,h1,m0,m1,s0,s1:

signaltmp2:

integerrange0to999;

signalho:

signalmin:

begin

p0:

process(clk)

if(clk'

eventandclk='

1'

)then

tmp1<

=0;

else

=tmp1+1;

endif;

if(tmp2=999)then

tmp2<

=tmp2+1;

endprocess;

p5:

process(tmp1)

clk1<

='

;

0'

iftmp2=999then

clk2<

p1:

process(clk1)

if(clk1'

eventandclk1='

if(last='

)then--backtothetime......

if(second=0)then

second<

=59;

if(minute=0)then

minute<

hour1<

=hour1-1;

if(hour1=0)then

=23;

hour2<

=hour2-1;

if(hour2=0)then

=11;

=minute-1;

=second-1;

if(second=59)then--normaltimerules

if(minute=59)then

=hour1+1;

if(hour1=23)then

=hour2+1;

if(hour2=11)then

=minute+1;

=second+1;

if(change='

)then--12/24stylechange

if(hour2=23andminute=59andsecond=59)then

hour<

=hour2;

if(hour1>

11)then

ld0<

Else

If(hour1=23andminute=59andsecond)then

=hour1;

if(alarm='

)then--alarmclock

if(mfix='

)then--minutechange

if(hfix='

)then--hourchange

)then--alarmminchange

if(min=59)then

min<

=min+1;

)then--alarmhochange

if(ho=23)then

ho<

=ho+1;

if(minute=0andsecond<

3)then--righttimering

spk<

elsif(minute=minandhour=hoandsecond<

5)then--alarmclock

elsif(alarm='

p2:

process(clk2)--encoder

if(clk2'

eventandclk2='

if(j=5)then

j<

=j+1;

andname='

)then--showalarmtime

h0<

=(hour-h1)/10;

H1<

=hourrem10;

M0<

=(minute-m1)/10;

M1<

=minuterem10;

S0<

=(second-s1)/10;

S1<

=secondrem10;

=(ho-h1)/10;

=horem10;

=(min-m1)/10;

=minrem10;

elsif(name<

=10;

h1<

m0<

=12;

m1<

=13;

s0<

=14;

s1<

=15;

casejis

when1=>

cat<

="

011111"

temp<

=h1;

when2=>

101111"

=m0;

when3=>

110111"

=m1;

when4=>

111011"

=s0;

when5=>

111101"

=s1;

when0=>

111110"

=h0;

endcase;

Casetempis

When0=>

light<

1111110"

--'

When1=>

0110000"

When2=>

1101101"

2

When3=>

1111001"

3'

When4=>

0110011"

4'

When5=>

1011011"

5'

When6=>

1011111"

6'

When7=>

1110000"

7'

When8=>

1111111"

8'

When9=>

1110011"

9'

when10=>

when11=>

0111110"

when12=>

1100111"

when13=>

when14=>

1001111"

when15=>

1110111"

whenothers=>

0000000"

Endcase;

endbehave;

--madebyliaoning

七.时序仿真波形图

仿真的部分,之前已经说过,计数器和数码管显示是本实验核心的部分,所以将这两部分做下仿真,仿真得到预期的效果,再加入分频器下载到实验板上进行调试,之后再加入其他输入输出的功能。

计数器仿真:

观察时分秒的进制是否正确。

数码管仿真:

观察数码管的显示是否正确。

八.故障和故障分析

故障1:

验收时出现的bug,在11:

59跳到00:

00时会先显示11:

:

00再显示00:

00。

解决办法:

由于时的跳变比分秒慢一个时钟沿,导致这样的错误。

用补丁的办法解决,即我承认计数的标准算法在这个时刻是有漏洞的,那么我在算法外附加一个条件使它能弥补这一漏洞。

在计数结束后,加一个判断条件,假如在时钟沿来临时计数值是11,59,59,那么直接将计数值都归零,这样就可以很好的解决这个bug。

故障2:

数码管显示闪烁太快,看不清显示的数值。

这是分频的问题,闪烁太快说明频率太高,应增大分频系数。

故障3:

数码管显示秒是每次跳两秒,而不是跳1秒。

计数算法没有问题,数码管显示模块有时钟沿的冲突导致,可通过修改数码管扫描的分频来解决,需要仔细的调试。

九.实验心得与总结

在这次数字系统综合实验中,我设计并实现了数字钟这一课题,在基本功能的基础上增添了一些有意思的附加功能,在出现bug后也迅速的找到了解决的办法,从这方面上说,这次实验我还是做的不错的。

同时,反思这次实验中出现的问题,还是暴露了自己各方面的问题:

1.仿真做的不是太好,对仿真的理解不深,说明自己在仿真上的经验还是不够。

2.编程语言的理解不深,在编程过程中多次因为琐碎的语法问题耽误了很多宝贵的实验时间。

3.没有充分面向硬件进行设计,占用资源过多。

4.按键的防抖设计没有做充分的评估,导致验收时的操作并不尽如人意。

以上的问题,都是我宝贵的收获,是我必须深刻总结并且在以后的学习实验中厄待解决的,只有这样,我才能有不断的进步。

十.致谢

在这次数字系统综合实验中,实验老师张咏梅老师给予了我无私而切实有效的帮助,其严谨的态度、严格的要求以及强烈的专业素养都对我有十分深刻的影响,在此,对张咏梅老师表示衷心的感谢。

同时,也希望张咏梅老师在教学方式上有更温和的理解,毕竟不是每个学生都能体会到老师您的严格要求和热切期望,谨期盼老师您能够理解。

另外,各位同学在本次实验中给予我的帮助,特别是一些萍水相逢的同学,他们的无私和热忱让我十分感激,在此,对他们一并表示由衷的感谢。

十一.参考文献

《现代数字电路与逻辑设计实验教程》袁东明史晓东陈凌霄编着

北京邮电大学出版社

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

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

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2