多功能数字钟(电工课程设计)_第1页
多功能数字钟(电工课程设计)_第2页
多功能数字钟(电工课程设计)_第3页
多功能数字钟(电工课程设计)_第4页
多功能数字钟(电工课程设计)_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目录1 前言2 总体方案设计2.1 方案论述2.2 设计方式3 单元模块电路设计3.1 时间显示电路模块设计3.2 按键及指示灯电路模块的设计3.3 蜂鸣器及有源晶振电路的设计3.4 cpld 编程下载电路的设计3.5 电源电路电路的设计3.6 epm7128slc84 器件介绍4 cpld 编程设计4.1 系统信号的定义及顶层模块4.2 时钟节拍产生模块4.3 模式选择功能模块4.4 快速时间设置功能模块4.5 秒、分、时计时与时间调整模块4.6 闹铃时间设置模块4.7 闹铃与整点报时模块4.8 7 段显示译码模块4.9 led 显示模块5 系统功能及功能仿真5.1 系统功能5.2 功能仿真

2、5.2.1 时钟节拍产生模块的仿真波形5.2.2 模式选择功能模块的仿真波形5.2.3 闹铃设置功能模块的仿真波形5.2.4 7 段译码功能模块的仿真波形5.2.5 led 显示功能模块的仿真波形5.2.6 系统总体功能仿真波形6 设计总结7 参考文献附录:基于cpld 的多功能数字钟电路图1 前言我们已经进入了数字化和信息化的时代,其特点是各种数字产品的广泛应用。现代数字产品在性能提高、复杂度增大的同时,其更新换代的步伐也越来越快,实现这种进步的因素在于生产制造技术和电子设计技术的进步。生产制造技术以微细加工技术为代表,目前已进展到深亚微米阶段,可以在几平方厘米的芯片上集成数千万个晶体管。p

3、ld 器件和 eda 技术的出现, 改变了这种传统的设计思路,使人们可以立足于pld 芯片来实现各种不同的功能,新的设计方法能够由设计者自己定义器件内部逻辑和管脚,将原来由电路板设计完成的工作大部分放在芯片的设计中进行。这样不仅可以通过芯片设计实现各种逻辑功能,而且由于管脚定义的灵活性,减轻了原理图和印制板设计的工作量和难度,增加了设计的自由度,提高了效率。同时这种设计减少了所需芯片的种类和数量,缩小了体积, 降低了功耗, 提高了系统的可靠性。本设计是基于cpld的多功能数字钟设计。 硬件界面为一个6 位的 led 数码管,时间显示方式为6 位同时显示,即显示状态为:88:88:88。显示的时

4、间制为24小时制。三个时间设定按键,分别为mode 模式选择键, set 设定键和change 数值修改键。按键功能介绍:mode 按键用来选择当前数字钟的工作模式,系统正常工作在模式0 下, 即模式 0 为正常时钟模式。 当在正常时钟模式下第一次按下mode键时,系统进入模式1,即闹铃模式,在此模式下可以通过set和 change按键的配合使用来设定所需要的闹铃时间。当再一次按下mode 按键后系统进入手动校时模式,在此模式下通过set和 change 按键的配合使用,可以改变当前时间。set按键则用于在不同的模式下选择当前设定的位置,比如当前设定的位置是小时,则再一次按下set 按键后当前

5、设定的位置变为分钟。change按键用来将当前设定位置的时间值加1,当长时间按下change 按键时,当前设定值为连续快速加1,此功能用于快速设定时间。系统带四个指灯电路,一个为电源指示灯,其他三个为工作状态指示灯,即分别为led_alarm、led_hour 和 led_min 。led_alarm 用于指示当前是否设有闹铃,当led_alarm 指示灯亮时表明当前设有闹铃。led_hour 和 led_min 用于指示当前设定的是时间的小时还是分钟,当 led_hour指示灯亮时表明此时设定的是时间的小时值,当 led_min 指示灯亮时表明此时设定的是时间的分钟值。闹铃的功能是实现当到达

6、预设的时间点时产生为时20s 的“ 嘀嘀嘀嘀 ” 急促短音。整点报时的功能 title= 下一页 | 是实现在每个整点的5 秒钟前产生整点报时音,报时音为“ 嘀嘀嘀 - 嘟”4短一长音。2 总体方案设计2.1 方案论述本设计是基于cpld的多功能数字钟设计。 硬件界面为一个6 位的 led 数码管,时间显示方式为6 位同时显示,即显示状态为:88:88:88。显示的时间制为24小时制。三个时间设定按键,分别为mode 模式选择键, set 设定键和change 数值修改键。按键功能介绍:mode 按键用来选择当前数字钟的工作模式,系统正常工作在模式 0 下,即模式 0 为正常时钟模式。 当在正

7、常时钟模式下第一次按下mode 键时,系统进入模式1,即闹铃模式,在此模式下可以通过set 和 change 按键的配合使用来设定所需要的闹铃时间。当再一次按下mode 按键后系统进入手动校时模式,在此模式下通过set 和 change 按键的配合使用,可以改变当前时间。set按键则用于在不同的模式下选择当前设定的位置,比如当前设定的位置是小时,则再一次按下 set 按键后当前设定的位置变为分钟。change 按键用来将当前设定位置的时间值加 1,当长时间按下change 按键时,当前设定值为连续快速加1,此功能用于快速设定时间。系统带四个指示灯电路,一个为电源指示灯,其他三个为工作状态指示灯

8、,即分别为 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 、模式选择

9、功能模块mode_select.v 、快速时间设置功能模块fast_settime.v 、秒、分、时计时与时间调整模块time_mode0.v 、闹铃时间设置模块alarm_set.v 、闹铃与整点报时模块alarm.v 、7 段显示译码模块decoder_7seg.v以及 led 显示功能模块display.v 。2.2 设计方式topdown 设计,即自顶向下的设计。这种设计方法首先从系统设计入手,在顶层进行功能方框图的划分和结构设计。在功能级进入仿真和纠错,并用硬件描述语言对高层次的系统行为进行描述,然后用综合工具将设计转化为具体门电路网表,其对应的物理实现可以是pld 器件或专用集成电

10、路。由于设计的主要仿真和调试过程是在高层次上完成的,这一方面有利于早期发现结构上的错误,避免设计工作的浪费,同时也减少了逻辑功能仿真的工作量,提高了设计的一次成功率。整个设计的设计方式采用top-down 设计方法。多功能数字钟设计分为1 个顶层模块和8 个功能子模块。顶层模块名称为clock.v。各功能子模块分别为:系统分频功能模块clk_generate.v 、模式选择功能模块mode_select.v 、快速时间设置功能模块fast_settime.v 、秒、分、时计时与时间调整模块time_mode0.v 、闹铃时间设置模块alarm_set.v 、闹铃与整点报时模块alarm.v 、

11、7 段显示译码模块decoder_7seg.v以及 led 显示功能模块display.v 。图 2.1 整个系统的模块划分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 的发射结正向偏置,集电结反向偏置,因此三极管处于导通状态

12、,此时有vce0.20.3v 。反之当q1 的基极为高电平时q1 截止。 q1、 q2、q3 q6 的基极( led0led5 )分别接cpld的 pin74 、pin73 、pin70 、| | pin69、pin68 、pin67 ,分别作为led 数码管的位选端。图 3.1 led 显示电路led 的显示方式有静态显示和动态方式两种工作方式。led 显示器工作于静态显示方式时,各位的共阴极(或共阳极)连接在一起并接地(或+5v );每位的段码线( adp )分别与一个8 位的锁存器输出相连。之所以为静态显示,是因为各个led 的显示字符的字符一经确定,相应锁存器锁存的段码输出将维持不变,

13、直到送入另一个字符的段码为止。正因为如此,静态显示器的亮度都较高。但是因为静态显示方式下, 各位 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/

14、o 口输出的段码对各个显示位来说都是相同的。因此,在同一时刻,如果各位位选线都处于选通状态的话六位led 将显示相同的字符。 若要各位led 能同时显示出与本位相应的显示字符,就必须采用动态显示方式,即在某一时刻,只让某一位的位选线处于选能状态,而其他各位的位选处于关闭状态,同时,段码线上输出相应的要显示的字符段码。这样,在同一时刻,六位led 中只有选通的那一位显示出字任,而其它四位则是熄灭的。同样在下一时刻,只让下一位的位选线处于选通状态,而其它各位的位选线处于关闭状态,在段码线上输出将要显示字符的段码,则同一时刻,只有选通位显示相应的字符。而其它各位是熄灭的。如此循环下去,就可以使各位显

15、示出将要显示的字符。图 3.1 所示三位数码显示管,常用的 led 显示器为 8 段。每一个段对应一个发光二极管。这种显示器有共阳极和共阴极2 种。共阴极led 显示器的发光二极管的阴极连接在一起,通常此公共阴极接地。当某个发光二极管的阳极为高电平时,发光二极管点亮,相应的段被显示。同样,共阳极led 显示器的发光二极管的阳极连接在一起,通常此公共阳极接正电压,当某个发光二极管的阴极接低电平时,发光二极管被点亮,相应的段被显示。六位 led 显示器有6 位位选线和48 根段码线。段码线控制显示字符的字型,而位选线为各个led 显示位中各段的公共端,它控制该led 显示位的亮或暗。led显示器工

16、作于静态显示方式时,各位的共阴极或共阳极连接在一起并接地或+5v 。在多位显示时,为简化硬件电路,通常将所有位的段码线相应段并联在一起,由一个 8 位 i/o 口控制,形成段码线的多路复用。由于各位段码线并联,8 位 i/o 口输出的段码对各个显示字符来说都是相同的,因此,在同一时刻,如果各位位选线都外于选通状态的话,6 位 led 将显示相同的字符,就必需采用动态显示方式,即在某一时刻, 只让某一位的位选线外于选通状态,而其他各位的位选线外于关闭状态,同时段码线上输出相应位要显示字符的段码。这样在同一时刻,6 位 led 中只有选通的那一位显示出字符,而其他5 位是熄灭的。同样在下一时刻,只

17、让下一位的位选线外于选通状态,而其他各位的位选线处于关闭状态,在段码线上输出将要显示字符的段码, 则同一时刻, 只有选通位显示出相应的字任,而其他各位刚是熄灭的。如此循环下去,就可以使各位显示出将要显示的字符。虽然这些字符是在不同时刻出现的,但由于人的视觉暂留作用而感到同时显示。3.2 按键及指示灯电路模块的设计根据电子电路常识,采用灌电流工作方式的电路的功耗要比采用拉电流方式工作的电路小。 因此本设计中所有的外部键盘,指示二极管均采用灌电流的工作方式。当多功能数字钟的| | 按键未按下时按键的输出(即 cpld 的输入)为低电平,当按键按下时输出(即cpld 的输入)为高电平。在本设计中只有

18、三个按键,分别为mode、 set、change。mode 按键用于模式选择,按下一次mode 按键后电路进入闹铃设置模式,在该模式下可以用set键来选择当前是设置小时还是设置分钟,而用 change 键可以改变当前设置闹铃的小时或分钟(向上加一)。再按一次mode 键则进入手动校时功能模式。按键电路如图 3.2 所示。图 3.2 按键电路在本设计中共有四个指示灯,一个为电源指示灯,其它三个是工作状态指示灯,d1 为闹铃报警指示电路,当设置闹铃后闹铃指示电路就工作在点亮状态,指示当前设有闹铃。 d2 和 d3 用来指示当前设置状态。当在闹铃设置模式和手动校时模式下,d2 或 d3 会有一个在点

19、亮状态,当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

20、的有源晶体振荡器。为了使有源晶振能输出较好的波形,必需保证供电的稳定。所以在晶振电路的前端加了两个小电容对电源进行滤波,在时钟输出端加了一个小电阻,能有效地抑制高次谐波和实现阻抗匹配。有源晶振电路如图3.5 所示。图 3.5 有源晶振电路3.4 cpld 编程下载电路的设计cpld器件多采用jtag 编程方式, jtag 编程方式是在线编程,传统生产流程中先对芯片进行预编程现再装到板上因此而改变,简化的流程为先固定器件到电路板上,再用jtag 编程 ,从而大大加快工程进度。jtag 接口可对psd 芯片内部的所有部件进行编程。在硬件结构上,jtag 接口包括两部分:jtag 端口和控制器。与j

21、tag 接口兼容的器件可以是微处理器(mpu)、微控制器( mcu)、pld、cpl、fpga、asic 或其它符合ieee1149.1 规范的芯片。 ieee1149.1 标准中规定对应于数字集成电路芯片的每个引脚都设有一个移位寄存单元,称为边界扫描单元bsc。它将 jtag 电路与内核逻辑电路联系起来,同时隔离内核逻辑电路和芯片引脚。由集成电路的所有边界扫描单元构成边界扫描寄存器bsr。边界扫描寄存器电路仅在进行jtag 测试时有效, 在集成电路正常工作时无效,不影响集成电路的功能。jtag 编程方式对cpld和 fpga 器件都支持,用于cpld器件的下载文件是pof 文件。 jtag

22、下载电路如图 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

23、.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

24、。2 变压器输入功率的计算:假设负载电流为500ma ,若输出电压为5v,则有效功率为5v*0.5a=2.5w。正常情况下变压器输出功率约为9v*1.2*1.5a=5.4w,当市网电压升到250v时,变压器的输出功率为5.4w*250/220=6.2w。小型电源变压器的效率一般为75% 左右。因此电源变压器的输入功率为6.2w/0.75=8.27w。3 虑波电容参数的选取:假设负载电流为500ma ,若输出电压为7.5v,则等效负载电阻为15。电源频率为50hz ,则 t=0 。02s,根据 crl= ( 35 )t/2 ,则 c= (35 )t/2/rl=20003300uf。在本设计中取2

25、200uf 。3. 电容耐压应大于1.42*vac即 vc=1.42*9*250/220=14.5v(其中 250/220是考虑市网电源电压过高时的情况。在本设计中电容耐压值取16v。3.6 epm7128slc84 器件介绍本次设计的核心器件采用altera 公司的 cpld可编程器件。altera 公司的max7000s 系列 cpld有着较高的性价比。max7000s 系列是基于altera 第二代max 架构的高密度、高性能的pld 器件。 max7000 器件包含32256 个可联结成16 个宏单元组的逻辑阵列块的宏单元。epm7128slc84 是 max7000s 家族成员之一,

26、它有如下的特点:可用逻辑门个数为 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时为设定闹钟模式, m

27、ode=2时为手动设定时间模式;set: 外接按键,用于在手动设置时间时选择是调整小时还是分钟;若长时间按住该键,还可以使秒信号清零,用于精确调整时间;change: 外接按键, 手动调整时间, 每按一次计数器加1;若长时间按住则连续快速加 1,用于快速调时和定时;alarm :接蜂鸣器,输出到蜂鸣器的信号,用于产生闹铃音和报时音;闹铃音为持续 20s 的急促的 “ 嘀嘀嘀 ” 音,整点报时音为“ 嘀嘀嘀 - 嘟” 四短一长音;dataout: 输出信号,输出显示时间的数码管显示的段码。include clk_generate.v include time_mode0.v include mo

28、de_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

29、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 的时钟 dis

30、playclk 。其中 clk节拍用于产生秒计时信号,在每个clk 的上升沿到来时秒计数器加1。clk_4hz 节拍用于快速调整时间, 当长时间按下chang 按键时,当前设置的时钟快速增加。| | clk_1k节拍用于闹铃音的产生,displayclk 时钟节拍是频率为50hz 的信号,由于本设计中显示部分采用led 动态显示的方式,因此必需要有一个扫描信号对6 位的 led 的每个位进行轮流选通点亮。分频进程的原理是在 cpld内部设置一个分频计数器和一个触发器,当计数到分频值时触发器进行翻转,因此只要设置不同的分频计数器的计数值就可以得到不同的时钟节拍。在cpld内部设置分频计数器的缺点

31、是,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:0div_count1; / 分频时钟计数器,用于产生

32、周期为1s 的时钟信号reg 19:0div_count2; / 分频时钟计数器,用于产生频率为4hz 的时钟信号reg 11:0div_count3; / 分频时钟计数器,用于产生频率为1khz 的时钟信号reg 14:0divclk_cnt; / 分频时钟计数器,用于产生50hz 的数码管扫描信号displayclk always (posedge sysclk) begin if (reset) div_count1=21d0000000; if (div_count1=21d1024000) /1024000/2048000=0.5s begin clk=clk; /clk为周期为 1

33、s 的时钟信号div_count1=21d0000000; end else begin div_count1=div_count1+1b1; end end always (posedge sysclk) begin if (reset) div_count2=20d000000; if (div_count2=20d256000) /512000/2048000=0.25s begin clk_4hz=clk_4hz; /clk_4hz为 4hz 的时钟信号div_count2=20d000000; end else begin div_count2=div_count2+1b1; end

34、 end always (posedge sysclk) begin / 产生周期为50hz 和 1khz 的时钟节拍end endmodule 4.3 模式选择功能模块本设计是多功能数字钟,实现的功能是以数字形式显示时、分、秒的时间,能进行手动快校时、快校分或慢校时、慢校分。该多功能电子共有3 种模式。分别为:模式 0 为正常时钟模式,模式1 为设置闹铃功能,模式2 为手动校时功能。多功能电子钟共有三个按键,一个mode 模式选择键,用于选择相应的模式,一个set 时间选择键,用于选择当前设定的是分钟或者是小时,一个change 键,用于给当前值加 1,当长时间按住change时当前值连续快

35、速加1,用于快速设定时间。模式选择进程如下所示。module mode_select( clk,mode,set,change,count1,counta,count2,countb,led_min,led_hour,m); input mode,set,change,clk; output count1,counta,count2,countb,led_min,led_hour,m; regbool,count1,counta,count2,countb; reg 1:0m; reg led_min,led_hour; always (posedge mode) begin if (m=2)

36、 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=2b10; end else begin / 手动设定小时counta=change; led_min,led_hour=2b01; end count2,countb=2b00; end 1:begin if (bool) begin / 设定闹铃分钟count2=change; led_

37、min,led_hour=2b10; end else begin | | ; /设定闹铃小时countb=change; led_min,led_hour=2b01; end count2,countb=2b00; end default: ount1,count2,counta,countb,led_min,led_hour=0; / 正常时钟状态endcase end endmodule 4.4 快速时间设置功能模块多功能数字钟要求有快速时间设置功能和慢设置功能。所谓快速时间设置功能是指一直按住按键不放时,当前值能够快速的增加;而慢设置是指每按一次按键则当前值向上增一。快速时间设置进程如

38、下所示。快速时间设置进程,功能描述:长时间按下 “change”键,则分别生成num1 、num2 、num3 、num4 信号用于连续快速加 1。当长时间按下change 按键后,利用系统的clk_4hz 对计数器进行快速加一处理。如果不是长时间按下change按键的话则每按一次change 按建键就对相应的寄存器的值加一处理。(本段的veriloghdl 代码详见符件)4.5 秒、分、时计时与时间调整模块秒计时程序采用周期为1s 的基准时钟信号clk,在每个clk 时钟信号的上升沿对秒寄存器加1,当长时间按下set按键后对秒寄存器进行清零,该功能用于准确校时。 ct1 为分计时的同步时钟,

39、在每个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)

40、; input clk,set,m,count1,counta,ct1,cta,m_clk,h_clk; inout 7:0sec1,min1,hour1; reg minclk,hclk; reg 7:0sec1,min1,hour1; wire m_clk,h_clk; always (posedge clk) begin if (!(sec1 8d59) | set & (!m) / 按住 set 键一段时间,秒信号自动清零sec1 7:0 = 8h00; if (!(set & (!m) minclk =1b1; else begin if (sec13:0=4b100

41、1) begin sec13:0=4b0000; sec17:4=sec17:4 + 1b1; end else begin sec13:0 = sec13:0 + 1b1; minclk=1b0; end end end always (posedge ct1) / 分钟计时进程begin if (min1 = 8d59) begin min1 = 0; hclk = 1; end else begin if (min13:0 =9) begin min13:0 =0; min17:4=min17:4 + 1; end else begin min13:0 =min13:0 +1; hclk

42、 =0; end end end always (posedge cta) / 小时计时与调整进程begin if (hour1=8h23) hour1=0; else begin / 此段源码见附件end end endmodule 4.6 闹铃时间设置模块module alarm_set(ct2,ctb,amin,ahour); input ct2,ctb; output 7:0amin,ahour; reg 7:0amin,ahour; always (posedge ct2) begin if (amin=8d59) amin=0; else if (amin3:0=9) begin

43、amin3:0=0; amin7:4=amin7:4 + 1; end else amin3:0=amin3:0 + 1; end always (posedge ctb) begin if (ahour=8d23) ahour=0; else if (ahour3:0=9) begin ahour3:0=0; ahour7:4=ahour7:4 + 1; end else ahour3:0=ahour3:0 + 1; end endmodule 4.7 闹铃与整点报时模块闹铃的功能是实现当到达预设的时间点时产| | 生为时 20s 的 “ 嘀嘀嘀嘀 ” 急促短音。 整点报时的功能是实现在每个

44、整点的 5 秒钟前产生整点报时音,报时音为“ 嘀嘀嘀 - 嘟”4短一长音。module alarm(sysclk,clk_1k,min1,hour1,amin,ahour,alarm1,alarm2); input sysclk,clk_1k; input 7:0min1,hour1,amin,ahour; output alarm1,alarm2; reg alarm1,alarm2; reg 7:0sec1; always (posedge sysclk) begin if (min1=amin)&(hour1=ahour) if (sec18d20) alarm1=1; else

45、 alarm1=0; else alarm18d54)|(!(min1|sec1) if (sec18d54) alarm2=clk_1k; / 产生长音else alarm2=clk_1k; / 产生短音else alarm2=0; end endmodule 4.8 7 段显示译码模块由于时钟计数模式采用的是bcd 码计数方式,而显示采用的8 段发光二极管,每个段代表一位二进制数,在本系统中采用的是共阳极接法,因此7 段码为共阳编码。因此在数码管上正常显示时间的话,必需要对在三个模式下的时、分、秒进行译码才能得到正常的显示。module decoder_7seg(sysclk,clk,cl

46、k_4hz,clk_1k,m,alarm1,alarm2,ahour,amin,min1,hour1,sec1,hour_msb,hour_lsb,min_msb,min_lsb,sec_msb,sec_lsb); input sysclk,clk,clk_4hz,clk_1k, alarm1,alarm2; input 7:0ahour,amin,min1,hour1,sec1; input 1:0m; output 7:0hour_msb,hour_lsb,min_msb,min_lsb,sec_msb,sec_lsb; reg 7:0hour,min,sec,hour_msb,hour_

47、lsb,min_msb,min_lsb,sec_msb,sec_lsb; wire led_alarm; always (posedge sysclk) begin case(m) 3b00: / 在模式 0 下,将正常计数值赋值给寄存器,等待译码begin hour=hour1; min=min1; sec=sec1; end 3b01: / 在模式 1 下,将闹铃时间设置值赋值给寄存器,等待译码begin hour=ahour; min=amin; sec=8hzz; end 3b10: / 在模式 2 下,将手动计数值赋值给寄存器,等待译码begin hour=hour1; min=mi

48、n1; sec=8hzz; end endcase assign led_alarm=(ahour|amin)?1:0; / 指示是否进行了闹铃定时assign alarm=(alarm1)?clk_1k&clk_4hz:0)|alarm2;/产生闹铃音或整点报时音end always ( sysclk ) begin case (hour7:4) 4b0000 : hour_msb=8hc0; / 数字 0 的共阳编码赋值给小时的十位4b0001 : hour_msb=8hf9; / 数字 1 的共阳编码赋值给小时的十位4b0010 : hour_msb=8ha4; / 数字 2 的

49、共阳编码赋值给小时的十位4b0011 : hour_msb=8hb0; / 数字 3 的共阳编码赋值给小时的十位4b0100 : hour_msb=8h99; / 数字 4 的共阳编码赋值给小时的十位4b0101 : hour_msb=8h92; / 数字 5 的共阳编码赋值给小时的十位4b0110 : hour_msb=8h82; / 数字 6 的共阳编码赋值给小时的十位4b0111 : hour_msb=8hf8; / 数字 7 的共阳编码赋值给小时的十位4b1000 : hour_msb=8h80; / 数字 8 的共阳编码赋值给小时的十位4b1001 : hour_msb=8h90;

50、/ 数字 9 的共阳编码赋值给小时的十位endcase case (hour3:0) 4b0000 : hour_lsb=8hc0; / 数字 0 的共阳编码赋值给小时的个位4b0001 : hour_lsb=8hf9; / 数字 1 的共阳编码赋值给小时的个位4| | b0010 : hour_lsb=8ha4; / 数字 2 的共阳编码赋值给小时的个位4b0011 : hour_lsb=8hb0; / 数字 3 的共阳编码赋值给小时的个位4b0100 : hour_lsb=8h99; / 数字 4 的共阳编码赋值给小时的个位4b0101 : hour_lsb=8h92; / 数字 5 的共

51、阳编码赋值给小时的个位4b0110 : hour_lsb=8h82; / 数字 6 的共阳编码赋值给小时的个位4b0111 : hour_lsb=8hf8; / 数字 7 的共阳编码赋值给小时的个位4b1000 : hour_lsb=8h80; / 数字 8 的共阳编码赋值给小时的个位4b1001 : hour_lsb=8h90; / 数字 9 的共阳编码赋值给小时的个位endcase / 此段分别将min7:0 和 sec7:0 进行译码,编码方式与上述方式一样endmodule 4.9 led 显示模块led 显示电路与cpld的接口电路共有两种接法,一种接法是静态显示法,即外接 6 个独

52、立的一位led 数码管, 在这种接法下每一位led 的段码线共有8 根,因此采用这种接法时总共需要6*8+6=54个 i/o 口,而采用这种接法时,分配i/o 工作烦琐,且电路图接线复杂。而第二种接法称为动态显示法,采用共阳或共阴极接法,而所谓的共阳极接法是指将每位led 的段码线连在一起共同接电源的正极,因此采用这种接法时,一个 6 位的 led 总共只需要8+6=14个 i/o 口,即 8 位的段码线和 6 位的位选线,采用这种方式的接法时,缺点是每次显示时6 位 lde 同时显示相同的数字,因此在这种接法下,必需要采用扫描的方式来显示,即每一个时刻只能有一个 led 处在点亮的状态,其它

53、led 熄灭,此时送出相应位的段码。而在下一时刻则下一位led 处于点亮状态,且在此时送出相应的段码,如此循环往复就能显示完 6 个不同的数字。因此采用这种接法时必需要有一个扫描信号来选择当前哪一位 led 处于点亮状态。module display(displayclk,reset,ledselect,dataout,hour_msb,hour_lsb,min_msb,min_lsb,sec_msb,sec_lsb); input displayclk,reset; input 7:0hour_msb,hour_lsb,min_msb,min_lsb,sec_msb,sec_lsb; out

54、put 5:0ledselect; output 7:0dataout; reg 7:0dataout; reg 5:0ledselect; reg 2:0state; always (posedge displayclk) begin if (reset=0) / 复位信号用于波形仿真时对分频计数器初始化begin state2:0=3b000; ledselect= 6b000000; end else begin case(state) 3b000: begin ledselect=6b011111; /数码管的第一位(小时的十位)被点亮dataout=hour_msb; / 显示当前时

55、间的小时十位state = 3b001; end 3b001: begin ledselect=6b101111;/数码管的第二位(小时的个位)被点亮dataout=hour_lsb; / 显示当前时间的小时个位state = 3b010; end 3b010: begin ledselect=6b110111;/数码管的第三位(分的十位)被点亮dataout=min_msb;/显示当前时间的分的十位state = 3b011; end 3b011: begin ledselect=6b111011;/数码管的第四位(分的个位)被点亮dataout=min_lsb; / 显示当前时间的分的个位state = 3b100; end 3b100: begin ledselect=6b111101;/数码管的第五位(秒的十位)被点亮dataout=sec_msb;/显示当前时间的秒的十位state = 3b101; end 3b101: begin ledselect=6b111110;/数码管的第六位(秒的个位)被点亮dataout=sec_lsb;/显示当前

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论