基于FPGA 设计数字日历可以实现以软件方式设计硬件的目的,无需购买专用数字芯片,从而克服了传统利用多片数字集成电路设计数字日历存在焊接麻烦、调试繁琐、成本较高等问题。而且,基于FPGA 的数字日历与传统系统相比,在设计灵活、开发速度、降低成本、计时精度、功能实现上都得到大幅度提升,能够更好地满足人们日常生活的需要。
本文介绍如何利用VHDL硬件描述语言设计一个具有年、月、日、星期、时、分、秒计时显示功能,时间调整功能和整点报时功能的数字日历。在Quartus Ⅱ开发环境下,采用自顶向下的设计方法,建立各个基本模块,再构建成一个完整的基于FPGA 设计的数字日历的顶层模块,然后对其进行编译、仿真、引脚锁定,最终下载到可编程逻辑器件上进行结果验证。
1 数字日历整体设计方案
基于FPGA 的数字日历设计分为硬件设计和软件设计两大部分。其原理框图如图1所示。整个数字日历由六个部分组成:显示控制部分,时分秒部分,年月日部分,定时与整点报时部分,星期部分,调整控制部分。秒、分、时分别由两个60进制的计数器和一个24进制的计数器组成。当个计数器达到进位的条件时向下一计数器进位。同样日、月、年也是由不同的计数器组成,当达到所需进位的条件时向下一计数器进位,各计数器在进位的同时分别把各自的结果输出给显示部分进行实时显示。
图1 数字日历原理框图
2 数字日历的工作原理
首先由外部振荡器产生稳定的高频脉冲信号,作为数字日历的时间基准,然后经过分频器输出标准秒脉冲,输入到FPGA的CLOCK端,实现计数。当秒计数器满60后向分计数器进位,分计数器满60后向小时计数器进位,小时计数器按照“24进1”规律计数。计满后各计数器清零,重新计数。日部分由于日有28天、29天、30天、31天4种情况,故日由年和月共同判断其天数,日计满后向月进位,月满后向年进位。计数器的输出分别经译码器送数码管显示。计时出现误差时,可以用校时电路校时、校分、校秒和校年、校月、校日。
设计中用到了6 个按键K1,K2,K3,K4,ZHENG,NAO。其中K1用于切换显示,刚开始时显示日期,按两次K1显示星期+时间,再按两次K1显示定时时间,再按两次重新显示日期,以此循环。K2、K3和K4配合进行调节:开始正常显示不进行调节;当按两下K2 键切换到对分钟进行调节,此时每按两下K3 键分钟加1;再按两下K2 键切换到对小时进行调节,此时每按两下K3 键小时加1;依照分钟→小时→星期→天→月→年→定时→正常→分钟的次序循环调节,每按两下K2 键切换到调节相应显示,此时每按下K3键两次,对应显示加1;当切换到定时调节时,每按两下K3键,定时的分钟加1,此时按两下K4 键,切换到定时小时调节,每按两下K3 键,定时的小时加1。按键ZHENG和NAO为整点报时和定时闹钟的使能端(低电平有效)。
3 软件设计
软件设计分为秒分时、年月日、按键调整、控制显示、闹钟等几大模块。设计好各子模块,然后在原理图编辑窗口创建顶层原理图文件shuzirili.bdf,将各子模块按照逻辑关系连接起来得到数字日历电路核心部分的原理图。下面对各子模块设计及仿真进行介绍。
3.1 时分秒模块
分和秒都是60进制的计数器,小时则是24进制的计数器,先对各个子模块进行设计编译,验证无误后再将其组织到一起。外部时钟信号通过秒模块的clk 输入,产生的进位信号输送到分模块的clk,分模块产生的进位信号输送到小时模块的clk,构成时分秒模块。其结构图如图2所示。
图2 时分秒原理图
3.2 星期模块
星期模块为七进制计数器。其计数时钟信号来自于调时电路产生的星期进位脉冲信号,计数至6 瞬间,计星期模块返回0 重新开始计数。
3.3 年月日模块
年月日模块有daycounter 模块、days-control 模块、monthcounter模块、yearcounter模块组成,具有大小月判断和闰年判断功能,其结构图如图3所示。
图3 年月日连接框图
下面以年月日模块为例,连接好之后进行编译并仿真,闰/平年的2月仿真结果如图4,图5所示,年进位如图6所示。
图4 仿真结果(2008年2月)
图5 仿真结果(2005年2月)
图6 仿真结果(2004年12月)
年月日模块计数设定为2000年~2999年,从图4中可以看出2008年2月,计数到29天;从图5得到2005年2 月计数到28天;从图6看出2004年12月计数到31天,设计正确。
3.4 定时模块
定时模块通过按键K4来切换调节定时的分钟和小时,调整功能由调时模块的按键K3来完成,每按两下K3对应的显示加1。
3.5 调时模块
调时模块设计思想是:通过把整个设计中的上一个模块(比如:分的上一个模块是秒;年的上一个模块是月,等等)的进位输出接到本模块的输入in,out接到下一个模块的时钟输入。正常状态下sout=fin,fout=hin,hout=din,dout=min,mout=yin ,win=hout;当每按下两次K2键,产生一个上升沿分别对fin,hin,win,din,min,yin,dingshi调节,调节信号由K3 给出。其中定义一个信号w,计数到7 返0,对应正常状态,fin,hin,win,din,min,yin,dingshi 7个状态。
当K2 每来一个上升沿时,分别对分,时,星期,天,月,年以及定时调整,调整信号由K3 给出,经仿真调时模块结果与系统设计要求符合。
3.6 控制模块
控制模块通过K1按键进行切换显示调整,起初显示年月日,按下2次K1显示时间,再按下2次显示定时时间。
若仿真参数设置数值为:2013 年05 月15 日,星期三,15:28(33 s),定时为07:19。仿真后结果如图7所示。
从图7可以看出,通过K1 按键控制显示,开始显示年月日:20130515,当按下K1 两下,显示星期+时间:03152833;再按两下显示定时时间:00000719。仿真结果与预期设计一致,设计正确。
图7 仿真结果
3.7 闹钟模块
闹钟模块设计为当定时时间到或者整点时闹铃响,分别有ZHENG,NAO 两个控制端子控制,低电平有效。经验证,定时和整点报时仿真结果均符合设计要求。
3.8 顶层模块
将各个子模块设计好之后,并创建各自文件的图元,以供原理图设计文件中调用。然后在原理图编辑窗口创建顶层原理图文件shuzirili.bdf,即将各图元的引线端子按照逻辑关系连接起来,得到如图8所示的完整原理图,也即顶层模块。
对顶层文件分别进行时间、日期、闹铃功能的波形仿真,得到的仿真结果和预想设计一致,表明设计正确。
图8 顶层原理图
4 硬件验证
在Quartus Ⅱ开发环境中完成上述软件设计及仿真后,最后还需将程序下载到FPGA器件中进行硬件测试,以进一步验证所设计程序是否正确。硬件验证时,还需对顶层文件进行管脚分配、并编译,然后将编译好的目标文件通过下载电缆下载到FPGA 开发板中进行验证和调试。
采用GW48-SPOC/EDA 实验开发系统并设置在工作模式0来验证设计结果。下面仅给出部分验证结果。刚完成下载,数码管显示20000000,按两下K1切换到时间显示,才刚刚开始计数,同时扬声器发出“滴答滴答”的频率为1 Hz的响声(为整点报时)60 s,然后通过按键8(K1)、键7(K2)、键6(K3)、键5(K4)对各个功能进行验证。首先调整时间,按两下K2键切换到分的调整,此时每按两下K3 键,分钟加1,验证过程中看到加到59就变为00;再按两下K2键切换到小时的调整,此时每按两下K3键,分钟加1;用同样的方法调整星期,天,月,年以及定时的分钟和小时。
调整日期为2013年7月31号,当再调整天时,就变为2013年7月1号,结果如图9所示。其他月份实验结果也符合生活规律,与设计要求一致。
其他的测试结果,数码管能够正确显示计时时间,定时验证及时间调节、整点报时均能够正常工作,实验结果符合设计要求。
图9 实际电路验证
5 结语
本文基于FPGA 环境设计了一个具有年、月、日、星期、时、分、秒计时显示功能,时间调整功能和整点报时功能的数字日历系统,并将之下载到FPGA 芯片EP1C3T144-3上进行结果验证,实验验证表明:数码管能够正确显示计时时间,能够通过按键调整时间,能够设定时间并调整,整点报时能够正常工作,实验结果符合设计要求。由于设计中利用硬件描述语言和FPGA芯片相结合进行数字日历的研究,即利用EDA 技术在一定程度上实现了硬件设计软件化,使设计过程变得相对简单,易于修改。
另外,随着电子技术的发展,数字日历的功能会更加多样化,诸如增加农历显示;加入温度采集系统,能够显示每时每刻的环境温度;加入节气、节日提醒及显示功能,提醒人们农耕及休息时间;还可以加入语音识别,方便人们不动手实现对数字日历的调节等等。相信功能日趋完善多样化的数字日历将能更好地满足人们的各种需要,为人类服务。