多功能数字钟设计说明:1.系统顶层框图:各模块电路功能如下:1.秒计数器、分计数器、时计数器组成最基本的数字钟,其计数输出送7段译码电路由数码管显示。2.基准频率分频器可分频出标准的1HZ频率信号,用于秒计数的时钟信号;分频出4HZ频率信号,用于校时、校分的快速递增信号;分频出64HZ频率信号,用于对按动“校时”,“校分”按键的消除抖动。2.多功能数字钟结构框图:一、系统功能概述已完成功能1.完成时/分/秒的依次显示并正确计数,利用六位数码管显示;2.时/分/秒各段个位满10正确进位,秒/分能做到满60向前进位,有系统时间清零功能;3.定时器:实现整点报时,通过扬声器发出高低报时声音;4.时间设置,也就是手动调时功能:当认为时钟不准确时,可以分别对分/时钟进行调整;5.闹钟:实现分/时闹钟设置,在时钟到达设定时间时通过扬声器响铃。有静音模式。待改进功能:1.系统没有万年历功能,正在思考设计方法。2.应添加秒表功能。二、系统组成以及系统各部分的设计1.时计数模块时计数模块就是一个2位10进制计数器,记数到23清零。VHDL的RTL描述如下:----cnt_h.vhdlibraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitycnt_hisport(en,clk,clr:instd_logic;dout:outstd_logic_vector(7downto0);c:outstd_logic);endcnt_h;architecturertlofcnt_hissignalt:std_logic_vector(7downto0);beginprocess(en,clk,clr)variablet:std_logic_vector(7downto0);beginifen='1'then--异步使能ifclk'eventandclk='1'thent:=t+1;ift(3downto0)=XAthen--个位等于10则十位加1t(7downto4):=t(7downto4)+1;t(3downto0):=X0;--个位清零endif;iftX23then--大于23清零t:=X00;endif;endif;ifclr='1'then--异步清零t:=X00;endif;endif;dout=t;endprocess;endrtl;时计数器模块仿真波形如下从仿真波形可知,当计数到23时,下一个时钟上升沿到来时就清零了,符合设计要求。时计数模块框图如下2.分及秒计数模块分及秒计数模块也是一个2位10进制计数器,记数到59清零。VHDL的RTL描述如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitycnt_sisport(en,clk,clr:instd_logic;dout:bufferstd_logic_vector(7downto0);c:outstd_logic);endcnt_s;architecturertlofcnt_sisbeginprocess(en,clk,clr)beginifen='1'thenifclr='1'then--异步清零dout=X00;elsifclk'eventandclk='1'thenifdout(3downto0)9thendout(3downto0)=dout(3downto0)+1;c='0';elsifdout(7downto4)5thendout(3downto0)=X0;dout(7downto4)=dout(7downto4)+1;elsedout=X00;c='1';endif;endif;elsedout=ZZZZZZZZ;endif;endprocess;endrtl;分和秒计数器模块仿真波形如下从仿真波形可知,当计数到59时,下一个时钟上升沿到来时就清零了,并且产生进位信号,符合设计要求。分和秒计数模块框图如下3.按键消抖动模块按键消抖动有很多方案,这里选择的是计数消抖,即只当有效电平到来后开始计数,当计数值大于一定值后再输出该有效电平,否则不输出,从而达到消抖目的。VHDL的RTL描述如下:libraryieee;useieee.std_logic_1164.all;entityhaoinisport(din,clk:instd_logic;dout:outstd_logic);endhaoin;architecturertlofhaoinisbeginprocess(din)variablet:integerrange0to63:=0;beginifdin='1'thenifclk'eventandclk='1'thent:=t+1;ift10thendout='1';t:=t-1;elsedout='0';endif;endif;elsedout='0';t:=0;endif;endprocess;endrtl;libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityringisport(clk:instd_logic;clk500:instd_logic;clk1k:instd_logic;beep:outstd_logic);endring;architecturertlofringisbeginprocess(clk)variablet:std_logic;variablen:integerrange0to15:=0;beginifclk'eventandclk='1'thent:=nott;n:=n+1;endif;ift='1'andn11thenbeep=clk500;elsifn=11thenbeep=clk1k;elsebeep='Z';endif;endprocess;endrtl;libraryIEEE;useIEEE.std_logic_1164.all;useIEEE.std_logic_arith.all;useIEEE.std_logic_unsigned.all;entityclockisport(SA:instd_logic;SB:instd_logic;SC:instd_logic;SD:instd_logic;clk1:instd_logic;dout:bufferstd_logic_vector(23downto0);--seg_data:outstd_logic_vector(7downto0);--seg_com:outstd_logic_vector(3downto0);beep:outstd_logic--led:outstd_logic_vector(3downto0));endentityclock;architecturertlofclockiscomponentcnt_sisport(en,clk,clr:instd_logic;dout:bufferstd_logic_vector(7downto0);c:outstd_logic);endcomponent;componentcnt_hisport(en,clk,clr:instd_logic;dout:bufferstd_logic_vector(7downto0));endcomponent;--componentsegmainis--port(clk,reset_n:instd_logic;--datain:instd_logic_vector(15downto0);--seg_data:outstd_logic_vector(7downto0);--seg_com:outstd_logic_vector(3downto0));--endcomponent;--componentringis--port(en:instd_logic;--clk:instd_logic;--clk500:instd_logic;--clk1k:instd_logic;--beep:outstd_logic);--endcomponent;componenthaoinisport(din,clk:instd_logic;dout:outstd_logic);endcomponent;componentnaolingisport(h,m:instd_logic_vector(7downto0);clk4hzh,clk4hzm:instd_logic;sys_en,sys_rst:instd_logic;h_o,m_o:outstd_logic_vector(7downto0);beep:outstd_logic);endcomponent;signalreg_h:std_logic_vector(7downto0);signalreg_m:std_logic_vector(7downto0);signalreg_s:std_logic_vector(7downto0);signalreg_m_s:std_logic_vector(7downto0):=X59;signalreg_m_m:std_logic_vector(7downto0):=X59;signalreg_m_h:std_logic_vector(7downto0):=X59;signalclk_h:std_logic;signalclk_m:std_logic;signalclk_s:std_logic;signalc_s:std_logic;signalc_m:std_logic;signalc_h:std_logic;signalsys_clk1:std_logic;signalsys_clk4:std_logic;signalsys_clk64:std_logic;signalsys_clk500:std_logic;signalsys_clk1k:std_logic;signalclki:integer:=750000;signalsys_rst:std_logic:='0';signalsys_en:std_logic:='1';signalclk_ring,mh:std_logic;signalSAc,SBc,SCc,SDc:std_logic;signalen_r:std_logic;signalNL_reg_h,NL_reg_m:std_logic_vector(7downto0);signalNL_ring:std_logic;signalsys_clk4_NL_h,sys_clk4_NL_m:std_logic;beginh:cnt_hportmap(en=sys_en,clk=clk_h,clr=sys_rst,dout=reg_h);m:cnt_sportmap(en=sys_en,clk=clk_m,clr=sys_rst,dout=reg_m,c=c_m);s:cnt_sportmap(en=sys_en,clk=sys_clk1,clr=SCc,dout=reg_s,c=c_s);--sled:segmainportmap(clk=clk1,reset_n=SCc,seg_data=seg_data,seg_com=seg_com,datain=dout(15downto0));--ring0:ringportmap(en=en_r,clk=clk_ring,clk500=sys_clk500,clk1k=sys_clk1k,beep=beep);haoin1:haoinportmap(SA,sys_clk64,SAc);haoin2:haoinportmap(SB,sys_clk64,SBc)