基于FPGA的数字密码锁设计【毕业论文】

基于FPGA的数字密码锁设计【毕业论文】

ID:463406

大小:1.61 MB

页数:53页

时间:2017-08-05

上传者:U-944
基于FPGA的数字密码锁设计【毕业论文】_第1页
基于FPGA的数字密码锁设计【毕业论文】_第2页
基于FPGA的数字密码锁设计【毕业论文】_第3页
基于FPGA的数字密码锁设计【毕业论文】_第4页
基于FPGA的数字密码锁设计【毕业论文】_第5页
资源描述:

《基于FPGA的数字密码锁设计【毕业论文】》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

毕业设计(20__届)基于FPGA的数字密码锁设计摘要 随着电子技术的发展,各类电子产品应运而生,数字密码锁就是其中之一。数字密码锁首先需要实现密码的输入和显示,并且要具有安全可靠性,其次,需要能够反复更改不同的密码,并且可以将密码保存起来。本文针对数字密码锁的功能要求,决定采用FPGA设计的数字密码锁方案。在文中介绍了数字密码锁的结构设计、主要功能、模块划分及总体和各模块的VHDL源程序,通过使用VHDL程序语言的编译,模拟实现数字密码锁的各项功能,并且给出了数字密码锁设计的仿真结果。然后研究了其在各领域的应用及未来的发展以及对其安全可靠性的说明。最后,在QuartusII环境下进行了电路的模拟仿真,仿真结果说明,整个设计基本满足了预期数字密码锁的设计目标。关键字:FPGA;VHDL;数字密码锁;QuartusIIAbstract Withthedevelopmentofelectronictechnology,variouselectronicproductshaveappeared,thedigitalcodelockisjustoneofthem.Thedigitalcodelockneedstoimplementthepasswordinputanddisplay,tohavethesafetyandreliability.Thedigitalcodelockalsoneedstochangedifferentpassword,andthepasswordcanbestored.Thispaperaccordstothefunctionrequirementsofdigitalcodelock,decidedtoadopttheschemeofdigitalCodeLockdesignbasedonFPGA.Thispapersummarizingthedefinitionofdigitallock,workingprinciple,andtheclassificationofvarioustypesofdigitalcodelock.Awayoftheelectroniccircuit-designwasemployed.Functionandoperationofcomputersimulationappliedtotheelectronicsystemdesign.Theresultofcomputersimulationwasobtained.Itsapplicationinallareasandfuturedevelopmentwillbeintroducedinthesecondpart.Subsequently,avarietyofdigitalcodelockwillbesummarizedandcompared.Finally,thesimulationofthecircuitwhichisundertheenvironmentoftheQuartusIIhasindicatedthatthewholedesignistomeetthedesiredobjectives.Keywords:EDA;VHDL;DigitalPasswordLock;QuartusII目录 1引言12实现方案的确定22.1基于单片机技术的设计方案22.2基于专用集成电路的控制设计52.3基于FPGA实现的设计方案73功能模块设计与实现83.1数字密码锁的框架83.2主要功能模块的划分93.3各功能模块的原理与仿真103.3.1控制器模块103.3.2密码存储模块113.3.3编码模块123.3.4数码管显示译码模块143.3.5分频模块153.3.6同步消抖模块173.3.7使能电路模块193.3.8反相电路模块213.3.9比较模块223.3.10计数器选择模块233.3.11指示电路模块254数字密码锁的综合调试与结果说明274.1顶层电路274.2过程调试305展望336致谢347参考文献35附录1程序代码36 1引言随着社会物质财富的日益增长,安全防盗已成为社会问题。而锁自古以来就是把守门户的铁将军,人们对它要求甚高,既要安全可靠地防盗,又要使用方便,这也是制锁者长期以来研制的主题。电子密码锁可以用分立元件、单片机等来实现,其中分立元件现在不常用,目前使用的电子密码锁大部分是基于单片机技术,以单片机为主要器件,其编码器与解码器的生成为软件方式。在实际应用中,由于程序容易跑飞,系统的可靠性能相对来说比较差。当前,数字应用系统设计向小型化、快速化、大容量、重量轻的方向发展。FPGA是英文FieldProgrammableGateArray的缩写,即现场可编程门阵列,它是在PAL、GAL、EPLD等可编程器件的基础上进一步发展的产物。FPGA的结构一般分为三部分:可编程逻辑模块、可编程I/O模块和可编程内部互连区IR。CLB的功能很强,不仅能够实现逻辑函数,还可以配置成RAM等复杂的形式。基于SRAM的FPGA器件工作前需要从芯片外部加载配置数据。配置数据可以存储在片外的EPROM或者计算机上,设计人员可以控制加载过程,在现场修改器件的逻辑功能,即所谓现场可编程[1]。FPGA出现后受到电子设计工程师的普遍欢迎,发展十分迅速。本设计是一种基于现场可编程门阵列(FPGA)器件的电子密码锁。由于FPGA具有ISP功能,当用户需要更改时,如增加口令位数和更改口令权限管理时,只需更改FPGA中的控制和接口电路,利用EDA工具将更新后的设计下载到FPGA中即可,无需更改外部电路,这就大大提高了设计效率。而且采用FPGA设计的电子密码锁与单片机控制的电子密码锁相比结构简单、具有更高的系统保密性和可靠性[2]。这种基于FPGA的电子密码锁可以应用在办公室、仓库、宾馆等人员经常变动的场所。 2实现方案的确定结合设计任务和功能实现要求,下面简单介绍一下单片机实现和分立元件实现数字密码锁的技术,并在此基础上确定基于FPGA的主控实现方案。2.1基于单片机技术的设计方案数字密码锁的设计框图如图所示。整个设计由键盘控制、掉电存储、数字显示、指示灯电路、控制电路和报警电路组成。AT24C02掉电存储输入错误锁定键盘延时报警控制电路指示电路89S51单片机数字显示电路键盘控制开锁控制电路图2-1基于单片机的原理框图键盘控制主要用于输入密码或者设置自己想设的密码。当输入的密码时将输入的信号传入89S51单片机中,经过数据处理再传给输出电路[3]。若密码正确则指示灯电路显示绿灯,开锁控制电路执行开锁;若输入的密码错误,指示电路显示红灯;若连续三次输入错误,输入错误锁定键盘电路则将锁定键盘,延时报警控制电路报警。AT24C02掉电存储电路是用于在电源没电的时候存储之前设置好的密码的相关数据,防止被盗和提高密码锁的安全性。 图2-2主程序流程图初始化调用显示有键按下启动定时识别按键全部按完超时比较密码开锁NYNYN自动清除>3次?NYY开始结束锁定图2-2所示主程序的流程图中:当开启密码锁电源时先对密码锁进行初始化,原先设置好的密码保存在密码锁中。当有按键按下时就启动定时器,开始计数按键按的次数是否按完,若没按完则不进入下一步;若按键超过规定时间则自动清除原先按入的密码;若超时三次则锁定键盘。结束按键且未超时就可以将输入完的密码与设置好的密码进行比较,比较结果相同则开锁,不同则重新开始。主程序主要完成初始化、设置中断向量、检查有无按下、以及调用显示等等。键盘采用查询的方式放在主程序中,当没有按键按下的时候,单片机循环主程序,一旦有按键按下,便转向响应的子程序处理,处理结束再返回。 有按键否?调用显示Y延时程序扫描程序有没按键?返回N读取键号处理程序找到未找到YN图2-3键盘处理程序流程图图2-4修改密码流程图初始化启动定时输入新密码存入缓存输入旧密码比较密码N调用24C02Y调用显示按下修改键修改键退出图2-3为键盘处理功能是检查键盘的输入情况,如没有输入则置寄存器R0为0FFH,若有输入,则判断是哪个键被按下,并把对应的键的值赋予寄存器R0,根据R0中不同的键值转向不同的按键处理程序。其中使用延迟10ms的方式实现消抖功能。图2-4为修改密码的流程图,当按下修改键时,启动定时器定时,此时可以输入新密码存入缓存中,然后再输入旧密码确认后与之前设置好的密码进行比较,若密码相同则将新密码存如AT24C02中,修改密码成功后通过显示电路显示,最后按修改键退出修改密码;若不相同则需要重新输入新密码再次进行设置。 2.2基于专用集成电路的控制设计基于标准单元的半定制设计方法,是指采用经过精心设计的逻辑单元版图,照芯片的功能要求排列而成集成电路的设计技术。标准单元具有以下特征:(1)各单元具有相同的高度,可以有不同的宽度。(2)单元的电源线和地线通常安排在单元的上下端,从单元的左右两侧同时出线,电源、地线在两侧的位置要相同,线的宽度要一致,以便单元间电源、地线的对接。(3)单元的输入输出端安排在单元的上下两边,要求至少有一个输入端或输出端可以在单元的上边和下边两个方向引出。ASIC设计设计,产业化后成本低,设计安全性高,缩小了产体积而使产品的便携性更好。还有,可以通过不改变核心芯片而对输入模块和输出模块的更换而增加产品线,使产品的形式多样化,又可以不改变输入模块和输出模块而更换核心芯片使产品升级而降低生产成本。目前设计的数字密码锁ASIC实现的主要功能是将输入模块的信号同已存在的信号进行同异比较,并将比较的结果输出到输出模块。具体功能为:(1)存储6位十进制数组,即密钥;(2)接收6位十进制数组,即用户输入的密码;(3)比较这两组数组的异同;(4)将比较的结果输出;(5)能够修改密钥。 图2-5单元电路图如图2-5是单元电路图,其中IN_A_01-04:密码接收端口;IN_A_S:密码接收使能端口;IN_B_01-04:密钥接收端口;IN_B_S:密钥接收使能端口;OUT:单元判断输出端口。通过使用TannerPro集成电路设计工具完成了一种数字密码锁ASIC的设计,得到了它的电路设计方案和版图设计结果,在整个设计过程中,流程严谨,每个环节都进行了相应的仿真和验证,整个数字密码锁ASIC共用到了102个标准单元。如果将该电路进一步完善,配以门禁控制器等调节控制设备,将可以推广应用。专用集成电路方案的主要不足之处就是原理过于复杂,体积大,而且不能满足现在的安全需求。 2.3基于FPGA实现的设计方案经过对比上述分立元件实现和单片机技术实现方案中的操作过程、实现思路、对应的模块设置和安全实用方面,结合已有CPLD应用实践经验,借鉴基于单片机实现技术中的主控流程和密码修改流程,并根据本次毕业设计任务要求确定本次设计的实现方案如图所示。控FPGA译码按键显示声光显示密码存储器图2-6数字密码锁的设计框图基于FPGA实现的数字密码设计框图中主要包括6大部分:按键输入、FPGA器件、声光显示、密码存储、译码电路,显示电路。其中FPGA为主控部分,将消除同步模块、计数器模块、控制器模块都用VHDL语言写入FPGA中代替了传统复杂的电路设计,也省去了许多繁琐的调试过程和步骤,只要这些模块在QuartusII平台通过了仿真,那么就可以基本实现传统电路模块的功能[4]。本系统主要集中在以FPGA以核心的外围扩展设计,配以相应硬件电路,完成密码的设置、存贮、识别和显示等功能。FPGA通过接收键入的密码,并与存贮在密码存储器中的密码进行比较,如果密码正确,则执行开锁;如果密码不正确,则允许重新输入密码,但是最多可输入三次;如果三次都不正确,则通过FPGA产生报警信号。本设计采用Altera公司的QuartusII7.2进行编译仿真。选择VHDL语言进行编程现实各模块的功能和顶层的设计。 3功能模块设计与实现根据前面确定的方案,数字密码锁主要是由控制模块和外围模块组成,以FPGA为控制核心,配以相应硬件电路,完成密码的设置、存贮、识别和显示、报警等功能。下面就各个模块的设计、仿真调试和结果等作概要的介绍。3.1数字密码锁的框架本系统由主控芯片(FPGA)、键盘、显示电路、报警电路和开/关门电路组成,而主控芯片又可分为按键处理部分、控制部分和译码显示部分。数字密码锁VCCAFBECGDLED_ALED_BALERTDIPSETUPSTARTOPENI-SETUPA0A1A2A3A4A5A6A7A8A9CLOCK图3-1数字密码锁的框架图各输入输出信号名和功能如表3-1所示。表3-1各端口功能说明信号说明信号说明i_setup报警复位open开锁setup复位clk时钟脉冲start启动密码输入A0---A9十进制密码输入dip启动密码修改A-----G七段译码器LED_R、LED_G红、绿指示灯ALERT报警扬声器 结合设计任务和确定的实现方案,确定的数字密码锁的构架图如图3-1所示。具体设定数字密码锁的主要功能如下:数字密码锁的工作时钟由外部晶振来提供,时钟频率为1MHz;密码采用3位十进制数字;密码输入正确后,密码锁将启动开锁装置;密码输入错误后,密码锁将给出报警信息,它通过红灯和蜂鸣器来指示;报警后,可以通过按键I-SETUP对密码进行重新设置;密码锁开启后,可以通过SETUP使密码器回到初始等待状态[5]。3.2主要功能模块的划分在本次设计中系统主要分别为以下十一个模块:分频、同步消抖、使能电路、反相电路、密码存储、编码、比较、计数选择、数码管译码、指示电路、控制器等模块组成。下面就各模块的功能进行说明。(1)分频模块:对已有的时钟频率进行分频获得我们需要的频率;(2)同步消抖模块:对输入的数字密码A0-A9、START、OPEN、SETUP和I-SETUP等按键信号进行同步消抖;(3)使能电路模块:控制输入按键是否有效;(4)反相电块:用来对输入的SETUP、I-SETUP和START按键输入信号进行反相操作;(5)密码存储模块:对计数模块的计数值进行寄存;(6)编码模块:将外接键盘输入的信号转换成BCD码;(7)比较模块:对编成模块的输出数据和密码存储模块输出数据进行比较;(8)计数选择模块:根据动态选择信号,选择相应的需要显示的计数值;(9)数码管译码模块:将BCD码译成数码管的显示数据;(10)指示电路模块:显示输出的状态和发出警报声;(11)控制器模块:控制整个电路中各状态之间的转换和运行。3.3各功能模块的原理与仿真3.3.1控制器模块本设计中将系统分为7个状态过程,QA是建立等待状态、QB是 准备就绪状态、QC是密码输入状态、QD是启动状态、QE是报警状态、QF是报警返回状态、QG是密码修改状态[6]。Start=‘1’open=‘1’I_setup=‘1’full=‘1’dep=‘0’dep=‘1’full=‘1’Start=‘1’setup=‘1’open=‘1’QE报警状态QF报警返状态QA建立等待状QD启动状态QG密码存储状态QB准备就绪状态QC密码输入状态图3-4控制器状态转换图建立等待状态QA是指:密码锁处于上电、启动或者报警后的状态。这时密码锁并没有进入到正常的先行状态,因此密码锁不会接收除SETUP信号外的任何输入号。准备就绪状态QB是指:密码锁在被按下SETUP键后处于的一种状态。这时如果操作人员按下START,密码锁将会进入到第三种状态,等待密码数字的输入。在这种情况下,密码锁会输出计数器清零信号RESET把计数器复位置零;密码输入状态QC是控制器模块的第三个状态,这时密码锁将会进入到数字密码输入的操作状态。当处于这种状态时,控制器模块的输出EN信号将变为有效,它意味着此时允许数字密码A0—A9和OPEN的按键输入;启动状态QD是控制器模块的第四个状态,这时控制器将判断按键输入的具体信号:如果判断出按键输入是OPEN信号,那么将发出S_LG信号;如果出是数字按键输入,那么控制器模块将进入到报警状态;报警状态QE,当控制器模块处于这个状态时,如果按下START键,那么控制器模块将发出复位信号RESET,并使控制器返回到密码输入状态;如果按下OPEN键,那么控制器模块将输出置位信号S_LR,并返回到报警返回状态;报警返回状态QF,当控制器模块处于这个状态时,控制器将判断输入的具体信号:如果按下I— SETUP,那么控制器模块将返回到建立等待状态。如果按下其他按键,那么状态将不会发生变化;密码存储状态QG,当控制器模块处于这个状态时,控制器将发出清零信号RESET将计数器清零,然后判断有无数字输入,若有数字输入则发出WR信号,使密码存储模块处于写状态;若没有数字输入则返回本状态,等待新密码输入。当3个新密码输入完毕后,计数器会向控制器发出FULL信号,此时控制器将又返回建立等待状态。图3-5控制器模块图以上是控制器模块图,其中各端口介绍见下表:表3-2控制器模块端口说明信号说明信号说明EN信号使能端Wr改写存储密码Rd读取存储密码Dep输入密码正确信号Full密码输入完成信号Data_in密码输入接收信号Cnp时钟信号C11-c55Start,setup,openLED_R、LED_G红、绿指示灯I_setup,dip3.3.2密码存储模块在数字密码锁中,密码存储模块是它的密码规定电路,有两个主要功能:一个是将存储的密码输出到比较模块中与外部输入的数字进行比较操作,另一个是存储用户修改过后的密码。 图3-6密码存储模块的顶层原理图图3-7密码存储模块的时序仿真图密码存储模块的时序仿真图如图3-7所示,从图中可以看出:在0-200ns时,写入信号有效,A0—A9数字按键产生的信号存入密码存储模块;在200-400ns时,读取信号有效,由e1—e4输出存储的密码,进入比较模块与输入的数字进行比较[7]。由于VHDL程序较长,详见附录一中程序11所示。3.3.3编码模块在数字密码锁中,由于密码数字是由外接键盘输入的信号,因此需要把它转换成4位的BCD码送入到比较器中,需要采用10线至4线编码器来完成这样的转换。因为前级同步消抖模块的输出是高电平,所以A0—A9这10个数字的输入信号经过同步消抖后应该是高电平有效。对于编码器的输出来说,B4是MSB,B1是LSB。在密码器中,编码模块的顶层原理图如图3-9所示。图3-8编码模块的顶层原理图 图3-9编码模块的时序仿真图图3-9是编码模块的时序仿真图,从图中可以看出:当输入0、3、2三个数字时,编码器对其进行了编码,并且每有一个数字输入,data_in都会向控制器发出一个高电平的信号[8]。以下是同步消抖模块的VHDL程序。LIBRARYIEEE;USEIEEE.std_logic_1164.ALL;ENTITYkeysync_modelISPORT(c1,c2,c3,c4,c5:INstd_logic;a00,a10,a20,a30,a40,a50,a60,a70,a80,a90:INstd_logic;clk:INstd_logic;c11,c22,c33,c44,c55:OUTstd_logic;a01,a11,a21,a31,a41,a51,a61,a71,a81,a91:OUTstd_logic);ENDkeysync_model;ARCHITECTUREkeysync_model_archOFkeysync_modelISCOMPONENTkey_syncPORT(key_in:INstd_logic;clk:INstd_logic;key_out:OUTstd_logic);ENDCOMPONENTkey_sync;BEGIN----元件连接说明;U1:key_syncPORTMAP(c1,clk,c11);U2:key_syncPORTMAP(c2,clk,c22);U3:key_syncPORTMAP(c3,clk,c33);U4:key_syncPORTMAP(c4,clk,c44);U5:key_syncPORTMAP(c5,clk,c55);U6:key_syncPORTMAP(a00,clk,a01);U7:key_syncPORTMAP(a10,clk,a11);U8:key_syncPORTMAP(a20,clk,a21);U9:key_syncPORTMAP(a30,clk,a31);U10:key_syncPORTMAP(a40,clk,a41); U11:key_syncPORTMAP(a50,clk,a51);U12:key_syncPORTMAP(a60,clk,a61);U13:key_syncPORTMAP(a70,clk,a71);U14:key_syncPORTMAP(a80,clk,a81);U15:key_syncPORTMAP(a90,clk,a91);ENDkeysync_model_arch;3.3.4数码管显示译码模块通用的LED数码管是由七段可发光的二极管组成的。为了使七段数码管能够显示出所要表示的数值,需要采用译码器将所要表示的数值译码成数码管所需要的驱动信号。这里,数码管显示译码模块的输入是编码器的B1—B4这4位输出,输出是用来驱动数码管的驱动信号,它们是高电平有效的信号,因此采用共阴极LED显示器。图3-10计数器选择模块的顶层原理图图3-11数码管显示译码模块的时序仿真图从图3-11数码管显示译码模块的时序仿真图中可以看出,当b4b3b2b1=0000时,a、b、c、d、e、f呈高电平,即数码管显示“0”,当b4b3b2b1=0001时,b、c呈高电平,即数码管显示“1”……[9]。程序代码详见附录一中的程序10。表3-3数码管显示译码表数字按键B4b3b2b1数码管显示译码七段数码管显示的数字 A0000001111110A1000100001101A2001010110112A3001110011113A4010011001104A5010111011015A6011011111016A7011101001117A8100011111118A91001110111193.3.5分频模块在数字密码器中,它的外部时钟信号CLOCK是由外部晶振来提供的,时钟频率为200Hz。对CLOCK进行分频输出两路时钟CLOCK_DIV1和CLOCK_DIV2,其中CLOCK_DIV1作为按键检测消抖时钟和控制器模块时钟,而CLOCK_DIV2作为密码错误次数计数模块的时钟。CLOCK时钟信号还作为蜂鸣器启动信号和LED显示扫描时钟信号。CLOCK_DIV1设为CLOCK的20分频,为10Hz。再将CLOCK_DIV1进行10分频可以得到CLOCK_DIV2时钟,为1HZ。因此,分频模块可以采用10分频和20分频电路来构成。如图3-12所示。20分频电路10分频电路CLOCKCLOCK_DIV1CLOCK_DIV1CLOCK_DIV2图3-1210分频和20分频电路图由图3-12可知,分频模块内部含有两个单元电路:20分频电路和10分频电路。首先需要进行20分频和10分频这两个单元电路的VHDL设计,这两个单元电路的设计可以采用计数的方法来完成。而对于分频模块的设计,可以通过对两个单元电路元件的例化调用来实现。分频模块的VHDL程序LIBRARYIEEE;USEIEEE.std_logic_1164.ALL;ENTITYclkdiv_modelISport(clk:INstd_logic;clk_div1:OUTstd_logic;clk_div2:OUTstd_logic);ENDclkdiv_model; ARCHITECTUREclkdiv_model_archOFclkdiv_modelISCOMPONENTclk_div10PORT(clk:INstd_logic;clk_div:OUTstd_logic);ENDCOMPONENTclk_div10;COMPONENTclk_div200PORT(clk:INstd_logic;clk_div:OUTstd_logic);ENDCOMPONENTclk_div200;SIGNALtmp1,tmp2,tmp3:std_logic;BEGIN----元件连接说明;U1:clk_div10PORTMAP(clk,tmp1);U2:clk_div10PORTMAP(tmp1,tmp2);U3:clk_div10PORTMAP(tmp2,tmp3);U4:clk_div200PORTMAP(tmp3,clk_div2);clk_div1<=tmp3;ENDclkdiv_model_arch;3.3.6同步消抖模块同步消抖模块需要对输入的数字密码A0-A9、DIP、START、OPEN、SETUP和I-SETUP共15个按键信号进行同步消抖。同步消抖模块的顶层原理图如下所示所示。 图3-13同步消抖模块的顶层原理图图3-14同步捎消抖电路的时序仿真图同步捎消抖电路的时序仿真图如上图所示,从图中可以得出,输入信号c5、c4、c3、c2、c1、a90、a80、a70、a60、a50、a40、a30、a20、a10、a00在经过了同步消抖电路后,达到了同步消抖的功能。D触发器的VHDL程序。LIBRARYIEEE;USEIEEE.std_logic_1164.ALL;ENTITYdfISPORT(d,clk:INstd_logic;q,qb:OUTstd_logic);ENDdf;ARCHITECTUREdff_artOFdfISBEGINPROCESS(clk)ISBEGINIF(clk’EVENTANDclk=’1’)THEN---上升沿触发;q<=d;qb<=NOTd; ENDIF;ENDPROCESS;ENDdff_art;在数字密码器中,由按键方式产生的数字密码A0-A9、DIP、START、OPEN、SETUP和I-SETUP的产生时刻和持续长短是随机不定的,同时存在因开关簧片反弹而引起的电平抖动现象,因此必须添加消抖同步模块,目的是保证系统能捕捉到输入脉冲,同时保证每按一键只形成一个宽度为系统时钟周期的脉冲。&&DQCP-QDQCP-Q&输入tmp1clocktmp2tmp3tmp6tmp5输出图3-15消抖同步电路根据图3-15可以看出同步消抖电路含有两个与非门、一个与门和两个D触发器[10]。所以首先必须进行D触发器的VHDL设计,然后构成同步消抖电路的VHDL设计,最后通过调用元件例化完成消抖同步模块的VHDL设计。图中所用到的D触发器的顶层原理图如图3-16所示。图3-16D触发器的顶层原理图图3-17D触发器的时序仿真图从上面的仿真图可以得知,该程序完全实现了D触发器的功能。但是需要注意的地方是,因为采用与非门构成的触发 器使用低电平触发,因此按键输入的数字或者指令要设计为低电平有效。3.3.7使能电路模块密码锁中的使能电路模块的顶层原理图如图3-18所示,图3-18使能电路模块的顶层原理图在数字密码器中,数字密码A0~A9的按键输入信号是通过控制器模块给出的使能信号EN来进行控制的。图3-19使能电路的时序仿真图从方针图中可知, 当使能信号有效(高电平)时,输入的信号A0~A9有效;否则输出为高电平。从而达到了使能电路的功能。使能电路模块的VHDL程序LIBRARYIEEE;USEIEEE.std_logic_1164.ALL;ENTITYenable_modelISPORT(open_t:INstd_logic;a0,a1,a2,a3,a4,a5,a6,a7,a8,a9:INstd_logic;en:INstd_logic;c4:OUTstd_logic;a00,a10,a20,a30,a40,a50,a60,a70,a80,a90:OUTstd_logic);ENDenable_model;ARCHITECTUREenable_model_archOFenable_modelISBEGINPROCESS(open_t,en,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9)BEGINIF(en='1')THEN--当使能信号有效时,A0-A9和OPEN取反c4<=NOTopen_t;a00<=NOTa0;a10<=NOTa1;a20<=NOTa2;a30<=NOTa3;a40<=NOTa4;a50<=NOTa5;a60<=NOTa6;a70<=NOTa7;a80<=NOTa8;a90<=NOTa9;ENDIF;ENDPROCESS;ENDenable_model_arch;3.3.8反相电路模块在数字密码锁的设计中,反相电路模块的主要功能是用来对输入的SETUP、I-SETUP、START和DIP的按键输入信号进行反相操作,从而满足消抖同步模块对输入信号的电平要求。它的顶层原理图如图3-19所示。图3-19反相电路模块的顶层原理图 图3-20反相电路模块的时序仿真图由图上可知,输入的WAIT_T、READY和SETUP和按键输入信号c1c2c3c5成功进行了反相。反相电路模块的VHDL程序LIBRARYIEEE;USEIEEE.std_logic_1164.ALL;ENTITYinvert_modelISPORT(setup:INstd_logic;isetup:INstd_logic;start:INstd_logic;dip:INstd_logic;c1,c2,c3,c5:OUTstd_logic);ENDinvert_model;ARCHITECTUREinvert_model_archOFinvert_modelISBEGINc1<=NOTsetup;c2<=NOTisetup;c3<=NOTstart;c5<=NOTdip;ENDinvert_model_arch;3.3.9比较模块在数字密码锁中,比较模块的主要功能是对编成模块的输出B1—B4这4位数据和密码存储模块的输出和E1—E4这4位数据进行比较,然后将比较的结果送入到控制器模块的DEF端口上[11]。比较器的具体工作原理是:当比较结果相同时,DEP的输出为1,即密码正确;当比较结果不相同时,DEP的输出为0,即密码错误。下面是比较模块的顶层原理图3-21。 图3-21比较模块的顶层原理图图3-22比较模块的时序仿真图经过QuartusII仿真后,得到时序仿真图如图3-22。图中波形说明,当e1-e4与b1-b4相等时,dep信号输出为高电平,否则输出为低电平。比较模块的VHDL程序如下。LIBRARYIEEE;USEIEEE.std_logic_1164.ALL;ENTITYcomparator_modelISPORT(b1,b2,b3,b4:INstd_logic;e1,e2,e3,e4:INstd_logic;dep:OUTstd_logic);ENDcomparator_model;ARCHITECTUREcomparator_model_archOFcomparator_modelISBEGINPROCESS(b1,b2,b3,b4,e1,e2,e3,e4)BEGINIF(b1=e1ANDb2=e2ANDb3=e3ANDb4=e4)THENdep<='1';----输入数字与密码相同时,dep输出1信号;ELSEdep<='0';----否则,dep输出0信号;ENDIF;ENDPROCESS;ENDcomparator_model_arch; 3.3.10计数器选择模块在密码器中,计数器选择模块的功能是用来给出密码预置输出模块中的地址选择信号s0和s1的,RESET控制信号和时钟信号CNP是由控制器模块来提供的;另外还有一个输出信号FULL,它表示3个密码数字已经输入完毕,控制器可以进入到启动状态。计数器选择模块的顶层原理图如图3-23所示。图3-23计数器选择模块的顶层原理图图3-24计数器选择模块的时序仿真图从计数器选择模块的时序仿真图3-24中可以得出:在129.0ns处full变为高电平,这是因为此时s1和s0已经计到了第三个数字,所以计数器选择模块向控制器发出了full信号。计数器选择模块的VHDL程序如下。LIBRARYIEEE;USEIEEE.std_logic_1164.ALL;USEIEEE.std_logic_arith.ALL;USEIEEE.std_logic_unsigned.ALL;ENTITYcounter_modelISPORT(reset:INstd_logic;cnp:INstd_logic;s0,s1:OUTstd_logic;full:OUTstd_logic);ENDcounter_model;ARCHITECTUREcounter_model_archOFcounter_modelISSIGNALcount:std_logic_vector(1DOWNTO0);BEGINPROCESS(reset,cnp)BEGINIF(reset='1')THEN----当reset=1时,清零信号有效,full=1;count<="00";full<='1'; ELSIF(cnp'eventANDcnp='1')THEN---上升沿触发;IF(count="10")THEN----当计数器计数满3时,count重新计数,full=1;count<="00";full<='1';ELSEcount<=count+1;ENDIF;ENDIF;ENDPROCESS;s0<=count(0);s1<=count(1);ENDcounter_model_arch;3.3.11指示电路模块在数字密码锁中,指示电路模块的功能是用来产生红灯指示LED_R、绿灯指示LED_G和蜂鸣装置ALERT的信号的。根据图3-1得知,绿灯指示LED_G是由控制器模块提供的置位信号S_LG和按下WAIT_T键时提供的WAIT_L信号通过RS触发器来共同控制的;红灯指示LED_R是由控制器模块提供的置位信号S_LR和信号WAIT_L共同控制的;蜂鸣装置ALERT是由置位信号S_LR、信号WAIT_L反相器和单频信号CLOCK_DIV1来共同控制的[12]。指示电路模块中的主要元件是RS触发器,控制器提供的置位和复位信号都是低电平有效。下面是RS触发器的顶层原理图。图3-25RS触发器的顶层原理图图3-26RS触发器的时序仿真图从图3-26RS触发器的时序仿真图中可以看出,RS触发器的VHDL程序实现了RS触发器的功能。接下来的图是密码器中指示电路模块的顶层原理图,如图 3-27所示。指示模块的顶层原理图是以上面的RS触发器为基本元件构成的。图3-27指示电路模块的顶层原理图图3-28指示电路模块的时序仿真图在图3-28指示电路模块的时序仿真图中,在155.4ns处,当s_lr处于高电平,即发出报警信号时,led_r置低电平,alert随时钟信号变化,此时,系统处于报警状态,红灯亮,启动报警器报警;当s_lg处于低电平时,led_g置低电平,密码锁处于启动状态。从时序图中可以看出,报警模块的设计符合设计求。指示电路模块的VHDL程序LIBRARYIEEE;USEIEEE.std_logic_1164.ALL;ENTITYindicator_modelISPORT(wait_l:INstd_logic;s_lg:INstd_logic;s_lr:INstd_logic;clk_div1:INstd_logic;led_g,led_r,alert:OUTstd_logic);ENDindicator_model;ARCHITECTUREindicator_model_archOFindicator_modelISCOMPONENTrs_dfPORT(r,s:INstd_logic;q:OUTstd_logic);ENDCOMPONENTrs_df; SIGNALtmp1,tmp2:std_logic;BEGINU1:rs_dfPORTMAP(wait_l,s_lg,led_g);U2:rs_dfPORTMAP(wait_l,s_lr,tmp1);tmp2<=NOTtmp1;alert<=tmp2ANDclk_div1;led_r<=tmp1;ENDindicator_model_arch;4数字密码锁的综合调试与结果说明4.1顶层电路在设计完各个模块后,需要将各个模块有机地组合成一个整体,最后来实现系统的功能在数字频率计的设计中,同时采用了电路原理图的设计以及VHDL语言来编写的顶层电路。图4-1数字密码锁的顶层原理图在前面,我们已经把数字密码锁各组成模块的程序进行了编写,并用QuartusII进行了编译仿真,从仿真时序图中可以看出,各模块实现了各自的功能,达到了预期的目标。下面,将就数字密码锁进行整体仿真,从而验证其正确性。 图4-2显示的是用户输入正确的密码以及修改数字密码时的时序仿真图,从图中可以看出:当给密码锁上电后,密码锁进入到等待状态QA。若用户按下SETUP按键,则c11产生一个高电平信号,WAIT_L置1,密码锁进入到准备状态QB。当用户需要开门时,按下START键,即c33呈高电平,这时RESET信号置高电平,计数器清零;S_LR,S_LG和ALERT置于低电平,此时用来指示密码锁工作情况的指示灯和扬声器都处于不工作状态,密码锁进入QC输入密码状态,可以接收外部输入的密码数字。图4-2数字密码输入正确时的时序仿真图用户通过A0-A9按键输入第一个数字密码后,编码器会向控制器发出DATA_IN信号,此时控制器模块会向计数器选择模块发出时钟信号CNP和向密码存储模块发出RD信号,目的是选出对应的预置密码与输入的密码进行比较。如果输入的密码正确,则比较器会向控制器发出1个表示输入数字密码正确的DEP信号,否则将不会发出DEP信号;当用户输入第二个数字密码后,重复上述操作;当输完三个数字密码后,计数器会向控制器发出1个表示密码已经输入完毕的FULL信号。如果前面用户输入的数字密码正确,则密码锁将进入启动状态QD,此时用户若按下OPEN键,则密码锁的绿灯亮,密码锁开锁。随后若用户没有按DIP键,即不修改密码,则密码锁会重新进入到等待状态QA。 数字密码输入正确后,若用户需要修改密码,则需按下DIP键,此时,RESET信号置高电平,计数器清零,若有数字密码输入,则编码器会向控制器发出DATA_IN信号,此时控制器将向计数器发出时钟信号CNP,同时向密码存储模块发出WR信号,使其进入到写状态,待3个十进行数字密码输入完毕后,计数器会向控制器发出一个FULL信号,密码锁重新进入QA等待状态。如果前面用户输入的数字密码不正确,则密码锁将进入到报警状态QE,如图4-3所示。图4-3数字密码输入错误时的时序仿真图当用户在输入密码过程中发现密码输入有误,则可以通过START键进行重新输入,此时控制器向计数器发出RESET清零信号,密码锁重新进入到QC密码输入状态。若用户在输入3个数字密码过程中没有按下START按键,而是在输入完3个数字密码后按下了开锁键OPEN,则S_LR和ALERT置高电平,密码锁的红灯亮,蜂鸣器报警。密码锁同时进入到报警返回状态QF,这时,START键和SETUP按键是不起作用的。在这种情况下,密码锁必须由内部人员通过按键I-SETUP来对密码器进行重新设置,才使其重新回到等待状态QA。从以上讨论,可以看出前面各模块设计较好的完成了数字密码锁的功能。 其中密码锁顶层设计的各个模块是以元件的形式给出的,必须首先进行元件说明,然后才能进行元件的例化调用。另外,结构体的说明部分还定义了许多中间信号,它们的作用是用来在模块之间传递信息。4.2过程调试PIN脚的设置、结果及程序下载图分别如图4-3、图4-4和图4-5所示。图4-3PIN脚的设置图4-4设置结果 图4-5程序下载图在DE2上硬件调试结果图如图4-6和图4-7所示:图4-6成功的结果图图4-7不成功的结果图硬件调试结果说明:(1)通过A0-A9按键输入3位数字密码后按下OPEN键如果输入密码正确并且按键正确,这时密码锁将启动开锁装置,同时密码锁的绿灯点亮;如果输入密码错误或者按键错误,这时密码锁不会启动开启装置,它将启动鸣叫扬声器,同时密码锁的红灯点亮。(2)给密码锁上电后按下SETUP键,密码锁开始进入等待状态当用户需要开门时,按下START键,表示密码锁进入等待状态 ,可以接收外部输入的密码数字;这时用来指示密码锁工作情况的指示灯和扬声器都处于不工作状态。(3)密码锁开启结束后将进入到下一次开启等待状态。这时,按下SETUP按键,密码锁应该重新进入到等待状态。(4)如果发现输入的3位密码有错误这时操作人员可以在按下OPEN键之前按下START键重新回到就绪状态。因此,密码锁需要含有一个输入数字密码的显示电路,这里采用七段显示数码管来依次显示输入的数字密码。(5)当密码锁处于报警状态时,START键和SETUP按键是不起作用的在这种情况下,密码锁必须由内部人员通过按键I-SETUP来对密码器进行重启设置,目的是使其重新回到等待状态。为了密码锁的安全起见,这里的按键I-SETUP应该设置在其它外部人员不能接触到的地方。(6)其他数字密码0-9、DIP、START、OPEN、SETUP、I-SETUP均为按键方式产生,其中数字密码0-9、DIP、START、OPEN和SETUP可以采用外接的键盘来进行输入需要注意的是,内部按键I-SETUP不由外接键盘提供。问题及解决方法:当上述工作都做完后去把设计拿到实验室进行硬件下载,在下载过程中并不是一帆风顺的,出现的问题及解决方法如下:首先是按设计接好电路,实验箱通电后,发现设计无法下载到试验箱上的FPGA芯片上。经检查发现是因为没有装下载驱动,当装好驱动后,这问题迎刃而解。当驱动问题解决后,下载到FPGA芯片上后发现指示电路的工作情况与设计中完全相反了。仔细检查之后发现是因为设计中的LED接了电源,高电平不亮、低电平亮;而实验箱上的LED是高电平有效(亮)、低电平无效(不亮),把指示灯的状态调整后,问题解决。上述问题都解决后进行最后的功能仿真的过程中发现密码修改功能无法实现。经检查后发现是控制器中密码存储状态部分的程序编写不周到导致的。在重新编写之后问题得到解决。 5展望随着人们生活水平的提高,对家庭防盗技术的要求也是越来越高,传统的机械锁由于其构造的简单,被撬的事件屡见不鲜,数字密码锁锁由于其保密性高,使用灵活性好,安全系数高,受到了广大用户的欢迎。现在市场上主要是基于单片机技术的电子密码锁,但可靠性较差。FPGA即现场可编程门阵列,它是在PAL、GAL、EPLD等可编程器件的基础上进一步发展的产物,是一种超大规模集成电路,具有对电路可重配置能力。通常FPGA都有着上万次的重写次数,也就是说现在的硬件设计和软件设计一样灵活、方便。相对于基于单片机技术的数字密码锁,用FPGA器件来构成系统,可靠性提高,并且由于FPGA具有的现场可编程功能,使得电子密码锁的更改与升级更为方便简单。在电子技术飞速发展的今天,具有防盗报警安全性功能的电子密码锁代替弹子锁和密码量少、安全性差的机械式密码锁已是必然趋势。电子密码锁具有机械锁无可比拟的优越性,它不但可以完成锁本身的功能,还可以兼有多种功能,如记忆,识别,报警等,电子密码锁以其安全性高,成本低,易操作等优点受到越来越多人的欢迎。目前使用的电子密码锁大部分是存储于ROM进行设计的,其将密码以直接存储于芯片中,可以达到使用,改写方便和基本的密码保护功能,在安全性和实际使用可靠性上展现了其优点。 7参考文献[1]朱正伟.EDA技术及应用[M].北京:清华大学出版社,2005,10.[2]施云贵,孙玉杰,姜维利.基于P89C51Rx2可编程计数器阵列(PCA)实现直流电机调速控制[J].仪器仪表学报,2006,32(9):19~22.[3]潘松,黄继业.EDA技术实用教程[M].北京:科学出版社,2005,1.[4]王金明.数字系统设计与VerilogHDL[M].北京:电子工业出版社,2005,9.[5]求是科技.VHDL应用开发技术与工程实践[M].北京:人民邮电出版社,2005,1.[6]于枫.ALTERA可编程逻辑器件应用技术[M].北京:科学出版社,2004,9.[7]尹常永.EDA技术与数字系统设计[M].西安:西安电子科技大学出版社.2004,8.[8]Ming-BoLin.DigitalSystemDesignsandPractices:UsingVerilogHDLandFPGAs[M].NewYork:McGraw-Hill,2008,8.[9]孙君曼,马庆华,扈刚.基于PIC16C57单片机的电子密码锁的设计与实现[J].工业控制计算机,2002,15(7):16~24.[10]崔葛瑾.基于FPGA的数字电路系统设计[M].西安:西安电子科技大学出版社,2008,7.[11]王效华,张咏梅.单片机原理与应用[M].北京:北京交通大学出版社,2007,5.[12]李忠国,陈刚.单片机应用技能实训[M].北京:人民邮电出版社.2006,11. 附录1程序代码程序110分频电路的VHDL程序LIBRARYIEEE;USEIEEE.std_logic_1164.ALL;USEIEEE.std_logic_arith.ALL;USEIEEE.std_logic_unsigned.ALL;ENTITYclock_div10ISport(clock:INstd_logic;clock_div:OUTstd_logic);ENDclock_div10;ARCHITECTURErtlOFclock_div10ISSIGNALcount:std_logic_vector(2DOWNTO0);SIGNALclock_tmp:std_logic;BEGINPROCESS(clock)BEGINIF(clock'eventANDclock='1')THEN---上升沿触发;IF(count="100")THEN----当count记过五个时钟周期时,clock_tmp反相;count<=(OTHERS=>'0');clock_tmp<=NOTclock_tmp;ELSEcount<=count+1;ENDIF;ENDIF;ENDPROCESS;clock_div<=clock_tmp;ENDrtl;程序220分频电路的VHDL程序LIBRARYIEEE;USEIEEE.std_logic_1164.ALL;USEIEEE.std_logic_arith.ALL;USEIEEE.std_logic_unsigned.ALL;ENTITYclock_div20ISport(clock:INstd_logic; clock_div:OUTstd_logic);ENDclock_div20;ARCHITECTURErtlOFclock_div20ISSIGNALcount:std_logic_vector(3DOWNTO0);SIGNALclock_tmp:std_logic;BEGINPROCESS(clock)BEGINIF(clock'eventANDclock='1')THEN---上升沿触发;IF(count="1001")THEN----当count记过十个时钟周期时,clock_tmp反相;count<=(OTHERS=>'0');clock_tmp<=NOTclock_tmp;ELSEcount<=count+1;ENDIF;ENDIF;ENDPROCESS;clock_div<=clock_tmp;ENDrtl;程序3200分频电路的VHDL程序LIBRARYIEEE;USEIEEE.std_logic_1164.ALL;ENTITYclock_div200ISport(clock:INstd_logic;clock_div:OUTstd_logic);ENDclock_div200;ARCHITECTURErtlOFclock_div200ISCOMPONENTclock_div10PORT(clock:INstd_logic;clock_div:OUTstd_logic);ENDCOMPONENTclock_div10;COMPONENTclock_div20PORT(clock:INstd_logic;clock_div:OUTstd_logic);ENDCOMPONENTclock_div20;SIGNALtmp:std_logic;BEGIN----元件连接说明;U1:clock_div10PORTMAP(clock,tmp);U2:clock_div20PORTMAP(tmp,clock_div);ENDrtl;程序4分频模块的VHDL程序LIBRARYIEEE; USEIEEE.std_logic_1164.ALL;ENTITYclockdiv_modelISport(clock:INstd_logic;clock_div1:OUTstd_logic;clock_div2:OUTstd_logic);ENDclockdiv_model;ARCHITECTUREclockdiv_model_archOFclockdiv_modelISCOMPONENTclock_div10PORT(clock:INstd_logic;clock_div:OUTstd_logic);ENDCOMPONENTclock_div10;COMPONENTclock_div200PORT(clock:INstd_logic;clock_div:OUTstd_logic);ENDCOMPONENTclock_div200;SIGNALtmp1,tmp2,tmp3:std_logic;BEGIN----元件连接说明;U1:clock_div10PORTMAP(clock,tmp1);U2:clock_div10PORTMAP(tmp1,tmp2);U3:clock_div10PORTMAP(tmp2,tmp3);U4:clock_div200PORTMAP(tmp3,clock_div2);clock_div1<=tmp3;ENDclockdiv_model_arch;程序5D触发器的VHDL程序。LIBRARYIEEE;USEIEEE.std_logic_1164.ALL;ENTITYdfISPORT(d,clock:INstd_logic;q,qb:OUTstd_logic);ENDdf;ARCHITECTUREdff_artOFdfISBEGINPROCESS(clock)ISBEGINIF(clock’EVENTANDclock=’1’)THEN---上升沿触发;q<=d;qb<=NOTd;ENDIF;ENDPROCESS;ENDdff_art;程序6消抖同步电路的VHDL程序。LIBRARYIEEE; USEIEEE.std_logic_1164.ALL;ENTITYkey_syncISPORT(key_in:INstd_logic;clock:INstd_logic;key_out:OUTstd_logic);ENDkey_sync;ARCHITECTURErtlOFkey_syncISCOMPONENTdfPORT(d,clock:INstd_logic;q,qb:OUTstd_logic);ENDCOMPONENTdf;SIGNALtmp1,tmp2,tmp3,tmp4,tmp5,tmp6:std_logic;BEGIN----元件连接说明;tmp2<=key_inNANDtmp1;tmp1<=tmp3NANDtmp2;key_out<=tmp4ANDtmp5;U1:df----元件例化;PORTMAP(tmp2,clock,tmp4,tmp3);U2:dfPORTMAP(tmp4,clock,tmp6,tmp5);ENDrtl;程序7同步消抖模块的VHDL程序LIBRARYIEEE;USEIEEE.std_logic_1164.ALL;ENTITYkeysync_modelISPORT(c1,c2,c3,c4,c5:INstd_logic;a00,a10,a20,a30,a40,a50,a60,a70,a80,a90:INstd_logic;clock:INstd_logic;c11,c22,c33,c44,c55:OUTstd_logic;a01,a11,a21,a31,a41,a51,a61,a71,a81,a91:OUTstd_logic);ENDkeysync_model;ARCHITECTUREkeysync_model_archOFkeysync_modelISCOMPONENTkey_syncPORT(key_in:INstd_logic;clock:INstd_logic;key_out:OUTstd_logic);ENDCOMPONENTkey_sync;BEGIN----元件连接说明;U1:key_syncPORTMAP(c1,clock,c11);U2:key_syncPORTMAP(c2,clock,c22);U3:key_syncPORTMAP(c3,clock,c33);U4:key_syncPORTMAP(c4,clock,c44);U5:key_syncPORTMAP(c5,clock,c55);U6:key_syncPORTMAP(a00,clock,a01);U7:key_syncPORTMAP(a10,clock,a11);U8:key_syncPORTMAP(a20,clock,a21);U9:key_syncPORTMAP(a30,clock,a31); U10:key_syncPORTMAP(a40,clock,a41);U11:key_syncPORTMAP(a50,clock,a51);U12:key_syncPORTMAP(a60,clock,a61);U13:key_syncPORTMAP(a70,clock,a71);U14:key_syncPORTMAP(a80,clock,a81);U15:key_syncPORTMAP(a90,clock,a91);ENDkeysync_model_arch;程序8使能电路模块的VHDL程序LIBRARYIEEE;USEIEEE.std_logic_1164.ALL;ENTITYenable_modelISPORT(open_t:INstd_logic;a0,a1,a2,a3,a4,a5,a6,a7,a8,a9:INstd_logic;en:INstd_logic;c4:OUTstd_logic;a00,a10,a20,a30,a40,a50,a60,a70,a80,a90:OUTstd_logic);ENDenable_model;ARCHITECTUREenable_model_archOFenable_modelISBEGINPROCESS(open_t,en,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9)BEGINIF(en='1')THEN--当使能信号有效时,A0-A9和OPEN取反c4<=NOTopen_t;a00<=NOTa0;a10<=NOTa1;a20<=NOTa2;a30<=NOTa3;a40<=NOTa4;a50<=NOTa5;a60<=NOTa6;a70<=NOTa7;a80<=NOTa8;a90<=NOTa9;ENDIF;ENDPROCESS;ENDenable_model_arch;程序9反相电路模块的VHDL程序LIBRARYIEEE;USEIEEE.std_logic_1164.ALL;ENTITYinvert_modelISPORT(setup:INstd_logic;isetup:INstd_logic;start:INstd_logic;dip:INstd_logic;c1,c2,c3,c5:OUTstd_logic);ENDinvert_model;ARCHITECTUREinvert_model_archOFinvert_modelISBEGINc1<=NOTsetup;c2<=NOTisetup; c3<=NOTstart;c5<=NOTdip;ENDinvert_model_arch;程序10密码存储模块的VHDL程序LIBRARYIEEE;USEIEEE.std_logic_1164.ALL;ENTITYsram_modelISPORT(s0,s1:INstd_logic;wr,rd:INstd_logic;b1,b2,b3,b4:INstd_logic;e1,e2,e3,e4:OUTstd_logic);ENDsram_model;ARCHITECTUREsram_model_archOFsram_modelISSIGNALd11,d12,d13,d14:std_logic;SIGNALd21,d22,d23,d24:std_logic;SIGNALd31,d32,d33,d34:std_logic;SIGNALd41,d42,d43,d44:std_logic;SIGNALcomb:std_logic_vector(1DOWNTO0);BEGINcomb<=s1&s0;PROCESS(comb)BEGINIF(rd='1')THEN--读信号有效,读出密码比较IF(comb="00")THENe1<=d11;e2<=d12;e3<=d13;e4<=d14;IF(comb="01")THENe1<=d21;e2<=d22;e3<=d23;e4<=d24;IF(comb="10")THENe1<=d31;e2<=d32;e3<=d33;e4<=d34;ELSEe1<=d41;e2<=d42;e3<=d43;e4<=d44;ENDIF;ELSIF(wr='1')THEN--写信号有效,写入密码存储IF(comb="00")THENd11<=b1;d12<=b2;d13<=b3;d14<=b4;e1<=d11;e2<=d12;e3<=d13;e4<=d14;IF(comb="01")THENd21<=b1;d22<=b2;d23<=b3;d24<=b4;e1<=d21;e2<=d22;e3<=d23;e4<=d24;IF(comb="10")THENd31<=b1;d32<=b2;d33<=b3;d34<=b4;e1<=d31;e2<=d32;e3<=d33;e4<=d34;ELSEd41<=b1;d42<=b2;d43<=b3;d44<=b4;e1<=d41;e2<=d42;e3<=d43;e4<=d44;ENDIF; ENDIF;ENDIF;ENDIF;ENDIF;ENDIF;ENDPROCESS;ENDsram_model_arch;程序11编码模块的VHDL程序LIBRARYIEEE;USEIEEE.std_logic_1164.ALL;ENTITYencoder_modelISPORT(a01,a11,a21,a31,a41,a51,a61,a71,a81,a91:INstd_logic;b1,b2,b3,b4:OUTstd_logic;data_in:OUTstd_logic);ENDencoder_model;ARCHITECTUREencoder_model_archOFencoder_modelISBEGINPROCESS(a01,a11,a21,a31,a41,a51,a61,a71,a81,a91)BEGINIF(a01='1')THEN--对数字“0”的编码b1<='0';b2<='0';b3<='0';b4<='0';data_in<='1';ELSIF(a11='1')THEN——对数字“1”的编码b1<='1';b2<='0';b3<='0';b4<='0';data_in<='1';ELSIF(a21='1')THEN——对数字“2”的编码b1<='0';b2<='1';b3<='0';b4<='0';data_in<='1';ELSIF(a31='1')THEN——对数字“3”的编码b1<='1';b2<='1';b3<='0';b4<='0';data_in<='1';ELSIF(a41='1')THEN——对数字“4”的编码b1<='0';b2<='0';b3<='1';b4<='0';data_in<='1';ELSIF(a51='1')THEN——对数字“5”的编码b1<='1';b2<='0';b3<='1';b4<='0';data_in<='1';ELSIF(a61='1')THEN——对数字“6”的编码b1<='0';b2<='1';b3<='1';b4<='0';data_in<='1';ELSIF(a71='1')THEN——对数字“7”的编码b1<='1';b2<='1';b3<='1';b4<='0';data_in<='1';ELSIF(a81='1')THEN——对数字“8”的编码 b1<='0';b2<='0';b3<='0';b4<='1';data_in<='1';ELSIF(a91='1')THEN——对数字“9”的编码b1<='1';b2<='0';b3<='0';b4<='1';data_in<='1';ELSE——无数字输入时b1<='1';b2<='1';b3<='1';b4<='1';data_in<='0';ENDIF;ENDPROCESS;ENDencoder_model_arch;程序12比较模块的VHDL程序LIBRARYIEEE;USEIEEE.std_logic_1164.ALL;ENTITYcomparator_modelISPORT(b1,b2,b3,b4:INstd_logic;e1,e2,e3,e4:INstd_logic;dep:OUTstd_logic);ENDcomparator_model;ARCHITECTUREcomparator_model_archOFcomparator_modelISBEGINPROCESS(b1,b2,b3,b4,e1,e2,e3,e4)BEGINIF(b1=e1ANDb2=e2ANDb3=e3ANDb4=e4)THENdep<='1';----输入数字与密码相同时,dep输出1信号;ELSEdep<='0';----否则,dep输出0信号;ENDIF;ENDPROCESS;ENDcomparator_model_arch;程序13计数器选择模块的VHDL程序LIBRARYIEEE;USEIEEE.std_logic_1164.ALL;USEIEEE.std_logic_arith.ALL;USEIEEE.std_logic_unsigned.ALL;ENTITYcounter_modelISPORT(reset:INstd_logic;cnp:INstd_logic;s0,s1:OUTstd_logic;full:OUTstd_logic);ENDcounter_model;ARCHITECTUREcounter_model_archOFcounter_modelISSIGNALcount:std_logic_vector(1DOWNTO0);BEGINPROCESS(reset,cnp)BEGINIF(reset='1')THEN----当reset=1时,清零信号有效,full=1; count<="00";full<='1';ELSIF(cnp'eventANDcnp='1')THEN---上升沿触发;IF(count="10")THEN----当计数器计数满3时,count重新计数,full=1;count<="00";full<='1';ELSEcount<=count+1;ENDIF;ENDIF;ENDPROCESS;s0<=count(0);s1<=count(1);ENDcounter_model_arch;程序14数码管显示译码模块的VHDL程序LIBRARYIEEE;USEIEEE.std_logic_1164.ALL;ENTITYdecoder_modelISPORT(b1,b2,b3,b4:INstd_logic;a,b,c,d,e,f,g:OUTstd_logic);ENDdecoder_model;ARCHITECTUREdecoder_model_archOFdecoder_modelISSIGNALdata_tmp:std_logic_vector(6DOWNTO0);BEGINPROCESS(b1,b2,b3,b4)VARIABLEcomb:std_logic_vector(3DOWNTO0);BEGINcomb:=b4&b3&b2&b1;CASEcombISWHEN"0000"=>data_tmp<="0111111";WHEN"0001"=>data_tmp<="0000110";WHEN"0010"=>data_tmp<="1011011";WHEN"0011"=>data_tmp<="1001111";WHEN"0100"=>data_tmp<="1100110";WHEN"0101"=>data_tmp<="1101101";WHEN"0110"=>data_tmp<="1111101";WHEN"0111"=>data_tmp<="0100111";WHEN"1000"=>data_tmp<="1111111";WHEN"1001"=>data_tmp<="1101111";WHENOTHERS=>data_tmp<="0000000";ENDCASE;ENDPROCESS;a<=data_tmp(0);b<=data_tmp(1);c<=data_tmp(2);d<=data_tmp(3);e<=data_tmp(4);f<=data_tmp(5);g<=data_tmp(6);ENDdecoder_model_arch;程序15RS触发器的VHDL程序 LIBRARYIEEE;USEIEEE.std_logic_1164.ALL;ENTITYrs_dfISPORT(r,s:INstd_logic;q:OUTstd_logic);ENDrs_df;ARCHITECTURErtlOFrs_dfISSIGNALtmp1,tmp2:std_logic;----信号定义;BEGIN----元件连接声明;tmp2<=rNANDtmp1;tmp1<=tmp2NANDs;q<=tmp2;ENDrtl;程序16指示电路模块的VHDL程序LIBRARYIEEE;USEIEEE.std_logic_1164.ALL;ENTITYindicator_modelISPORT(wait_l:INstd_logic;s_lg:INstd_logic;s_lr:INstd_logic;clk_div1:INstd_logic;led_g,led_r,alert:OUTstd_logic);ENDindicator_model;ARCHITECTUREindicator_model_archOFindicator_modelISCOMPONENTrs_dfPORT(r,s:INstd_logic;q:OUTstd_logic);ENDCOMPONENTrs_df;SIGNALtmp1,tmp2:std_logic;BEGINU1:rs_dfPORTMAP(wait_l,s_lg,led_g);U2:rs_dfPORTMAP(wait_l,s_lr,tmp1);tmp2<=NOTtmp1;alert<=tmp2ANDclk_div1;led_r<=tmp1;ENDindicator_model_arch;程序17控制器模块的VHDL程序。LIBRARYIEEE; USEIEEE.std_logic_1164.ALL;ENTITYcontrol_modelISPORT(c11,c22,c33,c44,c55:INstd_logic;data_in:INstd_logic;dep:INstd_logic;full:INstd_logic;clock_div2:INstd_logic;en:OUTstd_logic;wr,rd:OUTstd_logic;cnp,reset:OUTstd_logic;s_lr,s_lg,wait_l:OUTstd_logic);ENDcontrol_model;ARCHITECTUREcontrol_model_archOFcontrol_modelISTYPEstateIS(QA,QB,QC,QD,QE,QF,QG);SIGNALcurrent_state:state:=QA;BEGINPROCESSBEGINWAITUNTILclock_div2'eventANDclock_div2='1';wait_l<='1';CASEcurrent_stateISWHENQA=>en<='0';--建立等待状态IF(c11='0')THENcurrent_state<=QA;ELSEcurrent_state<=QB;wait_l<='0';s_lg<='1';s_lr<='1';ENDIF;WHENQB=>wait_l<='1';en<='0';--准备就绪状态IF(c33='0')THENcurrent_state<=QB;ELSEcurrent_state<=QC;reset<='1';ENDIF;WHENQC=>reset<='0';cnp<='0';en<='1';--密码输入状态IF(c44='1')THENcurrent_state<=QF;s_lr<='0';ELSIF(c33='1')THENcurrent_state<=QC;reset<='1'; ELSIF(full='1')THENcurrent_state<=QD;ELSIF(data_in='0')THENcurrent_state<=QC;ELSEcnp<='1';rd<='1';IF(dep='0')THENcurrent_state<=QE;ELSIF(full='1')THENcurrent_state<=QD;ELSEcurrent_state<=QC;ENDIF;ENDIF;WHENQD=>en<='1';--启动状态IF(data_in='1')THENcurrent_state<=QE;ELSIF(c33='1')THENcurrent_state<=QC;reset<='1';ELSIF(c44='0')THENcurrent_state<=QD;ELSEs_lg<='0';current_state<=QA;ENDIF;WHENQE=>en<='1';--报警状态IF(c33='1')THENcurrent_state<=QC;reset<='1';ELSIF(c44='0')THENcurrent_state<=QE;ELSEs_lr<='0';current_state<=QF;ENDIF;WHENQF=>en<='0';--报警返回状态IF(c22='0')THENcurrent_state<=QF;ELSEcurrent_state<=QB;s_lr<='0';wait_l<='0'; ENDIF;WHENQG=>en<='0';--密码存储状态IF(c55='1')THENcurrent_state<=QA;ELSEcurrent_state<=QG;reset<='1';IF(data_in='0')THENcurrent_state<=QG;ELSEwr<='1';IF(full='0')THENcurrent_state<=QG;ELSEcurrent_state<=QA;ENDIF;ENDIF;ENDIF;ENDCASE;ENDPROCESS;ENDcontrol_model_arch;程序18数字密码锁顶层设计的VHDL程序。----IEEE库及其中程序包的使用说明;LIBRARYIEEE;USEIEEE.std_logic_1164.ALL;USEIEEE.std_logic_arith.ALL;USEIEEE.std_logic_unsigned.ALL;----实体cipher_top的说明;ENTITYcipher_topISPORT(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9:INstd_logic;isetup:INstd_logic;start:INstd_logic;setup:INstd_logic;open_t:INstd_logic;dip:INstd_logic;clock:INstd_logic;led_a,led_b,alert:OUTstd_logic;a,b,c,d,e,f,g:OUTstd_logic);ENDcipher_top;----实体cipher_top的结构体cipher_top_arch的说明;ARCHITECTUREcipher_top_archOFcipher_topIS----元件调用声明;COMPONENTclockdiv_model----分频模块;PORT(clock:INstd_logic;clock_div1:OUTstd_logic;clock_div2:OUTstd_logic);ENDCOMPONENTclockdiv_model;COMPONENTkeysync_model----同步消抖模块;PORT(c1,c2,c3,c4,c5:INstd_logic; a00,a10,a20,a30,a40,a50,a60,a70,a80,a90:INstd_logic;clock:INstd_logic;c11,c22,c33,c44,c55:OUTstd_logic;a01,a11,a21,a31,a41,a51,a61,a71,a81,a91:OUTstd_logic);ENDCOMPONENTkeysync_model;COMPONENTenable_model----使能电路模块;PORT(open_t:INstd_logic;a0,a1,a2,a3,a4,a5,a6,a7,a8,a9:INstd_logic;en:INstd_logic;c4:OUTstd_logic;a00,a10,a20,a30,a40,a50,a60,a70,a80,a90:OUTstd_logic);ENDCOMPONENTenable_model;COMPONENTinvert_model----反相电路模块;PORT(setup:INstd_logic;isetup:INstd_logic;start:INstd_logic;dip:INstd_logic;c1,c2,c3,c5:OUTstd_logic);ENDCOMPONENTinvert_model;COMPONENTsram_model----密码存储模块;PORT(wr,rd:INstd_logic;s0,s1:INstd_logic;b1,b2,b3,b4:INstd_logic;e1,e2,e3,e4:OUTstd_logic);ENDCOMPONENTsram_model;COMPONENTencoder_model----编码模块;PORT(a01,a11,a21,a31,a41,a51,a61,a71,a81,a91:INstd_logic;b1,b2,b3,b4:OUTstd_logic;data_in:OUTstd_logic);ENDCOMPONENTencoder_model;COMPONENTcomparator_model----比较模块;PORT(b1,b2,b3,b4:INstd_logic;e1,e2,e3,e4:INstd_logic;dep:OUTstd_logic);ENDCOMPONENTcomparator_model;COMPONENTcounter_model----计数器模块;PORT(reset:INstd_logic;cnp:INstd_logic;s0,s1:OUTstd_logic;full:OUTstd_logic);ENDCOMPONENTcounter_model;COMPONENTdecoder_model----数字码管译码模块;PORT(b1,b2,b3,b4:INstd_logic;a,b,c,d,e,f,g:OUTstd_logic);ENDCOMPONENTdecoder_model;COMPONENTindicator_model----指示电路模块;PORT(wait_l:INstd_logic;s_lg:INstd_logic;s_lr:INstd_logic;clock_div1:INstd_logic;led_a:OUTstd_logic;led_b:OUTstd_logic;alert:OUTstd_logic);ENDCOMPONENTindicator_model;COMPONENTcontrol_model----控制器模块;PORT(c11,c22,c33,c44,c55:INstd_logic;data_in:INstd_logic;dep:INstd_logic; full:INstd_logic;clock_div2:INstd_logic;wr,rd:OUTstd_logic;en:OUTstd_logic;cnp,reset:OUTstd_logic;s_lg,s_lr,wait_l:OUTstd_logic);ENDCOMPONENTcontrol_model;----信号定义;SIGNALe1,e2,e3,e4:std_logic;SIGNALb1,b2,b3,b4:std_logic;SIGNALc1,c2,c3,c4,c5:std_logic;SIGNALc11,c22,c33,c44,c55:std_logic;SIGNALa00,a10,a20,a30,a40,a50,a60,a70,a80,a90:std_logic;SIGNALa01,a11,a21,a31,a41,a51,a61,a71,a81,a91:std_logic;SIGNALen,data_in:std_logic;SIGNALwait_l,s_lg,s_lr:std_logic;SIGNALreset,cnp:std_logic;SIGNALwr,rd:std_logic;SIGNALfull,dep:std_logic;SIGNALs0,s1:std_logic;SIGNALclock_div1,clock_div2:std_logic;SIGNALd11,d12,d13,d14,d21,d22,d23,d24,d31,d32,d33,d34,d41,d42,d43,d44:std_logic;BEGIN-----元件连接说明;U1:clockdiv_modelPORTMAP(clock,clock_div1,clock_div2);U2:keysync_modelPORTMAP(c1,c2,c3,c4,c5,a00,a10,a20,a30,a40,a50,a60,a70,a80,a90,clock,c11,c22,c33,c44,c55,a01,a11,a21,a31,a41,a51,a61,a71,a81,a91);U3:enable_modelPORTMAP(open_t,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,en,c4,a00,a10,a20,a30,a40,a50,a60,a70,a80,a90);U4:invert_modelPORTMAP(setup,isetup,start,dip,c1,c2,c3,c5);U5:sram_modelPORTMAP(wr,rd,s0,s1,b1,b2,b3,b4,e1,e2,e3,e4);U6:encoder_modelPORTMAP(a01,a11,a21,a31,a41,a51,a61,a71,a81,a91,b1,b2,b3,b4,data_in);U7:comparator_modelPORTMAP(b1,b2,b3,b4,e1,e2,e3,e4,dep);U8:counter_modelPORTMAP(reset,cnp,s0,s1,full);U9:decoder_model PORTMAP(b1,b2,b3,b4,a,b,c,d,e,f,g);U10:indicator_modelPORTMAP(wait_l,s_lg,s_lr,clock_div1,led_a,led_b,alert);U11:control_modelPORTMAP(c11,c22,c33,c44,c55,data_in,dep,full,clock_div2,wr,rd,en,cnp,reset,s_lg,s_lr,wait_l);ENDcipher_top_arch;

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭