最终论文 基于VHDL的多功能数字钟设计_第1页
最终论文 基于VHDL的多功能数字钟设计_第2页
最终论文 基于VHDL的多功能数字钟设计_第3页
最终论文 基于VHDL的多功能数字钟设计_第4页
最终论文 基于VHDL的多功能数字钟设计_第5页
已阅读5页,还剩50页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

西安欧亚学院本科毕业论文(设计)

1绪论现代社会的标志之一就是信息产品的广泛使用,而且是产品的性能越来越强,复杂程度越来越高,更新步伐越来越快。支撑信息电子产品高速发展的基础就是微电子制造工艺水平的提高和电子产品设计开发技术的发展。前者以微细加工技术为代表,而后者的代表就是电子设计自动化(electronicdesignautomatic,EDA)技术。集成电路是随着计算机技术的发展而不断进步,1946年2月15日世界上第一台通用电子数字计算机使用了18000个电子管,1500个继电器以及其他器件,安装在面积为9*15平方米的室内。在20世纪50年代中期第二代电子计算机问世,它是以晶体管代替了电子管,此时第一个集成电路诞生了,它包括一个晶体管,两个电阻和一个电阻。电容的组合。后来集成电路工艺日趋完善,大部分电路元件都已经以集成电路的形式出现,甚至在约1平方厘米的芯片上,就可以集成上百万个电子元件。在1967年和1977年,分别出现了大规模集成电路和超大规模集成电路,不断的完善和改进计算机的性能与规模。计算机尤其是以微细加工技术支持的微型计算机技术飞速发展,其应用渗透到了各行各业。以单片机、嵌入式处理器、数字信号处理器(DSP)为核心的计算机系统,以其软硬件可裁剪、高度的实时性、高度的可靠性、功能齐全、低功耗、适应面广等诸多优点而得到极为广泛的应用。目前计算机硬件技术向巨型化、微型化和单片机化三个方向告诉发展。自1975年美国德州仪器公司(TexasInstruments)第一块微型计算机芯片TMS-1000问世以来,在短短的20年间,EDA技术已发展成为计算机领域一个非常有前途的分之,它有自己的技术特征、规范和应用领域。EDA是自动控制系统的核心部件,主要用于工业控制、智能化仪器仪表、家用电器中。它具有体积小、性能突出可靠性高(某些方面的性能指标大大优于通用微机中央处理器)、价格低廉等一系列优点,应用领域不断扩大,除了工业控制、智能化仪表、通信、家用电器外,在智能化高档电子玩具产品中也大量采用FPGA芯片作为核心控制部件,已经渗入到人们工作和生活的各个角落,有力地推动了各行业的技术改造和产品的更新换代,前景广阔。本设计采用的VHDL是一种全方位的硬件描述语言,具有极强的描述能力,能支持系统行为级、寄存器传输级和逻辑门级三个不同层次的设计;支持结构、数据流、行为三种描述形式的混合描述、覆盖面广、抽象能力强,因此在实际应用中越来越广泛。ASIC是专用的系统集成电路,是一种带有逻辑处理的加速处理器。而FPGA是特殊的ASIC芯片,与其他的ASIC芯片相比,它具有设计开发周期短、设计制造成本低、开发工具先进、标准产品无需测试、质量稳定以及可实时在线检测等优点。在控制系统中,键盘是常用的人机交换接口,当所设置的功能键或数字键按下的时候,系统应该完成该键所设置的功能。因此,键信息输入是与软件结构密切相关的过程。根据键盘的结构不同,采用不同的编码方法。但无论有无编码以及采用什么样的编码,最后都要转换成为相应的键值,以实现按键功能程序的转移。钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、定时启闭电路、定时开关烘箱、通断动力设备,甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。因此,研究数字钟及扩大其应用,有着非常现实的意义。1.1选题背景本节将从FPGA嵌入式应用开发技术与数字钟技术发展的客观实际出发,通过对该技术发展状况的了解,以及课题本身的需要,指出研究基于FPGA的芯片系统与设计——数字钟的设计与实现的必要性。1.1.1课题相关技术的发展当今电子产品正向功能多元化,体积最小化,功耗最低化的方向发展。它与传统的电子产品在设计上的显著区别师大量使用大规模可编程逻辑器件,使产品的性能提高,体积缩小,功耗降低.同时广泛运用现代计算机技术,提高产品的自动化程度和竞争力,缩短研发周期。EDA技术正是为了适应现代电子技术的要求,吸收众多学科最新科技成果而形成的一门新技术。美国ALTERA公司的可编程逻辑器件采用全新的结构和先进的技术,加上QuartusII开发环境,更具有高性能,开发周期短等特点,十分方便进行电子产品的开发和设计。电子设计自动化技术以大规模可编程逻辑器件为设计载体,以硬件描述语言为系统逻辑描述主要表达方式,以计算机、大规模可编程逻辑器件的开发软件及实验开发系统为设计工具,通过有关的开发软件,自动完成用软件的方式设计的电子系统到硬件系统的逻辑编译,逻辑化简,逻辑分割,逻辑映射,编程下载等工作,最终形成集成电子系统或专用集成芯片的一门新技术。本设计利用VHDL硬件描述语言结合可编程逻辑器件进行的,并通过数码管动态显示计时结果。数字钟可以由各种技术实现,如单片机、FPGA等,利用可编程逻辑器件具有其他方式没有的特点,它具有易学、方便、新颖、有趣、直观、设计与实验项目成功率高、理论与实践结合紧密、体积小、容量大、I/O口丰富、易编程和加密等特点,并且它还具有开放的界面,丰富的设计库,模块化的工具以及LPM定制等优良性能,应用非常方便。因此,本设计采用可编程逻辑器件实现。1.1.2课题研究的必要性现在是一个知识爆炸的新时代。新产品、新技术层出不穷,电子技术的发展更是日新月异。可以毫不夸张的说,电子技术的应用无处不在,电子技术正在不断地改变我们的生活,改变着我们的世界。在这快速发展的年代,时间对人们来说是越来越宝贵,在快节奏的生活时,人们往往忘记了时间,一旦遇到重要的事情而忘记了时间,这将会带来很大的损失。因此我们需要一个定时系统来提醒这些忙碌的人。数字化的钟表给人们带来了极大的方便。近些年,随着科技的发展和社会的进步,人们对数字钟的要求也越来越高,传统的时钟已不能满足人们的需求。多功能数字钟不管在性能还是在样式上都发生了质的变化,有电子闹钟、数字闹钟等等。设计功能要求能按时钟功能进行小时、分钟、秒计时,并显示时间及调整时间,能整点报时,定点报时,使用4个数码管,能切换显示。基本功能:(1)时的计时要求为24进制,分和秒的计时要求为60进制(2)准确计时,以数字形式显示时,分,秒的时间(3)校时时间扩展功能:(1)定时闹铃控制;(2)校园打铃功能;1.2课题研究的内容本设计主要研究基于FPGA的数字钟,要求时间以24小时为一个周期,显示时、分、秒。具有校时以及报时功能,可以对时、分及秒进行单独校对,使其校正到标准时间,校对时间由4个键盘进行控制,为了保证计时的稳定及准确须由晶体振荡器提供时间基准信号。另外,本系统还具有定时闹钟和校园打铃功能,可以在任意时间响闹铃,同时分别按照规定好的春季和夏季作息时间响铃。

2FPGA开发流程简介2.1FPGA概述FPGA是现场可编程门阵列(FieldProgrammableGateArray)的简称,与之相应的CPLD是复杂可编程逻辑器件(ComplexProgrammableLogicDevice)的简称,两者的功能基本相同,只是实现原理略有不同,所以有时可以忽略这两者的区别,统称为可编程逻辑器件或CPLD/PGFA。CPLD/PGFA几乎能完成任何数字器件的功能,上至高性能CPU,下至简单的74电路。它如同一张白纸或是一堆积木,工程师可以通过传统的原理图输入或硬件描述语言自由的设计一个数字系统。通过软件仿真可以事先验证设计的正确性,在PCB完成以后,利用CPLD/FPGA的在线修改功能,随时修改设计而不必改动硬件电路。使用CPLA/FPGA开发数字电路,可以大大缩短设计时间,减少PCB面积,提高系统的可靠性。这些优点使得CPLA/FPGA技术在20世纪90年代以后得到飞速的发展,同时也大大推动了EDA软件和硬件描述语言HDL的进步。2.2FPGA基本结构FPGA具有掩膜可编程门阵列的通用结构,它由逻辑功能块排成阵列,并由可编程的互连资源连接这些逻辑功能块来实现不同的设计。FPGA一般由3种可编程电路和一个用于存放编程数据的静态存储器SRAM组成。这3种可编程电路是:可编程逻辑模块(CLB--ConfigurableLogicBlock)、输入/输出模块(input/outputblock--I/OBlock)和互连资源(IR—InterconnectResource)。可编程逻辑模块CLB是实现逻辑功能的基本单元,它们通常规则的排列成一个阵列,散布于整个芯片;可编程输入/输出模块(IOB)主要完成芯片上的逻辑与外部封装脚的接口,它通常排列在芯片的四周;可编程互连资源包括各种长度的连接线段和一些可编程连接开关,它们将各个CLB之间或CLB、IOB之间以及IOB之间连接起来,构成特定功能的电路。1.CLB是FPGA的主要组成部分。图2-1是CLB基本结构框图,它主要由逻辑函数发生器、触发器、数据选择器等电路组成。CLB中3个逻辑函数发生器分别是G、F和H,相应的输出是G’、F’和H’。G有4个输入变量G1、G2、G3和G4;F也有4个输入变量F1、F2、F3和F4。这两个函数发生器是完全独立的,均可以实现4输入变量的任意组合逻辑函数。逻辑函数发生器H有3个输入信号;前两个是函数发生器的输出G’和F’,而另一个输入信号是来自信号变换电路的输出H1。这个函数发生器能实现3输入变量的各种组合函数。这3个函数发生器结合起来,可实现多达9变量的逻辑函数。CLB中有许多不同规格的数据选择器(四选一、二选一等),通过对CLB内部数据选择器的编程,逻辑函数发生器G、F和H的输出可以连接到CLB输出端X或Y,并用来选择触发器的激励输入信号、时钟有效边沿、时钟使能信号以及输出信号。这些数据选择器的地址控制信号均由编程信息提供,从而实现所需的电路结构。CLB中的逻辑函数发生器F和G均为查找表结构,其工作原理类似于ROM。F和G的输入等效于ROM的地址码,通过查找ROM中的地址表可以得到相应的组合逻辑函数输出。另一方面,逻辑函数发生器F和G还可以作为器件内高速RAM或小的可读写存储器使用,它由信号变换电路控制。2.输入/输出模块IOB。IOB提供了器件引脚和内部逻辑阵列之间的连接。它主要由输入触发器、输入缓冲器和输出触发/锁存器、输出缓冲器组成。每个IOB控制一个引脚,它们可被配置为输入、输出或双向I/O功能。当IOB控制的引脚被定义为输入时,通过该引脚的输入信号先送入输入缓冲器。缓冲器的输出分成两路:一路可以直接送到MUX,另一路经延CLCLBCLBCLBCLBCLBBCLBCLBCLBCLBCLBCLBCLBCLBBCLBCLBCLB可编程开关矩输入输出模块互连资源图2-1CLB基本结构时几纳秒(或者不延时)送到输入通路D触发器,再送到数据选择器。通过编程给数据选择器不同的控制信息,确定送至CLB阵列的I1和I2是来自输入缓冲器,还是来自触发器。当IOB控制的引脚被定义为输出时,CLB阵列的输出信号OUT也可以有两条传输途径:一条是直接经MUX送至输出缓冲器,另一条是先存入输出通路D触发器,再送至输出缓冲器。IOB输出端配有两只MOS管,它们的栅极均可编程,使MOS管导通或截止,分别经上拉电阻接通Vcc、地线或者不接通,用以改善输出波形和负载能力。3.可编程互连资源IR。可编程互连资源IR可以将FPGA内部的CLB和CLB之间、CLB和IOB之间连接起来,构成各种具有复杂功能的系统。IR主要由许多金属线段构成,这些金属线段带有可编程开关,通过自动布线实现各种电路的连接。2.3FPGA系统设计流程一般说来,一个比较大的完整的项目应该采用层次化的描述方法:分为几个较大的模块,定义好各功能模块之间的接口,然后各个模块再细分去具体实现,这就是TOPDOWN(自顶向下)的设计方法。目前这种高层次的设计方法已被广泛采用。高层次设计只是定义系统的行为特征,可以不涉及实现工艺,因此还可以在厂家综合库的支持下,利用综合优化工具将高层次描述转换成针对某种工艺优化的网络表,使工艺转化变得轻而易举。CPLD/FPGA系统设计的工作流程如图2-2所示。系统划分系统划分=1\*GB3①编译器=3\*GB3③代码级功能仿真=4\*GB3④综合器=5\*GB3⑤适配前时序仿真=6\*GB3⑥适配器=7\*GB3⑦CPLD/FPGA实现适配后仿真模型=8\*GB3⑧适配后时序仿真适配报告=8\*GB3⑧ASIC实现VHDL代码或图形方式输入=2\*GB3②仿真综合库器件编程文件=8\*GB3⑧图2-2CPLD/FPGA系统设计流程流程说明:1.工程师按照“自顶向下”的设计方法进行系统划分。2.输入VHDL代码,这是设计中最为普遍的输入方式。此外,还可以采用图形输入方式(框图、状态图等),这种输入方式具有直观、容易理解的优点。3.将以上的设计输入编译成标准的VHDL文件。4.进行代码级的功能仿真,主要是检验系统功能设计的正确性。这一步骤适用于大型设计,因为对于大型设计来说,在综合前对源代码仿真,就可以大大减少设计重复的次数和时间。一般情况下,这一仿真步骤可略去。5.利用综合器对VHDL源代码进行综合优化处理,生成门级描述的网络表文件,这是将高层次描述转化为硬件电路的关键步骤。综合优化是针对ASIC芯片供应商的某一产品系列进行的,所以综合的过程要在相应的厂家综合库的支持下才能完成。6.利用产生的网络表文件进行适配前的时序仿真,仿真过程不涉及具体器件的硬件特性,是较为粗略的。一般的设计,也可略去这一步骤。7.利用适配器将综合后的网络表文件针对某一具体的目标器件进行逻辑映射操作,包括底层器件配置、逻辑分割、逻辑优化和布局布线。8.在适配完成后,产生多项设计结果:(a)适配报告,包括芯片内部资源利用情况,设计的布尔方程描述情况等;(b)适配后的仿真模型;(c)器件编程文件。根据适配后的仿真模型,可以进行适配后时序仿真,因为已经得到器件的实际硬件特性(如时延特性),所以仿真结果能比较精确的预期未来芯片的实际性能。如果仿真结果达不到设计要求,就修改VHDL源代码或选择不同速度和品质的器件,直至满足设计要求。最后将适配器产生的器件编程文件通过编程器或下载电缆载入到目标芯片CPLD/FPGA中。2.4FPGA开发编程原理硬件设计需要根据各种性能指标、成本、开发周期等因素,确定最佳的实现方案,画出系统框图,选择芯片,设计PCB并最终形成样机。CPLD/FPGA软件设计可分为两大块:编程语言和编程工具。编程语言主要有VHDL和Verilog两种硬件描述语言;编程工具主要是两大厂家Altera和Xilinx的集成综合EDA软件(如QuartusII、Foundation、ISE)以及第三方工具(如FPGAExpress、Modelsim、SynposysSVS等)。具体的设计输入方式有以下几种:1.HDL语言方式。HDL既可以描述底层设计,也可以描述顶层的设计,但它不容易做到较高的工作速度和芯片利用率。用这种方式描述的项目最后所能达到的性能与设计人员的水平、经验以及综合软件有很大的关系。2.图形方式。可以分为电路原理图描述,状态机描述和波形描述3种形式。有的软件3种输入方法都支持,如Active-HDL。MAX+plusII图形输入方式只支持电路原理图描述和波形描述两种。电路原理图方式描述比较直观和高效,对综合软件的要求不高。一般大都使用成熟的IP核和中小规模集成电路所搭成的现成电路,整体放到一片可编程逻辑器件的内部去,所以硬件工作速度和芯片利用率很高,但是但项目很大的时候,该方法就显得有些繁琐;状态机描述主要用来设计基于状态机思想的时序电路。在图形的方式下定义好各个工作状态,然后在各个状态上输入转换条件以及相应的输入输出,最后生成HDL语言描述,送去综合软件综合到可编程逻辑器件的内部。由于状态机到HDL语言有一种标准的对应描述方式,所以这种输入方式最后所能达到的工作速度和芯片利用率主要取决于综合软件;波形描述方式是基于真值表的一种图形输入方式,直接描述输入与输出的波形关系。这种输入方式最后所能达到的工作速度和芯片利用率也是主要取决于综合软件。

3数字钟总体设计方案3.1系统方案的选择首先的任务是根据任务要求进行模块划分,提出方案,并进行比较分析,最终找到较优的方案。方案一、采用异步电路,数据选择器将时钟信号输给秒模块,秒模块的进位输给分模块,分模块进位输入给时模块,切换的时候使用2选1数据选择器进行切换,电路框图如下:显示显示切换秒钟分钟小时控制1Hz脉冲信号闹钟图3-1方案一框图该方案的优点是模块内部简单,基本不需要额外的电路,但缺点也很明显,该方案结构不清晰,模块间关系混乱,模块外还需使用较多门电路,不利于功能扩充,且使用了异步电路,计数在59的时候,高一级马上进位,故本次设计不采用此方案。方案二、采用同步电路,总线结构时钟信号分别加到各个模块,各个模块功能相对独立,框图如下:闹钟闹钟小时分钟秒钟显示控制显示总线控制总线1Hz信号图3-2方案二框图该方案用总线结构,主要功能集中在模块内部,模块功能较为独立,模块间连线简单,易于扩展,本次设计采用此方案。综上所述,本次设计采用方案二。秒计数和分计数为60进制,时计数为24进制,为了简化设计,秒和分计数采用同一单元。控制模块有两部分,一为实现调整切换,二为实现显示切换。现对本方案中的各个主要功能模块的接口定义如下:60进制模块(电路图中模块名称为60count,下同。)实现同步60进制计数,可调整电源5v时钟信号输入接1Hz的信号源进位输入接秒的进位信号,实现秒功能时,接低电平。进位输出秒模块接分模块,分模块接时模块显示输出接到显示总线,能闪烁闹钟比较信号输出接到闹钟,秒模块悬空整点报时信号输出接到响铃,实现3短1长响铃调整使能端入0有效,有效时,显示信号输出,同时屏蔽进位输入和进位输出,允许调整信号输入。显示使能端入0有效调整信号输入24进制模块(24count):实现同步24进制计数,可调整电源,时钟信号同上进位输入接分的进位信号进位输出秒模块接分模块,分模块接时模块显示输出同上闹钟比较信号输出接到闹钟调整使能端,显示使能端,调整信号输入同上闹钟模块(60clock,24clock):实现可与时钟比较,并输出闹铃信号,可调整电源,时钟信号同上闹钟比较信号输入秒模块接分模块,分模块接时模块显示输出同上闹铃输出接到蜂鸣器调整使能端,显示使能端,调整信号输入同上控制模块(fun,func):管理总线资源,对各个模块输出控制信号电源5vVCC调整切换信号接各个需要调整的模块调整信号接到各个需要调整的模块显示切换信号接到各个需要共享显示总线的模块控制信号输出接到各个模块,有且只能有1个为0至此,本阶段就结束了。在上面的接口定义中,也可以发现,各个模块的独立性是很强的,这样的结构使得以后的扩展很容易。3.2数字钟的构成数字钟实际上是一个对标准频率(1HZ)进行计数的计数电路。由于计数的起始时间不可能与标准时间(如北京时间)一致,故需要在电路上加一个校时电路,同时标准的1HZ时间信号必须做到准确稳定。通常使用石英晶体振荡器电路构成数字钟。图3-1所示为数字钟的一般构成框图。主要包括时间基准电路、计数器电路、控制电路、译码和显示电路。其中的控制逻辑电路是比较灵活多样的,不断完善它可以增强数字钟的功能。译码驱译码驱动译码驱动译码驱动译码驱动译码驱动译码驱动时十位计数时个位计数分十位计数分个位计数秒十位计数秒个位计数校时控制电路校分控制电路分频器电路分频器电路晶体振荡器电路1HZ图3-3数字钟的一般组成框图本设计在上面数字钟结构的基础上还加入了定时闹铃功能,以及校园打铃功能,其总体框架如图3-2。图3-4总体框架图3.2数字钟的工作原理振荡器产生稳定的高频脉冲信号,作为数字钟的时间基准,然后经过分频器输出标准秒脉冲。秒计数器满60后向分计数器进位,分计数器满60后向小时计数器进位,小时计数器按照“24翻1”规律计数。计满后各计数器清零,重新计数。计数器的输出分别经译码器送数码管显示。计时出现误差时,可以用校时电路校时、校分。在控制信号中除了一般的校时信号外,还有时钟使能信号、时钟清零信号。控制信号由4个矩形键盘输入。时基电路可以由石英晶体振荡电路构成,如果晶振频率为1MHz,经过6次十分频就可以得到秒脉冲信号。译码显示电路由七段译码器完成,显示由数码管构成。

4单元电路设计4.1分频模块电路设计与实现晶体振荡器是构成数字式时钟的核心,振荡器的稳定度及频率的精度决定了数字钟计时的准确程度,它保证了时钟的走时准确及稳定。石英晶体的选频特性非常好,只有某一频率点的信号可以通过它,其它频率段的信号均会被它所衰减,而且,振荡信号的频率与振荡电路中的R、C元件的数值无关。因此,这种振荡电路输出的是准确度极高的信号。然后再利用分频电路,将其输出信号转变为秒信号,其组成框图如图4-1。分频电路分频电路石英晶体振荡电路秒信号图4-1秒信号产生电路框图本系统使用的晶体振荡器电路给数字钟提供一个频率稳定准确的40MHz的方波信号,其输出至分频电路。50K分频电路的逻辑框图如图4-2所示。图4-2分频电路模块其VHDL语言如下所示:libraryieee;useieee.std_logic_1164.all; --50k分频useieee.std_logic_unsigned.all;entityfenpin_50kisport(clk:instd_logic;q:outstd_logic);end;architectureoneoffenpin_50kissignalfull:std_logic;beginreg:process(clk,full)variablecnt:std_logic_vector(15downto0):="0000000000000000";beginifclk'eventandclk='1'thenifcnt="1100001101001111"thencnt:="0000000000000000";elsecnt:=cnt+1;endif; ifcnt<"110000110101000"then full<='1'; elsefull<='0';endif;endif;q<=full;endprocess;end;系统使用的所有分频电路图见图4-3。图4-3分频模块电路设计电路中采用QuartusII并使用VHDL语言进行硬件分频。经分频后输出1HZ的标准秒信号clk_s、128HZ的按键去抖信号clk_128和512HZ用于报时模块的输入信号clk_512。该模块的时序仿真图如图4-4所示,满足设计要求。图4-4分频模块仿真图4.2校时控制模块电路设计与实现4.2.1键盘接口电路原理校时控制模块在本系统中也就是键盘接口电路部分。下面先介绍键盘接口电路的工作原理,如图4-5。本系统采用的就是这种行列式键盘接口,相对个按键的键盘接口来说节省了I/O接口。如图所示,行线通过一个电阻被上拉到+5V电压。行线与按键的一个引脚相连,列线与按键的另一个引脚相连。平时列线被置成低电平,没有按键被按下的时候,行线保持高电平,而有按键被按下的时候,行线被拉成低电平,这时候控制器就知道有按键被按下,但只能判断出在哪一行,不能判断出在哪一列,因此接下来就要进行键盘扫描,以确定具体是哪个按键被按下。键盘扫描的过程事将列线逐列置成低电平,然后读取行线状态,直到行线中出现低电平,可知这时哪一列是低电平,然后将行线与列线的状态装入键码寄存器,进行按键译码,得到按下的按键的相应编码,这样就完成了按键扫描的过程。当然,一个完整的按键扫描过程还需要配合相应的键盘去抖手段才能正确的识别按键,不会发生重键和错误判断等情况。图4-5键盘接口电路4.2.2键盘接口的VHDL描述1.按键消抖本模块用于当有按键按下时,采用软件消抖的办法去除按键抖动。模块的实现方法是先判断是否有按键按下,如有按键按下则延时一段时间,待抖动过去之后再读行线状态,如果仍有低电平行线,则确定有按键按下,然后产生一个有按键按下的信号。该模块有一个时钟输入端口,输入时钟信号是分频出来的128HZ的时钟;有一个输入端口与按键相连,用于输入按键电平;一个输出端口,用于输出有按键按下时经过取抖的信号。该模块的逻辑框图如图4-6所示。图4-6去抖逻辑框图该电路的VHDL程序如下:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityqudouisport(clkin:INSTD_LOGIC; reset:INSTD_LOGIC;din:INSTD_LOGIC;dout:OUTSTD_LOGIC);endqudou;architectureBehavioralofqudouisTYPEstateIS(s0,s1,s2,s3);SIGNALpre_s,next_s:state;beginP0:PROCESS(reset,clkin)BEGINifreset='0'thenpre_s<=s0;elsifrising_edge(clkin)thenpre_s<=next_s;elsenull;endif;ENDPROCESSP0; P1:PROCESS(pre_s,next_s,din)BEGINcasepre_siswhens0=>dout<='1';ifdin='1'thennext_s<=s0;elsenext_s<=s1;endif;whens1=>dout<='1';ifdin='1'thennext_s<=s0;elsenext_s<=s2;endif;whens2=>dout<='1';ifdin='1'thennext_s<=s0;elsenext_s<=s3;endif;whens3=>dout<='0';ifdin='1'thennext_s<=s0;elsenext_s<=s1;endif;endcase;ENDPROCESSP1; endBehavioral;程序说明:这段程序是实现按键消抖的,实现较简单,原理是当有按键按下的时候,din会变成低电平,这时状态机会进入下一个状态,如果此时din不为低电平时,便会跳转回初始状态;当din为高电平时,状态机会继续进入下一个状态。由于计数脉冲为128HZ,故只有当低电平持续超过20ms时,才有可能进入最后一个状态,从而输入高电平。如果有按键抖动的话,状态机会在初始状态和最终状态之间变动多次,但不会输出高电平,所以按键输出就不会受抖动影响。一旦到达最后一个状态,抖动已经过去,就不会发生重键现象了,这样就去除了抖动。2.按键复用电路系统需要两个时钟校时按键,两个闹钟校时按键,另外还需要一个显示切换按键和一个春夏作息时间按键,这样就一共需要6个按键,而本系统的硬件电路板只提供了4个按键,所以需要按键复用电路。按键复用电路的框图如图4-7所示。图4-7按键扫描模块本系统给出的解决方案是,定时闹铃和时钟的校时按键复用,而另外用一个按键控制复用和显示切换,而第四个按键控制春季和夏季作息时间的切换。其中,KeySwitch模块的VHDL语言为:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.all;ENTITYKeySwitchISPORT(CLK,reset:INSTD_LOGIC;y:OUTSTD_LOGIC);ENDKeySwitch;ARCHITECTUREbehavOFKeySwitchISTYPEstatesIS(st0,st1,st2);SIGNALstx:states;BEGINCOMREG:PROCESS(CLK,RESET)BEGINIFRESET='0'THENSTX<=st0;ELSIFCLK'EVENTANDCLK='1'THENCASESTXISWHENst0=>STX<=st1;WHENst1=>STX<=st0;WHENOTHERS=>STX<=st0;ENDCASE;ENDIF;ENDPROCESSCOMREG;COM1:PROCESS(STX)BEGINCASESTXISWHENst0=>y<='0';WHENst1=>y<='1';WHENOTHERS=>y<='1';ENDCASE;ENDPROCESSCOM1;ENDbehav;2.完整的按键控制电路完整的键盘程序应加上刚开始介绍的分频模块,键盘接口电路总的逻辑连接框图如图4-8所示。图4-8键盘接口连接框图按键接口模块的仿真波形如下图所示:图4-9键盘接口仿真波形图4.3计数模块设计与实现4.3.1秒和分计数模块秒和分计数模块逻辑框图如图4-9所示。图4-10秒计数模块框图输入端口EN是秒时钟使能信号,也是整个数字钟的使能信号,高电平有效;CLRN是异步清零信号;CLK是秒脉冲输入端口,当秒计数到59时输出高电平,其它时候输出低电平。秒计数模块的程序如下:LIBRARYieee;USEieee.std_logic_1164.all;ENTITYclock_60ISPORT(CLRN,EN,CLK:INSTD_LOGIC;cout1:outSTD_LOGIC;Qsa:OUTINTEGERRANGE0TO10;Qsb:OUTINTEGERRANGE0TO10);ENDclock_60;ARCHITECTUREaOFclock_60ISBEGINPROCESS(CLK,CLRN)VARIABLEtmpsa:INTEGERRANGE0TO10;VARIABLEtmpsb:INTEGERRANGE0TO10;BEGINIFCLRN='0'THENtmpsb:=0;tmpsa:=0;COUT1<='0';ELSIFCLK'eventANDCLK='1'THEN IFEN='1'THENIFtmpsb=5ANDtmpsa=9THENtmpSa:=0;tmpSb:=0;COUT1<='1';ELSIFtmpSa=9THENtmpSa:=0;tmpSb:=tmpSb+1;ELSEtmpSa:=tmpSa+1;COUT1<='0';ENDIF;ENDIF;ENDIF;QSA<=tmpsa;QSB<=tmpsb;ENDPROCESS;ENDa;秒时钟的仿真波形图如图4-11所示,仿真图满足设计的要求。分计数和时计数模块的设计原理与秒模块的类似。图4-11秒时钟仿真波形4.3.2时计数模块时计数模块逻辑框图如图4-9所示。图4-12秒计数模块框图同样,输入端口EN是秒时钟使能信号,也是整个数字钟的使能信号,高电平有效;CLRN是异步清零信号;CLK是秒脉冲输入端口,当秒计数到23时输出高电平,其它时候输出低电平。秒计数模块的程序如下:LIBRARYieee;USEieee.std_logic_1164.all;ENTITYclock_24ISPORT(CLRN,EN,CLK:INSTD_LOGIC;cout1:outSTD_LOGIC;Qsa:OUTINTEGERRANGE0TO10;Qsb:OUTINTEGERRANGE0TO10);ENDclock_24;ARCHITECTUREaOFclock_24ISBEGINPROCESS(CLK,CLRN)VARIABLEtmpsa:INTEGERRANGE0TO10;VARIABLEtmpsb:INTEGERRANGE0TO10;BEGINIFCLRN='0'THENtmpsb:=0;tmpsa:=0;COUT1<='0';ELSIFCLK'eventANDCLK='1'THEN IFEN='1'THENIFtmpsb=2ANDtmpsa=3THENtmpSa:=0;tmpSb:=0;COUT1<='1';ELSIFtmpSa=9THENtmpSa:=0;tmpSb:=tmpSb+1;ELSEtmpSa:=tmpSa+1;COUT1<='0';ENDIF;ENDIF;ENDIF;QSA<=tmpsa;QSB<=tmpsb;ENDPROCESS;ENDa;时计数模块的仿真波形图如下图所示:图4-13秒计数模块仿真波形图4.3.3时钟校时模块本系统需要对分和时实现校时功能,即可以利用按键调整分和时。利用上述计数电路的特点,可通过人为产生脉冲的方法来产生计数的增加,以便实现校时功能。电路图如下图所示:图4-14时钟校时模块图其中,StateMachine模块的代码如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.all;ENTITYStateMachineISPORT(CLK,reset:INSTD_LOGIC;y:OUTSTD_LOGIC_VECTOR(1DOWNTO0));ENDStateMachine;ARCHITECTUREbehavOFStateMachineISTYPEstatesIS(st0,st1,st2);SIGNALstx:states;BEGINCOMREG:PROCESS(CLK,RESET)BEGIN--决定转换状态的进程IFRESET='0'THENSTX<=st0;ELSIFCLK'EVENTANDCLK='1'THENCASESTXISWHENst0=>STX<=st1;WHENst1=>STX<=st2;WHENst2=>STX<=st0;WHENOTHERS=>STX<=st0;ENDCASE;ENDIF;ENDPROCESSCOMREG;COM1:PROCESS(STX)--输出控制信号的进程BEGINCASESTXISWHENst0=>y<="11";WHENst1=>y<="01";WHENst2=>y<="10";WHENOTHERS=>y<="11";ENDCASE;ENDPROCESSCOM1;ENDbehav;4.3.3带校时功能的整体时钟模块将上面的模块联合在一起,就得到了整体时钟模块,并且可以实现校时功能。系统模块图如下图所示:图4-15时钟模块框图顶层模块图如下图所示:图4-15时钟模块顶层图整个时钟模块的仿真波形图如下图所示:图4-15时钟模块仿真波形图4.4定时闹铃模块定时闹铃模块由两部分组成,一部分负责调整闹铃的时间,另一部分负责在规定的时间触发打铃。其中,控制部分的功能和时钟校时模块的功能相同,但是实现方式不太相同。本模块中,第一个按键不按下的状态下,按第二个按键,调整分计数,而在第一个按键按下的状态下,按第二个按键调整的是时计数。4.4.1闹铃控制模块控制部分的代码如下所示:LIBRARYieee;USEieee.std_logic_1164.all;ENTITYctrl_memoISPORT(reset,k1,up_key:INSTD_LOGIC;--k1高电平为调时,低电平为调分Q_hourb:OUTINTEGERRANGE0TO10;--“时”高位Q_houra:OUTINTEGERRANGE0TO10;--“时”低位Q_minueb:OUTINTEGERRANGE0TO10;Q_minuea:OUTINTEGERRANGE0TO10);ENDctrl_memo;ARCHITECTUREaOFctrl_memoISBEGINPROCESS(reset,k1,up_key)VARIABLEQ_tmpma:INTEGERRANGE0TO10;VARIABLEQ_tmpmb:INTEGERRANGE0TO10;VARIABLEQ_tmpha:INTEGERRANGE0TO10;VARIABLEQ_tmphb:INTEGERRANGE0TO10;BEGINIFreset='0'THENQ_tmpma:=0;Q_tmpmb:=0;Q_tmpha:=0;Q_tmphb:=0;ELSIFup_key'eventANDup_key='1'THENIFk1='1'THENIFQ_tmphb=2ANDQ_tmpha=3THENQ_tmphb:=0;Q_tmpha:=0;ELSIFQ_tmpha=9THENQ_tmpha:=0;Q_tmphb:=Q_tmphb+1;ELSEQ_tmpha:=Q_tmpha+1;ENDIF;elseIFQ_tmpmb=5ANDQ_tmpma=9THENQ_tmpmb:=0;Q_tmpma:=0;ELSIFQ_tmpma=9THENQ_tmpma:=0;Q_tmpmb:=Q_tmpmb+1;ELSEQ_tmpma:=Q_tmpma+1;ENDIF;ENDIF;ENDIF;Q_hourb<=Q_tmphb;Q_houra<=Q_tmpha;Q_minueb<=Q_tmpmb;Q_minuea<=Q_tmpma;ENDPROCESS;ENDa;其顶层模块图如下图所示:图4-16定时闹钟模块顶层图4.4.2闹铃比较模块比较模块把输入的时信号和秒信号和预设的时间进行比较,如果相同,就会输出高电平。的代码如下:LIBRARYieee;USEieee.std_logic_1164.all;ENTITYcomparerISPORT(CLk0:INSTD_LOGIC;QH_A,QM_A:ININTEGERRANGE0TO10;QH_B:ININTEGERRANGE0TO10;QM_B:ININTEGERRANGE0TO10;HARM_A,MARM_A:ININTEGERRANGE0TO10;HARM_B:ININTEGERRANGE0TO10;MARM_B:ININTEGERRANGE0TO10;SPEAK:OUTSTD_LOGIC);ENDcomparer;ARCHITECTUREaOFcomparerISSIGNALY:STD_LOGIC;BEGINSPEAK<=CLK0ANDY;Y<='1'WHEN(QH_A=HARM_A)AND(QM_A=MARM_A)AND(QH_B=HARM_B)AND(QM_B=MARM_B)ELSE'0';ENDa;顶层模块图如下图所示:图4-15定时闹钟比较模块顶层图4.5校园打铃闹铃模块4.5.1校园打铃模块校园打铃的原理和定时闹铃相似,只是没有设置模块,所有的打铃时间都是预设好的,并且分为春季作息时间和夏季作息时间。本模块把输入的时信号和秒信号和预设的时间进行比较,如果相同,就会输出高电平。本模块的代码如下:LIBRARYieee;USEieee.std_logic_1164.all;USEIEEE.STD_LOGIC_ARITH.ALL;ENTITYCOMP_TIMEISPORT(K3:INSTD_LOGIC;QH_A,QM_A:ININTEGERRANGE0TO10;QH_B:ININTEGERRANGE0TO10;QM_B:ININTEGERRANGE0TO10;Q_Y:OUTSTD_LOGIC);ENDCOMP_TIME;ARCHITECTUREaOFCOMP_TIMEISSIGNALQTIME:STD_LOGIC_VECTOR(12DOWNTO0);SIGNALQ_HA:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALQ_HB:STD_LOGIC_VECTOR(1DOWNTO0);SIGNALQ_MA:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALQ_MB:STD_LOGIC_VECTOR(2DOWNTO0);BEGIN Q_HA<=conv_std_logic_vector(QH_A,4); Q_HB<=conv_std_logic_vector(QH_B,2); Q_MA<=conv_std_logic_vector(QM_A,4); Q_MB<=conv_std_logic_vector(QM_B,3);QTIME<=Q_HB&Q_HA&Q_MB&Q_MA;PROCESS(QTIME,K3)BEGINIFK3='1'THENCASEQTIMEISWHEN"0001101010000"=>Q_Y<='1'; WHEN"0001111000000"=>Q_Y<='1';WHEN"0001111010000"=>Q_Y<='1'; WHEN"0010000110101"=>Q_Y<='1';WHEN"0010001000101"=>Q_Y<='1'; WHEN"0010010110000"=>Q_Y<='1';WHEN"0010011010000"=>Q_Y<='1'; WHEN"0100000110101"=>Q_Y<='1';WHEN"0100001000101"=>Q_Y<='1'; WHEN"0100010110000"=>Q_Y<='1';WHEN"0101000000000"=>Q_Y<='1'; WHEN"0101000010000"=>Q_Y<='1';WHEN"0101001010101"=>Q_Y<='1'; WHEN"0101010000101"=>Q_Y<='1';WHEN"0101011010000"=>Q_Y<='1'; WHEN"0101100000000"=>Q_Y<='1';WHEN"0101101000101"=>Q_Y<='1'; WHEN"0101101010101"=>Q_Y<='1';WHEN"0101111000000"=>Q_Y<='1'; WHEN"0110010000000"=>Q_Y<='1';WHEN"0110011000101"=>Q_Y<='1'; WHEN"0110011010101"=>Q_Y<='1';WHEN"1000001000000"=>Q_Y<='1'; WHENOTHERS=>Q_Y<='0';ENDCASE;ELSECASEQTIMEISWHEN"0001101000000"=>Q_Y<='1'; WHEN"0001110110000"=>Q_Y<='1';WHEN"0001111000000"=>Q_Y<='1'; WHEN"0010000100101"=>Q_Y<='1';WHEN"0010000110101"=>Q_Y<='1';--0835 WHEN"0010010100000"=>Q_Y<='1'; --0920WHEN"0010011000000"=>Q_Y<='1'; --0940 WHEN"0100000100101"=>Q_Y<='1';--1025WHEN"0100000110101"=>Q_Y<='1'; --1035 WHEN"0100010100000"=>Q_Y<='1'; --1120WHEN"0101000100000"=>Q_Y<='1'; --1420 WHEN"0101000110000"=>Q_Y<='1'; --1430WHEN"0101010010101"=>Q_Y<='1'; --1515 WHEN"0101010100101"=>Q_Y<='1'; --1525WHEN"0101100010000"=>Q_Y<='1'; --1610 WHEN"0101100100000"=>Q_Y<='1'; --1620WHEN"0101110000101"=>Q_Y<='1'; --1705 WHEN"0101110010101"=>Q_Y<='1'; --1715WHEN"0110000000000"=>Q_Y<='1'; --1800 WHEN"0110010010000"=>Q_Y<='1'; --1910WHEN"0110011010101"=>Q_Y<='1'; --1955 WHEN"1000000000101"=>Q_Y<='1'; --2005WHEN"1000010000000"=>Q_Y<='1';--2100WHENOTHERS=>Q_Y<='0';ENDCASE;ENDIF;ENDPROCESS;ENDa;其顶层图如下图所示:图4-16校园打铃模块顶层图4.5.2打铃时间调整模块由于预设的时间和时钟时间相同的时间是一分钟,但是对于校园打铃来说,一分钟的时间明显太长了,所以需要打铃时间调整模块,以便于将时间调整为20s。其代码如下所示:LIBRARYieee;USEieee.std_logic_1164.all;ENTITYs20ISPORT(QY,CLK:INSTD_LOGIC;q_20s:outSTD_LOGIC);ENDs20;ARCHITECTUREaOFs20ISBEGINPROCESS(CLK)VARIABLEtmp:INTEGERRANGE0TO63;BEGINIFCLK'eventANDCLK='1'THENIFQY='1'THENIFtmp<=15THENtmp:=tmp+1;Q_20S<='1';ELSEtmp:=tmp+1;Q_20S<='0';ENDIF;ELSEtmp:=0;Q_20S<='0';ENDIF;ENDIF;ENDPROCESS;ENDa;其顶层图如下图所示:图4-17响铃时间调整模块框图4.6显示电路设计与实现本系统需要同时显示正常时钟和闹铃显示,所以需要一个切换信号。显示选择模块的代码如下图所示:LIBRARYieee;USEieee.std_logic_1164.all;ENTITYNOR_ARM_CTLISPORT(k2:INSTD_LOGIC;QSAI,QMAI,QHAI:ININTEGERRANGE0TO10;QSBI,QMBI:ININTEGERRANGE0TO10;QHBI:ININTEGERRANGE0TO10;QH_ARM_A,QM_ARM_A:ININTEGERRANGE0TO10;QH_ARM_B:ININTEGERRANGE0TO10;QM_ARM_B:ININTEGERRANGE0TO10;Q_HAO,Q_MAO,Q_SAO:OUTINTEGERRANGE0TO10;Q_HBO:OUTINTEGERRANGE0TO10;Q_MBO,Q_SBO:OUTINTEGERRANGE0TO10);ENDNOR_ARM_CTL;ARCHITECTUREaOFNOR_ARM_CTLISBEGINQ_HAO<=QHAIWHENK2='1'ELSEQH_ARM_A;Q_HBO<=QHBIWHENK2='1'ELSEQH_ARM_B;Q_MAO<=QMAIWHENK2='1'ELSEQM_ARM_A;Q_MBO<=QMBIWHENK2='1'ELSEQM_ARM_B;Q_SAO<=QSAIWHENK2='1'ELSE0;Q_SBO<=QSBIWHENK2='1'ELSE0;ENDa;另外,还需要译码电路,将数字转换成LED码,其代码如下:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYseg1ISPORT(clk:INstd_logic;rst:INstd_logic;Q_HAO,Q_MAO,Q_SAO:ININTEGERRANGE0TO10;Q_HBO:ININTEGERRANGE0TO10;Q_MBO,Q_SBO:ININTEGERRANGE0TO10;dataout:OUTstd_logic_vector(7DOWNTO0);en:OUTstd_logic_vector(7DOWNTO0));ENDseg1;ARCHITECTUREarchOFseg1ISsignaldiv_cnt:std_logic_vector(24downto0);signaldata4:INTEGERRANGE0TO10;signaldataout_xhdl1:std_logic_vector(7downto0);signalen_xhdl:std_logic_vector(7downto0);begindataout<=dataout_xhdl1;en<=en_xhdl;process(clk,rst)beginif(rst='0')thendiv_cnt<="0000000000000000000000000";elsif(clk'eventandclk='1')thendiv_cnt<=div_cnt+1;endif;endprocess;****************Display***************--process(rst,clk,div_cnt(19downto17))beginif(rst='0')thenen_xhdl<="11111110";elsif(clk'eventandclk='1')thencasediv_cnt(19downto17)iswhen"000"=>en_xhdl<="11011111";when"001"=>en_xhdl<="11101111";when"010"=>en_xhdl<="11110111";when"011"=>en_xhdl<="11111011";when"100"=>en_xhdl<="11111101";when"101"=>en_xhdl<="11111110";whenothers=>en_xhdl<="11111110";endcase;endif;endprocess;process(en_xhdl,Q_HAO,Q_HBO,Q_MAO,Q_MBO,Q_SAO,Q_SBO)begincaseen_xhdliswhen"11011111"=>data4<=Q_HBO;when"11101111"=>data4<=Q_HAO;when"11110111"=>data4<=Q_MBO;when"11111011"=>data4<=Q_MAO;when"11111101"=>data4<=Q_SBO;when"11111110"=>data4<=Q_SAO;--when"1011"=>data4<=cntthird;--when"0111"=>data4<=cntlast;whenothers=>data4<=0;endcase;endprocess;process(data4)begincasedata4isWHEN0=>dataout_xhdl1<="11000000";WHEN1=>dataout_xhdl1<="11111001";WHEN2=>dataout_xhdl1<="10100100";WHEN3=>dataout_xhdl1<="10110000";WHEN4=>dataout_xhdl1<="10011001";WHEN5=>dataout_xhdl1<="10010010";WHEN6=>dataout_xhdl1<="10000010";WHEN7=>dataout_xhdl1<="11111000";WHEN8=>dataout_xhdl1<="10000000";WHEN9=>dataout_xhdl1<="10010000";WHENOTHERS=>dataout_xhdl1<="0000

温馨提示

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

评论

0/150

提交评论