数字闹钟的设计

基于VHDL 的数字闹钟设计

基于VHDL 的数字闹钟设计

摘要

随着EDA 技术的发展和应用领域的扩大与深入,EDA 技术在电子信息、通信、自动控制及计算机应用领域的重要性日益突出。EDA 技术就是以计算机为工具,设计者在EDA 软件平台上,用硬件描述语言HDL 完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。本设计介绍了基于VHDL 硬件描述语言设计的多功能数字闹钟的思路和技巧,并在Quartus II开发环境中编译和仿真所设计的程序,并逐一调试验证程序的运行状况。仿真和验证的结果表明,该设计方法切实可行,该数字闹钟可以实现调时定时闹钟功能具有一定的实际应用性。

关键词: VHDL ;FPGA ;闹钟;Quartus II

1

基于VHDL 的数字闹钟设计

Digital alarm clock design base on VHDL

Abstract

The EDA (Electronic Design Automation) technology is experiencing a huge development and it widely spreads in its application field, thus emphasizes its importance in electronic message, communication, auto control and computer application gradually. EDA technology use computer as tool, designer is enabled to design files on the EDA platform with the help of HDL (Hardware Description Language). The computer automatically finishes tasks like logic compiling, simplication, division, colligation, optimization, distribution, wiring and simulation afterwards, and finally manages the match, compiling, mapping and download to a target chip. This project bases on the perspective and technique of multifunctional digital alarm clock of VHDL (Very-High-Speed Integrated Circuit Hardware Description Language). And then compiles and simulates the program it designed in the Quartus II environment. In addition, it adjusts and tests the program condition. The results of simulation and test imply the practicability of this project and the applicability of the timing function of digital alarm clock.

Key words: VHDL, FPGA, Alarm clock ,Quartus II

2

基于VHDL 的数字闹钟设计

目录

1 绪论

1.1 选题背景 2 设计目的 3 设计要求 4 设计原理:

4.1 功能描述 4.2 基本原理 5 设计内容:

5.1 分频模块 5.2 计数器模块

5.2.1 秒计数器模块

5.2.2 分计数器模块 5.2.3 时计数器模块

5.3 选择模块 5.4 闹钟模块 5.5 闹钟功能模块 5.6显示

6 数字闹钟原理方框图 7 调试步骤 8 结论 参考文献 附录A 致谢

3

基于VHDL 的数字闹钟设计

4

基于VHDL 的数字闹钟设计

1 绪论

1.1 选题背景

21新世纪,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。

时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。但是,一旦重要事情,一时的耽误可能酿成大祸。例如,许多火灾都是由于人们一时忘记了关闭煤气或是忘记充电时间。而数字闹钟能随时提醒这些容易忘记时间的人。钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、定时启闭电路、定时开关烘箱、通断动力设备,甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。因此,研究数字钟及扩大其应用,有着非常现实的意义。

随着EDA 技术的发展和应用领域的扩大与深入,EDA 技术在电子信息、通信、自动控制及计算机应用领域的重要性日益突出。EDA 技术就是以计算机为工具,设计者在EDA 软件平台上,用硬件描述语言VHDL 完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。本文介绍了基于VHDL 硬件描述语言设计的多功能数字闹钟的思路和技巧。在Quartus II开发环境中编译和仿真了所设计的程序,并逐一调试验证程序的运行状况。仿真和验证的结果表明,该设计方法切实可行,该数字闹钟可以实现调时定时闹钟功能具有一定的实际应用性。

5

基于VHDL 的数字闹钟设计

2 设计目的

1. 熟练利用VHDL 硬件描述语言进行数字系统设计; 2. 掌握数字系统的设计方法——自顶向下的设计思想; 3. 掌握Quartus II开发软件的使用方法; 4. 掌握FPGA/CPLD芯片的工作原理;

5. 根据数字闹钟的功能要求设计一个数字闹钟; 6. 掌握闹钟系统的原理。

3 设计要求

设计一个简单的数字闹钟,它的具体功能为:

(1) 计时功能:这是本计时器设计的基本功能,可进行时、分、秒计时,并显示。 (2) 清零功能:按下此键后计数器清零,数码管显示“0”;松开此键数码管开始显“00 -00-00”,并且以此开始重新计时;

(3) 调时调分功能:当需要校时,可通过实验箱上的按键控制; (4) 闹钟开/关功能:为避免闹钟天天响,设计了闹钟开启/关闭功能;

(5) 闹钟功能:开启闹钟功能后,通过闹钟键设置好铃响时间,时间到铃声响起,如果此时按下停止键,闹钟马上停止;如果按下忽略键,闹钟停止,并会在3分钟后重新响起,循环5次;什么都不按,闹钟响一分钟后停止,隔天再响,直到按下开启键关闭闹钟。

4 设计原理

4.1功能描述

数字钟是一计时的工具,有着广泛的用途。本实验的数字钟要求有三个功能按钮:一个是清零按钮reset ,当按下此按钮时,数字钟显示有位都清零.二是调分钟的按钮 setmin ,当按下此按钮时分钟会以1HZ 的频率速度进行调时,而且在调分钟时秒钟会暂停不动;三是调小时的按钮sethour ,当按下此按钮时时钟会以1HZ 的频率速度进行调时,在调小时时分钟会暂停不动,但秒钟是正常记时的。

6

基于VHDL 的数字闹钟设计

另外还有一个闹钟模块,在闹钟模块中,先按下闹钟开启键,按下调时或调分键时,数码显示管显示所调闹钟的时间,并进行调时或调分。当两个键都未按下时,数码管显示数字钟的时间。当设定的闹钟时间和数字钟的时间一致时,铃声响起。在铃声响起时,按下PASS 键,铃声停止响起,三分钟后闹钟再次响起,如此循环5次;按下STOP 键时,铃声停止工作;什么都不按,铃声响起一分钟后停止,隔天再响,直到按下闹钟开/关键。其余时间喇叭不叫。

4.2基本原理

在本实验中用到的主要元件有计数器,分频器,报时器, 选择器和译码器等。控制逻辑主要是用来实现计数和清零。基本方框图如图4.1:

图4.1 数字闹钟原理框图

7

基于VHDL 的数字闹钟设计

数字闹钟外观草图如图4.2所示:

图4.2 数字闹钟外观草图

5 设计内容

5.1分频模块

此模块定义一个全局时钟,用频率为6MHz 的信号源经分频从clk 进入模块,经分频后由clk6输出,得到一个1Hz 的时钟脉冲,用于驱动数字钟工作。分频模块和波形仿真如下图5.1(a)和5.1(b)所示:

图5.1(a) 分频模块

8

基于VHDL 的数字闹钟设计

图5.1(b) 分频模块波形仿真图

分频模块在计数器计数到2999999的时候再来一个高电平, 计数器加1,输出口clk6

翻转,由低电平翻转成高电平,但仿真只能看到1us 的情况,所以仿真未能看到其翻转,但是由图5.1(b)可知,在500ms 前为低电平,在500ms 时翻转为高电平,可判定该模块可行。

5.2 计数器模块

此模块包括秒计数器、分计数器、时计数器以及功能按键的设计。 程序说明:

1. 由分频模块产生1Hz 的时钟信号,输入计数60的秒计数器模块电路,等计数至60的瞬间,进位至计数60的分计数器模块电路加1,同时秒计数器模块电路也清除为0再重新计秒。

2. 分计数器模块电路和时计数器模块电路功能基本相似。时计数器模块电路计数为24,在计数至23的时,再来一个高电平,计数器模块全部清0, 再重新计数。

3. 三组计数电路中的计分和计时数据传给闹钟模块,通过闹钟模块再和计秒数据一起传给位选模块,位选模块产生一组输出信号,而控制这个输出的信号为SEL[2..0]。

4. 由于取得的信号不论是时、分、秒,都将以十进制表示,所以先将这个十进制表示的时、分、秒转换成两个数位的BCD 码。

5.2.1 秒计数器模块

秒计数模块和秒计数模块的波形仿真如下图5.2.1(a)和5.2.1(b)所示:

9

基于VHDL 的数字闹钟设计

图5.2.1(a) 秒计数模块

图5.2.1(b) 秒计数模块波形仿真图

模块功能介绍:

clk 是时钟型号输入端;reset 是清零键,低电平有效;setmin 是分钟调时按键,高电平有效;enmin 是进位输出端;daout[6..0]是显示输出端,连接位选模块,再经显示模块译码后输出显示在七段码上。

从图5.2.1(b)可以看出,当按下reset 键时,计数器清零,重新计数;按下setmin 键时,daout[6..0]是显示输出端输出的信号不变,同时enmin 进位输出端输出与时钟信号周期相同的脉冲信号,进入分钟计数模块,驱动分钟模块工作;当计数器计数到59时,再来一个脉冲模块清零,并且重新计数。由此可以判定,该模块能实现全部预想功能,程序编写正确。

5.2.2 分计数器模块

分计数模块和分计数模块的波形仿真如下图5.2.2(a)和5.2.2(b)所示:

10

基于VHDL 的数字闹钟设计

图5.2.2(a) 分计数模块

图5.2.2(b) 分计数模块波形仿真图

模块功能介绍:

clk 是时钟信号输入端;clk1是秒进位信号输入端,秒钟算到60时发出一个进位脉冲,驱动分钟计数模块加1;reset 是清零键,与秒钟计数模块的清零键是同一个键。sethour 是时钟调时按键,高电平有效;enhour 是进位输出端,功能与秒钟计数模块的相同;daout[6..0]是显示输出端,连接闹钟模块,再连接位选模块,经显示模块译码后输出显示在七段码上。

从图5.2.2(b)可以看出,clk1输入秒钟模块的进位信号,daout[6..0]输出端输出分钟计数信号。当按下reset 时daout[6..0]输出端清零,再次重新计数。按下sethour 时,enhour 输出频率与时钟信号相同的脉冲,用于使时计数模块计数增加,达到调时的目的。当分计数器计到60时,enhour 输出一个高电平,分计数器重新计时,同时时计数器加1。由此可以判定,该模块能实现全部预想功能,程序编写正确。

5.2.3 时计数器

11

基于VHDL 的数字闹钟设计

时计数模块和时计数模块的波形仿真如下图5.2.3(a)和5.2.3(b)所示:

图5.2.3(a) 时计数模块

图5.2.3(b) 时计数模块波形仿真图

模块功能介绍:

clk 是进位信号,有分钟模块输出;resets 是清零键;daout[5..0]是显示输出端,连接闹钟模块,再连接位选模块,经显示模块译码后输出显示在七段码上。

由图5.2.3(b) 时计数模块波形仿真图可以看出,当按下resets 清零键时,daout[5..0]是显示输出端清零并且重新计数。此可以判定,该模块能实现全部预想功能,程序编写正确。

5.3 选择器模块

选择器模块和选择器模块的波形仿真如下图5.3(a)和5.3(b)所示:

12

基于VHDL 的数字闹钟设计

图5.3(a) 选择器模块

图5.3(b) 选择器模块波形仿真图

模块功能介绍:

clk 电源信号输入端,输入的是分频前得频率为6MHz 的信号,选择模块工作频率为6MHz ;reset 是清零键;低电平有效;sec[6..0]、min[6..0]、hour[5..0]是分别从秒钟计数模块、分钟计数模块、时钟计数模块引入的待显示的信号:

SEL[5..0]=011111时输出sec[3..0];

SEL[5..0]101111时输出0和sec[6..4];

SEL[5..0]=110111时输出min[3..0];

SEL[5..0]=111011时输出0和min[6..4];

13

基于VHDL 的数字闹钟设计

SEL[5..0]=111101时输出hour[3..0];

SEL[5..0]=111110时输出00和hour[5..4];

SEL[5..0]为其他数字,则显示符号“-”。

从图5.3(b)可以看出,当SEL[5..0]=011111时,daout[3..0]输出为0011,与sec[3..0]输出的相同。此可以判定,该模块能实现全部预想功能,程序编写正确。

5.4 闹钟模块

闹钟模块和闹钟模块的波形仿真如下图5.4(a)和5.4(b)所示:

图5.4(a) 闹钟模块

5.4(b) 闹钟模块的波形仿真图

模块功能介绍:

clk输入1Hz 的时钟信号,setmin1和sethour1是调分和调时键,低电平有效;dain 和dainl 是分钟信号和时钟信号输入;sp2是闹钟信号输出;doaut 和doautl

是分钟信号

14

基于VHDL 的数字闹钟设计

和时钟信号输出。从仿真波形图可以看出,按下setmin1和sethour1设置好闹铃时间后,到特定时间,sp2输出高电平。此可以判定,该模块能实现全部预想功能,程序编写正确。

5.5闹钟功能模块

闹钟功能模块和闹钟功能模块的波形仿真如下图5.5(a)和5.5(b)、5.5(c)所示:

图5.5(a) 闹钟功能模块

图5.5(b) 闹钟功能模块的波形仿真图(按下pass )

图5.5(c) 闹钟功能模块的波形仿真图(按下stop )

模块功能介绍:

15

基于VHDL 的数字闹钟设计

clk 是时钟信号,工作频率6MHz ;sp2是从闹钟模块输出的用于驱动闹钟功能模块的信号。开启闹钟(enable=1),当sp2输入为高电平,sp 输出也为高电平。当按下stop 时,铃响停止;当按下pass 时,铃响停止,并且再3分钟后会再次响起,如此循环5次后铃声不会再响起。如果什么都不按,闹钟响一分钟后停止,隔天再响,直到按下enable 。从仿真波形图看出,按下stop 或pass 后,sp 由高电平变为低电平。此可以判定,该模块能实现全部预想功能,程序编写正确。

5.6 显示模块

显示模块和显示模块的波形仿真如下图5.6(a)和5.6(b)所示:

图5.6(a) 显示模块

图5.6(b) 显示模块的波形仿真图

模块功能介绍:

从选择模块出来的信号num[3..0]经显示模块翻译成BCD 码后才能显示在七段码上。从仿真波形图看以看到,当num[3..0]=0111时,led[6..0]=0000111,七段码显示数字7。此可以判定,该模块能实现全部预想功能,程序编写正确。

16

基于VHDL 的数字闹钟设计

6 数字闹钟原理方框图

数字闹钟的原理框图和闹钟调时程序流程图如图6.1、6.2所示:

图6.1 数字闹钟原理图

17

基于VHDL 的数字闹钟设计

18

基于VHDL 的数字闹钟设计

图6.2 闹钟调时程序流程图

本设计是以setmin 、sethour 为控制整个数字钟的校分、校时,以enable 控制闹钟开关,以setmin1、sethour1控制闹钟设置分、时。

则当sethour=1时是对时钟进行校时,时个位和时十位会以二十四进制循环自动增

19

基于VHDL 的数字闹钟设计

加;

当setmin=1时是对时钟进行校分,分个位和分十位会以六十进制循环增加,并且不对时进位;

当sethour1=1时是对闹钟进行校时,闹钟时个位和时十位会以二十四进制循环自动增加;

当setmin1=1时是对闹钟进行校分,闹钟分个位和分十位会以六十进制循环增加,并且不对时进位;

而当sethour=0和setmin=0是正常的计时时间,秒从零开始计时,每秒加一,当到达五十九在来一个脉冲后,秒十位和秒个位清零,从零开始直到六十一直循环,并且向分个位清零;分位的原理同秒的一样,计数到五十九后自动清零向时进位,而时与秒,分的不同之处是,当时计数到二十四时清零并且不向任何位进位。

另外当计数的时,分和闹钟所事先设置时,分相等,并且enable=1时,蜂鸣器会响起。此时,如果按下stop 蜂鸣器会立即停止蜂鸣。如果按下pass 蜂鸣器也会立即停止,但在三分钟后会再响,循环5次。如果两个键都不按蜂鸣器会维持蜂鸣一分钟,一分钟后蜂鸣自动停止。

7 调试步骤

1. 打开Quartus II新建一个工程,工程名用英文字母写,单独存放在一个文件夹,选择好芯片后新建一个vhd 文件并保存,保存后开始用VHDL 语言编写程序。每编写一个程序前要新建一个工程。

2. 编写完成后进行编译,在编译无误后进行元件例化。

3. 对每一个模块进行时序仿真,确认每一个模块功能是否符合要求。

4. 在时序仿真完成后新建一个bdf 文件并置顶,保存后左键双击工作区间,在对话框中选中已例化的模块,按确定后置于工作区间。

5. 连接好线后对bdf 文件进行编译,编译通过后,进行管脚分配,然后开始连线,将程序下载到实验箱中。

6. 刚开始,数字种会先报时一分钟,并从00—00—00开始计数,按下reset 键,全部清零,并从头开始计数。按下调分键,秒不动,小时不动,分开始加一加一的计数,按下调时键,分不动,秒动,小时开始加一加一的计数。

20

基于VHDL 的数字闹钟设计

7. 根据程序设计,开始的初始状态为:clk 接一个脉冲信号。sethour ,setmin ,sethour1,setmin1, stop ,pass 键置0,reset 键置0。

8 结论

通过本次制作,系统的复习整个EDA 的知识,并且了解了FPGA/CPLD可编程芯片的结构和引脚,能够熟练的运用quartus II 这个软件,尤其可贵的是,学会了使用这个软件来给程序配置引脚,并且实际的通过实验箱的几个按键就可以控制整个操作的过程,终于感到自己所学到的知识可以付诸到实践了。

在本文中采用VHDL 硬件描述语言设计多功能数字闹钟,借助其功能强大的语言结构,简明的代码描述复杂控制逻辑设计,与工艺无关特性,在提高工作效率的同时达到求解目的,并可以通过VHDL 语言的综合工具进行相应硬件电路的生成,具有传统逻辑设计方法所无法比拟的优越性。设计的电子闹钟基本上实现了所有的功能,但在有些功能的实现中,还有待提高。比如说对于调时功能,只能等待调时,这样对于调时的机动性不好,如果控制不好,过了应调时间的话,就必须在等一次循环后才能调时,有点浪费时间。

参考文献

21

基于VHDL 的数字闹钟设计

[1]文畅. 基于FPGA/CPLD和VHDL 语言的交通灯控制系统设计[J].电脑知识与技术(学术交流),2007,(06)

[2]韩克, 柳秀山. 电子技能与EDA 技术[M].暨南大学出版社.2004.

[3]刘昌华编著. 数字逻辑EDA 设计与实践[M] .国防工业出版社,2006.

[4]杨晖. 可编程逻辑器件与数字系统设计[M].北京航天航空大学出版社,1999.

[5]刘真, 毕才术. 数字逻辑与计算机设计[M ]北京:高等教育出版社,2002.

[6]HydeDC.BucknellHandbookonVerilogHDL.ComputerScienceDepartment,Bucknell University Lew is burg,1995.

[7]王小军.VHDL 简明教程[M].北京:清华大学出版社,1997.

[8]黄晓明, 黄璜. 基于Max+PlusⅡ平台对VHDL 硬件描述语言综合的探讨[J].湖北第二师范学院学报,2008,(02)

[9]邱磊, 肖兵. 基于VHDL 语言的交通灯控制器设计[J].福建电脑报,2004.

[10]陈宗梅. 交通灯控制系统电路设计[J].重庆职业技术学院学报,2005,(02)

[11]刘明丹. 基于数字电路对交通灯控制的研究与设计[D].四川. 四川技术学院,2005.

[12]孙芹芝, 张瑾, 苏晓鹭. 基于EDA 的交通灯控制系统[J].电子学报,2007.

[13]何峰. 基于Verilog HDL设计的交通灯控制系统[J]. 现代电子技术 , 2005,(08)

[14]张淑骅. 基于FPGA 的交通灯的VHDL 设计[J].科技信息,2007.

[15]黄任编著.VHDL 入门•解惑•经典实例[M].北京航空大学出版社.2005

[16]罗海涛. 基于VHDL 的交通信号灯设计与实现[J].电脑知识与技术,2008,(15)

[17]韩超. 基于VHDL 设计的交通灯系统[J].电子与电脑,2008,(01)

[18]杨捷, 蒋炜华, 马临超. 基于VHDL 语言的交通灯控制器设计[J].河南机电高等专科学校学报,2008,(03)

[19]曾珍虎. 基于VHDL 带音响的交通灯控制系统[J].黑龙江科技信息,2007,(22)

[20]李国栋, 任志平. 基于FPGA 技术的交通灯控制系统设计[J].现代电子技术, 2008,(17)

附录A

22

基于VHDL 的数字闹钟设计

分频模块具体程序:

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity fenp is

port(clk:in std_logic;

clk6:out std_logic);

end fenp;

architecture one of fenp is

signal cnt: std_logic_vector(21 downto 0);

signal clk_temp:std_logic;

constant c:INTEGER:=2999999;

begin

process(clk)

begin

if clk'event and clk='1' then

if cnt=c then

clk_temp

cnt

else

cnt

end if;

end if;

end process;

clk6

end;

秒计数器具体程序:

LIBRARY ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

23

基于VHDL 的数字闹钟设计

entity second is

port(clk,reset,setmin:in std_logic;

enmin:out std_logic;

daout:out std_logic_vector(6 downto 0));

end entity;

ARCHITECTURE art OF second IS

signal count:std_logic_vector(6 downto 0);

begin

daout

process(clk,reset,setmin)

begin

if(reset='0') then

count

elsif setmin='1' then

enmin

elsif(clk'event and clk='1') then

if(count(3 downto 0)="1001") then

if(count="1011001") then

enmin

count

else

count

end if;

else

count(3 downto 0)

end if;

end if;

end process;

end art;

24

基于VHDL 的数字闹钟设计

分计数器具体程序:

LIBRARY ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity minute is

port(clk,clk1,reset,sethour:in std_logic;

enhour:out std_logic;

daout:out std_logic_vector(6 downto 0));

end entity;

ARCHITECTURE art OF minute IS

signal count: std_logic_vector( 6 downto 0);

begin

daout

process(clk,reset,sethour,clk1)

begin

if(reset='0') then

count

elsif sethour='1' then

enhour

elsif(clk'event and clk='1') then

if(count(3 downto 0)="1001") then

if(count="1011001") then

enhour

count

else

count

end if;

else

count(3 downto 0)

enhour

25

基于VHDL 的数字闹钟设计

end if;

end if;

end process;

end art;

时计数器具体程序:

LIBRARY ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

ENTITY hour IS

PORT(clk,reset: IN STD_LOGIC; daout: out std_logic_vector (5 downto 0));

END entity hour;

ARCHITECTURE art OF hour IS

signal count:std_logic_vector(5 downto 0);

begin

daout

process(clk,reset)

begin

if(reset='0') then

count

elsif (clk'event and clk='1') then

if(count="100011") then

count

elsif(count(3 downto 0)="1001") then

count

else

count(3 downto 0)

end if;

end if;

end process;

26

基于VHDL 的数字闹钟设计

end art;

闹钟模块具体程序:

LIBRARY ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity naozhong is

port( clk,setmin1,sethour1:in std_logic;

sp2:out std_logic;

dain:in std_logic_vector(6 downto 0);

dainl:in std_logic_vector(5 downto 0);

daout:out std_logic_vector(6 downto 0);

daoutl:out std_logic_vector(5 downto 0));

end entity naozhong;

ARCHITECTURE art OF naozhong IS

signal count:std_logic_vector(6 downto 0);

signal countl:std_logic_vector(5 downto 0);

begin

process(clk,setmin1)

begin

if(clk'event and clk='1') then

if(setmin1='0') then

if(count(3 downto 0)="1001") then

if(count="1011001") then

count

else

count

end if;

else

count(3 downto 0)

27

基于VHDL 的数字闹钟设计

daout

else

daout

end if;

end if;

end process;

process(clk,sethour1)

begin

if(clk'event and clk='1') then

if(sethour1='0') then

if(countl="100011") then

countl

elsif(countl(3 downto 0)="1001") then

countl

else

countl(3 downto 0)

daoutl

else

daoutl

end if;

end if;

end process;

process(count,countl)

begin

if(count=dain and countl=dainl) then

sp2

else

sp2

28

基于VHDL 的数字闹钟设计

end if;

end process;

end art;

选择器具体程序:

LIBRARY ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

use ieee.std_logic_arith.all;

ENTITY seltime IS

PORT( clk1, reset: IN STD_LOGIC; sec,min : IN STD_LOGIC_VECTOR(6 downto 0); hour : in std_logic_vector (5 downto 0); daout : OUT STD_LOGIC_vector (3 downto 0); sel : out std_logic_vector ( 5 downto 0)); END seltime;

ARCHITECTURE art OF seltime IS

signal count:std_logic_vector(5 downto 0); begin

sel

process(clk1,reset)

begin

if(reset='0') then

count

elsif(clk1'event and clk1='1') then

count

end if;

case count is

when"011111"=>daout

when"101111"=>daout

29

基于VHDL 的数字闹钟设计

when"110111"=>daout

when"111011"=>daoutdaout

when"111110"=>daoutdaout

end case;

end process;

end art;

闹钟功能模块具体程序:

LIBRARY ieee;

use ieee.std_logic_1164.all;

USE ieee.numeric_std.ALL;

entity lanren is

port(clk : in std_logic;

sp2 : in std_logic;

pass : in std_logic;

stop : in std_logic;

enable: in std_logic;

sp :out std_logic );

end entity lanren;

ARCHITECTURE art OF lanren IS

type ctrl_type is (s_idle, s_pass, s_rtn);

signal ctrl_state : ctrl_type := s_idle;

signal a: unsigned(2 downto 0) := (others=>'0');

signal pass_cnt : unsigned(9 downto 0) := (others=>'0'); begin

process(clk,sp2,pass,stop)

begin

if rising_edge(clk) then

sp

30

基于VHDL 的数字闹钟设计

case ctrl_state is

when s_idle =>

if sp2 = '1' then

if stop = '1' then

ctrl_state

elsif pass = '1' then

ctrl_state

end if;

end if;

sp

a '0');

pass_cnt '0');

when s_pass =>

if a = 5 then -- alarm 5 times

ctrl_state

else

if pass_cnt(pass_cnt'left) = '1' then -- delay for 3 min, need to adjust the delay cnt according to clk freq

pass_cnt '0');

sp

a

else

pass_cnt

end if;

end if;

when s_rtn =>

if sp2 = '0' then -- go back when alarm goes off

ctrl_state

end if;

31

基于VHDL 的数字闹钟设计

when others =>

ctrl_state

end case;

end if;

end process;

end ARCHITECTURE art;

显示模块具体程序:

LIBRARY ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

ENTITY deled IS

PORT(num: IN std_logic_vector( 3 downto 0); led: OUT std_logic_vector(6 downto 0));

END deled;

ARCHITECTURE art OF deled IS

begin

process(num)

begin

case num is

when"0000"=>led

when"0001"=>led

when"0010"=>led

when"0011"=>led

when"0100"=>led

when"0101"=>led

when"0110"=>led

when"0111"=>led

when"1000"=>led

when"1001"=>led

when others=>led

32

基于VHDL 的数字闹钟设计

end case;

end process;

end art;

元件例化具体程序:

library ieee;

use ieee.std_logic_1164.all;

entity shuzi_clock is

port(clk,setmin,sethour,reset,pass,stop:in std_logic;

setmin1,sethour1:in std_logic;

led:out std_logic_vector(6 downto 0);

sel:out std_logic_vector(5 downto 0);

sp:out std_logic);

end entity;

architecture a of shuzi_clock is

component second is

port(clk,reset,setmin:in std_logic;

enmin:out std_logic;

daout:out std_logic_vector(6 downto 0)

);

end component;

component minute is

port(clk,clk1,reset,sethour:in std_logic;

enhour:out std_logic;

daout:out std_logic_vector(6 downto 0));

end component;

component hour is

port(clk,reset: IN STD_LOGIC;

daout: out std_logic_vector (5 downto 0));

end component;

component seltime is

33

基于VHDL 的数字闹钟设计

port(clk1, reset: IN

STD_LOGIC; sec,min : IN STD_LOGIC_VECTOR(6 downto 0); hour : in std_logic_vector (5 downto 0); daout : OUT STD_LOGIC_vector (3 downto 0); sel : out std_logic_vector ( 5 downto 0));

end component;

component deled is

port(num: IN std_logic_vector( 3 downto 0);

led: OUT std_logic_vector(6 downto 0));

end component;

component fenp is

port(clk:in std_logic;

clk6:out std_logic);

end component;

component naozhong is

port( clk,setmin1,sethour1:in std_logic;

sp2:out std_logic;

dain:in std_logic_vector(6 downto 0);

dainl:in std_logic_vector(5 downto 0);

daout:out std_logic_vector(6 downto 0);

daoutl:out std_logic_vector(5 downto 0));

end component;

component lanren is

port( clk,pass,stop ,sp2: in std_logic;

sp: out std_logic);

end component;

signal s1,s4,s5,s10,s11:std_logic;

signal s2,s6,s7:std_logic_vector(6 downto 0);

signal s3,s8:std_logic_vector(5 downto 0);

signal s9:std_logic_vector(3 downto 0);

34

基于VHDL 的数字闹钟设计

begin

u1:fenp port map(clk=>clk,clk6=>s1);

u2:second port map(clk=>s1,reset=>reset,setmin=>setmin,enmin=>s4,daout=>s6);

u3:minute

map(clk=>s1,clk1=>s4,reset=>reset,sethour=>sethour,enhour=>s5,daout=>s7);

u4:hour port map(clk=>s5,reset=>reset,daout=>s8);

u5:seltime

map(clk1=>clk,reset=>reset,sec=>s6,min=>s2,hour=>s3,daout=>s9,sel=>sel);

u6:deled port map(num=>s9,led=>led);

u7:naozhong port port port map(clk=>s1,setmin1=>setmin1,sethour1=>sethour1,dain=>s7,dainl=>s8,daout=>s2,daoutl=>s3,sp2=>s11);

u8:lanren port map(clk=>s1,sp2=>s11,pass=>pass,stop=>stop,sp=>sp);

end architecture;

致谢

35

基于VHDL 的数字闹钟设计

学年论文设计的设计成功与各位老师、同学和朋友的关心、支持和鼓励是分不开的。 设计的制作是枯燥艰辛而又富有挑战的。FPGA/CPLD是近年来比较热门话题,老师的谆谆诱导、同学的出谋划策,是我坚持完成设计的动力源泉。在此论文撰写过程中,要特别感谢王树斌老师的指导与督促。从设计的选题、文献的采集、框架的设计、结构的布局到最终的论文定稿,从内容到格式,从标题到标点,他都费尽心血。没有王老师的辛勤栽培、孜孜教诲,就没有我论文的顺利完成。

感谢电子信息工程学院的各位同学,与他们的交流使我受益颇多。

由于自身专业水平的不足,整个设计肯定存在尚未发现的缺点和错误。希望各位老师同学批评指正。

36

基于VHDL 的数字闹钟设计

基于VHDL 的数字闹钟设计

摘要

随着EDA 技术的发展和应用领域的扩大与深入,EDA 技术在电子信息、通信、自动控制及计算机应用领域的重要性日益突出。EDA 技术就是以计算机为工具,设计者在EDA 软件平台上,用硬件描述语言HDL 完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。本设计介绍了基于VHDL 硬件描述语言设计的多功能数字闹钟的思路和技巧,并在Quartus II开发环境中编译和仿真所设计的程序,并逐一调试验证程序的运行状况。仿真和验证的结果表明,该设计方法切实可行,该数字闹钟可以实现调时定时闹钟功能具有一定的实际应用性。

关键词: VHDL ;FPGA ;闹钟;Quartus II

1

基于VHDL 的数字闹钟设计

Digital alarm clock design base on VHDL

Abstract

The EDA (Electronic Design Automation) technology is experiencing a huge development and it widely spreads in its application field, thus emphasizes its importance in electronic message, communication, auto control and computer application gradually. EDA technology use computer as tool, designer is enabled to design files on the EDA platform with the help of HDL (Hardware Description Language). The computer automatically finishes tasks like logic compiling, simplication, division, colligation, optimization, distribution, wiring and simulation afterwards, and finally manages the match, compiling, mapping and download to a target chip. This project bases on the perspective and technique of multifunctional digital alarm clock of VHDL (Very-High-Speed Integrated Circuit Hardware Description Language). And then compiles and simulates the program it designed in the Quartus II environment. In addition, it adjusts and tests the program condition. The results of simulation and test imply the practicability of this project and the applicability of the timing function of digital alarm clock.

Key words: VHDL, FPGA, Alarm clock ,Quartus II

2

基于VHDL 的数字闹钟设计

目录

1 绪论

1.1 选题背景 2 设计目的 3 设计要求 4 设计原理:

4.1 功能描述 4.2 基本原理 5 设计内容:

5.1 分频模块 5.2 计数器模块

5.2.1 秒计数器模块

5.2.2 分计数器模块 5.2.3 时计数器模块

5.3 选择模块 5.4 闹钟模块 5.5 闹钟功能模块 5.6显示

6 数字闹钟原理方框图 7 调试步骤 8 结论 参考文献 附录A 致谢

3

基于VHDL 的数字闹钟设计

4

基于VHDL 的数字闹钟设计

1 绪论

1.1 选题背景

21新世纪,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。

时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。但是,一旦重要事情,一时的耽误可能酿成大祸。例如,许多火灾都是由于人们一时忘记了关闭煤气或是忘记充电时间。而数字闹钟能随时提醒这些容易忘记时间的人。钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、定时启闭电路、定时开关烘箱、通断动力设备,甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。因此,研究数字钟及扩大其应用,有着非常现实的意义。

随着EDA 技术的发展和应用领域的扩大与深入,EDA 技术在电子信息、通信、自动控制及计算机应用领域的重要性日益突出。EDA 技术就是以计算机为工具,设计者在EDA 软件平台上,用硬件描述语言VHDL 完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。本文介绍了基于VHDL 硬件描述语言设计的多功能数字闹钟的思路和技巧。在Quartus II开发环境中编译和仿真了所设计的程序,并逐一调试验证程序的运行状况。仿真和验证的结果表明,该设计方法切实可行,该数字闹钟可以实现调时定时闹钟功能具有一定的实际应用性。

5

基于VHDL 的数字闹钟设计

2 设计目的

1. 熟练利用VHDL 硬件描述语言进行数字系统设计; 2. 掌握数字系统的设计方法——自顶向下的设计思想; 3. 掌握Quartus II开发软件的使用方法; 4. 掌握FPGA/CPLD芯片的工作原理;

5. 根据数字闹钟的功能要求设计一个数字闹钟; 6. 掌握闹钟系统的原理。

3 设计要求

设计一个简单的数字闹钟,它的具体功能为:

(1) 计时功能:这是本计时器设计的基本功能,可进行时、分、秒计时,并显示。 (2) 清零功能:按下此键后计数器清零,数码管显示“0”;松开此键数码管开始显“00 -00-00”,并且以此开始重新计时;

(3) 调时调分功能:当需要校时,可通过实验箱上的按键控制; (4) 闹钟开/关功能:为避免闹钟天天响,设计了闹钟开启/关闭功能;

(5) 闹钟功能:开启闹钟功能后,通过闹钟键设置好铃响时间,时间到铃声响起,如果此时按下停止键,闹钟马上停止;如果按下忽略键,闹钟停止,并会在3分钟后重新响起,循环5次;什么都不按,闹钟响一分钟后停止,隔天再响,直到按下开启键关闭闹钟。

4 设计原理

4.1功能描述

数字钟是一计时的工具,有着广泛的用途。本实验的数字钟要求有三个功能按钮:一个是清零按钮reset ,当按下此按钮时,数字钟显示有位都清零.二是调分钟的按钮 setmin ,当按下此按钮时分钟会以1HZ 的频率速度进行调时,而且在调分钟时秒钟会暂停不动;三是调小时的按钮sethour ,当按下此按钮时时钟会以1HZ 的频率速度进行调时,在调小时时分钟会暂停不动,但秒钟是正常记时的。

6

基于VHDL 的数字闹钟设计

另外还有一个闹钟模块,在闹钟模块中,先按下闹钟开启键,按下调时或调分键时,数码显示管显示所调闹钟的时间,并进行调时或调分。当两个键都未按下时,数码管显示数字钟的时间。当设定的闹钟时间和数字钟的时间一致时,铃声响起。在铃声响起时,按下PASS 键,铃声停止响起,三分钟后闹钟再次响起,如此循环5次;按下STOP 键时,铃声停止工作;什么都不按,铃声响起一分钟后停止,隔天再响,直到按下闹钟开/关键。其余时间喇叭不叫。

4.2基本原理

在本实验中用到的主要元件有计数器,分频器,报时器, 选择器和译码器等。控制逻辑主要是用来实现计数和清零。基本方框图如图4.1:

图4.1 数字闹钟原理框图

7

基于VHDL 的数字闹钟设计

数字闹钟外观草图如图4.2所示:

图4.2 数字闹钟外观草图

5 设计内容

5.1分频模块

此模块定义一个全局时钟,用频率为6MHz 的信号源经分频从clk 进入模块,经分频后由clk6输出,得到一个1Hz 的时钟脉冲,用于驱动数字钟工作。分频模块和波形仿真如下图5.1(a)和5.1(b)所示:

图5.1(a) 分频模块

8

基于VHDL 的数字闹钟设计

图5.1(b) 分频模块波形仿真图

分频模块在计数器计数到2999999的时候再来一个高电平, 计数器加1,输出口clk6

翻转,由低电平翻转成高电平,但仿真只能看到1us 的情况,所以仿真未能看到其翻转,但是由图5.1(b)可知,在500ms 前为低电平,在500ms 时翻转为高电平,可判定该模块可行。

5.2 计数器模块

此模块包括秒计数器、分计数器、时计数器以及功能按键的设计。 程序说明:

1. 由分频模块产生1Hz 的时钟信号,输入计数60的秒计数器模块电路,等计数至60的瞬间,进位至计数60的分计数器模块电路加1,同时秒计数器模块电路也清除为0再重新计秒。

2. 分计数器模块电路和时计数器模块电路功能基本相似。时计数器模块电路计数为24,在计数至23的时,再来一个高电平,计数器模块全部清0, 再重新计数。

3. 三组计数电路中的计分和计时数据传给闹钟模块,通过闹钟模块再和计秒数据一起传给位选模块,位选模块产生一组输出信号,而控制这个输出的信号为SEL[2..0]。

4. 由于取得的信号不论是时、分、秒,都将以十进制表示,所以先将这个十进制表示的时、分、秒转换成两个数位的BCD 码。

5.2.1 秒计数器模块

秒计数模块和秒计数模块的波形仿真如下图5.2.1(a)和5.2.1(b)所示:

9

基于VHDL 的数字闹钟设计

图5.2.1(a) 秒计数模块

图5.2.1(b) 秒计数模块波形仿真图

模块功能介绍:

clk 是时钟型号输入端;reset 是清零键,低电平有效;setmin 是分钟调时按键,高电平有效;enmin 是进位输出端;daout[6..0]是显示输出端,连接位选模块,再经显示模块译码后输出显示在七段码上。

从图5.2.1(b)可以看出,当按下reset 键时,计数器清零,重新计数;按下setmin 键时,daout[6..0]是显示输出端输出的信号不变,同时enmin 进位输出端输出与时钟信号周期相同的脉冲信号,进入分钟计数模块,驱动分钟模块工作;当计数器计数到59时,再来一个脉冲模块清零,并且重新计数。由此可以判定,该模块能实现全部预想功能,程序编写正确。

5.2.2 分计数器模块

分计数模块和分计数模块的波形仿真如下图5.2.2(a)和5.2.2(b)所示:

10

基于VHDL 的数字闹钟设计

图5.2.2(a) 分计数模块

图5.2.2(b) 分计数模块波形仿真图

模块功能介绍:

clk 是时钟信号输入端;clk1是秒进位信号输入端,秒钟算到60时发出一个进位脉冲,驱动分钟计数模块加1;reset 是清零键,与秒钟计数模块的清零键是同一个键。sethour 是时钟调时按键,高电平有效;enhour 是进位输出端,功能与秒钟计数模块的相同;daout[6..0]是显示输出端,连接闹钟模块,再连接位选模块,经显示模块译码后输出显示在七段码上。

从图5.2.2(b)可以看出,clk1输入秒钟模块的进位信号,daout[6..0]输出端输出分钟计数信号。当按下reset 时daout[6..0]输出端清零,再次重新计数。按下sethour 时,enhour 输出频率与时钟信号相同的脉冲,用于使时计数模块计数增加,达到调时的目的。当分计数器计到60时,enhour 输出一个高电平,分计数器重新计时,同时时计数器加1。由此可以判定,该模块能实现全部预想功能,程序编写正确。

5.2.3 时计数器

11

基于VHDL 的数字闹钟设计

时计数模块和时计数模块的波形仿真如下图5.2.3(a)和5.2.3(b)所示:

图5.2.3(a) 时计数模块

图5.2.3(b) 时计数模块波形仿真图

模块功能介绍:

clk 是进位信号,有分钟模块输出;resets 是清零键;daout[5..0]是显示输出端,连接闹钟模块,再连接位选模块,经显示模块译码后输出显示在七段码上。

由图5.2.3(b) 时计数模块波形仿真图可以看出,当按下resets 清零键时,daout[5..0]是显示输出端清零并且重新计数。此可以判定,该模块能实现全部预想功能,程序编写正确。

5.3 选择器模块

选择器模块和选择器模块的波形仿真如下图5.3(a)和5.3(b)所示:

12

基于VHDL 的数字闹钟设计

图5.3(a) 选择器模块

图5.3(b) 选择器模块波形仿真图

模块功能介绍:

clk 电源信号输入端,输入的是分频前得频率为6MHz 的信号,选择模块工作频率为6MHz ;reset 是清零键;低电平有效;sec[6..0]、min[6..0]、hour[5..0]是分别从秒钟计数模块、分钟计数模块、时钟计数模块引入的待显示的信号:

SEL[5..0]=011111时输出sec[3..0];

SEL[5..0]101111时输出0和sec[6..4];

SEL[5..0]=110111时输出min[3..0];

SEL[5..0]=111011时输出0和min[6..4];

13

基于VHDL 的数字闹钟设计

SEL[5..0]=111101时输出hour[3..0];

SEL[5..0]=111110时输出00和hour[5..4];

SEL[5..0]为其他数字,则显示符号“-”。

从图5.3(b)可以看出,当SEL[5..0]=011111时,daout[3..0]输出为0011,与sec[3..0]输出的相同。此可以判定,该模块能实现全部预想功能,程序编写正确。

5.4 闹钟模块

闹钟模块和闹钟模块的波形仿真如下图5.4(a)和5.4(b)所示:

图5.4(a) 闹钟模块

5.4(b) 闹钟模块的波形仿真图

模块功能介绍:

clk输入1Hz 的时钟信号,setmin1和sethour1是调分和调时键,低电平有效;dain 和dainl 是分钟信号和时钟信号输入;sp2是闹钟信号输出;doaut 和doautl

是分钟信号

14

基于VHDL 的数字闹钟设计

和时钟信号输出。从仿真波形图可以看出,按下setmin1和sethour1设置好闹铃时间后,到特定时间,sp2输出高电平。此可以判定,该模块能实现全部预想功能,程序编写正确。

5.5闹钟功能模块

闹钟功能模块和闹钟功能模块的波形仿真如下图5.5(a)和5.5(b)、5.5(c)所示:

图5.5(a) 闹钟功能模块

图5.5(b) 闹钟功能模块的波形仿真图(按下pass )

图5.5(c) 闹钟功能模块的波形仿真图(按下stop )

模块功能介绍:

15

基于VHDL 的数字闹钟设计

clk 是时钟信号,工作频率6MHz ;sp2是从闹钟模块输出的用于驱动闹钟功能模块的信号。开启闹钟(enable=1),当sp2输入为高电平,sp 输出也为高电平。当按下stop 时,铃响停止;当按下pass 时,铃响停止,并且再3分钟后会再次响起,如此循环5次后铃声不会再响起。如果什么都不按,闹钟响一分钟后停止,隔天再响,直到按下enable 。从仿真波形图看出,按下stop 或pass 后,sp 由高电平变为低电平。此可以判定,该模块能实现全部预想功能,程序编写正确。

5.6 显示模块

显示模块和显示模块的波形仿真如下图5.6(a)和5.6(b)所示:

图5.6(a) 显示模块

图5.6(b) 显示模块的波形仿真图

模块功能介绍:

从选择模块出来的信号num[3..0]经显示模块翻译成BCD 码后才能显示在七段码上。从仿真波形图看以看到,当num[3..0]=0111时,led[6..0]=0000111,七段码显示数字7。此可以判定,该模块能实现全部预想功能,程序编写正确。

16

基于VHDL 的数字闹钟设计

6 数字闹钟原理方框图

数字闹钟的原理框图和闹钟调时程序流程图如图6.1、6.2所示:

图6.1 数字闹钟原理图

17

基于VHDL 的数字闹钟设计

18

基于VHDL 的数字闹钟设计

图6.2 闹钟调时程序流程图

本设计是以setmin 、sethour 为控制整个数字钟的校分、校时,以enable 控制闹钟开关,以setmin1、sethour1控制闹钟设置分、时。

则当sethour=1时是对时钟进行校时,时个位和时十位会以二十四进制循环自动增

19

基于VHDL 的数字闹钟设计

加;

当setmin=1时是对时钟进行校分,分个位和分十位会以六十进制循环增加,并且不对时进位;

当sethour1=1时是对闹钟进行校时,闹钟时个位和时十位会以二十四进制循环自动增加;

当setmin1=1时是对闹钟进行校分,闹钟分个位和分十位会以六十进制循环增加,并且不对时进位;

而当sethour=0和setmin=0是正常的计时时间,秒从零开始计时,每秒加一,当到达五十九在来一个脉冲后,秒十位和秒个位清零,从零开始直到六十一直循环,并且向分个位清零;分位的原理同秒的一样,计数到五十九后自动清零向时进位,而时与秒,分的不同之处是,当时计数到二十四时清零并且不向任何位进位。

另外当计数的时,分和闹钟所事先设置时,分相等,并且enable=1时,蜂鸣器会响起。此时,如果按下stop 蜂鸣器会立即停止蜂鸣。如果按下pass 蜂鸣器也会立即停止,但在三分钟后会再响,循环5次。如果两个键都不按蜂鸣器会维持蜂鸣一分钟,一分钟后蜂鸣自动停止。

7 调试步骤

1. 打开Quartus II新建一个工程,工程名用英文字母写,单独存放在一个文件夹,选择好芯片后新建一个vhd 文件并保存,保存后开始用VHDL 语言编写程序。每编写一个程序前要新建一个工程。

2. 编写完成后进行编译,在编译无误后进行元件例化。

3. 对每一个模块进行时序仿真,确认每一个模块功能是否符合要求。

4. 在时序仿真完成后新建一个bdf 文件并置顶,保存后左键双击工作区间,在对话框中选中已例化的模块,按确定后置于工作区间。

5. 连接好线后对bdf 文件进行编译,编译通过后,进行管脚分配,然后开始连线,将程序下载到实验箱中。

6. 刚开始,数字种会先报时一分钟,并从00—00—00开始计数,按下reset 键,全部清零,并从头开始计数。按下调分键,秒不动,小时不动,分开始加一加一的计数,按下调时键,分不动,秒动,小时开始加一加一的计数。

20

基于VHDL 的数字闹钟设计

7. 根据程序设计,开始的初始状态为:clk 接一个脉冲信号。sethour ,setmin ,sethour1,setmin1, stop ,pass 键置0,reset 键置0。

8 结论

通过本次制作,系统的复习整个EDA 的知识,并且了解了FPGA/CPLD可编程芯片的结构和引脚,能够熟练的运用quartus II 这个软件,尤其可贵的是,学会了使用这个软件来给程序配置引脚,并且实际的通过实验箱的几个按键就可以控制整个操作的过程,终于感到自己所学到的知识可以付诸到实践了。

在本文中采用VHDL 硬件描述语言设计多功能数字闹钟,借助其功能强大的语言结构,简明的代码描述复杂控制逻辑设计,与工艺无关特性,在提高工作效率的同时达到求解目的,并可以通过VHDL 语言的综合工具进行相应硬件电路的生成,具有传统逻辑设计方法所无法比拟的优越性。设计的电子闹钟基本上实现了所有的功能,但在有些功能的实现中,还有待提高。比如说对于调时功能,只能等待调时,这样对于调时的机动性不好,如果控制不好,过了应调时间的话,就必须在等一次循环后才能调时,有点浪费时间。

参考文献

21

基于VHDL 的数字闹钟设计

[1]文畅. 基于FPGA/CPLD和VHDL 语言的交通灯控制系统设计[J].电脑知识与技术(学术交流),2007,(06)

[2]韩克, 柳秀山. 电子技能与EDA 技术[M].暨南大学出版社.2004.

[3]刘昌华编著. 数字逻辑EDA 设计与实践[M] .国防工业出版社,2006.

[4]杨晖. 可编程逻辑器件与数字系统设计[M].北京航天航空大学出版社,1999.

[5]刘真, 毕才术. 数字逻辑与计算机设计[M ]北京:高等教育出版社,2002.

[6]HydeDC.BucknellHandbookonVerilogHDL.ComputerScienceDepartment,Bucknell University Lew is burg,1995.

[7]王小军.VHDL 简明教程[M].北京:清华大学出版社,1997.

[8]黄晓明, 黄璜. 基于Max+PlusⅡ平台对VHDL 硬件描述语言综合的探讨[J].湖北第二师范学院学报,2008,(02)

[9]邱磊, 肖兵. 基于VHDL 语言的交通灯控制器设计[J].福建电脑报,2004.

[10]陈宗梅. 交通灯控制系统电路设计[J].重庆职业技术学院学报,2005,(02)

[11]刘明丹. 基于数字电路对交通灯控制的研究与设计[D].四川. 四川技术学院,2005.

[12]孙芹芝, 张瑾, 苏晓鹭. 基于EDA 的交通灯控制系统[J].电子学报,2007.

[13]何峰. 基于Verilog HDL设计的交通灯控制系统[J]. 现代电子技术 , 2005,(08)

[14]张淑骅. 基于FPGA 的交通灯的VHDL 设计[J].科技信息,2007.

[15]黄任编著.VHDL 入门•解惑•经典实例[M].北京航空大学出版社.2005

[16]罗海涛. 基于VHDL 的交通信号灯设计与实现[J].电脑知识与技术,2008,(15)

[17]韩超. 基于VHDL 设计的交通灯系统[J].电子与电脑,2008,(01)

[18]杨捷, 蒋炜华, 马临超. 基于VHDL 语言的交通灯控制器设计[J].河南机电高等专科学校学报,2008,(03)

[19]曾珍虎. 基于VHDL 带音响的交通灯控制系统[J].黑龙江科技信息,2007,(22)

[20]李国栋, 任志平. 基于FPGA 技术的交通灯控制系统设计[J].现代电子技术, 2008,(17)

附录A

22

基于VHDL 的数字闹钟设计

分频模块具体程序:

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity fenp is

port(clk:in std_logic;

clk6:out std_logic);

end fenp;

architecture one of fenp is

signal cnt: std_logic_vector(21 downto 0);

signal clk_temp:std_logic;

constant c:INTEGER:=2999999;

begin

process(clk)

begin

if clk'event and clk='1' then

if cnt=c then

clk_temp

cnt

else

cnt

end if;

end if;

end process;

clk6

end;

秒计数器具体程序:

LIBRARY ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

23

基于VHDL 的数字闹钟设计

entity second is

port(clk,reset,setmin:in std_logic;

enmin:out std_logic;

daout:out std_logic_vector(6 downto 0));

end entity;

ARCHITECTURE art OF second IS

signal count:std_logic_vector(6 downto 0);

begin

daout

process(clk,reset,setmin)

begin

if(reset='0') then

count

elsif setmin='1' then

enmin

elsif(clk'event and clk='1') then

if(count(3 downto 0)="1001") then

if(count="1011001") then

enmin

count

else

count

end if;

else

count(3 downto 0)

end if;

end if;

end process;

end art;

24

基于VHDL 的数字闹钟设计

分计数器具体程序:

LIBRARY ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity minute is

port(clk,clk1,reset,sethour:in std_logic;

enhour:out std_logic;

daout:out std_logic_vector(6 downto 0));

end entity;

ARCHITECTURE art OF minute IS

signal count: std_logic_vector( 6 downto 0);

begin

daout

process(clk,reset,sethour,clk1)

begin

if(reset='0') then

count

elsif sethour='1' then

enhour

elsif(clk'event and clk='1') then

if(count(3 downto 0)="1001") then

if(count="1011001") then

enhour

count

else

count

end if;

else

count(3 downto 0)

enhour

25

基于VHDL 的数字闹钟设计

end if;

end if;

end process;

end art;

时计数器具体程序:

LIBRARY ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

ENTITY hour IS

PORT(clk,reset: IN STD_LOGIC; daout: out std_logic_vector (5 downto 0));

END entity hour;

ARCHITECTURE art OF hour IS

signal count:std_logic_vector(5 downto 0);

begin

daout

process(clk,reset)

begin

if(reset='0') then

count

elsif (clk'event and clk='1') then

if(count="100011") then

count

elsif(count(3 downto 0)="1001") then

count

else

count(3 downto 0)

end if;

end if;

end process;

26

基于VHDL 的数字闹钟设计

end art;

闹钟模块具体程序:

LIBRARY ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity naozhong is

port( clk,setmin1,sethour1:in std_logic;

sp2:out std_logic;

dain:in std_logic_vector(6 downto 0);

dainl:in std_logic_vector(5 downto 0);

daout:out std_logic_vector(6 downto 0);

daoutl:out std_logic_vector(5 downto 0));

end entity naozhong;

ARCHITECTURE art OF naozhong IS

signal count:std_logic_vector(6 downto 0);

signal countl:std_logic_vector(5 downto 0);

begin

process(clk,setmin1)

begin

if(clk'event and clk='1') then

if(setmin1='0') then

if(count(3 downto 0)="1001") then

if(count="1011001") then

count

else

count

end if;

else

count(3 downto 0)

27

基于VHDL 的数字闹钟设计

daout

else

daout

end if;

end if;

end process;

process(clk,sethour1)

begin

if(clk'event and clk='1') then

if(sethour1='0') then

if(countl="100011") then

countl

elsif(countl(3 downto 0)="1001") then

countl

else

countl(3 downto 0)

daoutl

else

daoutl

end if;

end if;

end process;

process(count,countl)

begin

if(count=dain and countl=dainl) then

sp2

else

sp2

28

基于VHDL 的数字闹钟设计

end if;

end process;

end art;

选择器具体程序:

LIBRARY ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

use ieee.std_logic_arith.all;

ENTITY seltime IS

PORT( clk1, reset: IN STD_LOGIC; sec,min : IN STD_LOGIC_VECTOR(6 downto 0); hour : in std_logic_vector (5 downto 0); daout : OUT STD_LOGIC_vector (3 downto 0); sel : out std_logic_vector ( 5 downto 0)); END seltime;

ARCHITECTURE art OF seltime IS

signal count:std_logic_vector(5 downto 0); begin

sel

process(clk1,reset)

begin

if(reset='0') then

count

elsif(clk1'event and clk1='1') then

count

end if;

case count is

when"011111"=>daout

when"101111"=>daout

29

基于VHDL 的数字闹钟设计

when"110111"=>daout

when"111011"=>daoutdaout

when"111110"=>daoutdaout

end case;

end process;

end art;

闹钟功能模块具体程序:

LIBRARY ieee;

use ieee.std_logic_1164.all;

USE ieee.numeric_std.ALL;

entity lanren is

port(clk : in std_logic;

sp2 : in std_logic;

pass : in std_logic;

stop : in std_logic;

enable: in std_logic;

sp :out std_logic );

end entity lanren;

ARCHITECTURE art OF lanren IS

type ctrl_type is (s_idle, s_pass, s_rtn);

signal ctrl_state : ctrl_type := s_idle;

signal a: unsigned(2 downto 0) := (others=>'0');

signal pass_cnt : unsigned(9 downto 0) := (others=>'0'); begin

process(clk,sp2,pass,stop)

begin

if rising_edge(clk) then

sp

30

基于VHDL 的数字闹钟设计

case ctrl_state is

when s_idle =>

if sp2 = '1' then

if stop = '1' then

ctrl_state

elsif pass = '1' then

ctrl_state

end if;

end if;

sp

a '0');

pass_cnt '0');

when s_pass =>

if a = 5 then -- alarm 5 times

ctrl_state

else

if pass_cnt(pass_cnt'left) = '1' then -- delay for 3 min, need to adjust the delay cnt according to clk freq

pass_cnt '0');

sp

a

else

pass_cnt

end if;

end if;

when s_rtn =>

if sp2 = '0' then -- go back when alarm goes off

ctrl_state

end if;

31

基于VHDL 的数字闹钟设计

when others =>

ctrl_state

end case;

end if;

end process;

end ARCHITECTURE art;

显示模块具体程序:

LIBRARY ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

ENTITY deled IS

PORT(num: IN std_logic_vector( 3 downto 0); led: OUT std_logic_vector(6 downto 0));

END deled;

ARCHITECTURE art OF deled IS

begin

process(num)

begin

case num is

when"0000"=>led

when"0001"=>led

when"0010"=>led

when"0011"=>led

when"0100"=>led

when"0101"=>led

when"0110"=>led

when"0111"=>led

when"1000"=>led

when"1001"=>led

when others=>led

32

基于VHDL 的数字闹钟设计

end case;

end process;

end art;

元件例化具体程序:

library ieee;

use ieee.std_logic_1164.all;

entity shuzi_clock is

port(clk,setmin,sethour,reset,pass,stop:in std_logic;

setmin1,sethour1:in std_logic;

led:out std_logic_vector(6 downto 0);

sel:out std_logic_vector(5 downto 0);

sp:out std_logic);

end entity;

architecture a of shuzi_clock is

component second is

port(clk,reset,setmin:in std_logic;

enmin:out std_logic;

daout:out std_logic_vector(6 downto 0)

);

end component;

component minute is

port(clk,clk1,reset,sethour:in std_logic;

enhour:out std_logic;

daout:out std_logic_vector(6 downto 0));

end component;

component hour is

port(clk,reset: IN STD_LOGIC;

daout: out std_logic_vector (5 downto 0));

end component;

component seltime is

33

基于VHDL 的数字闹钟设计

port(clk1, reset: IN

STD_LOGIC; sec,min : IN STD_LOGIC_VECTOR(6 downto 0); hour : in std_logic_vector (5 downto 0); daout : OUT STD_LOGIC_vector (3 downto 0); sel : out std_logic_vector ( 5 downto 0));

end component;

component deled is

port(num: IN std_logic_vector( 3 downto 0);

led: OUT std_logic_vector(6 downto 0));

end component;

component fenp is

port(clk:in std_logic;

clk6:out std_logic);

end component;

component naozhong is

port( clk,setmin1,sethour1:in std_logic;

sp2:out std_logic;

dain:in std_logic_vector(6 downto 0);

dainl:in std_logic_vector(5 downto 0);

daout:out std_logic_vector(6 downto 0);

daoutl:out std_logic_vector(5 downto 0));

end component;

component lanren is

port( clk,pass,stop ,sp2: in std_logic;

sp: out std_logic);

end component;

signal s1,s4,s5,s10,s11:std_logic;

signal s2,s6,s7:std_logic_vector(6 downto 0);

signal s3,s8:std_logic_vector(5 downto 0);

signal s9:std_logic_vector(3 downto 0);

34

基于VHDL 的数字闹钟设计

begin

u1:fenp port map(clk=>clk,clk6=>s1);

u2:second port map(clk=>s1,reset=>reset,setmin=>setmin,enmin=>s4,daout=>s6);

u3:minute

map(clk=>s1,clk1=>s4,reset=>reset,sethour=>sethour,enhour=>s5,daout=>s7);

u4:hour port map(clk=>s5,reset=>reset,daout=>s8);

u5:seltime

map(clk1=>clk,reset=>reset,sec=>s6,min=>s2,hour=>s3,daout=>s9,sel=>sel);

u6:deled port map(num=>s9,led=>led);

u7:naozhong port port port map(clk=>s1,setmin1=>setmin1,sethour1=>sethour1,dain=>s7,dainl=>s8,daout=>s2,daoutl=>s3,sp2=>s11);

u8:lanren port map(clk=>s1,sp2=>s11,pass=>pass,stop=>stop,sp=>sp);

end architecture;

致谢

35

基于VHDL 的数字闹钟设计

学年论文设计的设计成功与各位老师、同学和朋友的关心、支持和鼓励是分不开的。 设计的制作是枯燥艰辛而又富有挑战的。FPGA/CPLD是近年来比较热门话题,老师的谆谆诱导、同学的出谋划策,是我坚持完成设计的动力源泉。在此论文撰写过程中,要特别感谢王树斌老师的指导与督促。从设计的选题、文献的采集、框架的设计、结构的布局到最终的论文定稿,从内容到格式,从标题到标点,他都费尽心血。没有王老师的辛勤栽培、孜孜教诲,就没有我论文的顺利完成。

感谢电子信息工程学院的各位同学,与他们的交流使我受益颇多。

由于自身专业水平的不足,整个设计肯定存在尚未发现的缺点和错误。希望各位老师同学批评指正。

36


相关内容

  • 1多功能数字钟设计
  • EDA(二)实验报告 多功能数字钟设计 摘要 本实验根据设计要求,利用QuartusII 软件设计了一个多功能闹钟,并对其进行编译.综合.仿真.调试.下载到器件中从而实现功能.本次实验设计的闹钟具有24小时正常计时.校时.校分.整点报时.显示星期和闹钟等功能. Abstract According ...

  • 时钟系统设计
  • <单片机原理及接口> 课程设计报告 题 目: 时钟系统设计 专业名称: 电子信息工程 班 级: 092 学 号: 910706221 姓 名: 邹小东 2011年 12月 时钟系统设计 电子信息工程学院 通信081 赖福财 指导教师:陈炜 一 设计内容和目标 1.1设计目标 设计一时钟系 ...

  • 毕业论文日志
  • 广州大学松田学院 毕业论文(设计)日志薄 题目(中)_ 基于单片机的数字时钟设计 (英) 姓 名_____陈达明_______ __ 年 级_ 08电气与汽车工程系 班 级__ 电子(3)班_______ 指导教师____________________(签名) 2012年 3月 10日 广州大学松 ...

  • 定时闹钟设计
  • 河南工业职业技术学院 毕业设计报告 定时闹钟 姓 名: 汪长明 学 号: 0203100219 专业班级: 机修1002 指导老师: 张宏伟 所在学院: 河南工院 2008年6月29日 摘要 本设计是定时闹钟的设计, 由单片机AT89C51芯片和LED 数码管为核心,辅以必要的电路,构成的一个单片机 ...

  • 数字逻辑电路设计-多功能数字钟
  • 数字逻辑电路设计-多功能数字钟 多功能数字钟 摘要:实验作品名为多功能数字钟,具有校时.清零.保持.整点报时.闹钟五 大功能.整个实验以QuartusII 7.0为软件设计基础,结合Altera 公司研发的Cyclone 系列可编程逻辑器件工具箱进行实际测试.整个数字钟的开发完全遵照自顶向下的设计方 ...

  • 数字电子钟的设计
  • 数字电子钟的设计 一. 绪论: 数字钟以成为人们日常生活中数字电子钟一般由振荡器,分频器,译码器,显示器等部分组成.数字钟的应用非常广泛,应用于人家庭以及车站.码头.剧场,办公室等公共场所,给人们的生活,学习,工作,娱乐带来极大的方便,由于数字集成电路技术的发展和采用了先进的石英技术,使数字钟具有走 ...

  • 带整点报时的时钟
  • 单片机原理与应用 实训报告 题目:具有整点报时带闹钟时间可调的数字钟 学院:盐 城 工 业 职 业 技 术 学 院 班级:计 控 1201 姓名:孙 慧 芳 学号: 完成日期: 2014/12/12 目录 1. 系统整体设计...................................... ...

  • 基于单片机的多功能数字时钟设计
  • 河南农业大学 本科生毕业论文(设计) 题 目:基于单片机的多功能数字时钟设计 学 院: 专业班级: 学生姓名: 指导教师: 完成日期:2014年5月20号 摘 要 本文介绍了多功能数字时钟[1]的系统设计.系统具有时间设置及显示.闹钟.报时的功能.系统采用AT89C51和时钟芯片DS1302,实现L ...

  • 数字钟报告
  • 基于Verilog HDL设计的多功能数字钟 创新六班饶楠杰刘力哲 摘要:本文利用Verilog HDL语言自顶向下的设计方法设计多功能数字钟,突出了其作为硬件描述语言的良好的可读性.可移植性和易理解等优点,并通过Xilinx 完成综合.仿真.此程序通过下载到FPGA 芯片后,可应用于实际的数字钟显 ...