基于CPLD的多功能数字钟设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
说明书
目录
1 前言 (1)
2 总体方案设计 (2)
2.1 方案论述 (2)
2.2 设计方式 (3)
3 单元模块电路设计 (4)
3.1时间显示电路模块设计 (4)
3.2按键及指示灯电路模块的设计 (6)
3.3蜂鸣器及有源晶振电路的设计 (8)
3.4 CPLD编程下载电路的设计 (9)
3.5电源电路电路的设计 (10)
3.6 EPM7128SLC84器件介绍 (11)
4 CPLD 编程设计 (12)
4.1系统信号的定义及顶层模块 (12)
4.2 时钟节拍产生模块 (13)
4.3模式选择功能模块 (15)
4.4快速时间设置功能模块 (17)
4.5秒、分、时计时与时间调整模块 (17)
4.6闹铃时间设置模块 (19)
4.7闹铃与整点报时模块 (20)
4.8 7段显示译码模块 (21)
4.9 LED显示模块 (23)
5 系统功能及功能仿真 (25)
5.1系统功能 (25)
5.2功能仿真 (26)
5.2.1 时钟节拍产生模块的仿真波形 (26)
5.2.2 模式选择功能模块的仿真波形 (28)
5.2.3 闹铃设置功能模块的仿真波形 (29)
5.2.4 7段译码功能模块的仿真波形 (30)
5.2.5 LED显示功能模块的仿真波形 (31)
5.2.6 系统总体功能仿真波形 (32)
6 设计总结 (33)
7 参考文献 (34)
附录:基于CPLD的多功能数字钟电路图 (35)
说明书
1 前言
我们已经进入了数字化和信息化的时代,其特点是各种数字产品的广泛应用。
现代数字产品在性能提高、复杂度增大的同时,其更新换代的步伐也越来越快,实现这种进步的因素在于生产制造技术和电子设计技术的进步。
生产制造技术以微细加工技术为代表,目前已进展到深亚微米阶段,可以在几平方厘米的芯片上集成数千万个晶体管。
PLD器件和EDA技术的出现,改变了这种传统的设计思路,使人们可以立足于PLD 芯片来实现各种不同的功能,新的设计方法能够由设计者自己定义器件内部逻辑和管脚,将原来由电路板设计完成的工作大部分放在芯片的设计中进行。
这样不仅可以通过芯片设计实现各种逻辑功能,而且由于管脚定义的灵活性,减轻了原理图和印制板设计的工作量和难度,增加了设计的自由度,提高了效率。
同时这种设计减少了所需芯片的种类和数量,缩小了体积,降低了功耗,提高了系统的可靠性。
本设计是基于CPLD的多功能数字钟设计。
硬件界面为一个6位的LED数码管,时间显示方式为6位同时显示,即显示状态为:88:88:88。
显示的时间制为24小时制。
三个时间设定按键,分别为MODE模式选择键,SET设定键和CHANGE数值修改键。
按键功能介绍:MODE按键用来选择当前数字钟的工作模式,系统正常工作在模式0下,即模式0为正常时钟模式。
当在正常时钟模式下第一次按下MODE键时,系统进入模式1,即闹铃模式,在此模式下可以通过SET和CHANGE按键的配合使用来设定所需要的闹铃时间。
当再一次按下MODE按键后系统进入手动校时模式,在此模式下通过SET和CHANGE按键的配合使用,可以改变当前时间。
SET按键则用于在不同的模式下选择当前设定的位置,比如当前设定的位置是小时,则再一次按下SET按键后当前设定的位置变为分钟。
CHANGE按键用来将当前设定位置的时间值加1,当长时间按下CHANGE按键时,当前设定值为连续快速加1,此功能用于快速设定时间。
系统带四个指示灯电路,一个为电源指示灯,其他三个为工作状态指示灯,即分别为LED_ALARM、LED_HOUR和LED_MIN。
LED_ALARM用于指示当前是否设有闹铃,当LED_ALARM指示灯亮时表明当前设有闹铃。
LED_HOUR和LED_MIN用于指示当前设定的是时间的小时还是分钟,当LED_HOUR指示灯亮时表明此时设定的是时间的小时值,当LED_MIN指示灯亮时表明此时设定的是时间的分钟值。
闹铃的功能是实现当到达预设的时间点时产生为时20S的“嘀嘀嘀嘀”急促短音。
整点报时的功能是实现在每个整点的5秒钟前产生整点报时音,报时音为“嘀嘀嘀---嘟”4短一长音。
说明书
2 总体方案设计
2.1 方案论述
本设计是基于CPLD的多功能数字钟设计。
硬件界面为一个6位的LED数码管,时间显示方式为6位同时显示,即显示状态为:88:88:88。
显示的时间制为24小时制。
三个时间设定按键,分别为MODE模式选择键,SET设定键和CHANGE数值修改键。
按键功能介绍:MODE按键用来选择当前数字钟的工作模式,系统正常工作在模式0下,即模式0为正常时钟模式。
当在正常时钟模式下第一次按下MODE键时,系统进入模式1,即闹铃模式,在此模式下可以通过SET和CHANGE按键的配合使用来设定所需要的闹铃时间。
当再一次按下MODE按键后系统进入手动校时模式,在此模式下通过SET 和CHANGE按键的配合使用,可以改变当前时间。
SET按键则用于在不同的模式下选择当前设定的位置,比如当前设定的位置是小时,则再一次按下SET按键后当前设定的位置变为分钟。
CHANGE按键用来将当前设定位置的时间值加1,当长时间按下CHANGE按键时,当前设定值为连续快速加1,此功能用于快速设定时间。
系统带四个指示灯电路,一个为电源指示灯,其他三个为工作状态指示灯,即分别为LED_ALARM、LED_HOUR和LED_MIN。
LED_ALARM用于指示当前是否设有闹铃,当LED_ALARM指示灯亮时表明当前设有闹铃。
LED_HOUR和LED_MIN用于指示当前设定的是时间的小时还是分钟,当LED_HOUR指示灯亮时表明此时设定的是时间的小时值,当LED_MIN指示灯亮时表明此时设定的是时间的分钟值。
电源采用+5V供电。
整个设计的设计方式采用TOP-DOWN设计方法。
多功能数字钟设计分为1个顶层模块和8个功能子模块。
顶层模块名称为CLOCK.V。
各功能子模块分别为:系统分频功能模块clk_generate.v、模式选择功能模块mode_select.v、快速时间设置功能模块fast_settime.v、秒、分、时计时与时间调整模块time_mode0.v、闹铃时间设置模块alarm_set.v、闹铃与整点报时模块alarm.v、7段显示译码模块decoder_7seg.v以及LED显示功能模块display.v。
说明书
2.2 设计方式 TOP —DOWN 设计,即自顶向下的设计。
这种设计方法首先从系统设计入手,在顶层进行功能方框图的划分和结构设计。
在功能级进入仿真和纠错,并用硬件描述语言对高层次的系统行为进行描述,然后用综合工具将设计转化为具体门电路网表,其对应的物理实现可以是PLD 器件或专用集成电路。
由于设计的主要仿真和调试过程是在高层次上完成的,这一方面有利于早期发现结构上的错误,避免设计工作的浪费,同时也减少了逻辑功能仿真的工作量,提高了设计的一次成功率。
整个设计的设计方式采用TOP-DOWN 设计方法。
多功能数字钟设计分为1个顶层模块和8个功能子模块。
顶层模块名称为CLOCK.V 。
各功能子模块分别为:系统分频功能模块clk_generate.v 、模式选择功能模块mode_select.v 、快速时间设置功能模块fast_settime.v 、秒、分、时计时与时间调整模块time_mode0.v 、闹铃时间设置模块alarm_set.v 、闹铃与整点报时模块alarm.v 、7段显示译码模块decoder_7seg.v 以及LED 显示功能模块display.v 。
图2.1 整个系统的模块划分
clk_generate.v
mode_select.v
clock.v fast_settime.v
time_mode0.v
alarm_set.v
alarm.v
decoder_7seg.v
display.v
说明书
3 单元模块电路设计
3.1时间显示电路模块设计
时间显示电路主要由两部分组成,如图3.1所示。
其中一部分为六位LED数码管的驱动电路,另一部分为LED数码管电路。
LED驱动电路由Q1、Q2、Q3、Q4、Q5、Q6六支三级管和R5、R6、R7、R8、R9、R10基极偏置电阻组成。
驱动三级管为PNP型三极管,用于开关电路中。
当三级管Q1的基极(即CPLD的LED0输出端)为低电平时,Q1的发射结正向偏置,集电结反向偏置,因此三极管处于导通状态,此时有Vce≈0.2~0.3V。
反之当Q1的基极为高电平时Q1截止。
Q1、Q2、Q3……Q6的基极(LED0~LED5)分别接CPLD的PIN74、PIN73、PIN70、PIN69、PIN68、PIN67,分别作为LED数码管的位选端。
图3.1 LED显示电路
LED的显示方式有静态显示和动态方式两种工作方式。
LED显示器工作于静态显示方式时,各位的共阴极(或共阳极)连接在一起并接地(或+5V);每位的段码线(a~dp)分别与一个8位的锁存器输出相连。
之所以为静态显示,是因为各个LED的显示字符的字符一经确定,相应锁存器锁存的段码输出将维持不变,直到送入另一个字符的段码为
说明书
止。
正因为如此,静态显示器的亮度都较高。
但是因为静态显示方式下,各位LED的段码线都是独立的,因此一个6位的LED显示器需要占用6*8+6=54个I/O口,在这种情况下为了简化接线,因此在本设计中采用的是动态扫描方式来显示距离。
在动态显示方式下,通常将所有位的段码线相应并联在一起,由一个8位的I/O口控制,形成段码线的多路复用,而各位的共阳极或共阴极分别由相应的I/O口线控制,形成各位的分时选通。
图3.1所示的电路是一个六位的LED显示电路。
其中段码线占用1个8位I/O口,而位选线占用六位I/O口。
由于各段码线并联,8位I/O口输出的段码对各个显示位来说都是相同的。
因此,在同一时刻,如果各位位选线都处于选通状态的话六位LED将显示相同的字符。
若要各位LED能同时显示出与本位相应的显示字符,就必须采用动态显示方式,即在某一时刻,只让某一位的位选线处于选能状态,而其他各位的位选处于关闭状态,同时,段码线上输出相应的要显示的字符段码。
这样,在同一时刻,六位LED中只有选通的那一位显示出字任,而其它四位则是熄灭的。
同样在下一时刻,只让下一位的位选线处于选通状态,而其它各位的位选线处于关闭状态,在段码线上输出将要显示字符的段码,则同一时刻,只有选通位显示相应的字符。
而其它各位是熄灭的。
如此循环下去,就可以使各位显示出将要显示的字符。
图3.1所示三位数码显示管,常用的LED显示器为8段。
每一个段对应一个发光二极管。
这种显示器有共阳极和共阴极2种。
共阴极LED显示器的发光二极管的阴极连接在一起,通常此公共阴极接地。
当某个发光二极管的阳极为高电平时,发光二极管点亮,相应的段被显示。
同样,共阳极LED显示器的发光二极管的阳极连接在一起,通常此公共阳极接正电压,当某个发光二极管的阴极接低电平时,发光二极管被点亮,相应的段被显示。
六位LED显示器有6位位选线和48根段码线。
段码线控制显示字符的字型,而位选线为各个LED显示位中各段的公共端,它控制该LED显示位的亮或暗。
LED显示器工作于静态显示方式时,各位的共阴极或共阳极连接在一起并接地或+5V。
在多位显示时,为简化硬件电路,通常将所有位的段码线相应段并联在一起,由一个8位I/O口控制,形成段码线的多路复用。
由于各位段码线并联,8位I/O口输出的段码对各个显示字符来说都是相同的,因此,在同一时刻,如果各位位选线都外于选通状态的话,6位LED 将显示相同的字符,就必需采用动态显示方式,即在某一时刻,只让某一位的位选线外于选通状态,而其他各位的位选线外于关闭状态,同时段码线上输出相应位要显示字符的段码。
这样在同一时刻,6位LED中只有选通的那一位显示出字符,而其他5位是熄灭的。
同样在下一时刻,只让下一位的位选线外于选通状态,而其他各位的位选线处于关闭状态,在段码线上输出将要显示字符的段码,则同一时刻,只有选通位显示出相应的字任,而其他各位刚是熄灭的。
如此循环下去,就可以使各位显示出将要显示的字符。
虽然这些字符是在不同时刻出现的,但由于人的视觉暂留作用而感到同时显示。
说明书
3.2按键及指示灯电路模块的设计
根据电子电路常识,采用灌电流工作方式的电路的功耗要比采用拉电流方式工作的电路小。
因此本设计中所有的外部键盘,指示二极管均采用灌电流的工作方式。
当多功能数字钟的按键未按下时按键的输出(即CPLD的输入)为低电平,当按键按下时输出(即CPLD的输入)为高电平。
在本设计中只有三个按键,分别为MODE、SET、CHANGE。
MODE按键用于模式选择,按下一次MODE按键后电路进入闹铃设置模式,在该模式下可以用SET键来选择当前是设置小时还是设置分钟,而用CHANGE键可以改变当前设置闹铃的小时或分钟(向上加一)。
再按一次MODE键则进入手动校时功能模式。
按键电路如图3.2所示。
图3.2 按键电路
在本设计中共有四个指示灯,一个为电源指示灯,其它三个是工作状态指示灯,D1为闹铃报警指示电路,当设置闹铃后闹铃指示电路就工作在点亮状态,指示当前设有闹铃。
D2和D3用来指示当前设置状态。
当在闹铃设置模式和手动校时模式下,D2或D3会有一个在点亮状态,当D2亮时表示当前设置的是小时,当D3亮时表示当前设置的是分钟。
指示灯电路如图3.3所示。
说明书
图3.3 指示灯电路
引脚的连接为,D1接CPLD的PIN61,D2接CPLD的PIN63,D3接CPLD的PIN64。
当CPLD的引脚输出为高电平时相应的指示灯就点亮。
说明书
3.3蜂鸣器及有源晶振电路的设计
在本设计中由于有音调的变换,所以必需采用交流蜂鸣器。
由于CPLD管脚的驱动能力有限,因此通过连接一个三极管来增强驱动能力,从而提高蜂鸣器的响度。
二极管D9起到续流保护的作用,蜂鸣器电路如图3.4所示。
图3.4蜂鸣器电路
系统时钟采用2.048MHZ的有源晶体振荡器。
为了使有源晶振能输出较好的波形,必需保证供电的稳定。
所以在晶振电路的前端加了两个小电容对电源进行滤波,在时钟输出端加了一个小电阻,能有效地抑制高次谐波和实现阻抗匹配。
有源晶振电路如图3.5所示。
图3.5有源晶振电路
说明书
3.4 CPLD编程下载电路的设计
CPLD器件多采用JTAG编程方式,JTAG编程方式是在线编程,传统生产流程中先对芯片进行预编程现再装到板上因此而改变,简化的流程为先固定器件到电路板上,再用JTAG编程,从而大大加快工程进度。
JTAG接口可对PSD芯片内部的所有部件进行编程。
在硬件结构上,JTAG 接口包括两部分:JTAG 端口和控制器。
与JTAG 接口兼容的器件可以是微处理器(MPU)、微控制器(MCU)、PLD、CPL、FPGA、ASIC 或其它符合IEEE1149.1 规范的芯片。
IEEE1149.1 标准中规定对应于数字集成电路芯片的每个引脚都设有一个移位寄存单元,称为边界扫描单元BSC。
它将JTAG 电路与内核逻辑电路联系起来,同时隔离内核逻辑电路和芯片引脚。
由集成电路的所有边界扫描单元构成边界扫描寄存器BSR。
边界扫描寄存器电路仅在进行JTAG 测试时有效,在集成电路正常工作时无效,不影响集成电路的功能。
JTAG编程方式对CPLD和FPGA器件都支持,用于CPLD器件的下载文件是POF文件。
JTAG下载电路如图3.6所示。
图3.6 JTAG下载电路
JTAG下载电路的10针接口引脚定义为。
1引脚为TCK时钟,2引脚接地,3引脚TDO 为测试数据输出(数据输出,来自器件),4引脚接电源电压,5引脚TMS为测试模式选择(编程使能),NC为NO-CONNECT。
9引脚TDI为测试数据输入(数据输入到器件),10引脚接地。
说明书
3.5电源电路电路的设计
本设计中的核心器件为MAX7000S系列的EPM7128SLC84,I/O口电压VCCIO和核心电压VCCINT均支持正5V,因此在本设计中统一给I/O端口和内核提供+5V的电压。
图3.7 电源电路
电源电路是由电源变压器T、桥堆、滤波电容C11、C13、C15、C17及集成三端稳压电路7805以及保险丝组成,其电路图如图3.7所示。
电源的输出为+5V输出。
本系统采用7805稳压电路下面介绍电原各部分参数的整定方法:
1变压器次极电压估算(以便选取合适的变压器):
由于稳压管要正常工作时输入端的电压必需要比输出端高2.5V时才能使稳压管稳定工作。
考虑到市网交流电压的波动情况,在市网电压为200V时也能正常工作,则有220/200*Vac要大于8.0,所以VAC必需要大于8.8V,即交流变压器的负边输出电压应该高于8.8V,在本设计中选取9V。
2变压器输入功率的计算:
1.假设负载电流为500ma,若输出电压为5V,则有效功率为5V*0.5A=2.5W。
2.正常情况下变压器输出功率约为9V*1.2*1.5A=5.4W,当市网电压升到250V时,变压器的输出功率为5.4W*250/220=6.2W。
3.小型电源变压器的效率一般为75%左右。
因此电源变压器的输入功率为
6.2W/0.75=8.27W。
3虑波电容参数的选取:
1.假设负载电流为500ma,若输出电压为7.5V,则等效负载电阻为15Ω。
2.电源频率为50HZ,则T=0。
02S,根据CRL>=(3~5)T/2,则C>=[(3~5)T/2]/RL=2000~3300uF。
在本设计中取2200uF。
3. 电容耐压应大于1.42*Vac即Vc>=1.42*9*250/220=1
4.5V(其中250/220是考虑市网电源电压过高时的情况。
在本设计中电容耐压值取16V。
说明书
3.6 EPM7128SLC84器件介绍
本次设计的核心器件采用ALTERA公司的CPLD可编程器件。
ALTERA公司的MAX7000S 系列CPLD有着较高的性价比。
MAX7000S系列是基于ALTERA第二代MAX架构的高密度、高性能的PLD器件。
MAX7000器件包含32~256个可联结成16个宏单元组的逻辑阵列块的宏单元。
EPM7128SLC84是MAX7000S家族成员之一,它有如下的特点:可用逻辑门个数为2500门,128个宏单元,8个逻辑陈列块,最大用户可用I/O口100个,支持5V在系统编程和符合IEEE.STD.1179r的JTAG下载接口,内建边界扫描测试电路,支持片上调试EPM7128SLC84-15的封装图如图3.8所示
图3.8 EPM7128SLC的PLCC封装
说明书
4 CPLD 编程设计
4.1系统信号的定义及顶层模块
整个系统输入、输出信号的定义:
sysclk:系统的时钟信号,由外部有源晶振产生,频率为2.048Mhz;
mode:外接按键,模式选择信号,mode=0时为时钟模式,mode=1时为设定闹钟模式,mode=2时为手动设定时间模式;
set:外接按键,用于在手动设置时间时选择是调整小时还是分钟;若长时间按住该键,还可以使秒信号清零,用于精确调整时间;
change:外接按键,手动调整时间,每按一次计数器加1;若长时间按住则连续快速加1,用于快速调时和定时;
alarm:接蜂鸣器,输出到蜂鸣器的信号,用于产生闹铃音和报时音;闹铃音为持续20S 的急促的“嘀嘀嘀”音,整点报时音为“嘀嘀嘀---嘟”四短一长音;
Dataout:输出信号,输出显示时间的数码管显示的段码。
`include "clk_generate.v"
`include "time_mode0.v"
`include "mode_select.v"
`include "fast_settime.v"
`include "alarm_set.v"
`include "alarm.v"
`include "decoder_7seg.v"
`include "display.v"
module clock;
clk_generate clk_generate(); //调用时钟节拍产生模块
time_mode0 time_mode0(); // 秒、分、时计时与时间调整模块
mode_select mode_select(); //调用模式选择功能模块
fast_settime fast_settime(); //调用快速时间设置功能模块
alarm_set alarm_set(); //调用闹铃时间设置模块
alarm alarm(); //调用闹铃与整点报时模块
decoder_7seg decoder_7seg(); //调用7段译码模块
display display(); //调用显示模块
endmodule
说明书
4.2 时钟节拍产生模块
由于整个系统只有一个晶体振荡器,但是设计需要不同的时钟信号,因此需要设计一个分频进程,对系的的有源晶振产生的2.048MHZ时钟进行分频,产生需要的时钟节拍。
在本设计中总共用到如下几个时钟节拍:1HZ的时钟CLK,4HZ的时钟CLK_4hz,1kHZ 的时钟信号CLK_1K,和50HZ的时钟displayclk。
其中CLK节拍用于产生秒计时信号,在每个CLK的上升沿到来时秒计数器加1。
CLK_4hz节拍用于快速调整时间,当长时间按下CHANG按键时,当前设置的时钟快速增加。
CLK_1k节拍用于闹铃音的产生,displayclk时钟节拍是频率为50HZ的信号,由于本设计中显示部分采用LED动态显示的方式,因此必需要有一个扫描信号对6位的LED的每个位进行轮流选通点亮。
分频进程的原理是在CPLD内部设置一个分频计数器和一个触发器,当计数到分频值时触发器进行翻转,因此只要设置不同的分频计数器的计数值就可以得到不同的时钟节拍。
在CPLD内部设置分频计数器的缺点是,CPLD的触发器资源有限,设置计数器对资源的占用比较大,因此尽量可能少用一些时钟节拍,或者尽量使需要使用的时钟节拍相同,还有一种方法是利用两个已有的时钟信号进行逻辑运算从面获得想要的时钟节拍。
系统的分频进程如下:
module clk_generate(reset,sysclk,clk,clk_4hz,clk_1k,displayclk);
input sysclk,reset;
output clk,clk_4hz,clk_1k,displayclk;
reg clk,clk_4hz,clk_1k,displayclk;
reg [20:0]div_count1; //分频时钟计数器,用于产生周期为1S的时钟信号
reg [19:0]div_count2; //分频时钟计数器,用于产生频率为4hz的时钟信号
reg [11:0]div_count3; //分频时钟计数器,用于产生频率为1Khz的时钟信号
reg [14:0]divclk_cnt; //分频时钟计数器,用于产生50HZ的数码管扫描信号displayclk
always @(posedge sysclk)
begin
if (reset) div_count1=21'd0000000;
if (div_count1==21'd1024000) //1024000/2048000=0.5S
begin
clk<=~clk; //clk为周期为1S的时钟信号
说明书
div_count1=21'd0000000;
end
else
begin
div_count1=div_count1+1'b1;
end
end
always @(posedge sysclk)
begin
if (reset) div_count2=20'd000000;
if (div_count2==20'd256000) //512000/2048000=0.25S
begin
clk_4hz<=~clk_4hz; //clk_4hz为4hz的时钟信号 div_count2=20'd000000;
end
else
begin
div_count2=div_count2+1'b1;
end
end
always @(posedge sysclk)
begin
…… //产生周期为50HZ和1KHZ的时钟节拍
end
endmodule
说明书
4.3模式选择功能模块
本设计是多功能数字钟,实现的功能是以数字形式显示时、分、秒的时间,能进行手动快校时、快校分或慢校时、慢校分。
该多功能电子共有3种模式。
分别为:模式0为正常时钟模式,模式1为设置闹铃功能,模式2为手动校时功能。
多功能电子钟共有三个按键,一个MODE模式选择键,用于选择相应的模式,一个SET时间选择键,用于选择当前设定的是分钟或者是小时,一个CHANGE键,用于给当前值加1,当长时间按住CHANGE时当前值连续快速加1,用于快速设定时间。
模式选择进程如下所示。
module
mode_select( clk,mode,set,change,count1,counta,count2,countb,led_min,led_ho ur,m);
input mode,set,change,clk;
output count1,counta,count2,countb,led_min,led_hour,m;
regbool,count1,counta,count2,countb;
reg [1:0]m;
reg led_min,led_hour;
always @(posedge mode)
begin
if (m==2) m<=0;
else m<=m+1;
end
always @ (posedge set)
bool<=~bool;
always @ (posedge clk)
begin
case(m)
2: begin
if (bool)
begin //手动设定分钟
count1<=change;
{led_min,led_hour}<=2'b10;
end
else
begin //手动设定小时
说明书
counta<=change;
{led_min,led_hour}<=2'b01;
end
{count2,countb}<=2'b00;
end
1:begin
if (bool)
begin //设定闹铃分钟
count2<=change;
{led_min,led_hour}<=2'b10;
end
else
begin //设定闹铃小时
countb<=change;
{led_min,led_hour}<=2'b01;
end
{count2,countb}<=2'b00;
end
default: ount1,count2,counta,countb,led_min,led_hour}<=0;
//正常时钟状态
endcase
end
endmodule
说明书
4.4快速时间设置功能模块
多功能数字钟要求有快速时间设置功能和慢设置功能。
所谓快速时间设置功能是指一直按住按键不放时,当前值能够快速的增加;而慢设置是指每按一次按键则当前值向上增一。
快速时间设置进程如下所示。
快速时间设置进程,功能描述:长时间按下“change”键,则分别生成num1、num2、num3、num4信号用于连续快速加1。
当长时间按下CHANGE按键后,利用系统的CLK_4HZ对计数器进行快速加一处理。
如果不是长时间按下CHANGE按键的话则每按一次CHANGE按建键就对相应的寄存器的值加一处理。
(本段的VerilogHDL代码详见符件)
4.5秒、分、时计时与时间调整模块
秒计时程序采用周期为1S的基准时钟信号CLK,在每个CLK时钟信号的上升沿对秒寄存器加1,当长时间按下SET按键后对秒寄存器进行清零,该功能用于准确校时。
Ct1为分计时的同步时钟,在每个CT1时钟信号的上升沿对分寄存器加1。
当未长时间按下CHANGE按键时,CT1时钟是周期为60秒的时钟信号。
当长时间按下CHANGE后,CT1时钟变为周期为4HZ的时钟信号,该信号用于快速时间校准功能。
CTA时钟是周期为60分钟的时钟信号,在每个cta时钟信号的上升沿对小时寄存器加1,当当前设置值为小时且长时间按下CHANGE按键后,CTA时钟变为周期为4HZ的时钟信号,该信号用于快速时间校准功能。
module
time_mode0(clk,set,m,count1,ct1,counta,m_clk,h_clk,cta,sec1,min1,hour1); input clk,set,m,count1,counta,ct1,cta,m_clk,h_clk;
inout [7:0]sec1,min1,hour1;
reg minclk,hclk;
reg [7:0]sec1,min1,hour1;
wire m_clk,h_clk;
always @(posedge clk)
begin
if (!(sec1 ^ 8'd59) | set & (!m))
//按住SET键一段时间,秒信号自动清零
sec1 [7:0] <= 8'h00;
if (!(set & (!m)))
说明书
minclk <=1'b1;
else begin
if (sec1[3:0]==4'b1001)
begin
sec1[3:0]<=4'b0000;
sec1[7:4]<=sec1[7:4] + 1'b1;
end
else
begin
sec1[3:0] <= sec1[3:0] + 1'b1;
minclk<=1'b0;
end
end
end
always @ (posedge ct1) //分钟计时进程begin
if (min1 == 8'd59)
begin
min1 <= 0;
hclk <= 1;
end
else
begin
if (min1[3:0] ==9)
begin
min1[3:0] <=0;
min1[7:4]<=min1[7:4] + 1;
end
else
begin
min1[3:0] <=min1[3:0] +1;
hclk <=0;
end
end
说明书
end
always @ (posedge cta) //小时计时与调整进程begin
if (hour1==8'h23) hour1<=0;
else begin
……… //此段源码见附件
end
end
endmodule
4.6闹铃时间设置模块
module alarm_set(ct2,ctb,amin,ahour);
input ct2,ctb;
output [7:0]amin,ahour;
reg [7:0]amin,ahour;
always @ (posedge ct2)
begin
if (amin==8'd59) amin<=0;
else if (amin[3:0]==9)
begin
amin[3:0]<=0;
amin[7:4]<=amin[7:4] + 1;
end
else amin[3:0]<=amin[3:0] + 1;
end
always @ (posedge ctb)
begin
if (ahour==8'd23) ahour<=0;
else if (ahour[3:0]==9)
begin
ahour[3:0]<=0;
ahour[7:4]<=ahour[7:4] + 1;
end
else ahour[3:0]<=ahour[3:0] + 1;
说明书
end
endmodule
4.7闹铃与整点报时模块
闹铃的功能是实现当到达预设的时间点时产生为时20S的“嘀嘀嘀嘀”急促短音。
整点报时的功能是实现在每个整点的5秒钟前产生整点报时音,报时音为“嘀嘀嘀---嘟”4短一长音。
module alarm(sysclk,clk_1k,min1,hour1,amin,ahour,alarm1,alarm2);
input sysclk,clk_1k;
input [7:0]min1,hour1,amin,ahour;
output alarm1,alarm2;
reg alarm1,alarm2;
reg [7:0]sec1;
always @ (posedge sysclk)
begin
if ((min1==amin)&&(hour1==ahour))
if (sec1<8'd20)
alarm1<=1;
else alarm1<=0;
else alarm1<=0;
end
always @ (posedge sysclk)
begin
if ((min1==8'd59)&&(sec1>8'd54)||(!(min1|sec1)))
if (sec1>8'd54) alarm2<=clk_1k; // 产生长音
else alarm2<=~clk_1k; //产生短音
else alarm2<=0;
end
endmodule
说明书
4.8 7段显示译码模块
由于时钟计数模式采用的是BCD码计数方式,而显示采用的8段发光二极管,每个段代表一位二进制数,在本系统中采用的是共阳极接法,因此7段码为共阳编码。
因此在数码管上正常显示时间的话,必需要对在三个模式下的时、分、秒进行译码才能得到正常的显示。
module
decoder_7seg(sysclk,clk,clk_4hz,clk_1k,m,alarm1,alarm2,ahour,amin,min1,hour 1,sec1,hour_msb,hour_lsb,min_msb,min_lsb,sec_msb,sec_lsb);
input sysclk,clk,clk_4hz,clk_1k, alarm1,alarm2;
input [7:0]ahour,amin,min1,hour1,sec1;
input [1:0]m;
output [7:0]hour_msb,hour_lsb,min_msb,min_lsb,sec_msb,sec_lsb;
reg [7:0]hour,min,sec,hour_msb,hour_lsb,min_msb,min_lsb,sec_msb,sec_lsb; wire led_alarm;
always @ (posedge sysclk)
begin
case(m)
3'b00: //在模式0下,将正常计数值赋值给寄存器,等待译码
begin
hour<=hour1;
min<=min1;
sec<=sec1;
end
3'b01: //在模式1下,将闹铃时间设置值赋值给寄存器,等待译码
begin
hour<=ahour;
min<=amin;
sec<=8'hzz;
end
3'b10: //在模式2下,将手动计数值赋值给寄存器,等待译码
begin
hour<=hour1;
min<=min1;。