1、基于 VHDL 语言的简易电子钟设计摘要 VHDL 是广泛应用的硬件描述语言,可以用在硬件设计流程的建模、综合和模拟等多个阶段。随着硬件设计规模的不断扩大,应用硬件描述语言进行描述的 CPLD 结构,成为设计专用集成电路和其他集成电路的主流。通过应用 VHDL 对数字时钟的设计,达到对VHDL 的理解,同时对 CPLD 器件加深了解。该系统在开发软件 Quartus 环境中设计完成,本文给出了设计该数字时钟系统的流程和方法,最后通过 CPLD 实现预定功能。关键词:电子钟;硬件描述语言;VHDL;Quartus ;CPLD目录引言 1第一章 设计任务及功能要求 11.1 设计课题内容 11.2
2、 功能要求说明 1第二章 系统设计方案 22.1 电子钟工作原理 22.2 总体方案设计 2第三章 电子钟顶层设计 23.1 顶层设计分析 23.2 顶层电路图 .3第四章 各功能模块的设计 44.1 正常计时模块 44.1.1 分频模块设计 .44.1.2 60 进制计数器设计 54.1.3 24 进制计数器设计 54.2 整点报时模块 64.2.1 整点报时设计思路及原理图 .64.2.2 整点报时仿真波形 .74.3 分时校对模块 74.3.1 分时校对设计思路及原理图 .74.3.2 分时校对仿真波形 .74.4 扫描输出模块 84.4.1 扫描输出设计思路及原理图 .84.4.2 扫
3、描输出仿真波形 .84.5 译码显示模块 94.5.1 译码显示设计思路及原理图 .94.5.2 译码显示仿真波形 .10第五章 系统硬件实现分析 105.1 引脚分配 .105.2 系统硬件测试及分析 .11第六章 结束语 11参考文献 11附录 1 顶层电路图 12附录 2 程序代码 121引言数字时钟是一种用数字电路技术实现时、分、秒计时的装置,数字时钟走时精度高,稳定性好,使用方便,不需要经常调校,数字式时钟用秒脉冲发生器的精度稳定保证了数字钟的质量。电子设计自动化(EDA)技术发展越来越迅速,利用计算机辅助设计已成为发展趋势。VHDL 语言具有强大的电路描述和建模能力,用 VHDL
4、开发的数字电路与开发平台以及硬件实现芯片无关,可移植性、可重用性好。VHDL 语言能够在系统级、行为级、寄存器传输级、门级等各个层次对数字电路进行描述,并可以在不同层次进行不同级别的仿真,能极大得保证设计的正确性和设计指标的实现。Quartus 设计软件提供了一个完整的、多平台的设计环境,它可以轻易满足特定设计项目的要求。第一章 设计任务及功能要求1.1 设计课题内容1学习 ALTERA 公司的 FPGA/CPLD 的结构、特点和性能。2学习集成开发软件 MAX+plus II/Quartus II 的使用及设计过程。3熟悉 EDA 工具设计数字电路设计方法,掌握 VHDL 硬件描述语言设计方
5、法。4根据给定题目设计数字电路,来加深对可编程逻辑器件的理解和掌握。1.2 功能要求说明1在所选择器件内完成简易时钟的设计,要求设计完成后芯片具有时、分、秒的计时;译码;输出七段码;最大计时 23 时 59 分 59 秒;秒闪功能。2简易时钟要求具有对时功能,具体对时的实现方式自行决定,要求设计合理,以操作简单为原则(根具具体的工作进度,可以考虑增加整点报时等附加功能) 。3在相应的器件平台上完成设计的输入、编译、综合或适配通过。2第二章 系统设计方案2.1 电子钟工作原理系统主要由振荡器、分频器、计数器、译码显示电路和校时电路组成。振荡器产生稳定的分频脉冲信号,作为数字钟的时间基准,然后经过
6、分频器输出标准秒脉冲。秒计数器满 60 分向分计数器进位,分计数器满 60 后向小时计数器进位,小时计数器按照二十四进制计数。计数器的输出分别由译码器送显示器显示。计时出现误差时,可以用校时电路校时、校分。2.2 总体方案设计数字电子钟由振荡器、分频器、计数器、译码显示电路和校时电路组成。振荡器产生稳定的高频脉冲信号,作为数字钟的时间基准,然后经过分频器输出标准秒脉冲。秒计数器满 60 后向分计数器进位,分计数器满 60 后向小时计数器进位,小时计数器按照“24 翻 1”规律计数。计数器的输出分别经译码器送显示器显示。计时出现误差时,可以用校时电路校时、校分。1)时钟产生电路。将开发板上的时钟
7、信号经过分频得到不同频率的时钟,分别作用于定时计数、LED 扫描。2)控制逻辑电路。完成电子钟的系统逻辑控制,包括计时控制、时间校对、显示扫描的逻辑控制,可完成系统复位、调整时间的功能。3)计时电路。主要按照时钟模式完成计时功能。4)译码电路。根据计时模块的状态输出值来确定对应位的数据,从而驱动显示电路。5)显示控制电路。主要执行选择所对应位的数据功能,显示正确的时间。为了节省 6个七段显示器显示所需的电流消耗,本文利用视觉暂留原理来让七段显示器轮流来显示。第三章 电子钟顶层设计3.1 顶层设计分析对于电子钟的设计,这里将采用自顶向下的设计方法进行设计,因此首先需要进行电子钟的顶层设计。这里首
8、先介绍电子钟的系统结构和模块划分,然后设计出顶层 VHDL 设计程序。3根据前边所述的电子钟的设计要求、工作原理和设计方案,这里给出设计系统结构框图和外部管脚图分别如图 3.1 和图 3.2 所示。图 3.1 系统结构框图图 3.2 系统外部管脚图由电子钟的外部管脚图可知,系统的输入输出信号包括:(1)复位开关信号 reset:输入信号;(2)外部输入的晶振信号 clk_in:输入信号;(3)分/时调整信号 setmin,sethour:输入信号;(4)报时触发信号 speak:输出信号;(5)数码管输出选通信号 sel50:输出信号;(6)LED 七段数码管的输出信号 led60,dp:输出
9、信号。由图 3.1 知,系统划分了五个模块,划分的这五个模块,每个模块都包含若干个组件,因此首先建立一个程序包把所有的组件包含在一起,以便于主程序模块的调用,然后再对每个组件进行编程设计。3.2 顶层电路图顶层电路图见附录 1。扫描输出模块 译码显示模块分时校对模块 整点报时模块正常计时模块电子钟系统4第四章 各功能模块的设计4.1 正常计时模块系统必须维持一个持续不断计数的时钟,从时间 00:00:00 到 23:59:59 不断循环。首先将 50MHZ 的系统输入脉冲分频 5000000 得到 1HZ 的基本秒输入,秒计数器满 60 后向分计数器进位,分计数器满 60 后向小时计数器进位,
10、小时计数器按照“24 翻 1”规律计数。这些功能的实现要用到三种组件:分频组件,60 进制计时组件,24 进制计时组件。4.1.1 分频模块设计本设计采用 CPLD 芯片 EP2C20,内部晶振为 50MHz,而数码管位扫描信号clk1=1000Hz,计时时钟信号 clk=1Hz。所以要用分频模块来对输入时钟进行分频。下图4.1 是生成的分频组件元器件图形。接口:clks:时钟输入,输入信号 50MHzclk:1Hz 输出信号clk1:扫描频率信号图 4.1 分频模块器件图在 Quartus软件中进行仿真后,仿真时设置 3000 分频得到 clk,500 分频得到clk1。仿真时序图如图 4.
11、2。图 4.2 分频模块仿真波形图由图 4.2 知,输入信号 clks= 10ns,输出信号 clk1= 5us,clk= 30us,证明分频是正确的。54.1.2 60 进制计数器设计秒数的计数以 1Hz 的输入 clk 为触发信号,分数的计数以秒数的进位输出 enmin 作为触发。下图 4.3 是 60 进制计数器器件图形。接口: clk:1hz 时钟信号clk1:校时时钟信号reset:复位信号daout:输出十进制信号setmin,sethour :校分控制信号enmin, enhour:进位信号图 4.3 60 进制秒计数器器件图 图 4.3 60 进制分计数器器件图在 Quartu
12、s软件中进行仿真后,得到仿真时序图如图 4.4。图 4.4 60 进制计数器仿真波形图由图 4.4 知,每来一个 clk 上升沿,计数器就加 1,当计数器当到达第 60 个上升沿时,enmin=1,daout 由 59 归零,仿真符合 60 进制计数器的要求。4.1.3 24 进制计数器设计24 进制计数器的结构和原理与 60 进制计数器相类似,只是将除以 60 改为除以 24。个位数的进位归零在十进制为 2 时,必须在 one 等于 3 时进位,同时送出进位指针full=1,1 小时后将指针归零。下图 4.5 是生成的 24 进制计数器器件图形。接口: clk:分的进位信号reset:复位信
13、号6daout:输出十进制的小时数图 4.5 24 进制计数器器件图在 Quartus软件中进行仿真后,得到仿真时序图如图 4.6。图 4.6 24 进制计数器仿真波形由上图 4.6 知,每来一个 clk 上升沿,计数器就加 1,当计数器当到达第 24 个上升沿时,daout 由 59 归零,仿真符合 24 进制计数器的要求。4.2 整点报时模块4.2.1 整点报时设计思路及原理图当计数时间在 59 分 59 秒时,报时模块输出报时控制信号。输出 speak=clk1=1000Hz驱动蜂鸣器报时。下图 4.7 是生成的整点报时器件图形。接口: clk1:驱动信号reset:复位信号dainm,
14、 dains:输入秒数、分数speak:输出信号图 4.7 整点报时器件图74.2.2 整点报时仿真波形在 Quartus软件中进行仿真后,得到仿真时序图如图 4.8。图 4.8 整点报时仿真波形由上图 4.8 知,当 dainm、dains 都为 0 时,speak 输出为 clk1,仿真符合整点报时的要求。4.3 分时校对模块4.3.1 分时校对设计思路及原理图当电子钟正常计时,校对信号 setmin,sethour 都为 1。当需要分校对时,setmin=0,秒信号送入分计数器时钟信号,进行时校对,sethour=0,秒信号送入时计数器时钟信号。通过 setmin,sethour 能够很
15、方便的校对成功。下图 4.9 是生成的分时校对器件图形。接口: clk:1hz 时钟信号reset:复位信号setmin:校分控制信号enmin:进位信号图 4.9 校分器件图4.3.2 分时校对仿真波形在 Quartus软件中进行仿真后,得到仿真时序图如图 4.10。8图 4.10 校分仿真波形由上图 4.10 知,当校分控制信号为 setmin = 0 时,分的时钟信号 enmin = clk,实现分钟快速计数校对到正确时间。仿真结果符合设计要求。校时仿真波形与校分基本类似。4.4 扫描输出模块4.4.1 扫描输出设计思路及原理图为了节省 IC 的输出引脚及耗电量,可以将 6 组数字输出作
16、为多路输出;另外使用八合一型七段显示器与视觉暂留效应可降低显示耗电量。首先将 6 个数值通过扫描模块分时选通七段数码管,依次将秒、分、时的数据扫描输出。下面图 4.11 是生成的扫描输出器件图形。接口: clk1:扫描信号reset:复位信号sec,min,hour:输入信号sel:选通信号daout:输出信号dp:小数点信号图 4.1 扫描输出器件图形4.4.2 扫描输出仿真波形在 Quartus软件中进行仿真后,得到仿真时序图如图 4.12。9图 4.12 扫描输出器件仿真波形由上图 4.12 知,每来一个 clk 上升沿,daout 就输出一位,当 6 个上升沿后,已依次将秒、分、时输出
17、。下一个上升沿重新分时扫描输出。仿真可实现扫描输出。4.5 译码显示模块4.5.1 译码显示设计思路及原理图译码为编码的逆过程。它将编码时赋予代码的含义“翻译”过来。实现译码的逻辑电路为七段数码管。共阳极数码管输出与输入有唯一的对应关系。输入输出关系如下表 41。表 41 输入输出关系表输入 输出D C B A a b c d e f g 字型0 0 0 0 0 0 0 0 0 0 1 00 0 0 1 1 0 0 1 1 1 1 10 0 1 0 0 0 1 0 0 1 0 20 0 1 1 0 0 0 0 1 1 0 30 1 0 0 1 0 0 1 1 0 0 40 1 0 1 0 1
18、0 0 1 0 0 50 1 1 0 0 1 0 0 0 0 0 60 1 1 1 0 0 0 1 1 1 1 71 0 0 0 0 0 0 0 0 0 0 81 0 0 1 0 0 0 0 1 0 0 9译码即把给定的代码进行翻译,本设计即是将时、分、秒计数器输出的四位二进制数代码翻译为相应的十进制数,并通过数码管显示。下图 4.13 是生成的译码显示器件图形。接口: num:09 输入信号led:七段数码管显示值10图 4.13 译码显示器件图形4.5.2 译码显示仿真波形在 Quartus软件中进行仿真后,得到仿真时序图如图 4.14。图 4.14 译码显示器件仿真波形由上图 4.14
19、知,输入的是 0 到 9 的二进制表示形式,输出的是七段显示译码,本设计的七段显示器是共阳极的,所以,如输入时 6 的二进制 0110,输出是 0100000,对应十六进制是 20 。仿真证明程序是可行的。第五章 系统硬件实现分析5.1 引脚分配当各个模块仿真结束之后,就分配管脚,分配管脚如图 5.1。图 5.1 分配管脚图分配完管脚之后,再编译一次,编译通过之后,就可以下载到 CPLD 上了。115.2 系统硬件测试及分析将 setmin、sethour 、reset 均接高电平,接通电源,数码管能正常显示数字,6 个数码管分别显示时、分、秒,扫描显示电路设计正确。将校分按键开关 setmi
20、n 按下接低电平,分会秒计,则“分”校时电路能正确校时,同理,校时一样,说明校对电路设计正确。当分计数到 59 分 59 秒时下个时钟信号过来扬声器就会响,则整点报时电路设计正确。将reset 接低电平,数字钟准确清零。通过对电路各个功能进行综合测试,本电子钟钟各项功能指标均达到设计要求,则本设计取得圆满成功。第六章 结束语本设计是用 VHDL 语言编写编译建模设计成的。由于初学 VHDL 语言,设计初期遇到了很多困难,在经过一段时间的查阅资料以及老师的指导和同学之间的相互讨论后完成了设计,但程序即使编译成功仿真还是遇到了很多困难,比如不知道该如何进行模块例化调用。在经过一次次试验和修改后仿真
21、终于正确,仿真无误后就根据元件引脚进行元器件之间的连线。通过本次课程设计,让我对数字电子钟有了更深刻的理解,也对用 VHDL 语言设计实验有了更好的了解。进一步掌握了有关数字钟的工作原理及相关设计知识。特别是对其各工作模块的功能有了更深一步的了解。实验过程中熟悉了对 Quartus 软件的操作及应用,提高了个人独立分析问题及解决问题的能力,掌握了 VHDL 硬件描述语言设计方法,也深刻体会到了 VHDL 在功能设计中所具有的优越性。参考文献1康华光 主编, 电子技术基础-数字部分 ,高等教育出版社,1998。2郑亚民等 主编, 可编程逻辑器件开发软件 Quartus ,国防工业出版社,2006
22、3谭会生等 主编, EDA 技术及应用 ,西安电子科技大学出版社,20014潘松等 主编, EDA 技术实用教程 ,科学出版社,20065雷伏容 主编, VHDL 电路设计 ,清华大学出版社,200612附录 1 顶层电路图附录 2 程序代码-电子钟顶层 VHDL 设计程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity e_clock isport(clk_in:in std_logic;-晶振时钟信号reset:in std
23、_logic;-复位信号setmin,sethour:in std_logic;-校对控制speak:out std_logic;-报时输出dp:out std_logic;-小数点输出sel:out std_logic_vector(5 downto 0);-分时选通led:out std_logic_vector(6 downto 0);-译码显示end e_clock;architecture structure of e_clock iscomponent div_clk-分频模块声明部分port(clks:in std_logic;clk:out std_logic;clk1:out
24、 std_logic);end component;13component second-秒模块声明部分port(clk,reset,setmin:in std_logic;enmin:out std_logic;daout:out std_logic_vector(7 downto 0);end component;component minute-分模块声明部分port(clk,reset,clk1,sethour:in std_logic;enhour:out std_logic;daout:out std_logic_vector(7 downto 0);end component;c
25、omponent hour-时模块声明部分port(clk,reset:in std_logic;daout:out std_logic_vector(7 downto 0);end component;component alarm-报时模块声明部分port(clk1,reset:in std_logic;dainm:in std_logic_vector(7 downto 0);dains:in std_logic_vector(7 downto 0);speak:out std_logic);end component;component seltime-扫描输出模块声明部分port(c
26、lk1,reset:in std_logic;sec,min,hour:in std_logic_vector(7 downto 0);dp:out std_logic;sel:out std_logic_vector(5 downto 0);daout:out std_logic_vector(3 downto 0);end component;component deled-译码显示声明部分port(num: in std_logic_vector(3 downto 0);led: out std_logic_vector(6 downto 0);14end component;signa
27、l clk,clk1:std_logic;signal enmin,enhour:std_logic;signal sec :std_logic_vector(7 downto 0);signal min :std_logic_vector(7 downto 0);signal hor:std_logic_vector(7 downto 0);signal daout:std_logic_vector(3 downto 0);beginu0:div_clkport map(clk_in,clk,clk1);u1:second port map(clk,reset,setmin,enmin,se
28、c);u2:minute port map(enmin,reset,clk,sethour,enhour,min);u3:hour port map(enhour,reset,hor);u4:alarm port map(clk1,reset,min,sec,speak);u5:seltime port map(clk1,reset,sec,min,hor,dp,sel,daout);u6:deled port map(daout,led);end structure;-分频模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logi
29、c_unsigned.all;entity div_clk isport(clks:in std_logic;-晶振时钟信号clk:out std_logic;-1Hz 基准时钟信号15clk1:out std_logic);-1000Hz 扫描频率信号end div_clk;architecture behave of div_clk issignal temp0: integer range 0 to 49999999;signal temp1: integer range 0 to 49999;beginprocess(clks)beginif(clksevent and clks=1)
30、thenif(temp0=49999999)then temp0=24999999 then clk=24999 then clk1=“101“)thencountdaoutdaoutdaoutdaoutdaoutdaoutdaout=“0000“;dp=0;sel=“111111“;end case;end if;end process;end art;-译码显示模块(deled.vhd)library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity deled is port(num: in s
31、td_logic_vector(3 downto 0);23led: out std_logic_vector(6 downto 0);end deled;architecture rtl of deled is begin led=“0000001“when num=“0000“else“1001111“when num=“0001“else“0010010“when num=“0010“else“0000110“when num=“0011“else“1001100“when num=“0100“else“0100100“when num=“0101“else“0100000“when num=“0110“else“0001111“when num=“0111“else“0000000“when num=“1000“else“0000100“when num=“1001“else“0001000“when num=“1010“else“1100000“when num=“1011“else“0110001“when num=“1100“else“1000010“when num=“1101“else“0110000“when num=“1110“else“0111000“when num=“1111“;end rtl;