EDA实验报告 数字时钟设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.引言
随着科学技术的迅猛发展,在计算机技术的推动下电子技术获得了飞速的发展。
电子产品几乎渗透到了工业、生活的各个领域,其中集成电路的设计正朝着速度快、性能高、容量大、体积小和微功耗的方向发展。
基于这种情况,可编程逻辑器件的出现和发展大大改变了传统的系统设计方法。
可编程逻辑器件和相应的设计技术主要体现在三个方面:一是可编程逻辑器件的芯片技术;二是适用于可逻辑编程器件的硬件编程技术,三是可编程逻辑器件设计的EDA开发工具,它主要用来进行可编程逻辑器件应用的具体实现。
在本设计中采用了集成度较高的FPGA 可编程逻辑器件,选用了VHDL硬件描述语言和Quartus II开发软件进行设计。
VHDL硬件描述语言在电子设计自动化( EDA)中扮演着重要的角色,由于采用了具有多层次描述系统硬件功能的“自顶向下”(Top -Down)的全新设计方法,使设计师们摆脱了大量的辅助设计工作,而把精力集中于创造性的方案与概念构思上,用新的思路来发掘硬件设备的潜力,从而极大地提高了设计效率,缩短了产品的研制周期。
Quartus II软件是集成了编辑器、仿真工具、检查/分析工具和优化/综合工具的这些所有开发工具的一种集成的开发环境,通过该开发环境能够很方便的检验设计的仿真结果以及建立起与可编程逻辑器件的管脚之间对应的关系。
EDA技术是以计算机为工具,根据硬件描述语言HDL完成的设计文件,自动地完成逻辑编译、化简、分割、综合及优化、布局布线。
仿真以及对于特定目标芯片的适配编译和编程下载等工作。
典型的EDA工具中必须包含两个特殊的软件包,即综合器和适配器。
综合器的功能就是将设计者在EDA平台上完成的针对某个系统项目的HDL、原理图或状态图形描述,针对给定的硬件系统组件,进行编译、优化、转换和综合,最终获得我们欲实现功能的描述文件。
综合器在工作前,必须给定所要实现的硬件结构参数,它的功能就是将软件描述与给定的硬件结构用一定的方式联系起来。
综合过程就是将电路的高级语言描述转换低级的。
可与目标器件FPGA/CPLD相映射的网表文件。
适配器的功能是将由综合器产生的王表文件配置与指定的目标器件中,产生最终的下载文件,如JED文件。
适配所选定的目标器件(FPGA/CPLD芯片)必须属于在综合器中已指定的目标器件系列。
2.设计概述
数字时钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更长的使用寿命,数字时钟可植入自动控制、测试等系统内部,作为系统的时钟源,可为系统提供定时信号或中断控制的时间基准,具有广泛的用途。
由于数字集成电路的发展使得数字时钟的精度远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的单一报时功能。
加入了一些诸如自动报时、定时闹钟等功能。
这些都是以钟表数字化为基础的。
因此,研究数字时钟及扩大其应用,有着非常现实的意义。
数字时钟的设计方法有很多种,包括基于单片机的硬件设计、基于各种描述语言的软件设计,本设计采用VHDL语言来设计数字时钟有着多方面的优越性,通过把整个设计分为多个模块依次来实现,减少了众多重复性步骤,合理化了设计过程,使得设计更加省时、快捷,提高了设计效率。
目前,电子系统的EDA技术正从着眼与数字逻辑向模拟电路和数模混合电路
的方向发展,21世纪是EDA技术飞速发展的时期,可以预见EDA技术将会对今后电子设计的发展产生重大的影响。
随着电子技术的发展,集成电路经历了从小规模、中规模到大规模和超大规模集成的过程,应用系统向小型化、快速化、大容量、重量轻的方向发展;数字系统的设计也已从芯片组合化设计走向单片系的设计。
随着微电子和计算机领域的原理创新、技术创新、应用创新层出不穷,许多特定功能的专用集成电路应用日益广泛,用户迫切希望根据自身设计要求自行构造逻辑功能的数字电路,复杂可编程逻辑器件FPGA顺应了这一新的需要。
它能将大量逻辑功能集成于一个芯片中,其规模可达几十万或上百门以上,从而电子设计自动化EDA技术应运而生,它是电子产品及系统开发领域中一场革命性变革,EDA技术极大地推动了科学技术的发展。
EDA技术的发展使硬件电路设计软件化,降低了硬件电路设计的难度,使设计周期和产品的开发时间缩短,设计更新变成了程序的修改,适应了千变万化的市场潮流。
它的设计输入可以使用硬件描述语言(HDL),采用“自顶向下”的设计方法,为设计者提供了一个高效、便捷的设计环境,同时也为充分发挥设计人员的创造性提供了条件。
EDA技术主要应用于数字电路的设计,目前它在中国的应用多数是用在FPGA的设计中。
EDA技术是现代电子信息工程领域的一门新技术,它是在先进的计算机工作平台上开发出来的一套电子系统设计的软硬件工具,并提供了先进的电子系统设计方法。
20世纪90年代,国际上电子和计算机技术较先进的国家,一直在积极探索新的电子电路设计方法,并在设计方法、工具等方面进行了彻底的变革,取得了巨大成功。
在电子技术设计领域,可编程逻辑器件的应用,已得到广泛的普及,这些器件为数字系统的设计带来了极大的灵活性。
这些器件可以通过软件编程而对其硬件结构和工作方式进行重构,从而使得硬件的设计可以如同软件设计那样方便快捷。
这一切极大地改变了传统的数字系统设计方法、设计过程和设计观念,促进了EDA技术的迅速发展。
目前,电子系统的EDA技术正从着眼与数字逻辑向模拟电路和数模混合电路的方向发展,21世纪是EDA技术飞速发展的时期,EDA技术将会对今后电子设计的发展产生重大的影响。
3.开发工具简介
3.1VHDL语言简介
3.1.1 VHDL发展史
VHDL语言诞生于1982年,翻译成中文就是超高速集成电路硬件描述语言。
最初是由美国国防部开发出来供美军用来提高设计的可靠性和缩减开发周期的一种使用范围较小的设计语言。
1987年底,VHDL被IEEE和美国国防部确认为标准硬件描述语言。
自IEEE公布了VHDL的标准版本,IEEE-1076之后,各EDA公司相继推出了自己的VHDL设计环境,或宣布自己的设计工具可以和VHDL接口。
此后VHDL在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准的硬件描述语言。
1993年,IEEE对VHDL进行了修订,从更高的抽象层次和系统描述能力上扩展VHDL的内容,公布了新版本的VHDL,主要是应用在数字电路的设计中。
现在,VHDL和Verilog HDL作为IEEE的工业标准硬件描述语言,又得到众多EDA公司的支持,在电子工程领域,已成为事实上的通用硬件描述语言。
有专家认为在新的世纪中,VHDL与Verilog语言将承担起大部分的数字系统设计任务。
目前,它在中国的应用多数是用FPGA/CPLD的设计中。
VHDL主要用于描述数字系统的结构、行为、功能和接口。
除了含有许多具有
硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。
VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可是部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。
在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。
这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。
3.1.2 VHDL设计特点
应用VHDL语言进行系统设计,有以下几方面的特点:
1)功能强大:VHDL具有功能强大的语言结构。
它可以用明确的代码描述复杂的控制逻辑设计。
并且具有多层次的设计描述功能,支持设计库和可重复使用的元件生成。
VHDL是一种设计、仿真和综合的标准硬件描述语言。
2)可移植性:VHDL语言是一个标准语言,其设计描述可以为不同的EDA工具支持。
它可以从一个仿真工具移植到另一个仿真工具,从一个综合工具移植到另一个综合工具,从一个工作平台移植到另一个工作平台。
此外,通过更换库再重新综合很容易移植为ASIC设计。
3)独立性:VHDL的硬件描述与具体的工艺技术和硬件结构无关。
设计者可以不懂硬件的结构,也不必管最终设计实现的目标器件是什么,而进行独立的设计。
程序设计的硬件目标器件有广阔的选择范围,可以是各系列的CPLD、FPGA 及各种门阵列器件。
4)可操作性:由于VHDL具有类属描述语句和子程序调用等功能,对于已完成的设计,在不改变源程序的条件下,只需改变端口类属参量或函数,就能轻易地改变设计的规模和结构。
5)灵活性:VHDL最初是作为一种仿真标准格式出现的,有着丰富的仿真语句和库函数。
使其在任何大系统的设计中,随时可对设计进行仿真模拟。
所以,即使在远离门级的高层次,设计者就能够对整个工程设计的结构和功能的可行性进行查验,并做出决策。
3.1.3 VHDL设计结构
VHDL描述数字电路系统设计的行为、功能、输入和输出。
它在语法上与现代编程语言相似,但包含了许多与硬件有特殊关系的结构。
VHDL将一个设计称为一个实体Entity(元件电路或者系统),并且将它分成外部的可见部分(实体名连接)和内部的隐藏部分(实体算法实现)。
当定义了一个设计的实体之后,其他实体可以利用该实体,也可以开发一个实体库。
所以,内部和外部的概念对系统设计的VHDL是十分重要的。
外部的实体名或连接由实体声明来描述。
而内部的实体算法或实现则由结构体来描述。
结构体可以包含相连的多个进程或者组建等其他并行结构,需要说明的是它们在硬件中都是并行运行的。
3.1.4 VHDL设计步骤
采用VHDL的系统设计,一般有以下6个步骤:
1)按照要求的功能模块划分;
2)VHDL的设计描述(设计输入);
3)代码仿真模拟(前仿真);
4)计综合、优化和布局布线;
5)布局布线后的仿真模拟(后仿真);
6)设计的实现(下载到目标器件)。
3.2Quartus II软件简介
3.2.1 Quartus II软件介绍
Quartus II 是Alera公司推出的一款功能强大,兼容性最好的EDA工具软件。
该软件界面友好、使用便捷、功能强大,是一个完全集成化的可编程逻辑设计环境,具有开放性、与结构无关、多平台完全集成化丰富的设计库、模块化工具、支持多种硬件描述语言及有多种高级编程语言接口等特点[16]。
Quartus II 支持原理图输入与 Verilog HDL 和VHDL输入混合设计,它除了承接原来的Max+Plus II 软件的全部设计功能和器件对象外,还增加了许多新功能和新的FPGA器件系列。
它可对设计进行功能仿真,对数字电路的设计实现同步模拟分析和时序仿真。
这种同步模拟分析、时序仿真在数字电路的教学中可以起到很好的辅助作用。
Quartus II是Altera公司推出的CPLD/FPGA开发工具,Quartus II提供了完全集成且与电路结构无关的开发包环境,具有数字逻辑设计的全部特性,包括:可利用原理图、结构框图、VerilogHDL、AHDL和VHDL完成电路描述,并将其保存为设计实体文件;芯片(电路)平面布局连线编辑;功能强大的逻辑综合工具;完备的电路功能仿真与时序逻辑仿真工具;定时/时序分析与关键路径延时分析;可使用SignalTap II逻辑分析工具进行嵌入式的逻辑分析;支持软件源文件的添加和创建,并将它们链接起来生成编程文件;使用组合编译方式可一次完成整体设计流程;自动定位编译错误;高效的期间编程与验证工具;可读入标准的EDIF网表文件、VHDL网表文件和Verilog网表文件;能生成第三方EDA软件使用的VHDL网表文件和Verilog网表文件。
3.2.2 Quartus II软件设计流程
1)设计输入:
设计文件的输入方法有原理图输入、文本输入、内存编辑以及由第三方EDA 工具产生的网表输入、格式输入,生成方法不同,生成的文件格式也有所不同。
在图形设计文件中,Quartus II软件为了实现不同的逻辑功能提供了大量的基本单元符号和宏功能模块,在图形编辑器中可以直接调用;为了适应自顶向下的设计,设计者可以使用和Verilog HDL以及Tcl脚本输入文本型设计。
2)项目编译:
项目编译主要完成设计项目的检查和逻辑综合,将项目最终设计结果生成器件的下载文件,并为模拟和编程产生输出文件。
3)仿真验证和时序分析:
在把经过编译的输入设计编程或配置到器件之前,可以通过Quartus II软件的仿真器对文件进行全面测试,保证设计在各种可能的条件下都有正确的响应。
根据所需的信息类型,可以进行功能仿真和时序仿真。
Quartus II时序分析器允许分析设计中所有逻辑的性能,得出时序分析结果,如建立时间、保持时间、引脚到引脚延迟、最大时钟频率、延迟时间及其它时序特征,并协助引导适配器满足设计中的时序要求。
4)器件编程:
成功编译了设计工程之后,编译器的Assembler模块自动将适配过程的器件、逻辑单元和引脚分配信息转换为器件的编程图像,并以.sof形式保存,Quartus II软件的编程器(programmer)使用该文件就可对器件进行编程配置。
4. 数字时钟实验要求和原理
4.1 实验要求
在Quartus II 软件开发环境下,使用VHDL 描述语言、结合FPGA 开发板编译和仿真数字时钟;要求时钟能进行基本的计时功能,按照:“时:分:秒”来显示时间;能引入秒脉冲进行校时、校分,并可用reset 信号给秒清零;具有整点报时功能,当计时到59分50秒时蜂鸣器开始鸣响,四声低音,最后一声高音。
4.2 实验原理
根据实验要求,采用自顶向下的设计方法,层次化设计概念,将此数字时钟分成若干模块,设计时首先用VHDL 语言编写各个功能模块,在 Quartus II 开发环境下分别进行编译、仿真,然后再用顶层文件将各功能模块连接起来。
规定某一模块的功能和各模块之间的接口.然后将各模块组合起来构成系统框图。
根据设数字时钟的功能可以把整体设计分为:分频模块clk 、秒计时模块second 、分计时模块minute 、小时及时模块hour 及报时模块alarm ,根据总体方案对各模块分别进行设计、仿真和下载,数字时钟的总体结构框图如图1所示 蜂鸣器
1hz 1hz
图1 数字时钟结构框图
分频模块clk 将输入的5MHz 时钟信号分频后获得1Khz ,500hz ,1hz 的矩形波。
其中1Khz 和500hz 的音频信号用于报时,1Hz 的信号用于计时、校时和校分。
秒计时模块second 和分计时模块minute 均为60进制计数器。
RESET 信号用于秒清零,SETM 为校分控制信号,当SETM=‘1’时,将1hz 信号引入分计时器minute 进行快速计分;SETH 为校时控制信号,当SETH=‘1’时,将1hz 信号引入时计时器hour 进行快速校时。
报时模块alarm 根据当前的计时值确定是否鸣响,当计时值为59分50秒时蜂鸣器开始鸣响,四声低音,最后一声高音。
1KHz Clk5M 500Hz 1Hz 1KHz
500Hz alarm
秒个位
秒十位 分个位 分十位
校分脉冲 分个位 CLKM 分十位 SETM 分进位 CLK1S 秒个位 秒十位 RESET 秒进位
校时脉冲 时个位
CLKH 时十位 SETH
5.数字时钟模块化设计
需要设计的数字时钟由上述5个模块组成,设计时,首先用VHDL语言编写各个底层功能模块,然后在Quartus II开发环境下分别进行编译、仿真, 然后再用顶层文件将各功能模块连接起来,再进行进一步编译、仿真、下载。
以下介绍系统中各模块的具体功能和设计方法。
5.1分频模块clk设计
本设计使用的FPGA开发板中使用的芯片是Cyclone II EP2C35F484C8,使用的是5MHz的时钟脉冲输入,根据电路的具体设计需要,对其进行分频设计。
如图2所示为系统的分频模块,其中模块clk1管脚输出为1hz的时钟脉冲,得出用于计数模块和报警模块正常工作的时钟信号,在clk1k管脚输出为一个1khz的时钟脉冲,作用与动态扫描模块的正常工作。
输入管脚:clk为5Mhz脉冲输入;
输出管脚:clk1s为1hz脉冲输出;
clk1k为1khz脉冲输出;
clk500为500hz脉冲输出
clk
clk clk500
clk1k
clk1s
inst
图2
分频模块clk源代码clk.vhd如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY clk IS
PORT (clk : IN STD_LOGIC; --5Mhz信号输入
clk500 : OUT STD_LOGIC; --500hz音频信号输出
clk1k : OUT STD_LOGIC; --1khz音频信号输出
clk1s : OUT STD_LOGIC); --1hz脉冲信号输出
END clk;
ARCHITECTURE fenpin OF clk IS
SIGNAL x : STD_LOGIC;
SIGNAL y : STD_LOGIC;
SIGNAL z : STD_LOGIC;
BEGIN
PROCESS(clk)
VARIABLE cnt : INTEGER RANGE 0 TO 2499;
BEGIN --分频输出500hz音频信号
IF clk'EVENT AND clk='1' THEN
IF cnt<2499 THEN
cnt := cnt+1;
ELSE cnt := 0;
x <= NOT x;
END IF;
END IF;
clk1k <= x;
END PROCESS;
PROCESS(clk)
VARIABLE cnt : INTEGER RANGE 0 TO 4999;
BEGIN --分频输出1khz 音频信号
IF clk'EVENT AND clk='1' THEN
IF cnt<4999 THEN
cnt := cnt+1;
ELSE cnt :=0;
y <= NOT y;
END IF;
END IF;
clk500 <= y;
END PROCESS;
PROCESS(clk)
VARIABLE cnt : INTEGER RANGE 0 TO 2499999;
BEGIN --分频输出1hz 脉冲信号
IF clk'EVENT AND clk = '1' THEN
IF cnt<2499999 THEN
cnt := cnt+1;
ELSE cnt := 0;
z <= NOT z;
END IF;
END IF;
clk1s <= z;
END PROCESS;
END fenpin;
5.2 秒计时模块second 设计
秒计时模块如图3所示,其实质是一个六十进制计数器,其中 :
输入管脚: clk1s 为1hz 的时钟脉冲;
reset 为秒清零复位信号;
输出管脚:sec1[3..0]为秒计时器的低位;
sec2[3..0]为秒计时器的高位;
seco 为秒计时模块输出的进位信号。
图3
clk1s
reset sec2[3..0]sec1[3..0]
seco
second
inst1
秒计时模块second源代码second.vhd如下:
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_arith.all;
Use ieee.std_logic_unsigned.all;
Entity second is
Port(clk1s : in std_logic; --1hz时钟输入信号
reset : in std_logic; --秒计时器清零
sec2,sec1 : buffer std_logic_vector(3 downto 0); --秒计时器的高/低位 seco : out std_logic); --秒进位输出
End;
Architecture A of second is
Begin
Process(clk1s,reset)
Begin
If reset = '0' then --将秒计时器清零
sec2 <= "0000";
sec1 <= "0000";
seco <= '0';
Elsif clk1s'event and clk1s = '1' then
If(sec1 = "1001" and sec2 = "0101") then
sec2 <= "0000";
sec1 <= "0000"; --计时到59s归零
seco <= '1'; --计时到59s产生进位
elsif(sec1 = "1001") then
sec1 <= "0000";
sec2 <= sec2+1;
seco <= '0';
else sec1 <= sec1+1;
seco <= '0';
End if;
End if;
End Process;
End;
5.3分计时模块minute设计
分计时模块如图4所示,其实质也是一个六十进制计数器,其中:
输入管脚:clkm为分计时模块的秒进位输入信号;
clk1s为1hz的校分时钟输入脉冲;
setm为校分控制信号。
输出管脚:min1[3..0]为分计时器的低位;
min2[3..0]为分计时器的高位;
mino为分计时模块输出的分进位信号.
图4
分计时模块minute 源代码minute.vhd 如下:
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_arith.all;
Use ieee.std_logic_unsigned.all;
Entity minute is
Port(clkm : in std_logic; --秒进位信号输入
clk1s : in std_logic; --1hz 校分时钟输入信号
setm : in std_logic; --校分控制信号
min2,min1 : buffer std_logic_vector(3 downto 0); --
分计时器高/低位
mino : out std_logic); --输出分进位信号
End;
Architecture A of minute is
Signal clkx : std_logic;
Begin
Pclkm : Process(clkm,clk1s,setm)
Begin --根据是否校分选择计时时钟
If setm = '1' then clkx <=clk1s; else clkx <=clkm;
End if;
End Process;
Pcontm : Process(clkx)
Begin --分计时器
if clkx'event and clkx = '1' then
If (min1 = "1001" and min2 = "0101") then
min1 <= "0000";
min2 <= "0000"; --计时到59min 后归零
mino <= '1'; --计时到59分产生进位
elsif (min1 = "1001") then
min1 <= "0000";
min2 <= min2+1;
mino <= '0';
else min1 <= min1+1;
mino <= '0';
End if;
End if;
End Process;
End;
clkm clk1s setm min2[3..0]
min1[3..0]
mino
minute
inst2
5.4 小时计时模块hour 设计
小时计时模块如图5所示,其实质也是一个六十进制计数器,其中 : 输入管脚:clkh 为小时计时模块的分进位输入信号;
clk1s 为1hz 的校时时钟输入脉冲;
seth 为校时控制信号。
输出管脚:hou1[3..0]为小时计时器的低位;
hou2[3..0]为小时计时器的高位。
图5
小时计时模块hour 源代码hour.vhd 如下:
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_arith.all;
Use ieee.std_logic_unsigned.all;
Entity hour is
Port(clkh : in std_logic; --分进位信号输入
clk1s : in std_logic; --1hz 小时时钟信号输入
seth : in std_logic; --校时控制信号
hou2,hou1 : buffer std_logic_vector(3 downto 0)); --小时计数器高/低位 End;
Architecture A of hour is
Signal clky : std_logic;
Begin
Pclkh : Process(clkh,clk1s,seth)
Begin --根据是否校时选择计时时钟
If seth = '1' then clky <= clk1s; else clky <= clkh;
End if;
End process;
Pconth : Process(clky)
Begin --小时计时器
if clky'event and clky = '1' then
If(hou1 = "0011" and hou2 = "0010") then
hou1 <= "0000";
hou2 <= "0000"; --重复计数并产生进位
elsif (hou1 = "1001") then
hou1 <= "0000";
hou2 <= hou2+1;
else hou1 <= hou1+1;
End if;
clkh
clk1s
seth
hou2[3..0]hou1[3..0]hour
inst3
End if; End Process; End;
5.5 报时模块alarm 设计
报时模块如图6所示,其作用是在时钟整点的时候输出一个报时信号,信号作用在蜂鸣器上,产生外部响声,起到报时的作用,其中:
输入管脚:clk1s 为1hz 时钟输入信号; clk500为500hz 音频输入信号; clk1k 为1khz 音频输入信号; sec2,sec1 为秒计时值输入; min2,min1为分计时值输入; 输出管脚:alarm 为报时信号输出。
图6
报时模块alarm 源代码alarm.vhd 如下:
Library ieee;
Use ieee.std_logic_1164.all; Use ieee.std_logic_arith.all; Use ieee.std_logic_unsigned.all; Entity alarm is
Port(clk500 : in std_logic; --1hz 时钟信号输入 clk1k : in std_logic; --500hz 音频信号输入 clk1s : in std_logic; --1khz 音频信号输入
sec2,sec1 : in std_logic_vector(3 downto 0); --秒计时值输入 min2,min1 : in std_logic_vector(3 downto 0); --分计时值输入 alarm : out std_logic); --输出报时信号 End;
Architecture A of alarm is Begin
Process(clk1s)
VARIABLE flag500 : std_logic; --输出500hz 信号时的标志 VARIABLE flag1k : std_logic; --输出1khz 信号时的标志 begin
if clk1s'event and clk1s = '1' then
If (min1 = "1001" and min2 = "0101" and sec2="0101") then --在59分50秒开始设置高/低音频信号标志
clk500clk1k clk1s sec2[3..0]sec1[3..0]min2[3..0]min1[3..0]alarm
alarm
inst4
case sec1 is
when "0000" => flag500 := '1'; when "0010" => flag500 := '1'; when "0100" => flag500 := '1'; when "0110" => flag500 := '1'; when "1001" => flag1k := '1';
when others => flag500 := '0'; flag1k := '0'; End case;
else flag500 := '0'; flag1k := '0'; End if; end if;
if flag500 = '1' then alarm <= clk500; --输出500hz 报时信号 elsif flag1k = '1' then alarm <= clk1k; --输出1khz 报时信号 else alarm <= '0'; end if;
End Process; End;
5.6 数字时钟顶层文件timer.bdf 设计
数字时钟顶层电路图(timer.bdf )如图7所示,通过将各个功能模块打包成元件,并通过连线将各功能模块连接起来构成顶层文件。
图7数字时钟顶层电路图(timer.bdf )
PIN_B12
VCC
clk
INPUT PIN_AB15
VCC
reset
INPUT PIN_AB14
VCC
setm_in
INPUT PIN_AB13
VCC
seth_in
INPUT PIN_Y16
speaker
OUTPUT
PIN_K18PIN_K21PIN_K22PIN_L17sec1out[3..0]
OUTPUT PIN_J20PIN_J21PIN_J22PIN_K17
sec2out[3..0]
OUTPUT PIN_E9PIN_E11PIN_J18PIN_J19min1out[3..0]OUTPUT
PIN_D9PIN_D11PIN_E7PIN_E8
min2out[3..0]
OUTPUT PIN_H7PIN_C9PIN_D7PIN_D8hou1out[3..0]
OUTPUT PIN_K20PIN_U20PIN_Y13PIN_Y7
hou2out[3..0]
OUTPUT clkm clk1s
setm min2[3..0]min1[3..0]
mino
minute inst2
clk1s
reset
sec2[3..0]sec1[3..0]
seco
second inst1
clk500clk1k clk1s sec2[3..0]sec1[3..0]min2[3..0]min1[3..0]alarm
alarm inst4
clkh clk1s
seth hou2[3..0]hou1[3..0]
hour
inst3
clk clk500
clk1k clk1s
clk
inst
m i n 1o u t [3..0]
m i n 2o u t [3..0]
s e c 2o u t [3..0]
sec1out[3..0]
hou1out[3..0]
hou2out[3..0]
6.数字时钟各模块仿真
仿真是使用VHDL语言进行设计的重要组成部分,也是对设计的电路进行功能和性能测试的有效手段。
EDA工具提供了强大且与电路实时行为相吻合的精确硬件系统测试工具。
由于本设计采用了分模块化设计的方法,所以仿真的时候需要先进行各底层模块的独立仿真,最后进行整个电子时钟的时序仿真,将所有仿真图综合起来验证系统功能的完整性。
6.1分频模块clk仿真
分频模块clk的时序仿真图如图8所示,考虑到5Mhz和1khz,500hz都较大,为了便于观察,将频率整体缩小到1/250,从图中可以看出,输入为5Mhz/250时,输出确实为1khz/250,500hz/250和1hz/250。
图8 分频模块clk时序仿真
6.2秒计时模块second仿真
秒计时模块second的时序仿真图如图9所示,从图中可以看出,输入为1hz 的时钟信号,reset为低电平有效的复位信号,秒计时器的低位从0计到9后向高位产生进位,当计时到59秒时,向分计时模块产生进位,然后重新开始进行秒计时,实现60秒计时制。
图9 秒计时模块second时序仿真
6.3分计时模块minute仿真
分计时模块minute的时序仿真图如图10所示,从图中可以看出,输入为1hz的时钟信号,setm为高电平有效的校分信号,分计时器的低位从0计到9后向高位产生进位,当计时到59分时,向小时计时模块产生进位,然后重新进行分计时,实现60分钟计时制。
图10 分计时模块minute时序仿真
6.4小时计时模块hour仿真
小时计时模块hour的时序仿真如图11所示,从图中可以看出,输入为1hz 的时钟信号,seth为高电平有效的校时信号,小时计时器的低位从0计到9后向高位产生进位,当计时到23时,高低位都归0,重新进行小时计时,实现24小时计时制。
图11 小时计时模块hour时序仿真
6.5报时模块alarm仿真
报时模块alarm的时序仿真如图12所示,从图中可以看出,当计时到59分50秒时,蜂鸣器开始报时,即有整点报时功能,报时输出为前四声低音,最后一声高音。
图12报时模块alarm时序仿真
7.硬件测试
本实验采用的是杭州康芯有限公司的GW48-PK4 SOPC/EDA实验开发系统,核心芯片为Cyclone II EP2C35FBGA 484芯片。
实验硬件测试时使用开发系统的模式5,用短路冒从CLK9获取5Mhz的时钟脉冲信号,并将核心板右下方的短路冒置于CLK0位置,按下键1(相应指示灯亮),可以将秒计时器清零,按下键2(相应指示灯亮)可以引入秒时钟脉冲校分,按下键3(相应指示灯亮)可以引入秒时钟脉冲校时。
实验调试过程如下:先按下键1(相应指示灯亮)是秒计时器处于清零状态,在按下键2(相应指示灯亮)引入秒时钟脉冲校分到“59”时,再次按下键2(相应指示灯灭),还可以调试一下小时,然后按下键1(相应指示灯灭)开始正常计时,当秒计时器显示“50”的时候,蜂鸣器开始报时,四声低音最后一声高音。
到秒计时器回到“00”的时候报时结束,小时位加1了,分钟位也回到了“00”,调试完毕。
8.实验总结
此次实验是第一次做EDA实验,在学习使用软硬件的过程中,自然遇到了很多不懂的问题,在老师的指导和同学们的相互帮助下,我终于解决了实验过程遇到的很多难题,成功的完成了实验,实验结果和预期的结果也是一致的,在这次实验中,我学会了如何使用Quartus II软件,如何分层设计电路,如何编写VHDL 程序,如何对实验程序进行编译和仿真和对程序进行硬件测试。
明白了一定要学会看开发板资料以清楚如何给程序的输入输出信号配置管脚。
这次实验为我今后对EDA和VHDL语言的进一步学习奠定了更好的理论基础和应用基础。