您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 基于VHDL语言的数字钟设计
1信息与通信工程学院数字电路与逻辑设计实验题目:基于VHDL语言的数字钟设计班级:姓名:学号:日期:指导教师:2一.摘要数字钟是一个将“时”、“分”、“秒”显示于人的视觉器官的计时装置。它的基本功能是计时,计时周期为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来依次使六个数码管亮,数码管每两位对应相应的时分秒;第四部分,其他输入输出单元,比如数字钟的时间修正,闹铃等,这些都是基于前三个部分,做起来难度不大。设计的关键是做好计数器和数码管显示,这是本实验最核心的部分。32.总体设计框图四.使用的硬件清单maxII可编程器件EPM1270T144C5,6个共阴极7段数码管,一个频率为50MHZ的时钟,一个发光二极管,两个按键,4个拨码开关,一个蜂鸣器。控制电路计数器时钟分频器1校时按键译码器数码管蜂鸣器其他拨码开关分频器24五.程序的状态转移图和逻辑流程图状态转移图fixnamenamefixchclarmch24时计数显示校时12时计数屏保闹铃5逻辑流程图是否是否是是否启动计数校时整点响铃1闹钟响铃2显示分频调时定时6六.完整的源程序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的错误),不足是防抖动设计缺少经验。--madebysupperlibraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitymemclockisport(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;architecturebehaveofmemclockissignaltemp:integerrange0to15;signalj:integerrange0to5;signalclk1,clk2:std_logic;7signalminute:integerrange0to59;signalsecond:integerrange0to59;signalhour,hour1:integerrange0to23;signalhour2:integerrange0to11;signalh0,h1,m0,m1,s0,s1:integerrange0to15;signaltmp1:integerrange0to499999999;signaltmp2:integerrange0to999;signalho:integerrange0to23;signalmin:integerrange0to59;beginp0:process(clk)beginif(clk'eventandclk='1')theniftmp1=49999999thentmp1=0;elsetmp1=tmp1+1;endif;if(tmp2=999)thentmp2=0;elsetmp2=tmp2+1;endif;endif;endprocess;p5:process(tmp1)begin8iftmp1=49999999thenclk1='1';elseclk1='0';endif;iftmp2=999thenclk2='1';elseclk2='0';endif;endprocess;p1:process(clk1)beginif(clk1'eventandclk1='1')thenif(last='1')then--backtothetime......if(second=0)thensecond=59;if(minute=0)thenminute=59;hour1=hour1-1;if(hour1=0)thenhour1=23;endif;hour2=hour2-1;9if(hour2=0)thenhour2=11;endif;elseminute=minute-1;endif;elsesecond=second-1;endif;elseif(second=59)then--normaltimerulessecond=0;if(minute=59)thenminute=0;hour1=hour1+1;if(hour1=23)thenhour1=0;endif;hour2=hour2+1;if(hour2=11)thenhour2=0;endif;elseminute=minute+1;endif;elsesecond=second+1;endif;10endif;if(change='1')then--12/24stylechangeif(hour2=23andminute=59andsecond=59)thenhour=0;elsehour=hour2;endif;if(hour111)thenld0='1';elseld0='0';endif;ElseIf(hour1=23andminute=59andsecond)thenhour1=0;elsehour=hour1;endif;ld0='0';endif;if(alarm='0')then--alarmclockif(mfix='1')then--minutechangeif(minute=59)thenminute=0;else11minute=minute+1;endif;endif;if(hfix='1')then--hourchangeif(hour1=23)thenhour1=0;elsehour1=hour1+1;endif;if(hour2=11)thenhour2=0;elsehour2=hour2+1;endif;endif;elseif(mfix='1')then--alarmminchangeif(min=59)thenmin=0;elsemin=min+1;endif;endif;if(hfix='1')then--alarmhochangeif(ho=23)thenho=0;12elseho=ho+1;endif;endif;endif;if(minute=0andsecond3)then--righttimeringspk='1';elsif(minute=minandhour=hoandsecond5)then--alarmclockif(alarm='1')thenspk='0';elsif(alarm='0')thenspk='1';endif;elsespk='0';endif;endif;endprocess;p2:process(clk2)--encoderbeginif(clk2'eventandclk2='1')then13if(j=5)thenj=0;elsej=j+1;endif;if(alarm='0'andname='0')then--showalarmtimeh0=(hour-h1)/10;H1=hourrem10;M0=(minute-m1)/10;M1=minuterem10;S0=(second-s1)/10;S1=secondrem10;elsif(alarm='1'andname='0')thenh0=(ho-h1)/10;H1=horem10;M0=(min-m1)/10;M1=minrem10;S0=0;S1=0;elsif(name='1')thenh0=10;h1=11;m0=12;m1=13;s0=14;s1=15;endif;14casejiswhen1=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;CasetempisWhen0=light=1111110;--'0'When1=light=0110000;--'1'When2=light=1101101;--'2When3=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;15endif;endprocess;endbehave;--madebyliaoning七.时序仿真波形图仿真的部分,之前已经说过,计数器和数码管显示是本实验核心的部分,所以将这两部分做下仿真,仿真得到预期的效果,再加入分频器下载到实验板上进行调试,之后再加入其他输入输出的功能。计数器仿真:观察时分秒的进制是否正确。16数码管仿真:观察数码管的显示是否正确。八.故障和故障分析故障1:验收时出现的bug,在11:59:59跳到00:00:00时会先显示11::00:00再显示00:00:00。解决办法:由于时的跳变比分秒慢一个时钟沿,导致这样的错误。用补丁的办法解决,即我承认计数的标准算法
本文标题:基于VHDL语言的数字钟设计
链接地址:https://www.777doc.com/doc-2405485 .html