基于FPGA的数字时钟设计论文部分_第1页
基于FPGA的数字时钟设计论文部分_第2页
基于FPGA的数字时钟设计论文部分_第3页
基于FPGA的数字时钟设计论文部分_第4页
基于FPGA的数字时钟设计论文部分_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

毕业设计(论文)PAGEI摘要本设计为一个多功能的数字钟,具有年、月、日、时、分、秒计数显示功能,以24小时循环计数;具有校对功能以及整点报时功能。本设计采用EDA技术,以硬件描述语言VHDL为系统逻辑描述手段设计文件,在MaxplusII工具软件环境下,采用自顶向下的设计方法,由各个基本模块共同构建了一个基于FPGA的数字钟。系统主芯片采用EP1K100QC208-3,由时钟模块、控制模块、计时模块、数据译码模块、显示以及报时模块组成。经编译和仿真所设计的程序,在可编程逻辑器件上下载验证,本系统能够完成年、月、日和时、分、秒的分别显示,由按键输入进行数字钟的校时、清零、启停功能。关键词:数字钟;硬件描述语言;VHDL;FPGA;键盘接口PAGEPAGE31ABSTRACTThedesignforamulti-functionaldigitalclock,withayear,month,day,hours,minutesandsecondscountdisplaytoa24-hourcyclecount;haveprooffunctionsandthewholepointtimekeepingfunction.TheuseofEDAdesigntechnology,hardware-descriptionlanguageVHDLdescriptionlogicmeansforthesystemdesigndocuments,inMaxplusIItoolsenvironment,atop-downdesign,bythevariousmodulestogetherbuildaFPGA-baseddigitalclock.ThemainsystemchipsusedEP1K100QC208-3,makeupoftheclockmodule,controlmodule,timemodule,datadecodingmodule,displayandbroadcastmodule.Aftercompilingthedesignandsimulationprocedures,theprogrammablelogicdevicetodownloadverification,thesystemcancompletetheyear,month,dayandthehours,minutesandsecondsrespectively,usingkeystomodify,cleared,startandstopthedigitalclock.Keywords:digitalclock;hardwaredescriptionlanguage;VHDL;FPGA;keyboardinterface目录TOC\o"1-3"\u第1章绪论 31.1选题背景 31.1.1课题相关技术的发展 31.1.2课题研究的必要性 41.2课题研究的内容 4第2章FPGA简介 52.1FPGA概述 52.2FPGA基本结构 52.3FPGA系统设计流程 72.4FPGA开发编程原理 8第3章数字钟总体设计方案 103.1数字钟的构成 103.2数字钟的工作原理 11第4章单元电路设计 124.1分频模块电路设计与实现 124.2校时控制模块电路设计与实现 134.2.1键盘接口电路原理 134.2.2键盘接口的VHDL描述 144.3计数模块设计与实现 194.3.1秒计数模块 194.3.2日计数模块 214.3.3月计数和年计数模块 244.4动态扫描及显示电路设计与实现 254.4.1动态扫描模块 254.4.2显示模块 26第5章设计结论与研究展望 275.1设计结论 275.2研究展望 27致谢 29附录 30参考文献 34第1章绪论现代社会的标志之一就是信息产品的广泛使用,而且是产品的性能越来越强,复杂程度越来越高,更新步伐越来越快。支撑信息电子产品高速发展的基础就是微电子制造工艺水平的提高和电子产品设计开发技术的发展。前者以微细加工技术为代表,而后者的代表就是电子设计自动化(electronicdesignautomatic,EDA)技术。本设计采用的VHDL是一种全方位的硬件描述语言,具有极强的描述能力,能支持系统行为级、寄存器传输级和逻辑门级三个不同层次的设计;支持结构、数据流、行为三种描述形式的混合描述、覆盖面广、抽象能力强,因此在实际应用中越来越广泛。ASIC是专用的系统集成电路,是一种带有逻辑处理的加速处理器。而FPGA是特殊的ASIC芯片,与其他的ASIC芯片相比,它具有设计开发周期短、设计制造成本低、开发工具先进、标准产品无需测试、质量稳定以及可实时在线检测等优点。在控制系统中,键盘是常用的人机交换接口,当所设置的功能键或数字键按下的时候,系统应该完成该键所设置的功能。因此,键信息输入是与软件结构密切相关的过程。根据键盘的结构不同,采用不同的编码方法。但无论有无编码以及采用什么样的编码,最后都要转换成为相应的键值,以实现按键功能程序的转移。钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、定时启闭电路、定时开关烘箱、通断动力设备,甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。因此,研究数字钟及扩大其应用,有着非常现实的意义。1.1选题背景本节将从FPGA嵌入式应用开发技术与数字钟技术发展的客观实际出发,通过对该技术发展状况的了解,以及课题本身的需要,指出研究基于FPGA的芯片系统与设计——数字钟的设计与实现的必要性。1.1.1课题相关技术的发展当今电子产品正向功能多元化,体积最小化,功耗最低化的方向发展。它与传统的电子产品在设计上的显著区别师大量使用大规模可编程逻辑器件,使产品的性能提高,体积缩小,功耗降低.同时广泛运用现代计算机技术,提高产品的自动化程度和竞争力,缩短研发周期。EDA技术正是为了适应现代电子技术的要求,吸收众多学科最新科技成果而形成的一门新技术。美国ALTERA公司的可编程逻辑器件采用全新的结构和先进的技术,加上MaxplusII(或最新的QUARTUS)开发环境,更具有高性能,开发周期短等特点,十分方便进行电子产品的开发和设计。EDA技术,技术以大规模可编程逻辑器件为设计载体,以硬件描述语言为系统逻辑描述主要表达方式,以计算机、大规模可编程逻辑器件的开发软件及实验开发系统为设计工具,通过有关的开发软件,自动完成用软件的方式设计的电子系统到硬件系统的逻辑编译,逻辑化简,逻辑分割,逻辑映射,编程下载等工作。最终形成集成电子系统或专用集成芯片的一门新技术。本设计利用VHDL硬件描述语言结合可编程逻辑器件进行的,并通过数码管动态显示计时结果。数字钟可以由各种技术实现,如单片机等.利用可编程逻辑器件具有其他方式没有的特点,它具有易学,方便,新颖,有趣,直观,设计与实验项目成功率高,理论与实践结合紧密,体积小,容量大,I/O口丰富,易编程和加密等特点,并且它还具有开放的界面,丰富的设计库,模块化的工具以及LPM定制等优良性能,应用非常方便。因此,本设计采用可编程逻辑器件实现。1.1.2课题研究的必要性现在是一个知识爆炸的新时代。新产品、新技术层出不穷,电子技术的发展更是日新月异。可以毫不夸张的说,电子技术的应用无处不在,电子技术正在不断地改变我们的生活,改变着我们的世界。在这快速发展的年代,时间对人们来说是越来越宝贵,在快节奏的生活时,人们往往忘记了时间,一旦遇到重要的事情而忘记了时间,这将会带来很大的损失。因此我们需要一个定时系统来提醒这些忙碌的人。数字化的钟表给人们带来了极大的方便。近些年,随着科技的发展和社会的进步,人们对数字钟的要求也越来越高,传统的时钟已不能满足人们的需求。多功能数字钟不管在性能还是在样式上都发生了质的变化,有电子闹钟、数字闹钟等等。1.2课题研究的内容本设计主要研究基于FPGA的数字钟,要求时间以24小时为一个周期,显示年、月、日、时、分、秒。具有校时以及报时功能,可以对年、月、日、时、分及秒进行单独校对,使其校正到标准时间。校对时间由4×4矩形键盘进行控制,为了保证计时的稳定及准确须由晶体振荡器提供时间基准信号。本设计小组成员共有三人:其他两人分别采用原理图设计和VerilogHDL语言设计。第2章FPGA简介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)、输入/输出模块(IOB--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软件(如MAX+plusII、QuartusII、Foundation、ISE)以及第三方工具(如FPGAExpress、Modelsim、SynposysSVS等)。具体的设计输入方式有以下几种:1.HDL语言方式。HDL既可以描述底层设计,也可以描述顶层的设计,但它不容易做到较高的工作速度和芯片利用率。用这种方式描述的项目最后所能达到的性能与设计人员的水平、经验以及综合软件有很大的关系。2.图形方式。可以分为电路原理图描述,状态机描述和波形描述3种形式。有的软件3种输入方法都支持,如Active-HDL。MAX+plusII图形输入方式只支持电路原理图描述和波形描述两种。电路原理图方式描述比较直观和高效,对综合软件的要求不高。一般大都使用成熟的IP核和中小规模集成电路所搭成的现成电路,整体放到一片可编程逻辑器件的内部去,所以硬件工作速度和芯片利用率很高,但是但项目很大的时候,该方法就显得有些繁琐;状态机描述主要用来设计基于状态机思想的时序电路。在图形的方式下定义好各个工作状态,然后在各个状态上输入转换条件以及相应的输入输出,最后生成HDL语言描述,送去综合软件综合到可编程逻辑器件的内部。由于状态机到HDL语言有一种标准的对应描述方式,所以这种输入方式最后所能达到的工作速度和芯片利用率主要取决于综合软件;波形描述方式是基于真值表的一种图形输入方式,直接描述输入与输出的波形关系。这种输入方式最后所能达到的工作速度和芯片利用率也是主要取决于综合软件。

第3章数字钟总体设计方案3.1数字钟的构成数字钟实际上是一个对标准频率(1Hz)进行计数的计数电路。由于计数的起始时间不可能与标准时间(如北京时间)一致,故需要在电路上加一个校时电路,同时标准的1Hz时间信号必须做到准确稳定。通常使用石英晶体振荡器电路构成数字钟。图3-1所示为数字钟的一般构成框图。主要包括时间基准电路、计数器电路、控制电路、译码和显示电路。其中的控制逻辑电路是比较灵活多样的,不断完善它可以增强数字钟的功能。译码驱动译码驱动译码驱动译码驱动译码驱动译码驱动译码驱动译码驱动译码驱动译码驱动译码驱动译码驱动时十位计数时个位计数分十位计数分个位计数秒十位计数秒个位计数校时控制电路校分控制电路分频器电路分频器电路晶体振荡器电路1Hz图3-1数字钟的一般组成框图本设计在上面数字钟结构的基础上还加入了显示年、月、日的功能,其显示范围为2000年1月1日至2099年12月31日。其总体框架如图3-2。图3-2总体框架3.2数字钟的工作原理振荡器产生稳定的高频脉冲信号,作为数字钟的时间基准,然后经过分频器输出标准秒脉冲。秒计数器满60后向分计数器进位,分计数器满60后向小时计数器进位,小时计数器按照“24翻1”规律计数。计满后各计数器清零,重新计数。日期部分由于日有28天、29天、30天、31天4种情况,故日由年和月共同判断其天数,日计满后向月进位,月满后向年进位。计数器的输出分别经译码器送数码管显示。计时出现误差时,可以用校时电路校时、校分、校秒和校年、校月和校日。在控制信号中除了一般的校时信号外,还有时钟使能信号、时钟清零信号。控制信号由4×4矩形键盘输入。时基电路可以由石英晶体振荡电路构成,如果晶振频率为1MHz,经过6次十分频就可以得到秒脉冲信号。译码显示电路由七段译码器完成,显示由数码管构成。第4章单元电路设计4.1分频模块电路设计与实现晶体振荡器是构成数字式时钟的核心,振荡器的稳定度及频率的精度决定了数字钟计时的准确程度,它保证了时钟的走时准确及稳定。石英晶体的选频特性非常好,只有某一频率点的信号可以通过它,其它频率段的信号均会被它所衰减,而且,振荡信号的频率与振荡电路中的R、C元件的数值无关。因此,这种振荡电路输出的是准确度极高的信号。然后再利用分频电路,将其输出信号转变为秒信号,其组成框图如图4-1。分频电路分频电路石英晶体振荡电路秒信号图4-1秒信号产生电路框图本系统使用的晶体振荡器电路给数字钟提供一个频率稳定准确的40MHz的方波信号,其输出至分频电路。分频电路的逻辑框图如图4-2所示。图4-2分频电路模块图4-3分频模块电路设计其内部结构图见图4-3。电路中采用Max+plusII元器件库中的计数器7490进行硬件分频。经分频后输出1Hz的标准秒信号CLK1、4MHz的按键扫描信号、1KHz的按键去抖信号和500Hz用于报时模块的输入信号。该模块的时序仿真图如图4-4所示,满足设计要求。图4-4分频模块仿真图4.2校时控制模块电路设计与实现4.2.1键盘接口电路原理校时控制模块在本系统中也就是键盘接口电路部分。下面先介绍键盘接口电路的工作原理,如图4-5。本系统采用的就是这种行列式键盘接口,相对个按键的键盘接口来说节省了I/O接口。如图所示,行线通过一个电阻被上拉到+5V电压。行线与按键的一个引脚相连,列线与按键的另一个引脚相连。平时列线被置成低电平,没有按键被按下的时候,行线保持高电平,而有按键被按下的时候,行线被拉成低电平,这时候控制器就知道有按键被按下,但只能判断出在哪一行,不能判断出在哪一列,因此接下来就要进行键盘扫描,以确定具体是哪个按键被按下。键盘扫描的过程事将列线逐列置成低电平,然后读取行线状态,直到行线中出现低电平,可知这时哪一列是低电平,然后将行线与列线的状态装入键码寄存器,进行按键译码,得到按下的按键的相应编码,这样就完成了按键扫描的过程。当然,一个完整的按键扫描过程还需要配合相应的键盘去抖手段才能正确的识别按键,不会发生重键和错误判断等情况。图4-5键盘接口电路4.2.2键盘接口的VHDL描述1.按键消抖本模块用于当有按键按下时,采用软件消抖的办法去除按键抖动。模块的实现方法是先判断是否有按键按下,如有按键按下则延时一段时间,待抖动过去之后再读行线状态,如果仍有低电平行线,则确定有按键按下,然后产生一个有按键按下的信号。该模块有一个时钟输入端口,输入时钟信号是分频出来的1KHz的时钟;有一个输入端口与行线相连,用于输入行线状态;一个输出端口,用于输出有按键按下的信号。该模块的逻辑框图如图4-6所示。图4-6去抖逻辑框图该电路的VHDL程序如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entityqudouisport(clk1:instd_logic;row:instd_logic_vector(3downto0);key_pre:outstd_logic);endqudou;architecturebehavofqudouissignalsig1,counter:std_logic_vector(3downto0);signaltmp1,sig2:std_logic;beginsig1<=row;tmp1<=sig1(0)andsig1(1)andsig1(2)andsig1(3);key_pre<=counter(0)andcounter(1)andcounter(2)andcounter(3);process(clk1)beginif(clk1'eventandclk1='1')thenif(tmp1='0')thenif(sig2='0')thensig2<='1';endif;endif;if(sig2='1')thenif(counter="1111")thensig2<='0';counter<="0000";elsecounter<=counter+'1';endif;endif;endif;endprocess;endbehav;程序说明:这段程序是实现按键消抖,在这里实现的比较简单,原理是当有按键按下的时候,temp1会变成低电平,这时把sig2变成高电平,如果此时counter不为“1111”时,内部计数器计数,从“0000”直到“1111”,当计数到“1111”时,key_pre输出高电平,同时计数器清零。由于计数脉冲为1KHz,故从有按键按下到输入信号产生大概需要15ms。如果有按键抖动的话,tem1会在“0”和“1”之间变动多次,但是计数过程不会停止,原因是计数由sig2的电平决定,而sig2一旦变成高电平,再要变成低电平,需要计数完成即counter等于“1111”时。所以计数过程不会受抖动影响。一旦计数完成,抖动已经过去,不会发生重键现象了,这样就去除了抖动。2.键扫描模块键扫描模块的框图如图4-7所示。图4-7按键扫描模块CLKY为输入时钟,该时钟是分频模块分出的4MHz的时钟信号,之所以在这里采用频率高的时钟信号就是因为键扫描是一个快过程,不需要太慢的时钟。Key_pre是由去抖模块输出的有键按下的信号,这个信号引发按键扫描模块内部信号的变化,在该状态信号的作用下,模块可以键盘扫描。ROW[3..0]是行输入信号,与键盘的行线相连,COM[3..0]是列输出信号,与键盘的列线相连。SCAN_CODE[7..0]是扫描的键码输出端口。键扫描的基本方法是将列线逐一置成低电平,然后读行线输入端口,如果行线中有低电平出现,说明按键已经确定,将行向量和列向量读入键码中即可。键盘扫描程序如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entityajsmisport(clky,key_pre:instd_logic;row:instd_logic_vector(3downto0);com:outstd_logic_vector(3downto0);scan_code:outstd_logic_vector(7downto0));endajsm;architecturebehavofajsmissignalsig_com:std_logic_vector(3downto0);signalcounter:std_logic_vector(1downto0);signaltmp,sig1,sig2:std_logic;beginsig2<=key_pre;tmp<=row(0)androw(1)androw(2)androw(3);process(clky)beginif(clky'eventandclky='1')then--计数进程if(sig2='1')thenif(counter="11")thensig1<='0';counter<="00";elsesig1<='1';counter<=counter+'1';endif;endif;endif;endprocess;process(clky)--列线逐位输出低电平variablejt:std_logic;beginif(clky'eventandclky='1')thenif(sig1='1')thenjt:=sig_com(3);foriin3downto1loopsig_com(i)<=sig_com(i-1);endloop;sig_com(0)<=jt;elsesig_com<="1110";endif;endif;endprocess;process(clky)beginif(clky'eventandclky='1')thenif(sig1='1')thencom<=sig_com;elsecom<="0000";endif;endif;endprocess;process(clky)--键码信号赋值beginif(clky'eventandclky='1')thenif(sig1='1')thenif(tmp='0')thenscan_code<=row&sig_com;elsescan_code<="11111111";endif;elsescan_code<="11111111";endif;endif;endprocess;endbehav;程序说明:该程序较长,用个4个进程,这里逐一介绍。第一个进程是计数变量counter的计数进程,当sig2为1且counter不为11时,sig1为1且counter开始记数。第二个进程是根据状态变量的状态进行列线的低电平的逐位输出。如果sig1等于1,那么sig_com就进行循环移位,每个钟周期循环左移一位。第三个进程决定列线的输出,平时输出“0000”,当sig1为1时,输出sig_com。最后一个进程就是给键码信号赋值的过程。3.键码转换模块该模块框图如图4-8所示。模块主要完成从键扫描码到按键编码的转换。图4-8键码转换模块逻辑框图键码转换的核心程序如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entityjmzhisport(clky:instd_logic;scan_code:instd_logic_vector(7downto0);key_code:outstd_logic_vector(3downto0));endjmzh;architecturebehavofjmzhisbeginprocess(clky)beginif(clky'eventandclky='1')thencasescan_codeiswhen"11101110"=>key_code<="0000";when"11101101"=>key_code<="0001";when"11101011"=>key_code<="0010";when"11100111"=>key_code<="0011";when"11011110"=>key_code<="0100";when"11011101"=>key_code<="0101";when"11011011"=>key_code<="0110";when"11010111"=>key_code<="0111";when"10111110"=>key_code<="1000";when"10111101"=>key_code<="1001";when"10111011"=>key_code<="1010";when"10110111"=>key_code<="1011";when"01111110"=>key_code<="1100";when"01111101"=>key_code<="1101";when"01111011"=>key_code<="1110";whenothers=>key_code<="1111";endcase;endif;endprocess;endbehav;程序中采用case语句进行按键编码,也可以用elsif语句实现此段程序设计。完整的键盘程序应加上刚开始介绍的分频模块,键盘接口电路总的逻辑连接框图如图4-9所示。图4-9键盘接口连接框图4.3计数模块设计与实现4.3.1秒计数模块秒计数模块逻辑框图如图4-10所示。图4-10秒计数模块框图输入端口ENL是秒时钟使能信号,也是整个数字中的使能信号,高电平有效;RES是异步清零信号;CLK是秒脉冲输入端口;MADD和MDEC是同步校时控制信号,MADD是控制秒信号加一,MDEC是控制秒信号减一;输出端口A[3..0]是秒时钟的低位,B[3..0]是高位;CA端口是进位输出端口,当秒计数到59时输出高电平,其它时候输出低电平。秒计数模块的程序如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitymiaoisport(enl,res,clk,madd,mdec:instd_logic;a,b:outstd_logic_vector(3downto0);ca:outstd_logic);endmiao;architectureSECofmiaoisbeginprocess(enl,clk,res)variablem0,m1:std_logic_vector(3downto0);beginifres='1'thenm0:="0000";m1:="0000";ca<='0';elsifclk'eventandclk='1'thenca<='0';ifmadd='1'orenl='1'thenifm0="1000"andm1="0101"thenca<='1';--实际是第59个--脉冲endif;ifm0<"1001"thenm0:=m0+1;elsem0:="0000";m1:=m1+1;ifm1>"0101"thenm0:="0000";m1:="0000";ca<='0';endif;endif;elsifmdec='1'thenifm0="0000"andm1="0000"thenm0:="1001";m1:="0101";elsifm0>"0000"thenm0:=m0-1;elsem0:="1001";m1:=m1-1;endif;endif;endif;a<=m0;b<=m1;endprocess;endSEC;秒时钟的仿真波形图如图4-11所示,仿真图满足设计的要求。分计数和时计数模块的设计原理与秒模块的类似。图4-11秒时钟仿真波形4.3.2日计数模块由于一年中各个月份的日的长短不同,共有28、29、30和31天四种情况,可知日由年和月共同决定,如表4-1。年中0表示闰年,1表示平年;月中0表示1、2、3、5、7、8、10和12月,1表示其它月份;二月中1表示2月,0表示其它月份。年月二月日SEL[0]SEL[1]SEL[2]——000——10031010——110300012910128011——111——表4-1日长短逻辑表日计数模块的逻辑框图如图4-12所示输入引脚SEL[2..0]是决定日长短的输入信号,其它信号功能与秒计数模块功能类似。图4-12日计数模块逻辑框图日计数模块的核心程序如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityriisport(enl,res,clk,radd,rdec:instd_logic;sel:instd_logic_vector(2downto0);a,b:outstd_logic_vector(3downto0);ca:outstd_logic);endri;architectureSECofriissignalsr0,sr1:std_logic_vector(3downto0);beginprocess(sel)beginifsel="001"thensr0<="0001";sr1<="0011";endif;ifsel="011"thensr0<="0000";sr1<="0011";endif;ifsel="100"thensr0<="1001";sr1<="0010";endif;ifsel="101"thensr0<="1000";sr1<="0010";endif;endprocess;process(enl,clk,res)variabler0,r1:std_logic_vector(3downto0);beginifres='1'thenr0:="0000";r1:="0000";ca<='0';elsifclk'eventandclk='1'thenca<='0';ifradd='1'orenl='1'thenifr0=sr0andr1=sr1thenr0:="0001";r1:="0000";ca<='1';elsifr0<"1001"thenr0:=r0+1;ca<='0';elser0:="0000";r1:=r1+1;endif;elsifrdec='1'thenifr0="0001"andr1="0000"thenr0:=sr0;r1:=sr1;elsifr0>"0000"thenr0:=r0-1;elser0:="1001";r1:=r1-1;endif;endif;endif;a<=r0;b<=r1;endprocess;endSEC;程序中第一个进程主要是对日的长短的设置,sr0和sr1分别是日的低位和高位的信号,它们的值由输入sel[2..0]决定。sel[0]由年计数模块输入,sel[1]和sel[2]由月计数模块输入。第二个进程主要实现计数和加减控制。日计数模块的时序仿真图如图4-13所示,仿真图满足设计的要求。图4-13日计数仿真时序图4.3.3月计数和年计数模块1.月计数模块逻辑框图如图4-14所示。输出ERYUE端口接日模块的sel[2],YSEL端口接sel[1]。其VHDL程序描述见附录。图4-14月计数逻辑框图其仿真时序图如图4-15所示。仿真图中有毛刺出现,但并不会对本模块的计数产生影响,满足本设计的需要。图4-15月模块仿真时序图2.年计数模块的逻辑框图如图4-16所示。年计数模块的输出NSEL端口接日模块的sel[0]。其它端口的功能与上述模块类似。其VHDL描述见附录。图4-16年计数逻辑框图年模块的计数范围是从2000到2099,在这之间的闰年见表4-2。由于年份都带有20,所以省略,用年份数来表示。将表4-2中的年份用二进制表示即可得到以下规律:当年个位的后2位为“00”且十位的最后一位为“0”,或者年的个位的后2位为“10”且年十位的最后一位为“1”的时候,该年为闰年,否则为平年。表4-2闰年表00040812162024283236404448525660646872768084889296其仿真时序图如图4-17所示,满足设计的要求。图4-17年模块仿真时序图4.4动态扫描及显示电路设计与实现4.4.1动态扫描模块动态扫描电路将计数器输出的8421BCD码转换为数码管需要的逻辑状态,并且输出数码管的片选信号和位选信号。所谓动态扫描显示方式是在显示某一位LED显示块的数据的时候,让其它位不显示,然后在显示下一位的数据,同时关闭其他显示块。这样做可以使每一个显示块显示与自己相对应的数据。只要保证每一位显示的时间间隔不要太大,利用人眼的视觉暂留的现象,就可以造成各位数据同时显示的假象。一般每一位的显示时间为1~10ms。动态扫描逻辑框图如图4-18所示。该模块的输入端口DISCLK是频率为500Hz的扫描时钟,故每一位显示的时间为2ms,需要扫描10个数码管,故显示间隔为20ms。由分频模块提供;端口CONV显示转换信号,当其为高电平时,数码管显示时、分和秒。当其为低电平时显示年、月和日;其它输入端口接计数模块输出的数据;输出端口DATAOUT[3..0]动态输出扫描的数据;端口WSEL[3..0]输出数码管的片选信号。其VHDL程序描述见附录。图4-18动态扫描逻辑框图4.4.2显示模块本系统选择7448作为显示译码电路,选择数码管作为显示单元电路。计数器实现了对时间的累计并以8421BCD码的形式输送到动态扫描模块,再由其输出的端送到7448,将BCD码转换为七段码,再由数码管显示出来。数码管位选连接电路4-19所示。由于所用到的数码管为两组,故位选电路用到两片7448模块。图4-19数码管位选实现电路

第5章设计结论与研究展望5.1设计结论将设计程序下载到实验箱上运行调试后,最终结果与预期效果基本一致,年、月、日和时、分、秒能够正常计数并能由控制键分别显示,整点报时功能正常。在此次的数字钟设计过程中,更进一步地熟悉有关数字电路的知识和具体应用。学会了利Max+plus和QuarterII软件进行原理图的绘制,硬件描述语言VHDL的编写,程序的仿真等工作。并能根据仿真结果分析设计的存在的问题和缺陷,从而进行程序的调试和完善。在设计电路中,往往是先仿真后连接实物图,但有时候仿真和电路连接并不是完全一致的,例如在对具体模块的仿真的过程中,往往没有考虑到整体设计的层面以及与上下模块接口的设计。再加上器件对信号的延时等问题,实际下载到实验箱上后会出现一系列的问题,因此仿真图和电路连接图还是有一定区别的。此次的数字钟设计重在于按键的控制和各个模块代码的编写,虽然能把键盘接口和各个模块的代码编写出来,并能正常显示,但对于各个模块的优化设计还有一定的缺陷和不足。总的来说,通过这次的设计实验更进一步地增强了实验的动手能力,对数字钟的工作原理也有了更加透彻的理解。在本设计调试过程中遇到了一些问题如下:1.当程序下载到实验箱上后,数码管显示全部为零,计数器不工作,经分析得知程序中的总的清零信号保持有效状态,改动程序后计数器开始计数。2.当秒时钟计数到59时变0时,分计数模块滞后计数,考虑的器件的延时,将程序中秒的进位信号提前1秒。3.利用控制按键给月模块加计数时,发现的月加到12时,年则在没有按键按下的情况下一直加计数。检查程序后得知,月的进位信号在月为12后变一直有效,其它模块也存在这种情况,改动程序后各个模块工作正常。4.在检测按键时,由于有些按键控制是秒时钟同步的,所以控制起来显得梢慢些,但是工作正常,能满足实际的需要。5.2研究展望本设计中虽然有控制键对时钟进行控制,但是用到的按键太多,在实际应用上存在不足。故提出改进方案为用一个按键控制数码管的片选,再用两个按键控制计数的加减。这样可以节省按键资源,以供更多的功能的使用。本设计是采用硬件描述语言和FPGA芯片相结合进行的数字钟的研究,从中可以看出EDA技术的发展在一定程度上实现了硬件设计的软件化。设计的过程变的相对简单,容易修改等优点,相信随着电子技术的发展,数字钟的功能会更加多样化,满足人们的各种需要。致谢时间如梭,转眼毕业在即。回想在大学求学的四年,心中充满无限感激和留恋之情。感谢母校为我们提供的良好学习环境,使我们能够在此专心学习,陶冶情操。谨向我的论文指导老师xx老师致以最诚挚的谢意!xx老师不仅在学业上言传身教,而且以其高尚的品格给我以情操上的熏陶。本文的写作更是直接得益于他的悉心指点,从论文的选题到体系的安排,从观点推敲到字句斟酌,无不凝聚着他的心血。滴水之恩,当以涌泉相报,师恩重于山,师恩难报。我只有在今后的学习、工作中,以锲而不舍的精神,努力做出点成绩,以博恩师一笑。另外,我必须感谢我的父母。焉得谖草,言树之背,养育之恩,无以回报。作为他们的孩子,我秉承了他们朴实、坚韧的性格,也因此我有足够的信心和能力战胜前进路上的艰难险阻;也因为他们的日夜辛劳,我才有机会如愿完成自己的大学学业,进而取得进一步发展的机会。最后,我必须感谢我的朋友,我的同学们,正是因为他们在电脑技术上的无私指引,我才能得以顺利完成该论文。

附录1.主程序:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityyueisport(enl,res,clk,yadd,ydec:instd_logic;a,b:outstd_logic_vector(3downto0);eryue,ysel,ca:outstd_logic);endyue;architectureSECofyueisbeginprocess(enl,clk,res)variabley0,y1:std_logic_vector(3downto0);beginifres='1'theny0:="0000";y1:="0000";ca<='0';elsifclk'eventandclk='1'thenca<='0';ifyadd='1'orenl='1'thenify0="0010"andy1="0001"theny0:="0001";y1:="0000";ca<='1';elsify0<"1001"theny0:=y0+1;ca<='0';elsey0:="0000";y1:=y1+1;endif;elsifydec='1'thenify0="0001"andy1="0000"theny0:="0010";y1:="0001";elsify0>"0000"theny0:=y0-1;elsey0:="1001";y1:=y1-1;endif;endif;endif;if((y0="0100"ory0="0110"ory0="1001")andy1="0000")or(y0="0000"andy1="0001")thenysel<='1';elseysel<='0';endif;ify0="0010"andy1="0000"theneryue<='1';elseeryue<='0';endif;a<=y0;b<=y1;endprocess;endSEC;2.年计数模块的程序:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entitynianisport(enl,res,clk,nadd,ndec:instd_logic;a,b,c,d:outstd_logic_vector(3downto0);nsel:outstd_logic);endnian;architecturendofnianisbeginprocess(res,enl,clk)variablen0,n1,n2,n3:std_logic_vector(3downto0);beginifres='1'thenn0:="0000"; n1:="0000"; n2:="0000"; n3:="0000";elsifclk'eventandclk='1'then ifnadd='1'orenl='1'then ifn0<"1001"thenn0:=n0+1; elsifn0="1001"thenn0:="0000"; n1:=n1+1; ifn1="1010"thenn1:="0000"; n2:=n2+1; endif; ifn2="1010"thenn2:="0000"; n3:=n3+1; endif; ifn3="1010"thenn3:="0000";endif;endif; elsifndec='1'then ifn0>"0000"thenn0:=n0-1; elsifn0="0000"andn1="0000"andn2="0000"andn3="0000"thenn0:="1001"; n1:="1001"; n2:="1001"; n3:="1001"; elsifn0="0000"andn1="0000"andn2="0000"thenn0:="1001"; n1:="1001"

温馨提示

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

评论

0/150

提交评论