版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
电子科技大学电子综合实验论文论文主题:基于VHDL的秒表设计所在学院:电子工程学院所属专业:电磁场与无线技术学生姓名:王立学生学号:提交日期:指导教师:皇晓辉目录背景简介4时间的起源4人们对时间认识的开展5计时器的创造与开展6数字电路以及其与时钟、时序的不可分割关系7工程设计介绍91.FPGA简介92.Verilog简介123.VHDL介绍134.使用的软件以及实验器材21相关数字电路简介23秒表的设计与实现25设计总体:251.设计思路:252.电路设计:253.思路总结:26模块设计:261.分频器262.十进制计数器273.六进制计数器284.锁存器305.显示电路306.按键消抖337.控制电路348.模块完成36仿真与硬件实现411.仿真电路图412.按键关联423.硬件实现424.效果展示42设计结果分析42程序优化43设计心得43特别感谢44参考文献44背景简介时间的起源时间是人类用以描述物质运动过程或事件发生过程的一个参数,确定时间,是靠不受外界影响的物质周期变化的规律。例如月球绕地球周期,地球绕太阳周期,地球自转周期,原子震荡周期等。爱因斯坦说时间和空间是人们认知的一种错觉。大爆炸理论认为,宇宙从一个起点处开始,这也是时间的起点。时间是指宏观一切具有不停止的持续性和不可逆性的物质状态的各种变化过程,其有共同性质的连续事件的度量衡的总称。时是客观存在,而间是人们的思想所划分的。时间是一个较为抽象的概念,爱因斯坦在相对论中提出:不能把时间、空间、物质三者分开解释,"时"是对物质运动过程的描述,"间"是指人为的划分。时间是思维对物质运动过程的分割、划分。探究时间概念的由来,可从地球人公认的时间单位“天〞和“年〞说起。自人类诞生起,人们就感受着昼夜轮回现象,并把一个昼夜轮回定义为一天时间,以后逐步认识到这是地球自转〔一种事物〕的表现。再有,人们从春夏秋冬、日月星辰轮回现象的背后认识了地球在绕太阳公转这一事物,并把地球公转一周的过程定义为一年时间。不仅如此,人们还把一天划分为24小时或者12时辰,把一年划分为4个季节、12个月份等等。人们还拿一年时间与一天时间的长短进行了比较,以1年时间〔地球公转一周的过程〕来对应大约365天。通过对时间单位“天〞和“年〞的分析可以看出,人们对时间的认识其实是围绕着各个〔种〕事物的存在过程进行的。时间概念是人们在认识事物的根底上,对事物的存在过程进行定义、划分和相互比对而逐步形成和完善的。〔〕【1】人们对时间认识的开展事物的存在过程、状态无外乎运动变化或静止。运动变化的事物既可有空间上的改变,也可有形状的改变,有的事物呈现出周期性的运动或变化,而有的那么不明显或者没有。那些具有明显周期性变化的事物,其存在过程或阶段,往往被人们用来作为判断时间长短的依据。例如地球的自转和公转周期、单摆的运动周期、原子的震荡周期等等。人们虽然由观察事物的运动变化而建立起了时间概念,但这并不说明没有运动变化就没有时间或静止对时间没有意义。静止状态也是事物存在的一种形式,比方钻石的分子结构这一事物在通常情况下一般是稳定不变的,不然人们就不会说“钻石恒久远,一颗永流传〞。因此,不管事物是运动变化的还是静止的,只要有事物存在就可以对其用时间来描述其存在过程,也就是时间概念里还应表达事物的静止状态这一面。仅仅把时间概念建立在事物的运动变化上是初步和片面的,假设能进一步意识到静止也是事物存在过程中的一种状态,将是人们在时间概念上的一个进步。人们建立时间概念的一个根本目的是为了对时,即对各个〔种〕事物的先后次序或者是否同时进行比对。人们为了方便相互间的交流和活动,通常以一些具有标志性事物的起止作为对时的标志。例如,以耶稣诞生的年份作为公元纪年的开始、以孙中山宣告中华民国成立的年份成为民国纪年的开始、以运动场上发令枪的声音和烟雾就作为某项比赛的开始。人们建立时间概念的另一个根本目的是为了计时,即衡量、比较各个〔种〕事物存在过程的长短。人们一般不以静止事物的存在过程作为记时的依据,这也许是长期以来人们将时间仅仅看作“运动的存在形式〞的一个因素。人们通常选择一些周期性运动变化较为稳定的事物,以其运动周期作为计时依据。比方月相、圭表、日晷、机械钟表、石英钟、原子钟等等,这些事物也就成为人们天然的或人工的计时器。计时器就是人们在一定条件下,通过某个〔种〕变化事物的存在过程〔尤其是周期性的〕来衡量其它事物存在过程长短的装置。需要注意的是,任何计时器度量出的时间都是呈现其本身的存在过程,不一定代表其它事物的存在过程。虽然如此,人们还是可以在一定的条件下或通过一定的转换,以某个计时器的运行状态来描述其它事物存在过程的长短或所处阶段。比方以大约365个地球自转周期〔天〕来对应1个地球公转周期〔年〕、以大约29.5天来对应1个朔望月、用秒表来测量运发动的成绩等等。上述可以看出,时间概念不应是人凭空杜撰出来的意识,时间概念来自于人们对各个〔种〕事物存在过程的认识,并通过归纳总结而产生。因此时间概念对应着客观现实——事物的存在过程。人们除了对“东西〞——以实物形态呈现的客观事物,比方恒星、行星、分子、原子、细胞等认识以后可以产生了相应的概念,还可以对不是“东西〞的非实物形态的客观事实认识以后产生相应的概念。比方国际单位制中七个根本单位所对应的物理量:时间、长度、质量、电流强度、温度、发光强度、物质的量,还有人们的空间、信息、意识等概念反映的也是非实物形态的客观事实。所以,如果有人以时间不是“东西〞为由,就否认时间概念的客观性显然是荒唐的。计时器的创造与开展如今我们只需瞧一下钟就能说出具体时间,我们把这看成是很自然的事。但在长达几千年的时间里,根本就没有任何测定时间的精确方法。人们通过太阳在天空中的位置,或者通过像日晷或沙漏这样的装置来判断时间。在沙漏中,是通过沙子从一个双头玻璃容器中漏落下来来指示时间的。至今为止,在中国历史上有留下记载的四代计时器分别为:日晷、沙漏、机械钟、石英钟。随着时间的开展,人们对时间的精确度也在不断地提高。继机械钟和石英钟后又出现了分子时钟与原子时钟。据国外媒体报道,物理学家近日表示,一种新型的时钟可以通过称重原子的方式计时。和标准的原子钟相比,它的工作原理有着很大的不同,这种新型时钟能更加精确地记录时间。标准的原子钟利用了原子吸收电磁辐射这一原理,如某些特定频率的光,它的内部结构可以从一个量子态跳跃到另一个量子态。该时钟本质上就是将原子暴露在辐射中找到这种频率的辐射,然后随着时钟滴答声一直不停工作。原子钟可以很好的保持官方世界时间的精确度,一亿年内的误差小于1秒。美国加州大学伯克利分校的物理学家霍尔格-穆勒说,以另一种方式记录时间应该是可行的。任何大规模粒子以量子波的形式描述时都是上下振荡的,即使粒子并没有移动。原子的质量越重其振荡的频率越高,这被称作康普顿频率〔Comptonfrequency〕。依此原理,量子振荡可以用在记录时间上。而事实上,原子的康普顿频率相当之高,高到无法用任何电子计数器测量,美国加利福尼亚大学伯克利分校的博士后研究员蓝劭宇〔Shau-YuLan〕和他的同事采用先进技术构建了一台基于单个铯原子的原子钟,这台设备能够将这个原子超高的天然频率拆分成更容易测量的量。〔〕【1】数字电路以及其与时钟、时序的不可分割关系用数字信号完成对数字量进行算术运算和逻辑运算的电路称为数字电路,或数字系统。由于它具有逻辑运算和逻辑处理功能,所以又称数字逻辑电路。现代的数字电路由半导体工艺制成的假设干数字集成器件构造而成。逻辑门是数字逻辑电路的根本单元。存储器是用来存储二进制数据的数字电路。从整体上看,数字电路可以分为组合逻辑电路和时序逻辑电路两大类。数字电路是以二值数字逻辑为根底的,其工作信号是离散的数字信号。电路中的电子晶体管工作于开关状态,时而导通,时而截止。数字电路的开展与模拟电路一样经历了由电子管、半导体分立器件到集成电路等几个时代。但其开展比模拟电路开展的更快。从60年代开始,数字集成器件以双极型工艺制成了小规模逻辑器件。随后开展到中规模逻辑器件;70年代末,微处理器的出现,使数字集成电路的性能产生质的飞跃。数字集成器件所用的材料以硅材料为主,在高速电路中,也使用化合物半导体材料,例如砷化镓等。逻辑门是数字电路中一种重要的逻辑单元电路。TTL逻辑门电路问世较早,其工艺经过不断改良,至今仍为主要的根本逻辑器件之一。随着CMOS工艺的开展,TTL的主导地位受到了动摇,有被CMOS器件所取代的趋势。近几年来,可编程逻辑器件PLD特别是现场可编程门阵列FPGA的飞速进步,使数字电子技术开创了新局面,不仅规模大,而且将硬件与软件相结合,使器件的功能更加完善,使用更灵活。数字电路或数字集成电路是由许多的逻辑门组成的复杂电路。与模拟电路相比,它主要进行数字信号的处理〔即信号以0与1两个状态表示〕,因此抗干扰能力较强。数字集成电路有各种门电路、触发器以及由它们构成的各种组合逻辑电路和时序逻辑电路。一个数字系统一般由控制部件和运算部件组成,在时脉的驱动下,控制部件控制运算部件完成所要执行的动作。通过模拟数字转换器、数字模拟转换器,数字电路可以和模拟电路互相连接。〔〕【2】在数字电路的设计中,时序设计是一个系统性能的主要标志,在高层次设计方法中,对时序控制的抽象度也相应提高,因此在设计中较难把握,但在理解RTL电路时序模型的根底上,采用合理的设计方法在设计复杂数字系统是行之有效的,通过许多设计实例证明采用这种方式可以使电路的后仿真通过率大大提高,并且系统的工作频率可以到达一个较高水平。建立时间〔setuptime〕是指在触发器的时钟信号上升沿到来以前,数据稳定不变的时间,如果建立时间不够,数据将不能在这个时钟上升沿被打入触发器;保持时间〔holdtime〕是指在触发器的时钟信号上升沿到来以后,数据稳定不变的时间,如果保持时间不够,数据同样不能被打入触发器。〔如图1〕数据稳定传输必须满足建立和保持时间的要求,当然在一些情况下,建立时间和保持时间的值可以为零。PLD/FPGA开发软件可以自动计算两个相关输入的建立和保持时间〔如图2〕。由此可见,时序和时间对于数字电路有着不可分割的关系,掌握好时序关系对数字电路的认识、学习和设计会有这无法取代的作用。工程设计介绍FPGA简介FPGA〔Field-ProgrammableGateArray〕,即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的根底上进一步开展的产物。它是作为专用集成电路〔ASIC〕领域中的一种半定制电路而出现的,既解决了定制电路的缺乏,又克服了原有可编程器件门电路数有限的缺点。以硬件描述语言〔Verilog或VHDL〕所完成的电路设计,可以经过简单的综合与布局,快速的烧录至FPGA上进行测试,是现代IC设计验证的技术主流。这些可编辑元件可以被用来实现一些根本的逻辑门电路〔比方AND、OR、XOR、NOT〕或者更复杂一些的组合功能比方解码器或数学方程式。在大多数的FPGA里面,这些可编辑的元件里也包含记忆元件例如触发器〔Flip-flop〕或者其他更加完整的记忆块。系统设计师可以根据需要通过可编辑的连接把FPGA内部的逻辑块连接起来,就好似一个电路试验板被放在了一个芯片里。一个出厂后的成品FPGA的逻辑块和连接可以按照设计者而改变,所以FPGA可以完成所需要的逻辑功能。FPGA一般来说比ASIC〔专用集成电路〕的速度要慢,无法完成复杂的设计,但是功耗较低。但是他们也有很多的优点比方可以快速成品,可以被修改来改正程序中的错误和更廉价的造价。厂商也可能会提供廉价的但是编辑能力差的FPGA。因为这些芯片有比较差的可编辑能力,所以这些设计的开发是在普通的FPGA上完成的,然后将设计转移到一个类似于ASIC的芯片上。另外一种方法是用CPLD〔ComplexProgrammableLogicDevice,复杂可编程逻辑器件)。早在1980年代中期,FPGA已经在PLD设备中扎根。CPLD和FPGA包括了一些相对大数量的可编辑逻辑单元。CPLD逻辑门的密度在几千到几万个逻辑单元之间,而FPGA通常是在几万到几百万。CPLD和FPGA的主要区别是他们的系统结构。CPLD是一个有点限制性的结构。这个结构由一个或者多个可编辑的结果之和的逻辑组列和一些相对少量的锁定的存放器组成。这样的结果是缺乏编辑灵活性,但是却有可以预计的延迟时间和逻辑单元对连接单元高比率的优点。而FPGA却是有很多的连接单元,这样虽然让它可以更加灵活的编辑,但是结构却复杂的多。CPLD和FPGA另外一个区别是大多数的FPGA含有高层次的内置模块〔比方加法器和乘法器〕和内置的记忆体。因此一个有关的重要区别是很多新的FPGA支持完全的或者局部的系统内重新配置。允许他们的设计随着系统升级或者动态重新配置而改变。一些FPGA可以让设备的一局部重新编辑而其他局部继续正常运行。CPLD和FPGA还有一个区别:CPLD下电之后,原有烧入的逻辑结构不会消失;而FPGA下电之后,再次上电时,需要重新加载FLASH里面的逻辑代码,需要一定的加载时间。早在1980年代中期,FPGA已经在PLD设备中扎根。CPLD和FPGA包括了一些相对大数量的可编辑逻辑单元。CPLD逻辑门的密度在几千到几万个逻辑单元之间,而FPGA通常是在几万到几百万。CPLD和FPGA的主要区别是他们的系统结构。CPLD是一个有点限制性的结构。这个结构由一个或者多个可编辑的结果之和的逻辑组列和一些相对少量的锁定的存放器组成。这样的结果是缺乏编辑灵活性,但是却有可以预计的延迟时间和逻辑单元对连接单元高比率的优点。而FPGA却是有很多的连接单元,这样虽然让它可以更加灵活的编辑,但是结构却复杂的多。CPLD和FPGA另外一个区别是大多数的FPGA含有高层次的内置模块〔比方加法器和乘法器〕和内置的记忆体。因此一个有关的重要区别是很多新的FPGA支持完全的或者局部的系统内重新配置。允许他们的设计随着系统升级或者动态重新配置而改变。一些FPGA可以让设备的一局部重新编辑而其他局部继续正常运行。CPLD和FPGA还有一个区别:CPLD下电之后,原有烧入的逻辑结构不会消失;而FPGA下电之后,再次上电时,需要重新加载FLASH里面的逻辑代码,需要一定的加载时间。FPGA对半导体产业最大的奉献莫过于创立了无生产线(Fabless)模式。如今采用这种模式司空见惯,但是在20多年前,制造厂被认为是半导体芯片企业必须认真考虑的主要竞争优势。然而,基于过去和关系和直接、清晰的业务模式,Xilinx创始人之一BernieVonderschmitt成功地使日本精工公司(Seiko)确信利用该公司的制造设施来生产Xilinx公司设计的芯片对双方都是有利的,于是,无生产线模式诞生了。未来,相信FPGA还将在更多方面改变半导体产业!〔〕【3】Verilog简介VerilogHDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。数字系统能够按层次描述,并可在相同描述中显式地进行时序建模。VerilogHDL语言具有下述描述能力:设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。所有这些都使用同一种建模语言。此外,VerilogHDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。VerilogHDL语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。因此,用这种语言编写的模型能够使用Verilog仿真器进行验证。语言从C编程语言中继承了多种操作符和结构。VerilogHDL提供了扩展的建模能力,其中许多扩展最初很难理解。但是,VerilogHDL语言的核心子集非常易于学习和使用,这对大多数建模应用来说已经足够。当然,完整的硬件描述语言足以对从最复杂的芯片到完整的电子系统进行描述。VerilogHDL就是在用途最广泛的C语言的根底上开展起来的一种硬件描述语言,它是由GDA(GatewayDesignAutomation)公司的PhilMoorby在1983年末首创的,最初只设计了一个仿真与验证工具,之后又陆续开发了相关的故障模拟与时序分析工具。1985年Moorby推出它的第三个商用仿真器Verilog-XL,获得了巨大的成功,从而使得VerilogHDL迅速得到推广应用。1989年CADENCE公司收购了GDA公司,使得VerilogHDL成为了该公司的独家专利。1990年CADENCE公司公开发表了VerilogHDL,并成立LVI组织以促进VerilogHDL成为IEEE标准,即IEEEStandard1364-1995.VerilogHDL的最大特点就是易学易用,如果有C语言的编程经验,可以在一个较短的时间内很快的学习和掌握,因而可以把VerilogHDL内容安排在与ASIC设计等相关课程内部进行讲授,由于HDL语言本身是专门面向硬件与系统设计的,这样的安排可以使学习者同时获得设计实际电路的经验。与之相比,VHDL的学习要困难一些。但VerilogHDL较自由的语法,也容易造成初学者犯一些错误,这一点要注意。〔〕【4】VHDL介绍VerilogHDL和VHDL是目前世界上最流行的两种硬件描述语言,都是在20世纪80年代中期开发出来的。前者由GatewayDesignAutomation公司〔该公司于1989年被Cadence公司收购〕开发。两种HDL均为IEEE标准。VHDL是我们这次设计使用的语言所以接下来会对它的背景、语法规那么和使用方式有一个较为详尽的介绍。VHDL全名Very-High-SpeedIntegratedCircuitHardwareDescriptionLanguage,诞生于1982年。1987年底,VHDL被IEEE和美国国防部确认为标准硬件描述语言。自IEEE-1076〔简称87版)之后,各EDA公司相继推出自己的VHDL设计环境,或宣布自己的设计工具可以和VHDL接口。1993年,IEEE对VHDL进行了修订,从更高的抽象层次和系统描述能力上扩展VHDL的内容,公布了新版本的VHDL,即IEEE标准的1076-1993版本,简称93版。VHDL和Verilog作为IEEE的工业标准硬件描述语言,得到众多EDA公司支持,在电子工程领域,已成为事实上的通用硬件描述语言。VHDL语言是一种用于电路设计的高级语言。它在80年代的后期出现。最初是由美国国防部开发出来供美军用来提高设计的可靠性和缩减开发周期的一种使用范围较小的设计语言。VHDL翻译成中文就是超高速集成电路硬件描述语言,主要是应用在数字电路的设计中。它在中国的应用多数是用在FPGA/CPLD/EPLD的设计中。当然在一些实力较为雄厚的单位,它也被用来设计ASIC。VHDL主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式、描述风格以及语法是十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称设计实体〔可以是一个元件,一个电路模块或一个系统〕分成外部〔或称可视局部,及端口)和内部〔或称不可视局部〕,既涉及实体的内部功能和算法完成局部。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种将设计实体分成内外局部的概念是VHDL系统设计的根本点。与其他硬件描述语言相比,VHDL具有以下特点:1.功能强大、设计灵活:VHDL具有功能强大的语言结构,可以用简洁明确的源代码来描述复杂的逻辑控制。它具有多层次的设计描述功能,层层细化,最后可直接生成电路级描述。VHDL支持同步电路、异步电路和随机电路的设计,这是其他硬件描述语言所不能比较的。VHDL还支持各种设计方法,既支持自底向上的设计,又支持自顶向下的设计;既支持模块化设计,又支持层次化设计。2.支持广泛、易于修改:由于VHDL已经成为IEEE标准所标准的硬件描述语言,大多数EDA工几乎都支持VHDL,这为VHDL的进一步推广和广泛应用奠定了根底。在硬件电路设计过程中,主要的设计文件是用VHDL编写的源代码,因为VHDL易读和结构化,所以易于修改设计。3.强大的系统硬件描述能力:VHDL具有多层次的设计描述功能,既可以描述系统级电路,又可以描述门级电路。而描述既可以采用行为描述、存放器传输描述或结构描述,也可以采用三者混合的混合级描述。另外,VHDL支持惯性延迟和传输延迟,还可以准确地建立硬件电路模型。VHDL支持预定义的和自定义的数据类型,给硬件描述带来较大的自由度,使设计人员能够方便地创立高层次的系统模型。4.独立于器件的设计、与工艺无关:设计人员用VHDL进行设计时,不需要首先考虑选择完成设计的器件,就可以集中精力进行设计的优化。当设计描述完成后,可以用多种不同的器件结构来实现其功能。5.很强的移植能力:VHDL是一种标准化的硬件描述语言,同一个设计描述可以被不同的工具所支持,使得设计描述的移植成为可能。6.易于共享和复用:VHDL采用基于库〔Library〕的设计方法,可以建立各种可再次利用的模块。这些模块可以预先设计或使用以前设计中的存档模块,将这些模块存放到库中,就可以在以后的设计中进行复用,可以使设计成果在设计人员之间进行交流和共享,减少硬件电路设计。〔〕【4】下面先说明一下VHDL的根本结构【5】,VHDL的设计单元主要由:实体、构造体、包合集、配置和库组成,下面就来依次介绍:实体〔Entity〕:描述所设计的系统的外部接口信号,定义电路设计中所有的输入和输出端口;结构体(Architecture):描述系统内部的结构和行为;包集合(Package):存放各设计模块能共享的数据类型、常数和子程序等;配置(Configuration):指定实体所对应的结构体;库(Library):存放已经编译的实体、结构体、包集合和配置。〔1〕实体〔Entity〕描述了设计单元的输入输出接口信号或引脚,是设计实体经封装后对外的一个通信界面。实体名由设计者自由命名,用来表示被设计电路芯片的名称,但是必须与VHDL程序的文件名称相同。要与文件名一致;类属为设计实体与外界通信的静态信息提供通道,用来规定端口的大小、实体中子元件的数目和实体的定时特性等。端口方向:IN,OUT,INOUT,BUFFER同方向、同类型的端口可放在同一个说明语句中。如:ENTITY
Full_adderISPORT(a,b,c:INBIT;sum,
carry:
OUT
BIT);END
Full_adder;〔2〕结构体〔Architecture〕定义了设计单元具体的功能,描述了该根本设计单元的行为、元件和内部的连接关系。一个实体可对应多个结构体,每个结构体代表该实体功能的不同实现方案或不同实现方式。同一时刻只有一个结构体起作用,通过CONFIGURATION决定用哪个结构体进行仿真或综合。〔3〕库、程序包的调用LIBRARY库名;USE库名.程序包名.工程名;在介绍完VHDL设计单元的根本组成后,下面再来简单介绍一下VHDL中的常用语句:〔1〕简单赋值语句目标信号名<=表达式〔2〕选择信号赋值语句这种语句通常用于多路数据选择器,以便从多个输入信号中选择所需的信号到输出端。其格式如下;WITH选择表达式SELECT赋值目标信号<=表达式1WHEN选择值1,表达式2WHEN选择值1,表达式nWHENOTHERS;注:选择值要覆盖所有可能情况,假设不能一一指定,用OTHERS为其他情况找个出口;选择值必须互斥,不能出现条件重复或重叠的情况。〔3〕条件信号赋值语句注:各赋值语句有优先级的差异,按书写顺序从高到低排列;各赋值条件可以重叠。〔4〕进程与时钟〔5〕流程控制语句eq\o\ac(○,1)IF语句:eq\o\ac(○,2)CASE语句:注:1.选择值不可重复或重叠;2.当CASE语句的选择值无法覆盖所有的情况时,要用OTHERS指定未能列出的其他所有情况的输出值;eq\o\ac(○,3)NULL语句NULL为空操作语句,一般用于CASE中,表示在某些情况下对输出不作任何改变,隐含锁存信号。不能用于纯组合逻辑电路。介绍完常用语句后,对VHDL的语法规那么和简单应用就应该有了一个直观的了解,下面接着来介绍一下有关VHDL仿真的知识。仿真〔Simulation,也称模拟〕,不接触具体的硬件系统利用计算机对电路设计的逻辑行为和运行功能进行模拟检测,较大规模的VHDL系统设计的最后完成必须经历多层次的仿真测试过程,包括针对系统的VHDL行为仿真、分模块的时序仿真和硬件仿真,直至最后系统级的硬件仿真测试。在对VHDL的编程和相关设计知识有了根本的了解以后,接着就来介绍设计相关的软件和实验器材。4.使用的软件以及实验器材〔1〕XilinxISEDesignSuite12.4XilinxISEDesignSuite是利用新技术来降低总设计本钱的电子设计套件软件,并且实现了比任何其它PLD解决方案更高的性能。借助XilinxISEDesignSuite的突破性技术提高系统级设计效率并加快产品投产。ISEDesignSuite采用各种方法来实现团队设计、功耗优化以及简化IP集成,从而分发挥Xilinx目标设计平台在配置逻辑、嵌入式和DSP设计方面的潜力-所有这一切均可通过紧密集成的设计流程来实现。〔2〕XilinxPlanAhead12.4XilinxPlanAhead是XilinxISEDesignSuite自带的一个插件,主要用于分析设计程序,配合输入输出来实现便捷定义管脚等一系列功能。〔3〕ModelsimMentor公司的ModelSim是业界最优秀的HDL语言仿真软件,它能提供友好的仿真环境,是业界唯一的单内核支持VHDL和Verilog混合仿真的仿真器。它采用直接优化的编译技术、Tcl/Tk技术、和单一内核仿真技术,编译仿真速度快,编译的代码与平台无关,便于保护IP核,个性化的图形界面和用户接口,为用户加快调错提供强有力的手段,是FPGA/ASIC设计的首选仿真软件。〔4〕FPGA实验板相关数字电路简介【6】〔1〕组合逻辑电路:对于数字逻辑电路,当其任意时刻的稳定输出仅仅取决于该时刻的输入变量的取值,而与过去的输出状态无关,那么称该电路为组合逻辑电路,简称组合电路。示意图:〔2〕时序逻辑电路:时序电路是一种输出不仅与当前的输入有关,而且与其输出状态的原始状态有关,其相当于在组合逻辑的输入端加上了一个反应输入,在其电路中有一个存储电路,其可以将输出的状态保持住,我们可以用下列图的框图来描述时序电路的构成。〔3〕同步时序电路的设计同步时序电路的分析是根据给定的时序逻辑电路,求出能反映该电路功能的状态图。状态图清楚地说明了电路在不同的输入、输出原状态时,在时钟作用下次态状态的变化情况。同步时序电路的设计的设计是分析的反过程,其是根据给定的状态图或通过对设计要求的分析得到的状态图,设计出同步时序电路的过程。这里主要讨论给定状态图的情况下的同步时序电路的设计,对于具体的要求得到状态图的过程一般是一个较复杂的问题,这是暂不讲。根据状态图设计同步时序电路的过程一般分为以下几步:1.确定触发器的个数。首先根据状态的个数来确定所需要触发器的个数,如给定的状态个数为n,由应满足n≤2K,K为实现这来状态所需要的触发器的个数。〔实际使用时可能给定的状态中存在冗余项,这时一般还须对状态进行化简。〕2.列出状态转移真值表。根据状态列出状态转移真值表,也称状态表、状态转移表。3.触发器选型。选择适宜的触发器,通常可选的触发器有:JK-FF,D-FF,T-FF,一般使用较广的为JK-FF。根据状态图和给出的触发器的型号写出其输入方程,通常在写输入方程时须对其进行化简,以使电路更简单。4.求出输出方程。根据状态表,求出输出逻辑函数Z的输出方程,还过有些电路没有独立的输出,这一步就省了。5.画出逻辑图。根据输入方程、输出方程画出逻辑电路图。6.讨论设计的电路能否自启动。在设计的电路中可能出现一些无关的状态,这些状态能否经过假设干个时钟脉冲后进行有效的状态。秒表的设计与实现设计总体:设计思路:先来看设计的要求:秒表的计时范围为00’00〞00~59’59〞99。有两个按钮开关Start/Stop和Split/Reset,控制秒表的启动、停止、分段和复位:在秒表已经被复位的情况下,按下“Start/Stop〞键,秒表开始计时。在秒表正常运行的情况下,如果按下“Start/Stop〞键,那么秒表暂停计时;再次按下该键,秒表继续计时。在秒表正常运行的情况下,如果按下“Split/Reset〞键,显示停止在按键时的时间,但秒表仍然在计时;再次按下该键,秒表恢复正常显示。在秒表暂停计时的情况下,按下“Split/Reset〞键,秒表复位归零。首先,从功能出发,秒表要有计时功能,时钟信号必不可少,因此,必须要有clk,即时钟信号作为输入端。其次,从计数的范围来看,必须要用到多个不同进制的计数器。另外,考虑到split的功能锁存器也不可缺少,因为需要用它来将当前的计数状态保存下来并将当前的数值固定显示。最后,考虑到有Start/Stop、Split/Reset两个键来实现多个功能,控制电路必不可少。当然,所有的数据都是必须显示在七段数码管显示频上的,还需要一个显示电路。接下来,就是对整体电路设计的详细描述。电路设计:由于电路的功能比较多,连接比较复杂,很难在一个程序里表示清楚,因此,比较好的解决方案就是:功能分块实现,模块相连完成总要求。从上面的设计思路我们可以确定电路由分频器、控制器、计数器、锁存器和显示电路组成,考虑到实际操作的效果,还加上了按键消抖电路。模块图如下:思路总结:结合老师给的资料以及自己的构思,设计出了比较建议的电路示意图,下面就来对每个模块的设计思路以及程序进行说明。模块设计:分频器分频器的功能是提供计数器的时钟信号以及数码管动态扫描显示局部的时钟信号。根据要求,实验电路板上使用的是48Mhz的晶振,而根据实验要求需要精确到0.01s,所以计数器的时钟信号应该为100hz,因此需要对48Mhz的信号进行分频,得到100hz的信号,作为计数器的技术时钟。根据显示局部的要求,我们还需要1khz的扫描控制信号,因此在分频器局部还要产生1khz的信号。分频器的设计基于计数器的方法来实现。所以应该先设计一个24000进制的计数器,当计数器24000个时钟,分频输出信号clkout1k取反,这样,可以对输出信号48000次分频,从而得到1khz的信号。在第二个进程中采用类似的方法,对已得到的1khz信号clkout1k进行10分频,得到100hz信号。程序如下:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_unsigned.ALL;entityfenpinclkisPort(clkin:inSTD_LOGIC;clkout1k:outSTD_LOGIC;clkout100:outSTD_LOGIC);endfenpinclk;architectureBehavioraloffenpinclkissignalcnter0:integerrange0to23999:=0; signalcnter1:integerrange0to4:=0; signalclkout1k_tmp,clkout100_tmp:STD_LOGIC:='0';beginprocess(clkin)is begin ifclkin'eventandclkin='1'then ifcnter0=23999then cnter0<=0; clkout1k_tmp<=notclkout1k_tmp; else cnter0<=cnter0+1; endif; endif; endprocess; clkout1k<=clkout1k_tmp; process(clkout1k_tmp)is begin ifclkout1k_tmp'eventandclkout1k_tmp='1'then ifcnter1=4then cnter1<=0; clkout100_tmp<=notclkout100_tmp; else cnter1<=cnter1+1; endif; endif;endprocess; clkout100<=clkout100_tmp;endBehavioral;十进制计数器十进制计数器需要以下几个端口:rst清零端,clk记数信号输入端,ena使能输入端〔高电平时记数,低电平时停止记数且保持记数不变〕,count_out记数结果输出,carry_out视为进位端。如十进制’0--9‘记数用二进制表示“0000〞“0001〞“0010〞“0011〞“0100〞“0101〞“0110〞“0111〞“1000〞“1001〞四位输出当最高位为1且最低位为1时满足条件,进位端carry_out就为’1‘表示进一位其他情况取’0‘,从而满足要求。程序如下:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitycount10isPort(rst:inSTD_LOGIC;clk:inSTD_LOGIC;ena:inSTD_LOGIC;count_out:outSTD_LOGIC_VECTOR(3downto0);carry_out:outSTD_LOGIC);endcount10;architectureBehavioralofcount10issignaltmp:std_logic_vector(3downto0):=(others=>'0');signalc:std_logic:='0';begincount_out<=tmp; carry_out<=c; process(clk,ena,rst) begin ifrst='1'then tmp<="0000"; elsifrising_edge(clk)then ifena='1'then c<='0'; iftmp=9then tmp<="0000"; c<='1'; else tmp<=tmp+1; endif; endif; endif; endprocess;endBehavioral;六进制计数器六进制计数器,设计原理和十进制计数器根本相同:rst清零端,clk记数信号输入端,ena使能端,count_out记数结果输出,carry_out进位端。分析六进制:“0--5〞用二进制表示“000〞“001〞“010〞“011〞“100〞“101〞同样的类似于十进制计数器进行设计。程序如下:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitycount6isPort(rst:inSTD_LOGIC;clk:inSTD_LOGIC;ena:inSTD_LOGIC;count_out:outSTD_LOGIC_VECTOR(3downto0);carry_out:outSTD_LOGIC);endcount6;architectureBehavioralofcount6issignaltmp:std_logic_vector(3downto0):=(others=>'0');signalc:std_logic:='0';begincount_out<=tmp; carry_out<=c; process(clk,ena,rst) begin ifrst='1'then tmp<="0000"; elsifrising_edge(clk)then ifena='1'then c<='0'; iftmp=5then tmp<="0000"; c<='1'; else tmp<=tmp+1; endif; endif; endif; endprocess;endBehavioral;锁存器从理论上来讲,锁存器的功能最为简单,设计自然也就最为方便。首先它只有三个端口,使能端l_ena、数据输入端data_in、数据输出端data_out。实现的功能是:当使能端工作时,令data_out=data_in。程序如下:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitylockerisPort(data_in:instd_logic_vector(3downto0);l_ena:inSTD_LOGIC;data_out:outstd_logic_vector(3downto0));endlocker;architectureBehavioraloflockerisbeginprocess(data_in,l_ena)beginifl_ena='1'then data_out<=data_in; endif;endprocess;endBehavioral;显示电路显示电路相关的电路示意图如下:由此可见,显示电路由多个局部组成,分别是:三八译码器、数据选择器并且要实现段选和位选的功能。根据要求的显示结果:00-00-00来看要从八个数码显示屏中选择0、1、3、4、6、7显示从锁存器输出的数字,剩下的2、5显示“-〞,即二进制数:“1111〞。程序如下:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityshowisPort(clk:inSTD_LOGIC;t0,t1,t2,t3,t4,t5:inSTD_LOGIC_VECTOR(3downto0);sel:outSTD_LOGIC_VECTOR(2downto0);led:outSTD_LOGIC_VECTOR(6downto0);en:outSTD_LOGIC);endshow;architectureBehavioralofshowisSIGNALcnt:STD_LOGIC_VECTOR(2downto0):="000";SIGNALdata:STD_LOGIC_VECTOR(3downto0);beginPROCESS(clk)beginifclk'eventandclk='1'then cnt<=cnt+1; endif;endprocess;process(cnt,t0,t1,t2,t3,t4,t5)begincasecntis when"000"=>data<=t0; when"001"=>data<=t1; when"011"=>data<=t2; when"100"=>data<=t3; when"110"=>data<=t4; when"111"=>data<=t5; whenothers=>data<="1111";endcase;endprocess;process(data)begincasedataiswhen"0000"=>led<="0000001";when"0001"=>led<="1001111"; when"0010"=>led<="0010010"; when"0011"=>led<="0000110"; when"0100"=>led<="1001100"; when"0101"=>led<="0100100"; when"0110"=>led<="0100000"; when"0111"=>led<="0001111"; when"1000"=>led<="0000000"; when"1001"=>led<="0000100"; whenothers=>led<="1111110"; endcase;endprocess;en<='0';sel<=cnt; endBehavioral;按键消抖出于对实际电路操作时的考虑:电路板上的键按下后不一定只能产生一个脉冲信号,可能按下的一瞬间就会产生多个脉冲导致输出信号改变了屡次,所以需要按键消抖来防止这种情况的发生。示意图如下:程序如下:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_unsigned.ALL;entitykey_debounceisPort(clk:inSTD_LOGIC;key_in:inSTD_LOGIC;key_out:outSTD_LOGIC);endkey_debounce;architectureBehavioralofkey_debounceissignalcnt:STD_LOGIC_VECTOR(1downto0);signalk1,k2:STD_LOGIC;beginprocess(clk,key_in) begin ifclk'eventandclk='0'then ifcnt=3then k1<='1'; else k1<='0'; cnt<=cnt+1; endif; k2<=k1; endif; ifkey_in='0'then cnt<="00"; endif; endprocess;key_out<=(notk1)andk2; endBehavioral;控制电路控制电路起到的是一个状态机的作用,事先设定好的状态再根据按键的输入进行状态转换来实现所需的功能。如本实验的要求:有两个按钮开关Start/Stop和Split/Reset,控制秒表的启动、停止、分段和复位:在秒表已经被复位的情况下,按下“Start/Stop〞键,秒表开始计时。在秒表正常运行的情况下,如果按下“Start/Stop〞键,那么秒表暂停计时;再次按下该键,秒表继续计时。在秒表正常运行的情况下,如果按下“Split/Reset〞键,显示停止在按键时的时间,但秒表仍然在计时;再次按下该键,秒表恢复正常显示。在秒表暂停计时的情况下,按下“Split/Reset〞键,秒表复位归零。为了更清晰地分析状态机的工作原理我们可以作出状态转换图:这时候就可以很简单的用if或case语句来描述状态间的转换了。程序如下:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitycontrolisPort(key_stsp:inSTD_LOGIC;key_strt:inSTD_LOGIC;clk:inSTD_LOGIC;rst:outSTD_LOGIC;ena:outSTD_LOGIC;l_ena:outSTD_LOGIC);endcontrol;architectureBehavioralofcontrolissignalctrl:std_logic_vector(2downto0):="111";beginrst<=ctrl(2);ena<=ctrl(1);l_ena<=ctrl(0);process(clk,key_stsp)beginifclk'eventandclk='1'thenifkey_stsp='1'then--ifctrl="111"then--ctrl<="011";--elsifctrl="001"then--ctrl<="011";--elsifctrl="011"then--ctrl<="001"; casectrlis when"111"=>ctrl<="011"; when"001"=>ctrl<="011"; when"011"=>ctrl<="001"; whenothers=>ctrl<=ctrl; endcase;--endif; elsifkey_strt='1'then ifctrl="001"then ctrl<="111"; elsifctrl="011"then ctrl<="010"; elsifctrl="010"then ctrl<="011"; endif; endif;endif;endprocess;endBehavioral;模块完成在各个模块编译通过没有语法错误以后,接下来就是根据示意图进行模块间的连接,电路示意图如下:程序如下:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitymiaobiaoisPort(key_1:inSTD_LOGIC;key_2:inSTD_LOGIC;clk_48mhz:inSTD_LOGIC;a,b,c,d,e,f,g:outSTD_LOGIC;sel_a,sel_b,sel_c:outSTD_LOGIC;ncs:outSTD_LOGIC);endmiaobiao;architectureBehavioralofmiaobiaois COMPONENTfenpinclk PORT( clkin:INstd_logic; clkout1k:OUTstd_logic; clkout100:OUTstd_logic ); ENDCOMPONENT; COMPONENTkey_debounce PORT( clk:INstd_logic; key_in:INstd_logic; key_out:OUTstd_logic ); ENDCOMPONENT; COMPONENTcontrol PORT( key_stsp:INstd_logic; key_strt:INstd_logic; clk:INstd_logic; rst:OUTstd_logic; ena:OUTstd_logic; l_ena:OUTstd_logic ); ENDCOMPONENT; COMPONENTcount10 PORT( rst:INstd_logic; clk:INstd_logic; ena:INstd_logic; count_out:OUTstd_logic_vector(3downto0); carry_out:OUTstd_logic ); ENDCOMPONENT; COMPONENTcount6 PORT( rst:INstd_logic; clk:INstd_logic; ena:INstd_logic; count_out:OUTstd_logic_vector(3downto0); carry_out:OUTstd_logic ); ENDCOMPONENT; COMPONENTlocker PORT( data_in:INstd_logic_vector(3downto0); l_ena:INstd_logic; data_out:OUTstd_logic_vector(3downto0) ); ENDCOMPONENT; COMPONENTshow PORT( clk:INstd_logic; t0:INstd_logic_vector(3downto0); t1:INstd_logic_vector(3downto0); t2:INstd_logic_vector(3downto0); t3:INstd_logic_vector(3downto0); t4:INstd_logic_vector(3downto0); t5:INstd_logic_vector(3downto0); sel:OUTstd_logic_vector(2downto0); led:OUTstd_logic_vector(6downto0); en:OUTstd_logic ); ENDCOMPONENT;signalclk_1khz,clk_100hz,keyde_1,keyde_2,rst_ctrl,ena_ctrl,l_ena_ctrl:std_logic;signalclk_1,clk_2,clk_3,clk_4,clk_5:std_logic;signaldatain_1,datain_2,datain_3,datain_4,datain_5,datain_6:std_logic_vector(3downto0);signaldataout_1,dataout_2,dataout_3,dataout_4,dataout_5,dataout_6:std_logic_vector(3downto0);signalsel_sum:std_logic_vector(2downto0);signalled_sum:std_logic_vector(6downto0);beginsel_a<=sel_sum(0);sel_b<=sel_sum(1);sel_c<=sel_sum(2);a<=led_sum(6);b<=led_sum(5);c<=led_sum(4);d<=led_sum(3);e<=led_sum(2);f<=led_sum(1);g<=led_sum(0);u1:fenpinclkPORTMAP( clkin=>clk_48mhz, clkout1k=>clk_1khz, clkout100=>clk_100hz );u2:key_debouncePORTMAP( clk=>clk_1khz, key_in=>key_1, key_out=>keyde_1 );u3:key_debouncePORTMAP( clk=>clk_1khz, key_in=>key_2, key_out=>keyde_2 );u4:controlPORTMAP( key_stsp=>keyde_1, key_strt=>keyde_2, clk=>clk_1khz, rst=>rst_ctrl, ena=>ena_ctrl, l_ena=>l_ena_ctrl );u5:count10PORTMAP( rst=>rst_ctrl, clk=>clk_100hz, ena=>ena_ctrl, count_out=>datain_1, carry_out=>clk_1 );u6:lockerPORTMAP( data_in=>datain_1, l_ena=>l_ena_ctrl, data_out=>dataout_1 );u7:count10PORTMAP( rst=>rst_ctrl, clk=>clk_1, ena=>ena_ctrl, count_out=>datain_2, carry_out=>clk_2 );u8:lockerPORTMAP( data_in=>datain_2, l_ena=>l_ena_ctrl, data_out=>dataout_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 区政府督办工作制度
- 医共体检验工作制度
- 医教部干事工作制度
- 医院共青团工作制度
- 医院药事员工作制度
- 十二小时制工作制度
- 单位机关考勤工作制度
- 卫健委弹性工作制度
- 卫生监督所工作制度
- 卫计局科教工作制度
- 浙江省杭州北斗联盟2023-2024学年高一上学期期中联考英语试题
- 眼科质控手册
- 甘肃省2023年中考:《语文》考试真题与参考答案
- 《电力设备典型消防规程》考试复习题库(含答案)
- 加热炉推料结构设计论文(1)-学位论文
- 河北人社APP认证操作指南
- 英语人教新目标七年级下册My favorite animals
- CB/T 615-1995船底吸入格栅
- 大姜优质高产栽培管理技术课件
- 马工程西方经济学(第二版)教学课件-8
- (完整)普洱茶介绍ppt
评论
0/150
提交评论