目录第一章系统工作原理.....................................................................1第二章程序模块分析.....................................................................22.1时钟分频模块.....................................................................22.2时钟运行模式模块.................................................................22.3扫描数码管及蜂鸣模块.............................................................42.4数码管显示模块...................................................................5第三章时序仿真.........................................................................7第四章总结..............................................................................9参考文献.................................................................................9附录....................................................................................101基于VerilogHDL设计的多功能数字钟本文利用VerilogHDL语言自顶向下的设计方法设计多功能数字钟,在本文中采用VerilogHDL语言设计多功能数字钟,借助其功能强大的语言结构,简明的代码描述复杂控制逻辑设计,与工艺无关特性,在提高工作效率的同时达到目的,并可以通过VerilogHDL语言的综合工具进行相应硬件电路的生成,突出了其作为硬件描述语言的良好的可读性、可移植性和易理解等优点,具有传统逻辑设计方法所无法比拟的优越性。此程序通过下载到FPGA芯片后,可应用于实际的数字钟显示中。第一章系统工作原理工作原理:时钟系统由八个数码管显示组成,其中第1、2个显示的为时的高位和低位,第3个数码管显示的是分隔符“-”,第4、5个为分的高低位,第6个也为隔符“-”,第7、8个为秒的高低位。时钟工作时用到两个频率,一个是系统频率Clk,主要用来扫描数码管和分频,第二个是时钟工作频率Clk_1HZ(由Clk分频得来),按下复位键,秒分时显示清零,工作时Clk(489HZ)不断通过3-8译码器值的改变来扫描时钟的八位数码管,由于人眼分辩不出这么高的频率,所以看到的是八个数码管一直同时亮着,与此同时控制端连着七段数码管的七位不断提供秒时分的高低位译码到数码管上显示,当Clk计数到244次(500ms)时,Clk_1HZ翻转一次,这样Clk_1HZ的周期就为1s整,每个Clk_1HZ的上升沿给秒的低位加1。按调时键S1进入调时模式,按下开关时程序里设置扫描到时的高低位时不显示,同时时的低位加1,松开开关时再显示出来,以此实现闪烁的功能,调分键也是同理。abcdefg3-8译码器核心控制rstS1(调时)S2(调分)489HZ时钟分频为1HZ小时分钟秒图1、系统原理图各个输入输出端口定义如下:Clk:489HZ的系统基准时钟输入。作为七段码管扫描频率。将其489分频可得到1HZ的数字钟工作频率。Rst:系统复位信号,低电平有效。复位后显示00-00-00。S1:调节小时信号,低电平有效。每按下一次,小时增加一个小时。S2:调节分钟信号,低电平有效。每按下一次,分钟增加一个分钟。2Spk:输出到扬声器,产生嘀、嗒的报时声。Sel:七段码管扫描驱动。因为是八个七段码管,所以Sel为三位总线。扫描频率为489HZ,由于人眼的视觉效果,呈现在眼前的便是整体的时-分-秒显示。Display:七段码管显示输出。除此之外另设了几个寄存器:Clk_1HZ:1HZ的数字钟工作频率Clk_Count1:产生1Hz时钟的分频计数器Music_Count:产生扬声器声音频率的分频计数器SECL,SECH:秒的低位和高位MINL,MINH:分的低位和高位HOURL,HOURH:时的低位和高位Disp_Temp:显示存储中间量第二章程序模块分析2.1时钟分频模块always@(posedgeClk)beginif(Clk_Count1==244)//对计数器进行判断,以确定Clk_1HZ信号是否反转beginClk_1HZ=~Clk_1HZ;Clk_Count1=0;endelseClk_Count1=Clk_Count1+1;end时钟分频模块实现的功能的把系统时钟(489HZ)分频为Clk_1HZ(1HZ)提供时钟工作频率,Clk_Count1为定义的一个计数器,当计到第244次时,刚好经过500ms(略有误差),Clk_1HZ翻转一次,人为制造出一个1HZ的时钟。2.2时钟运行模式模块always@(posedgeClk_1HZornegedgeRst)if(!Rst)//系统复位beginSECL=0;SECH=0;MINL=0;MINH=0;3HOURL=0;HOURH=0;endelsebeginif(!S1)//调节小时beginif(HOURL==9)beginHOURL=0;HOURH=HOURH+1;endelsebeginif(HOURH==2&&HOURL==3)beginHOURL=0;HOURH=0;endelseHOURL=HOURL+1;endendelseif(!S2)//调节分钟beginif(MINL==9)beginMINL=0;if(MINH==5)MINH=0;elseMINH=MINH+1;endelseMINL=MINL+1;endelseif(SECL==9)//一般运行状态beginSECL=0;if(SECH==5)beginSECH=0;if(MINL==9)4beginMINL=0;if(MINH==5)beginMINH=0;if(HOURL==9)beginHOURL=0;HOURH=HOURH+1;endelseif(HOURH==2&&HOURL==3)beginHOURL=0;HOURH=0;endelseHOURL=HOURL+1;endelseMINH=MINH+1;endelseMINL=MINL+1;endelseSECH=SECH+1;endelseSECL=SECL+1;end此模块描述的是时钟运行的几种形式,复位之后时分秒的高低位全给赋0,开始计数,按下S1键后,进入调时模式,按下一次加1,再根据各种情况判断是否进位等,同理按下S2键后进入调分模式,什么都不按下的情况下就是一般运行状态,先从秒开始判断,9秒时秒低位给0,高位进1,59秒时秒的高低位全给0,分的低位加1,还有9分59秒、59分59秒的情况等等,完全列举出了时钟运行的各种可能,按情况处理。2.3扫描数码管及蜂鸣模块always@(posedgeClk)beginMusic_Count=Music_Count+1;Sel=Sel+1;//扫描累加if(MINH==5&&MINL==9&&SECH==5)//在59分50秒开始提示beginif((SECL%2)==0)//在偶数秒开始发声5Spk=Music_Count[2];//嘀elseSpk=0;endelseif(MINH==0&&MINL==0&&SECH==0&&SECL==0)Spk=Music_Count[1];//嗒elseSpk=0;end此模块的功能是给3-8译码器一个扫描频率为Clk的三位输入,经3-8译码器输出后扫描八个数码管,蜂鸣器实现的是整点报时功能。2.4数码管显示模块always@(Sel)//三种扫描方式beginif(!S1)begincase(Sel)3'b111:Disp_Temp=4'b1111;3'b110:Disp_Temp=4'b1111;3'b101:Disp_Temp=4'b1010;3'b100:Disp_Temp=MINH;3'b011:Disp_Temp=MINL;3'b010:Disp_Temp=4'b1010;3'b001:Disp_Temp=SECH;3'b000:Disp_Temp=SECL;endcaseendelseif(!S2)begincase(Sel)3'b111:Disp_Temp=HOURH;3'b110:Disp_Temp=HOURL;3'b101:Disp_Temp=4'b1010;3'b100:Disp_Temp=4'b1111;3'b011:Disp_Temp=4'b1111;3'b010:Disp_Temp=4'b1010;3'b001:Disp_Temp=SECH;3'b000:Disp_Temp=SECL;endcaseend6elsebegincase(Sel)3'b111:Disp_Temp=HOURH;3'b110:Disp_Temp=HOURL;3'b101:Disp_Temp=4'b1010;3'b100:Disp_Temp=MINH;3'b011:Disp_Temp=MINL;3'b010:Disp_Temp=4'b1010;3'b001:Disp_Temp=SECH;3'b000:Disp_Temp=SECL;endcaseendendalways@(Disp_Temp)//数码管显示转换begincase(Disp_Temp)4'b0000:Display=7'b0111111;//04'b0001:Display=7'b0000110;//14'b0010:Display=7'b1011011;//24'b0011:Display=7'b1001111;//34'b0100:Display=7'b1100110;//44'b0101:Display=7'b1101101;//54'b0110:Display=7'b1111101;//64'b0111:Display=7'b0000111;//74'b1000:Display=7'b1111111;//84'b1001:Display=7'b1101111;//94'b1010:Display=7'b1000000;//-default:Display=7'b0000000;//全灭endcaseend此模块实现的是数码管的显示,分三种模式,第1种,调时模式,由于调节时钟的对应的位需要实现闪烁功能,所时按下调时(分)键时对应的时(分)位必须暗下去,等键松开时再回归一般状态,即所有数码管都亮,按下时按相应位暗下去是通过扫描到相应位时让数码管不显示实现的。7第三章时序仿真程序编译通过后,进行了一下仿真,设置Clk为2周期为2ms(近似489HZ),EndTime设了100s,仿真结果如下图。图2仿真结果图在Rst复位端为从低变到高开始计时,计时Clk489次后秒的低位进1,这里由于244次Clk上升沿后Clk_1HZ才翻转,故Clk太密集观察困难,秒的低位到9以后秒高位进1,同理到分以及时,由于如果结束时间设得太长,仿真结果出来得太慢,此处只设了100s,下图为放大后结果,计时Clk489次后秒的低位进1。图31秒跳变放大图下图为数码管显示放大后的仿真图,可以看到,Sel为000时,系统扫描到的是秒的低位,显示为Display:011111