基于VHDL的数字时钟设计与时序仿真_第1页
基于VHDL的数字时钟设计与时序仿真_第2页
基于VHDL的数字时钟设计与时序仿真_第3页
基于VHDL的数字时钟设计与时序仿真_第4页
基于VHDL的数字时钟设计与时序仿真_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

基于VHDL的数字时钟设计和时序仿真/毕业设计基于VHDL的数字时钟设计和时序仿真学生姓名:学院:专业:指导教师:年月目录1引言……………………12设计概述………………23开发工具简介…………43.1VHDL语言简介……………………43.1.1VHDL发展史……………………43.1.2VHDL设计特点…………………43.1.3VHDL设计结构………………53.1.4VHDL设计步骤………………63.2QuartusII软件简介……………63.2.1QuartusII软件介绍…………63.2.2QuartusII软件设计流程……………………64数字时钟的设计要求和原理………84.1设计要求……………84.2设计原理……………85数字时钟模块化设计………………105.1分频模块…………115.2计时模块…………135.2.1秒计时模块……………………135.2.2分计时模块……………………155.2.3时计时模块……………………175.3报警模块…………185.4数据选择模块………………205.5译码显示模块……………………226数字时钟模块化仿真………………246.1计时模块仿真图…………………246.1.1秒模块仿真图…………………246.1.2分模块仿真图…………………246.1.3时模块仿真图………………256.2报警模块仿真图…………………256.3数据选择模块仿真图……………266.4译码模块仿真图…………………266.5数字时钟整体仿真图……………277FPGA开发板实验……………………287.1芯片和器件选择…………………287.2外部电路接线……………………287.2硬件实物图………………………288结论…………………30附录……………………31参考文献………………42致谢……………………431引言随着科学技术的迅猛发展,在计算机技术的推动下电子技术获得了飞速的发展。电子产品几乎渗透到了工业、生活的各个领域,其中集成电路的设计正朝着速度快、性能高、容量大、体积小和微功耗的方向发展。基于这种情况,可编程逻辑器件的出现和发展大大改变了传统的系统设计方法。可编程逻辑器件和相应的设计技术主要体现在三个方面:一是可编程逻辑器件的芯片技术;二是适用于可逻辑编程器件的硬件编程技术,三是可编程逻辑器件设计的EDA开发工具,它主要用来进行可编程逻辑器件应用的具体实现[1]。在本设计中采用了集成度较高的FPGA可编程逻辑器件,选用了VHDL硬件描述语言和QuartusII开发软件进行设计。VHDL硬件描述语言在电子设计自动化<EDA>中扮演着重要的角色,由于采用了具有多层次描述系统硬件功能的"自顶向下"<Top-Down>的全新设计方法,使设计师们摆脱了大量的辅助设计工作,而把精力集中于创造性的方案与概念构思上,用新的思路来发掘硬件设备的潜力,从而极大地提高了设计效率,缩短了产品的研制周期[2]。QuartusII软件是集成了编辑器、仿真工具、检查/分析工具和优化/综合工具的这些所有开发工具的一种集成的开发环境,通过该开发环境能够很方便的检验设计的仿真结果以及建立起与可编程逻辑器件的管脚之间对应的关系[3]。EDA技术是以计算机为工具,根据硬件描述语言HDL完成的设计文件,自动地完成逻辑编译、化简、分割、综合及优化、布局布线。仿真以及对于特定目标芯片的适配编译和编程下载等工作。典型的EDA工具中必须包含两个特殊的软件包,即综合器和适配器。综合器的功能就是将设计者在EDA平台上完成的针对某个系统项目的HDL、原理图或状态图形描述,针对给定的硬件系统组件,进行编译、优化、转换和综合,最终获得我们欲实现功能的描述文件。综合器在工作前,必须给定所要实现的硬件结构参数,它的功能就是将软件描述与给定的硬件结构用一定的方式联系起来。综合过程就是将电路的高级语言描述转换低级的。可与目标器件FPGA/CPLD相映射的网表文件。适配器的功能是将由综合器产生的王表文件配置与指定的目标器件中,产生最终的下载文件,如JED文件。适配所选定的目标器件<FPGA/CPLD芯片>必须属于在综合器中已指定的目标器件系列。2设计概述数字时钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更长的使用寿命,数字时钟可植入自动控制、测试等系统内部,作为系统的时钟源,可为系统提供定时信号或中断控制的时间基准,具有广泛的用途。由于数字集成电路的发展使得数字时钟的精度远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的单一报时功能[4]。加入了一些诸如自动报时、定时闹钟等功能。这些都是以钟表数字化为基础的。因此,研究数字时钟及扩大其应用,有着非常现实的意义。数字时钟的设计方法有很多种,包括基于单片机的硬件设计、基于各种描述语言的软件设计,本设计采用VHDL语言来设计数字时钟有着多方面的优越性,通过把整个设计分为多个模块依次来实现,减少了众多重复性步骤,合理化了设计过程,使得设计更加省时、快捷,提高了设计效率。目前,电子系统的EDA技术正从着眼与数字逻辑向模拟电路和数模混合电路的方向发展,21世纪是EDA技术飞速发展的时期,可以预见EDA技术将会对今后电子设计的发展产生重大的影响。随着电子技术的发展,集成电路经历了从小规模、中规模到大规模和超大规模集成的过程,应用系统向小型化、快速化、大容量、重量轻的方向发展[5];数字系统的设计也已从芯片组合化设计走向单片系的设计。随着微电子和计算机领域的原理创新、技术创新、应用创新层出不穷,许多特定功能的专用集成电路应用日益广泛,用户迫切希望根据自身设计要求自行构造逻辑功能的数字电路,复杂可编程逻辑器件FPGA顺应了这一新的需要。它能将大量逻辑功能集成于一个芯片中,其规模可达几十万或上百门以上,从而电子设计自动化EDA技术应运而生,它是电子产品及系统开发领域中一场革命性变革,EDA技术极大地推动了科学技术的发展[6]。EDA技术的发展使硬件电路设计软件化,降低了硬件电路设计的难度,使设计周期和产品的开发时间缩短,设计更新变成了程序的修改,适应了千变万化的市场潮流。它的设计输入可以使用硬件描述语言<HDL>,采用"自顶向下"的设计方法[7],为设计者提供了一个高效、便捷的设计环境,同时也为充分发挥设计人员的创造性提供了条件。EDA技术主要应用于数字电路的设计,目前它在中国的应用多数是用在FPGA的设计中。EDA技术是现代电子信息工程领域的一门新技术,它是在先进的计算机工作平台上开发出来的一套电子系统设计的软硬件工具,并提供了先进的电子系统设计方法[8]。20世纪90年代,国际上电子和计算机技术较先进的国家,一直在积极探索新的电子电路设计方法,并在设计方法、工具等方面进行了彻底的变革,取得了巨大成功。在电子技术设计领域,可编程逻辑器件的应用,已得到广泛的普及,这些器件为数字系统的设计带来了极大的灵活性。这些器件可以通过软件编程而对其硬件结构和工作方式进行重构,从而使得硬件的设计可以如同软件设计那样方便快捷。这一切极大地改变了传统的数字系统设计方法、设计过程和设计观念,促进了EDA技术的迅速发展[9]。目前,电子系统的EDA技术正从着眼与数字逻辑向模拟电路和数模混合电路的方向发展,21世纪是EDA技术飞速发展的时期,EDA技术将会对今后电子设计的发展产生重大的影响[10]。3开发工具简介3.1VHDL语言简介3.1.1VHDL发展史VHDL语言诞生于1982年,翻译成中文就是超高速集成电路硬件描述语言。最初是由美国国防部开发出来供美军用来提高设计的可靠性和缩减开发周期的一种使用范围较小的设计语言。1987年底,VHDL被IEEE和美国国防部确认为标准硬件描述语言。自IEEE公布了VHDL的标准版本,IEEE-1076之后,各EDA公司相继推出了自己的VHDL设计环境,或宣布自己的设计工具可以和VHDL接口。此后VHDL在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准的硬件描述语言[11]。1993年,IEEE对VHDL进行了修订,从更高的抽象层次和系统描述能力上扩展VHDL的内容,公布了新版本的VHDL,主要是应用在数字电路的设计中。现在,VHDL和VerilogHDL作为IEEE的工业标准硬件描述语言,又得到众多EDA公司的支持,在电子工程领域,已成为事实上的通用硬件描述语言。有专家认为在新的世纪中,VHDL与Verilog语言将承担起大部分的数字系统设计任务[12]。目前,它在中国的应用多数是用FPGA/CPLD的设计中。VHDL主要用于描述数字系统的结构、行为、功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称设计实体〔可以是一个元件,一个电路模块或一个系统分成外部〔或称可是部分,及端口>和内部〔或称不可视部分,既涉及实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体[13]。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。3.1.2VHDL设计特点应用VHDL语言进行系统设计,有以下几方面的特点:1功能强大:VHDL具有功能强大的语言结构。它可以用明确的代码描述复杂的控制逻辑设计。并且具有多层次的设计描述功能,支持设计库和可重复使用的元件生成。VHDL是一种设计、仿真和综合的标准硬件描述语言。2可移植性:VHDL语言是一个标准语言,其设计描述可以为不同的EDA工具支持。它可以从一个仿真工具移植到另一个仿真工具,从一个综合工具移植到另一个综合工具,从一个工作平台移植到另一个工作平台[14]。此外,通过更换库再重新综合很容易移植为ASIC设计。3独立性:VHDL的硬件描述与具体的工艺技术和硬件结构无关。设计者可以不懂硬件的结构,也不必管最终设计实现的目标器件是什么,而进行独立的设计。程序设计的硬件目标器件有广阔的选择范围,可以是各系列的CPLD、FPGA及各种门阵列器件。4可操作性:由于VHDL具有类属描述语句和子程序调用等功能,对于已完成的设计,在不改变源程序的条件下,只需改变端口类属参量或函数,就能轻易地改变设计的规模和结构。5灵活性:VHDL最初是作为一种仿真标准格式出现的,有着丰富的仿真语句和库函数。使其在任何大系统的设计中,随时可对设计进行仿真模拟。所以,即使在远离门级的高层次,设计者就能够对整个工程设计的结构和功能的可行性进行查验,并做出决策。VHDL设计结构VHDL描述数字电路系统设计的行为、功能、输入和输出。它在语法上与现代编程语言相似,但包含了许多与硬件有特殊关系的结构。VHDL将一个设计称为一个实体Entity〔元件电路或者系统,并且将它分成外部的可见部分〔实体名连接和内部的隐藏部分〔实体算法实现。当定义了一个设计的实体之后,其他实体可以利用该实体,也可以开发一个实体库。所以,内部和外部的概念对系统设计的VHDL是十分重要的。外部的实体名或连接由实体声明来描述。而内部的实体算法或实现则由结构体来描述[15]。结构体可以包含相连的多个进程或者组建等其他并行结构,需要说明的是它们在硬件中都是并行运行的。VHDL设计步骤采用VHDL的系统设计,一般有以下6个步骤:1按照要求的功能模块划分;2VHDL的设计描述〔设计输入;3代码仿真模拟〔前仿真;4计综合、优化和布局布线;5布局布线后的仿真模拟〔后仿真;6设计的实现〔下载到目标器件。3.2QuartusII软件简介3.2.1QuartusII软件介绍QuartusII是Alera公司推出的一款功能强大,兼容性最好的EDA工具软件。该软件界面友好、使用便捷、功能强大,是一个完全集成化的可编程逻辑设计环境,具有开放性、与结构无关、多平台完全集成化丰富的设计库、模块化工具、支持多种硬件描述语言及有多种高级编程语言接口等特点[16]。QuartusII支持原理图输入与VerilogHDL和VHDL输入混合设计,它除了承接原来的Max+PlusII软件的全部设计功能和器件对象外,还增加了许多新功能和新的FPGA器件系列。它可对设计进行功能仿真,对数字电路的设计实现同步模拟分析和时序仿真。这种同步模拟分析、时序仿真在数字电路的教学中可以起到很好的辅助作用。QuartusII是Altera公司推出的CPLD/FPGA开发工具,QuartusII提供了完全集成且与电路结构无关的开发包环境,具有数字逻辑设计的全部特性,包括:可利用原理图、结构框图、VerilogHDL、AHDL和VHDL完成电路描述,并将其保存为设计实体文件;芯片〔电路平面布局连线编辑;功能强大的逻辑综合工具;完备的电路功能仿真与时序逻辑仿真工具;定时/时序分析与关键路径延时分析;可使用SignalTapII逻辑分析工具进行嵌入式的逻辑分析;支持软件源文件的添加和创建,并将它们链接起来生成编程文件;使用组合编译方式可一次完成整体设计流程;自动定位编译错误;高效的期间编程与验证工具;可读入标准的EDIF网表文件、VHDL网表文件和Verilog网表文件;能生成第三方EDA软件使用的VHDL网表文件和Verilog网表文件。3.2.2QuartusII软件设计流程1>设计输入:设计文件的输入方法有原理图输入、文本输入、内存编辑以及由第三方EDA工具产生的网表输入、格式输入,生成方法不同,生成的文件格式也有所不同。在图形设计文件中,QuartusII软件为了实现不同的逻辑功能提供了大量的基本单元符号和宏功能模块,在图形编辑器中可以直接调用;为了适应自顶向下的设计,设计者可以使用和VerilogHDL以及Tcl脚本输入文本型设计[17]。2>项目编译:项目编译主要完成设计项目的检查和逻辑综合,将项目最终设计结果生成器件的下载文件,并为模拟和编程产生输出文件。3>仿真验证和时序分析:在把经过编译的输入设计编程或配置到器件之前,可以通过QuartusII软件的仿真器对文件进行全面测试,保证设计在各种可能的条件下都有正确的响应。根据所需的信息类型,可以进行功能仿真和时序仿真。QuartusII时序分析器允许分析设计中所有逻辑的性能,得出时序分析结果,如建立时间、保持时间、引脚到引脚延迟、最大时钟频率、延迟时间及其它时序特征,并协助引导适配器满足设计中的时序要求。4>器件编程:成功编译了设计工程之后,编译器的Assembler模块自动将适配过程的器件、逻辑单元和引脚分配信息转换为器件的编程图像,并以.sof形式保存,QuartusII软件的编程器<programmer>使用该文件就可对器件进行编程配置。4数字时钟设计要求和原理4.1设计要求在QuartusII软件开发环境下,使用VHDL描述语言、结合FPGA开发板编译和仿真数字时钟;要求时钟能进行基本的计时功能,按照:"时:分:秒"来显示时间;并且能进行时间设置,具有整点报时功能,可对所有显示的内容进行调节设定。4.2设计原理根据设计要求,采用自顶向下的方法,层次化设计概念,将此任务分成若干模块,设计时首先用VHDL语言编写各个功能模块,在QuartusII开发环境下分别进行编译、仿真,然后再用顶层文件将各功能模块连接起来。规定某一模块的功能和各模块之间的接口.然后将各模块组合起来构成系统框图。根据设计要求可以把整体设计分为:分频模块、计时模块、数据扫描模块、报警模块和数据选择模块,然后再根据总体方案对各模块进行分别设计和仿真下载[18]。根据总体方案对各模块分别进行设计、仿真和下载,数字时钟的总体框图如图5.1所示,报警模块声音输出报警模块24进制计数器控制信号624进制计数器控制信号6位数码显示管时间数据动态时间数据动态扫描模块译码电路60进制计数器reset60进制计数器60进制计数器sethour60进制计数器分频模块50MHz分频模块图4.1数字时钟基本框图系统的基本功能模块可划分为:分频模块、计数模块<包括秒、分、时>、译码模块、数据扫描模块和报警模块。计数模块由两个60进制计数器和一个24进制计数器组成,分别对秒、分、小时进行计数。整个计数模块从00点00分00秒开始计时,当计数到23点59分59秒的时候,一天结束,计数器清零,新的一天重新开始计数。秒计数器的计数时钟信号为1Hz的标准信号,可以由系统板上提供的50MHz信号通过分频得到。秒计数器的进位输出信号作为分钟计数器的计数信号,分钟计数器的进位输出信号又作为小时计数器的计数信号。要设计一个同时显示时、分、秒6个数字的数字时钟,则需要6个七段数码显示管。若同时点亮这6个七段数码显示显示管,则电路中会产生一个比较大的电流,很容易造成电路烧坏,我们通过扫描电路来解决这一问题,通过产生一个扫描信号来控制6个七段显示器,依次点亮6个七段数码显示管,也就是每次只点亮一个七段显示器。只要扫描信号的频率超过人的眼睛视觉暂留频率24Hz以上,就可以达到尽管每次点亮单个七段数码显示管,却能具有6个同时显示的视觉效果,而且显示也不致闪烁抖动。其中6位扫描信号一方面控制七段显示器依次点亮,一方面控制6选1选择器输出相应显示数字。时间数据选择模块的作用是将时钟产生的秒、分钟、小时信号集合起来,然后驱动六位七段数码管的片选驱动信号输出。5数字时钟模块化设计需要设计的数字时钟由上述7个模块组成,设计时,首先用VHDL语言编写各个底层功能模块,然后在QuartusII开发环境下分别进行编译、仿真,然后再用顶层文件将各功能模块连接起来,再进行进一步编译、仿真、下载。以下介绍系统中各模块的具体功能和设计方法。5.1分频模块本设计使用的FPGA开发板中使用的芯片是CycloneEP1C6Q240C8,使用的是50MHz的时钟脉冲输入,根据电路的具体设计需要,对其进行分频设计。如图5.2所示,其为系统的分频模块,其中模块clk1管脚输出为1hz的时钟脉冲,得出用于计数模块和报警模块正常工作的时钟信号,在clk1k管脚输出为一个1khz的时钟脉冲,作用与动态扫描模块的正常工作。输入管脚:clk为50Mhz脉冲输入;输出管脚:clk1为1hz脉冲输出;clk1k为1khz脉冲输出.图5.2源代码如下:libraryieee;useieee.std_logic_1164.all;entityfpisport<clk:instd_logic;q1:outstd_logicq1k:outstd_logic>;endfp;architecturefp_arcoffpissignalx:std_logic;signaly:std_logic;beginprocess<clk>variablecnt:integerrange0to24999999;beginifclk'eventandclk='1'thenifcnt<24999999thencnt:=cnt+1;elsecnt:=0;x<=notx;endif;endif;q1<=x;endprocess;process<clk>variablecnt:integerrange0to24999;beginifclk'eventandclk='1'thenifcnt<24999thencnt:=cnt+1;elsecnt:=0;y<=noty;endif;endif;q1k<=y;endprocess;endfp_arc;5.2计时模块5.2.1秒计时模块如图5.3所示,计数电路的第一个模块为秒计数模块,其实质是一个六十进制计数器,其中输入管脚:clk为1hz的时钟脉冲;reset为秒模块清零复位键;setmin为调分钟按键输出管脚:enmin为分模块的进位信号;dout[6..0]为秒模块输出的计数信号.图5.3源代码如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitysecondisport<clk:instd_logic;reset:instd_logic;setmin:instd_logic;enmin:outstd_logic;daout:outstd_logic_vector<6downto0>>;endentitysecond;architecturefunofsecondissignalcount:std_logic_vector<6downto0>;signalenmin_1,enmin_2:std_logic;begindaout<=count;enmin_2<=<setminandclk>;enmin<=<enmin_1orenmin_2>;process<clk,reset,setmin>beginif<reset='0'>thencount<="0000000";elsif<clk'eventandclk='1'>thenif<count<3downto0>="1001">thenif<count<16#60#>thenif<count="1011001">thenenmin_1<='1';count<="0000000";elsecount<=count+7;endif;elsecount<="0000000";endif;elsif<count<16#60#>thencount<=count+1;enmin_1<='0'after100ns;elsecount<="0000000";endif;endif;endprocess;endfun;5.2.2分计时模块如图5.4所示,计数模块的第二个模块为分计时模块,其实质是一个六十进制计数器,其中:输入管脚:clk为秒模块输出的进位信号;clk1为1hz的时钟控制脉冲;reset管脚的作用为分模块的清零、复位;sethour为调小时按键。输出管脚:enhour输出为时模块的进位信号;dout[6..0]为分钟模块输出的计数信号.图5.4源代码如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityminuteisport<clk:instd_logic;clk1:instd_logic;reset:instd_logic;sethour:instd_logic;enhour:outstd_logic;daout:outstd_logic_vector<6downto0>>;endentityminute;architecturefunofminuteissignalcount:std_logic_vector<6downto0>;signalenhour_1,enhour_2:std_logic;begindaout<=count;enhour_2<=<sethourandclk1>;enhour<=<enhour_1orenhour_2>;process<clk,reset,sethour>beginif<reset='0'>thencount<="0000000";elsif<clk'eventandclk='1'>thenif<count<3downto0>="1001">thenif<count<16#60#>thenif<count="1011001">thenenhour_1<='1';count<="0000000";elsecount<=count+7;endif;elsecount<="0000000";endif;elsif<count<16#60#>thencount<=count+1;enhour_1<='0'after100ns;elsecount<="0000000";endif;endif;endprocess;endfun;5.2.3时计时模块如图5.5所示,此模块的第三个模块为小时计数模块,其实质是一个二十四进制计数器,其中:输入管脚:clk为分模块输出的进位信号;Reset为小时模块的清零、复位管脚.输出模块:dout[5..0]为小时模块输出的计数信号.图5.5源代码如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityhourisport<clk,reset:instd_logic;daout:outstd_logic_vector<5downto0>>;endentityhour;architecturefunofhourissignalcount:std_logic_vector<5downto0>;begindaout<=count;process<clk,reset>beginif<reset='0'>thencount<="000000";elsif<clk'eventandclk='1'>thenif<count<3downto0>="1001">thenif<count<16#23#>thencount<=count+7;elsecount<="000000";endif;elsif<count<16#23#>thencount<=count+1;elsecount<="000000";endif;endif;endprocess;endfun;5.3报警模块如图5.6所示,报警模块的作用是在时钟整点的时候输出一个报时信号,信号作用用开发板上,产生外部响声,起到报时的作用,同时可以选择在开发板的LED上显示出整点报时的LED花样显示,其中:输出管脚:clk为1hz的脉冲信号;dain[6..0]是分钟的输入信号;输出管脚:speak为整点报时的声音输出;lamp[2..0]为整点报时的LED输出;图5.6源代码如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityalertisport<clk:instd_logic;dain:instd_logic_vector<6downto0>;speak:outstd_logic;lamp:outstd_logic_vector<2downto0>>;endalert;architecturefunofalertissignalcount1:std_logic_vector<1downto0>;signalcount:std_logic_vector<1downto0>;beginspeaker:process<clk>beginspeak<=count1<1>;if<clk'eventandclk='1'>thenif<dain="0000000">thenif<count1>="10">thencount1<="00";elsecount1<=count1+1;endif;endif;endif;endprocessspeaker;lamper:process<clk>beginif<rising_edge<clk>>thenif<count<="10">thenif<count<="00">thenlamp<="001";elsif<count="01">thenlamp<="010";elsif<count="10">thenlamp<="100";endif;count<=count+1;elsecount<="00";endif;endif;endprocesslamper;endfun;5.4时间数据选择模块如图5.7所示,该模块的作用是将时钟产生的秒、分钟、小时信号集合起来,然后驱动六位八段共阴数码管的片选驱动信号输出。输入管脚:clk1为1khz的时钟脉冲;Reset为数据选择模块的清零、复位信号;Sec[6..0]为秒模块计数的输入信号;Min[6..0]为分钟模块计数的输入信号;Hour[5..0]为小时模块计数的输入信号;输出管脚:dout[3..0]为选择信号的输出;Dp为八段数码管小数点的输出管脚;Sel[2..0]为位选后的输出信号.源代码如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;useieee.std_logic_arith.all;entityseltimeisport<clk1,reset:instd_logic;sec,min:instd_logic_vector<6downto0>;hour:instd_logic_vector<5downto0>;daout:outstd_logic_vector<3downto0>;dp:outstd_logic;sel:outstd_logic_vector<2downto0>>;endseltime;architecturefunofseltimeissignalcount:std_logic_vector<2downto0>;beginsel<=count;process<clk1,reset>beginif<reset='0'>thencount<="000";elsif<clk1'eventandclk1='1'>thenif<count>="101">thencount<="000";elsecount<=count+1;endif;endif;casecountiswhen"000"=>daout<=sec<3downto0>;dp<='0';when"001"=>daout<3><='0';daout<2downto0><=sec<6downto4>;dp<='0';when"010"=>daout<=min<3downto0>;dp<='1';when"011"=>daout<3><='0';daout<2downto0><=min<6downto4>;dp<='0';when"100"=>daout<=hour<3downto0>;dp<='1';whenothers=>daout<3downto2><="00";daout<1downto0><=hour<5downto4>;dp<='0';endcase;endprocess;endfun;5.5译码显示模块如图5.8所示,此模块为数字时钟的译码显示输出模块,其中:输入管脚:num[3..0]为数据选择模块的输出信号;输出管脚:led[6..0]为7段数码管的显示输出.图5.8源代码如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitydeledisport<num:instd_logic_vector<3downto0>;led:outstd_logic_vector<6downto0>>;enddeled;architecturefunofdeledisbeginled<="1111110"whennum="0000"else"0110000"whennum="0001"else"1101101"whennum="0010"else"1111001"whennum="0011"else"0110011"whennum="0100"else"1011011"whennum="0101"else"1011111"whennum="0110"else"1110000"whennum="0111"else"1111111"whennum="1000"else"1111011"whennum="1001"else"1110111"whennum="1010"else"0011111"whennum="1011"else"1001110"whennum="1100"else"0111101"whennum="1101"else"1001111"whennum="1110"else"1000111"whennum="1111";endfun;6数字时钟模块化仿真仿真是使用VHDL语言进行设计的重要组成部分,也是对设计的电路进行功能和性能测试的有效手段。EDA工具提供了强大且与电路实时行为相吻合的精确硬件系统测试工具。由于本设计采用了分模块化设计的方法,所以仿真的时候需要先进行各底层模块的独立仿真,最后进行整个电子时钟的时序仿真,将所有仿真图综合起来验证系统功能的完整性。6.1计时模块仿真图由于计时模块分为三个部分:时、分、秒;所以三个模块需要进行独立仿真,其中:6.1.1秒模块仿真如图7.1所示,从图中可以看出,输入为1hz的时钟信号,reset为低电平有效的复位信号,计数从00到59,计数到59时向分计时模块进位,然后重新开始计数。实现60秒计数制,setmin为高电平有效的调分信号。图6.16.1.2分模块仿真如图6.2所示,在图中可以看出和秒模块一致的是计数从00到59,当计数到59时向时模块进位,然后重新开始计时,实现60分钟计数制。并且给报警模块一个报时信号,提示整点报时。reset为低电平有效的清零信号,sethour为高电平有效的调时信号。图6.26.1.3小时模块仿真如图6.3所示,在图中可以看出reset为低电平有效的清零信号,clk为分模块的进位信号,计数值从00到23,当计数到23的时候,计数器归零,重新开始计数,实现24小时计数制。图6.36.2报警模块仿真图如图6.4所示,该模块的功能是,对分计时模块输入的整点信号输出一个声音信号,提供整点报时功能,lamp为三位LED灯输出,speak为扬声器输出。图6.46.3数据选择模块仿真图如图6.5所示,在图中可以看出,该模块中当输入时间为"23:59:38"的时候,dout端口中输出的内容为:235938,两者输入时间一致,所以该模块符合设计要求。其中Reset为低电平有效置位信号,clk1为1khz的时钟脉冲,dp为八段数码管的"."输出。图6.56.4译码模块仿真图如图6.6所示,译码模块的作用就是将输入的时间信号转化成显示信号经过数码管输出。图6.66.5数字时钟整体仿真图数字时钟的整体仿真如图6.7所示,图中clk为50hz的时钟输出信号,reset为低电平有效的清零信号,setmin为高电平有效的调分信号,sethour为高电平有效的调时信号,dp为"."信号,led[6..0]为7段译码器的输出信号,lamp为三盏LED灯输出,speak为报时信号输出。图6.77FPGA开发板实验7.1FPGA芯片和器件选择主芯片:CycloneEP1C6Q240C8;器件:4个八段扫描数码显示管;三个按键开关〔系统清零按键、调时按键、调分按键;一个蜂鸣器;3个LED灯。7.2外部电路接线7.2.1输入接口1、代表清零,调时,调分信号RESET、SETHOUR、SETMIN的管脚分别连接按键开关。2、代表输入脉冲信号CLK50M同50MHz时钟源相连。7.2.2输出接口1、代表扫描显示的驱动信号管脚SEL2,SEL1,SEL0的管脚同四位扫描驱动地址的低3位相连,最高位地址接"0"〔也可以悬空;2、代表7段字码驱动信号dout[6..0]的管脚分别同扫描数码管的段输入a,b,c,d,e,f,g相连,dp与7段数码显示管的段码插口相连。3、代表扬声器驱动信号的管脚SPEAK同扬声器驱动接口SPEAKER相连。4、代表花样LED灯显示的信号管脚LAMP[0..2]同3个LED灯相连。7.2.3硬件实物图根据外部接线,需要结合FPGA开发板验证数字时钟的功能。如图7.1所示,FreeDev2_2开发板上只有四位数码管,所以每次只能显示时钟信号中的:时、分、秒4位时间信号,因为时钟主要以显示时、分为主。所以接时、分两位信号到四位数码管,秒信号暂且省略。经外部实物验证,本课题所设计的数字时钟满足当初的设计要求。图7.1如图7.2所示,显示时间为05:58。另经多次显示时间,调节时间、时间计时功能等均一切正常,符合设计要求。图7.28结论本设计对EDA技术进行了简明的阐述,叙述了VHDL语言的设计特点,主要论述了怎样在QuartusII软件平台的基础上,设计一个以VHDL语言为输入的数字时钟系统。该系统可以在数码管上显示小时、分钟和秒,可以使用复位开关使系统时间清零;并可以在认为时间不准确的时候调节时间。不足之处是,由于时间、设备以及其他方面的因素,没能够把数字时钟的扩展功能:年、月、日显示出来,本设计已经可以满足对电子时钟的日常需求。本设计采取的是分模块化的设计过程,其中底层模块全部采用VHDL语言输入,而顶层实体模块采用了原理图输入的方式进行,根据由VHDL生成的各模块加上必要的器件,最后进行连线组成系统原理图。另外,顶层模块也可用VHDL语言来描述,采用这种方法进行设计需要的源代码将在附录里做详细说明。通过本次毕业设计,体会到EDA技术的先进性,用VHDL语言进行设计的优点,和QuartusII软件的强大功能。掌握了数字时钟设计的开发原理和基本思想,由此进一步扩展了我的思维,加深了对电子设计自动化的认识。附录数字时钟顶层文件源代码:libraryieee;useieee.std_logic_1164.all;entityclock_topisPort〔clk,reset,setmin,sethour,clkdsp:instd_logic;speaker:outstd_logic;lamp:outstd_logic_vector<2downto0>;sel:outstd_logic_vector<2downto0>;a,b,c,d,e,f,g,dpout:outstd_logic>;endclock_top;architectureaofclock_topiscomponentsecondport<clk,reset,setmin:instd_logic;daout:outstd_logic_vector<6downto0>;enmin:outstd_logic>;endcomponent;componentminuteport<clk,clk1,reset,sethour:instd_logic;enhour:outstd_logic;daout:outstd_logic_vector<6downto0>>;endcomponent;componenthourport<clk,reset:instd_logic;daout:outstd_logic_vector<5downto0>>;endcomponent;componentalertport<clk:instd_logic;dain:instd_logic_vector<6downto0>;lamp:outstd_logic_vector<2downto0>;speak:outstd_logic>;endcomponent;componentseltimeport<clk1,reset:instd_logic;sec,min:instd_logic_vector<6downto0>;hour:instd_logic_vector<5downto0>;dp:outstd_logic;daout:outstd_logic_vector<3downto0>;sel:outstd_logic_vector<2downto0>>;endcomponent;componentdeledport<num:instd_logic_vector<3downto0>;led:instd_logic_vector<6downto0>>;endcomponent;signalenmin_re,enhour_re:std_logic;signalsecond_daout,minute_daout:std_logic_vector<6downto0>;signalhour_daout:std_logic_vector<5downto0>;signalseltime_daout:std_logic_vector<3downto0>;signalledout:std_logic_vector<6downto0>;begina<=ledout<6>;b<=ledout<5>;c<=ledout<4>;d<=ledout<3>;e<=ledout<2>;f<=ledout<1>;g<=ledout<0>;u1:secondportmap<reset=>reset,clk=>clk,setmin=>setmin,enmin=>enmin_re,daout=>second_daout>;u2:minuteportmap<clk=>enmin_re,clk1=>clk,reset=>reset,sethour=>sethour,enhour=>enhour_re,daout=>minute_daout>;u3:hourportmap<clk=>enhour_re,reset=>reset,daout=>hour_daout>;u4:alertportmap<clk=>clk,dain=>minute_daout,speak=>speaker,lamp=>lamp>;u5:seltimeportmap<clk1=>clkdsp,reset=>reset,sec=>second_daout,min=>minute_daout,hour=>hour_daout,daout=>seltime_daout,dp=>dpout,sel=>sel>;u6:deledportmap<num=>seltime_daout,led=>ledout>;enda;数字时钟各底层模块源代码:U1:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitysecondisport<clk:instd_logic;reset:instd_logic;setmin:instd_logic;enmin:outstd_logic;daout:outstd_logic_vector<6downto0>>;endentitysecond;architecturefunofsecondissignalcount:std_logic_vector<6downto0>;signalenmin_1,enmin_2:std_logic;begindaout<=count;enmin_2<=<setminandclk>;enmin<=<enmin_1orenmin_2>;process<clk,reset,setmin>beginif<reset='0'>thencount<="0000000";elsif<clk'eventandclk='1'>thenif<count<3downto0>="1001">thenif<count<16#60#>thenif<count="1011001">thenenmin_1<='1';count<="0000000";elsecount<=count+7;endif;elsecount<="0000000";endif;elsif<count<16#60#>thencount<=count+1;enmin_1<='0'after100ns;elsecount<="0000000";endif;endif;endprocess;endfun;U2:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityminuteisport<clk:instd_logic;clk1:instd_logic;reset:instd_logic;sethour:instd_logic;enhour:outstd_logic;daout:outstd_logic_vector<6downto0>>;endentityminute;architecturefunofminuteissignalcount:std_logic_vector<6downto0>;signalenhour_1,enhour_2:std_logic;begindaout<=count;enhour_2<=<sethourandclk1>;enhour<=<enhour_1orenhour_2>;process<clk,reset,sethour>beginif<reset='0'>thencount<="0000000";elsif<clk'eventandclk='1'>thenif<count<3downto0>="1001">thenif<count<16#60#>thenif<count="1011001">thenenhour_1<='1';count<="0000000";elsecount<=count+7;endif;elsecount<="0000000";endif;elsif<count<16#60#>thencount<=count+1;enhour_1<='0'after100ns;elsecount<="0000000";endif;endif;endprocess;endfun;U3:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityhourisport<clk:instd_logic;reset:instd_logic;daout:outstd_logic_vector<5downto0>>;endentityhour;architecturefunofhourissignalcount:std_logic_vector<5downto0>;begindaout<=count;process<clk,reset>beginif<reset='0'>thencount<="000000";elsif<clk'eventandclk='1'>thenif<count<3downto0>="1001">thenif<count<16#23#>thencount<=count+7;elsecount<="000000";endif;elsif<count<16#23#>thencount<=count+1;elsecount<="000000";endif;endif;endprocess;endfun;U4:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityalertisport<clk:instd_logic;dain:instd_logic_vector<6downto0>;speak:outstd_logic;lamp:outstd_logic_vector<2downto0>>;endalert;architecturefunofalertissignalcount1:std_logic_vector<1downto0>;signalcount:std_logic_vector<1downto0>;beginspeaker:process<clk>beginspeak<=count1<1>;if<clk'eventandclk='1'>thenif<dain="0000000">thenif<count1>="10">thencount1<="00";elsecount1<=count1+1;endif;endif;endif;endprocessspeaker;lamper:process<clk>beginif<rising_edge<clk>>thenif<count<="10">thenif<count<="00">thenlamp<="001";elsif<count="01">thenlamp<="010";elsif<count="10"

温馨提示

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

最新文档

评论

0/150

提交评论