1、基于 FPGA 实现多功能数字钟电子系071180094王丛屹摘要本文利用Verilog HDL语言自顶向下的设计方法设计多功能数字钟,并通过ISE完成综合、仿真。此程序通过下载到FPGA 芯片后,可应用于实际的数字钟显示中,实现了基本的计时显示和设置,调整时间,闹钟设置的功能。关键词 FPGA;Verilog HDL;数字钟一、多功能数字钟的设计设计一个多功能数字时钟,具有时分、秒计数显示、闹钟功能。能够利用按键实现对闹钟时间的设定并在当前显示时间到时后能够进行闹钟提示。能够利用按键实现“较时”、“较分”功能,随时对数码管的显示进行校正和校对。数字中系统主要由系统时钟,三个功能按键(mode
2、,turn,change),FPGA,数码管和蜂鸣器部分组成。 分频模块计时模块 闹钟模块显示模块控制模块蜂鸣器图: 多功能数字钟总体设计模块以下就各个模块说明其功能1. 分频模块数码管Clk由于 FPGA 内部提供的时钟信号频率大约为 50MHz,在这需要将它转化成 1Hz 的标准时钟信号供数字钟的计时显示;在此我采用了级联分频法。RTL 图如下:代码如下:/fenpinmodule fenpin(clk,clk_1Hz,clk_100Hz,clk_1k);output clk_1Hz,clk_100Hz,clk_1k;input clk;reg clk_1Hz=0,clk_3=0,clk_
3、1=0,clk_2=0,clk_1k=0;reg 6:0 cnt1=0,cnt2=0,cnt3=0,cnt4=0,cnt5=0;wire clk_100Hz;always (posedge clk) beginif ( cnt1 8h54)|(!(min1|sec1)if(sec18h54) alert2=ear /产生短音else alert2=!ear /产生长音else alert2 = 0; /停止发声end/assign alert=(alert1)?clk_100Hz/产生闹铃音或整点报时音assign alert=(alert1)?clk_1k /产生闹铃音或整点报时音endmo
4、dule8、 跑表模块原理:输入该模块的是 100Hz 时钟信号。百分秒是模为 100 的 BCD 码计数器,为方便数码管显示,将百分秒的两位分别用 4 位的 MSH(百分秒高位),MSL(百分秒低位)表示。这样 MSH,MSL 就分别对应每一个数码管显示的 BCD 码。同理,秒信号为模为60 的 BCD 码计数器,两位也用四位的 SH(秒高位) ,SL (秒低位) 。此时 turn 键可用作跑表的 pause 键,按下 turn 键后跑表暂停,再按下后秒表启动。此外 clr 按键可实现跑表的异步清零。/ paobiao/*信号定义:clk_100Hz: clk_100Hz 为时钟信号;clr
5、: 为异步复位信号;pause: 为暂停信号;MSH,MSL: 百分秒的高位和低位;SH,SL: 秒信号的高位和低位;MH,ML: 分钟信号的高位和低位。 */module paobiao(clk_100Hz,clr,pause,MSH,MSL,SH,SL,MH,ML);input clk_100Hz,clr;input pause;output3:0 MSH,MSL,SH,SL,MH,ML;reg3:0 MSH,MSL,SH,SL,MH,ML;reg cn1,cn2; /cn1 为百分秒向秒的进位,cn2 为秒向分的进位/百分秒计数进程,每计满 100,cn1 产生一个进位always (p
6、osedge clk_100Hz or posedge clr)beginif(clr) begin /异步复位MSH,MSL=8h00;cn1=0;endelse if(!pause) /PAUSE 为 0 时正常计数,为 1 时暂停计数beginif(MSL=9) beginMSL=0;if(MSH=9) begin MSH=0; cn1=1; endelse MSH=MSH+1;endelse beginMSL=MSL+1; cn1=0;endendend/秒计数进程,每计满 60,cn2 产生一个进位always (posedge cn1 or posedge clr)beginif(
7、clr) begin /异步复位SH,SL=8h00;cn2=0;endelse if(SL=9) /低位是否为 9beginSL=0;if(SH=5)begin SH=0; cn2=1; endelse SH=SH+1;endelse begin SL=SL+1; cn2=0; endend/分钟计数进程,每计满 60,系统自动清零always (posedge cn2 or posedge clr)beginif(clr)begin MH,ML=8h00; end /异步复位else if(ML=9) beginML=0;if(MH=5) MH=0;else MH=MH+1;endelse
8、 ML=ML+1;endendmodule三、总体设计构思套路:1、关于模式信号 mode 选择各个功能显示的构思:考虑到使用 mode 按键产生 0、1 信号在正常时间显示、调节时间功能、调节闹钟功能和跑表功能这四个功能之间的转换。所以 mode 信号的作用主要体现在控制模块(1)和显示模块中,虽然计时模块中也用到 mode 信号,但是它只是 turn 信号将秒信号清零的辅助作用,保证只有在 m=0(即普通时钟显示)下 turn 信号清零功能才起作用,在校时功能下只能是分、小时的切换和跑表下的暂停功能。a、 在控制模块下的作用:在控制模块下,其实 mode 和 turn 信号的作用更像 2-
9、4 译码器的功能,将 change 数字上加信号按不同的 mode 和 turn 分成四个信号,分别是 count1(时间显示下的分信号) 、counta(时间显示下的小时信号)、count2(闹铃显示下的分信号)、countb(闹铃显示下的小时信号)。b、 在显示模块下的作用:同在控制模块下的作用。只是将 turn 信号选出的小时和分钟在同一个 mode 下一起送至数码管显示。2、关于时间调整和闹铃时间调整中数字上加的原理:对于这个问题,我们要考虑两种情况,首先是时间调整的情况:因为在时间调整下,数字的上加不仅受到 change 信号的作用(即人工调时) ,还受本身在 1Hz 信号下计时而随
10、时发生的累加。而闹铃时间调整不存在这种情况,因为闹铃下的时间数字发生上加只可能人工调节(change 信号作用下)的结果。a、 时间调整下的上加:由于在控制模块(2)下又设置了快加的功能,所以有三部分信号对上加起作用,一是快加下的 numXclk,表示以原始时钟的速率上加,二是慢加下的 change 具体到各模块、各位的 count1 或 counta,三是秒信号记到 9 向分信号的进位。b、 闹铃时间调整下的上加:该部分原理同上,只是少了低位记到 9 向高位的进位。所以只有两部分组成,一是快加下的 numXclk,表示以原始时钟的速率上加,二是慢加下的 change 具体到各模块、各位的 c
11、ount2 或 countb。上述原理可用下面的信号流程图表示;Change 信号count1 counta count2 countbnum3 num4 num1 num2ct1 cta ct2 ctbmin1 hour1 amin ahour【hour, min】送至数码管显示Mode 和 turn 进行译码选择minclk hclk四各工作模式仿真波形1.时钟正常计时波形00:00:59 时刻波形00:59:59 时刻波形23:59:59 时刻波形2.定时闹钟波形Mode 选择如图所示为 01:02:00-01:02:59 的一分钟闹钟波形。3.仿电台报时波形如图所示,在任意小时 59
12、分的 51、53、55、57 秒内蜂鸣器为低频(512Hz)信号输出,在 59 秒内蜂鸣器为高频(1024Hz)信号输出,实现模仿电台报时功能。3.整点报时波形如图所示,在 06:00:00 后的 6 秒内,蜂鸣器前半秒无输入,后半秒有高频(1024Hz)输入,达到整点报时功能。在 N 小时整时刻,蜂鸣器会鸣响 N次。如此仿真中为六点,响六下分计数器仿真波形图:小时计数器仿真波形图:五、在 FPGA 板上调试过程如下:1.当前 m=0,输出的是计时模块的时间;LD_alert=0,表示没有设置闹钟。2.当 m=1 时,输出的是闹钟时间。改变 change 的值,可以调节闹钟的时间。可以看出设置
13、得闹钟为 8:25。LD-alert=1 提示设置了闹钟。3.当 m=2or3 时,输出的是调整计时模块的时间。改变 change 的值,可以调节时间。可以看出,时间调整为 8:21。4.从下可以看出,LD_alert=1,表明设置有闹钟。alert=0,表示闹钟时间还没有到。时间为 8:25:00,闹钟报警,alert=1,报警时间长为 30 秒,如果按住 change 键,则可以屏蔽闹铃。时间为 8:25:31,闹铃停止。测试成功!六小结通过近来对 FPGA 的学习,我对 ISE 软件总体操作步骤已比较熟悉。接下来的时间是要提高对 FPGA 的掌握能力,将 FPGA 运用到数字信号处理和通信原理上。,另外,对 Verilog 语言的学习不仅是能读懂别人的程序,更重要的是能写出条理清晰的程序。通过做多功能数字钟,我发现自己对 Verilog 语言还不是很熟悉,接下来的时间要加强语言的学习,多看一些语言方面的书籍。