信息与通信工程学院数字电路与逻辑设计实验题目:基于VHDL语言的数字钟设计班级:姓名:学号:日期:指导教师:1一.摘要数字钟是一个将“时”、“分”、“秒”显示于人的视觉器官的计时装置。
它的基本功能是计时,计时周期为24小时,显示满刻度23时59分59秒;或者计时周期为12小时并配有上下午指示,显示满刻度为11时59分59秒,通过六个七段数码管显示出来。
本实验主要在理论分析和具体的软硬件实现上,基于VHDL语言编写源代码,使用软件Quartus II 进行处理,再配合具体电路连接,实现一个多功能的数字钟。
关键词:数字钟;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来依次使六个数码管亮,数码管每两位对应相应的时分秒;第四部分,其他输入输出单元,比如数字钟的时间修正,闹铃等,这些都是基于前三个部分,做起来难度不大。
设计的关键是做好计数器和数码管显示,这是本实验最核心的部分。
22.总体设计框图四.使用的硬件清单maxII可编程器件EPM1270T144C5,6个共阴极7段数码管,一个频率为50MHZ的时钟,一个发光二极管,两个按键,4个拨码开关,一个蜂鸣器。
3五.程序的状态转移图和逻辑流程图状态转移图45逻辑流程图是是 是六.完整的源程序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的错误),不足是防抖动设计缺少经验。
--made by supperlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity memclock isport(clk:in std_logic;mfix,hfix:in std_logic;change:in std_logic;last:in std_logic;ld0:out std_logic;name :in std_logic;alarm:in std_logic;cat:out std_logic_vector(5 downto 0);spk:out std_logic;light:out std_logic_vector(6 downto 0));end memclock;architecture behave of memclock issignal temp:integer range 0 to 15;signal j:integer range 0 to 5;signal clk1,clk2:std_logic;6signal minute:integer range 0 to 59;signal second:integer range 0 to 59;signal hour,hour1:integer range 0 to 23;signal hour2:integer range 0 to 11;signal h0,h1,m0,m1,s0,s1:integer range 0 to 15;signal tmp1:integer range 0 to 499999999;signal tmp2:integer range 0 to 999;signal ho:integer range 0 to 23;signal min:integer range 0 to 59;beginp0:process(clk)beginif(clk'event and clk='1')thenif tmp1=49999999 thentmp1<=0;elsetmp1<=tmp1+1;end if;if(tmp2=999) thentmp2<=0;elsetmp2<=tmp2+1;end if;end if;end process;p5:process(tmp1)begin7if tmp1=49999999 thenclk1<='1';elseclk1<='0';end if;if tmp2=999 thenclk2<='1';elseclk2<='0';end if;end process;p1:process(clk1)beginif(clk1'event and clk1='1') thenif(last='1') then--back to the time ......if (second=0) thensecond<=59;if(minute=0) thenminute<=59;hour1<=hour1-1;if(hour1=0) thenhour1<=23;end if;hour2<=hour2-1;8if(hour2=0) thenhour2<=11;end if;elseminute<=minute-1;end if;elsesecond<=second-1;end if;elseif (second=59) then--normal time rulessecond<=0;if(minute=59) thenminute<=0;hour1<=hour1+1;if(hour1=23) thenhour1<=0;end if;hour2<=hour2+1;if(hour2=11) thenhour2<=0;end if;elseminute<=minute+1;end if;elsesecond<=second+1;end if;9end if;if(change='1')then--12/24 style changeif (hour2=23 and minute=59 and second=59) thenhour<=0;elsehour<=hour2;end if;if(hour1>11) thenld0<='1';elseld0<='0';end if;ElseIf (hour1=23 and minute=59 and second) thenhour1<=0;elsehour<=hour1;end if;ld0<='0';end if;if(alarm='0') then--alarm clockif(mfix ='1') then--minute changeif(minute=59) thenminute<=0;else10minute<=minute+1;end if;end if;if(hfix='1') then--hour changeif(hour1=23) thenhour1<=0;elsehour1<=hour1+1;end if;if(hour2=11)thenhour2<=0;elsehour2<=hour2+1;end if;end if;elseif(mfix ='1') then--alarm min change if(min=59) thenmin<=0;elsemin<=min+1;end if;end if;if(hfix='1') then--alarm ho changeif(ho=23) thenho<=0;elseho<=ho+1;end if;end if;end if;if(minute=0 and second<3) then--right time ringspk<='1';elsif(minute=min and hour=ho and second <5) then--alarm clock if(alarm='1') thenspk<='0';elsif(alarm='0')thenspk<='1';end if;elsespk<='0';end if;end if;end process;p2:process(clk2)--encoderbeginif(clk2'event and clk2='1') thenif(j=5) thenj<=0;elsej<=j+1;end if;if(alarm='0' and name='0') then--show alarm time h0<=(hour-h1)/10;H1<=hour rem 10;M0<=(minute-m1)/10;M1<=minute rem 10;S0<=(second-s1)/10;S1<=second rem 10;elsif(alarm='1'and name='0') thenh0<=(ho-h1)/10;H1<=ho rem 10;M0<=(min-m1)/10;M1<=min rem 10;S0<=0;S1<=0;elsif(name<='1') thenh0<=10;h1<=11;m0<=12;m1<=13;s0<=14;s1<=15;end if;case j iswhen 1=>cat<="011111";temp<=h1; when 2=>cat<="101111";temp<=m0; when 3=>cat<="110111";temp<=m1; when 4=>cat<="111011";temp<=s0; when 5=>cat<="111101";temp<=s1; when 0=>cat<="111110";temp<=h0;end case;Case temp isWhen 0=>light<="1111110";--'0' When 1=>light<="0110000";--'1' When 2=>light<="1101101";--'2 When 3=>light<="1111001";--'3' When 4=>light<="0110011";--'4' When 5=>light<="1011011";--'5' When 6=>light<="1011111";--'6' When 7=>light<="1110000";--'7' When 8=>light<="1111111";--'8' When 9=>light<="1110011";--'9' when 10=>light<="1011011";when 11=>light<="0111110";when 12=>light<="1100111";when 13=>light<="1100111";when 14=>light<="1001111";when 15=>light<="1110111";when others =>light<="0000000"; End case;end if;end process;end behave;--made by liaoning七.时序仿真波形图仿真的部分,之前已经说过,计数器和数码管显示是本实验核心的部分,所以将这两部分做下仿真,仿真得到预期的效果,再加入分频器下载到实验板上进行调试,之后再加入其他输入输出的功能。