VHDL设计FPGA数字系统:电子万年历
第3章 电子万年历的设计
3.1设计思想
本设计是基于VHDL语言的万年历设计。日期显示能够从0000年1月1日到9999年12月31日,时间显示能够显示一天24小时,并且能够校时校分。
在设计中,采用模块化的设计思想实现万年历的设计。根据万年历的预定功能,将万年历分为计时模块、显示及显示方式切换模块,校时模块。
计时模块根据功能,包含了秒、分、时、日、月、年模块。其中,秒和分都采用60进制计数器,时采用24进制计数器,月采用12进制计数器,年高位和年低位都采用100进制计数器(高位计数器可不需要进位输出)。在所有计数器进制设定方面,比较特别的是日计数器进制的设定,因为它有四种不同的情况,若为大月(1、3、5、7、8、10、12月)则为31进制计数器,若为小月(4、6、9、11月),则为30进制计数器,若为闰年的2月,则为29进制计数器,若为平年的2月,则为28进制的计数器。因此,在年计数器中,需要判断其是否为闰年,并将此信号引入月计时器中,配合月份输出判断信号,再将此判断信号引入日计数器模块。根据设计要求,判断信号需分为4种,分别代表大月,小月,平年的2月,闰年的2月。此外,每个计数器(除年高位计数器)都应该有进位输出端,每个计数器都有显示输出端,低位计数器的进位输出要作为高一位计数器的脉冲输入,比如秒计数器的进位输出作为分计数器的脉冲输入,而分计数器的进位输出作为时计数器的脉冲输入,以此类推。
计时功能仅仅是万年历的基本功能,若要实现校时功能,则必须包含校准模块。校准模块使系统具有7种工作方式,分别为正常计时、校分、校时、校日、校月、校年低位、校年高位。
在设计中,通过按键K1,K2,K3来选择不同的工作方式,如表3.1所示。若三个按键为001,则进入校分的工作方式,且在校分时秒计数器不正常工作,即秒的进位输出不作为分的输入。若按键为010则进入校时的工作方式,在进入校时工作方式时,秒计数器和分计数器正常工作,以此类推,三个按键为110后则进入校年高位的工作方式,在进入校年高位工作方式时,秒计数器、分计数器、日计数器和月计数器均正常工作,避免在校对年高位时影响其他时间位的正确性。若在进入校年高位的工作方式时,三个键再调节至000时,则再次进入正常计时。
此外,利用LED灯1至LED灯6作为显示工作方式的指示灯,如,正常计时时LED灯1至LED灯6都不亮;进入校分的工作方式时,LED灯1亮,其余
10
VHDL设计FPGA数字系统:电子万年历
都不亮;以此类推,进入校年高位的工作方式时,LED灯6亮,其余都不亮。通过这些LED灯的亮灭,可以方便地观察到目前系统所处的工作方式。
此外,通过时钟源来改变各个计数器的值,当检测到K1,K2,K3按键启动时,对应的计数器则由时钟信号驱动加1计数。例如,目前系统处于2013年4月20日18点57分23秒时,而真正的时间为19时整,则可以先将K1K2K3输入:001,进入校分的工作方式,则等待时钟源输入三个时钟脉冲,使分计数器加3,再使K1K2K3输入010,进入校时工作方式,再等待时钟信号加1计数即可实现。
万年历不仅要正确计时,而且要显示时间,而本设计中数码管显示内容有两种,一种是时分秒的显示,另一种则是年月日的显示,因此,共要用到16个数码管,但实验系统中只有8个数码管,所以设计中需增加显示及显示内容切换模块。
在设计中,显示内容的切换通过按键K4K5来控制,若K4,K5按键为00,则显示方式为时分秒;若K4,K5按键为01,则显示方式为年月日。此外,利用LED灯8作为显示方式的指示灯,当处于时分秒的显示方式时,LED灯8不亮,否则LED灯8亮。
按键 状态 000 正常 001 校分 010 校时 011 校日 100 校月 101 110 校年低位 校年高位 表3.1 按键K1,K2,K3状态表格
3.2 设计框图
电子万年历系统由计时模块,显示及显示内容切换模块,校准模块组成。计时模块由秒、分、时、日、月、年计数器实现。显示内容切换功能由开关K4和K5控制实现,校准功能由开关K1、K2、K3控制实现。显示功能由数码管和BCD译码器组实现,译码器的输入端为D、C、B、A,各个计数器的输出作为译码器的输入,7段译码器有7个输出端,分别接到数码管的7个显示输入端:a、b、c、d、e、f和g,从而使数码管显示相应的数字,进而实现显示功能。 万年历的设计框图如图3.1所示:
11
VHDL设计FPGA数字系统:电子万年历
数码管显示 译码驱动 年千位计数器 年百位计数器 年/时十位计数器 年/时个位计数器 月/分十位计数器 月/分个位计数器 日/秒十位计数器 日/秒个位计数器 校准模块,显示内容切换模块 时钟信号、拨位开关输入 图3.1 万年历设计框图
3.3 设计流程图
程序下载后,上电各个计数器开始计时,并将进位输出作为后一计数器的时钟触发输入,实现各计数器之间的连接。K1、K2、K3为校时控制输入端,检测到K1上升沿,使系统进入不同的工作状态,通过检测时钟源的到来,使相应的计数器的值增加1,从而实现校时功能。此外,通过K4、K5来控制显示方式,K4、K5显示为00,显示方式为时分秒,K4、K5显示为01则显示方式为年月日。
秒、分计数器为60进制加法计数器,时计数器的模值为24,日计数器的模值由是否为闰年2月、平年2月、大月、小月决定,月计数器模值为12,年计数器模值为10000。
秒计数器由频率为1Hz的时钟信号驱动,其他各计数器的时钟脉冲信号由前一个计数器的进位信号提供。
在此设计中最重要的部分是平年闰年的判断,由于四年一闰,百年不闰,四百年再闰,例如,2000年是闰年,1900年则是平年,所以我们在判断年低位是否能被4整除的同时,还应判断年低位是否为100,若是100还应判断年高位是否能被4整除,若可以,则当前年份为闰年,则二月为29天。
整体设计流程图如图3.2所示:
12
VHDL设计FPGA数字系统:电子万年历
开始 输入K1K2K3
正常计时 000 001 校分 010 011 100 101 110 校时 校日 校月 校年低位 校年高位 Y K4K5=00 N 输出时分秒 输出年月日 显示数据 结束 图3.2 整体设计流程图
计时模块流程图,如图3.3所示
13
VHDL设计FPGA数字系统:电子万年历
开始 N clk上升沿 Y 秒计数+1 保持原值 结束 N 满60 Y 分计数+1
N 满60 时计数+1 满24 日计数+1 闰年 N 月份 大月 小月 Y N 二月 二月 N 日计数满31 N Y 日计数满30 N Y 月计数+1 N 满12 Y 日计数满28 N Y 日计数满29 Y N 满9999 Y 清零 年计数+1 图3.3 计时模块流程图 14