《FPGA基于verilog HDL的密码锁.docx》由会员分享,可在线阅读,更多相关《FPGA基于verilog HDL的密码锁.docx(24页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、EDA课程设计密码锁2014.6.237.5课设名称:课设日期:*名:学号:哈尔滨工业大学(威海)信电学院电子信息工程2014.6一.所用软件与硬件介绍1.1 所用软件介绍QuartusII是Altera公司的综合性PLD/FPGA开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(AlteraHardwareDescriptionLanguage)等多种设计输入形式,内嵌的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。QuartusII可以在XP、Linux以及Unix上使用,除了可以使用TCL脚本完成设计流程外,提供了完善的用户图形界面设计方式。具有运行
2、速度快,界面统一,功能集中,易学易用等特点。QuartusII支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三方EDA工具。此外,QuartusII通过和DSPBuilder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。MaxplusII作为Altera的上一代PLD设计
3、软件,由于其出色的易用性而得到了广泛的应用。目前Altera已经停止了对MaxplusII的更新支持,QuartusII与之相比不仅仅是支持器件类型的丰富和图形界面的改变。Altera在QuartusII中包含了许多诸如SignalTapII、ChipEditor和RTLViewer的设计辅助工具,集成了SOPC和HardCopy设计流程,并且继承了MaxplusII友好的图形界面及简便的使用方法。1.2 所用硬件介绍硬件的总体设计:故由上图,将整个硬件电路部分主要分成五个部分,即:FPGA电路设计,数码管显示驱动电路设计,温度传感器电路设计,报警电路设计,键盘矩阵控制电路设计。I.FPGA芯
4、片的介绍在本次课程设计中选用Altera公司CycloneII系列FPGA器件。Altera公司2004年推出了新款CycloneII系列FPGA器件。CycloneIIFPGA的成本比第一代Cyclone器件低30%,逻辑容量大了三倍多,可满足低成本大批量应用需求。随着低复杂度FPGA器件成本的不断下降,具有灵活性和及时面市优势的FPGA与ASIC相比更有竞争性,在数字消费市场上的应用也急剧增加。第一代Cyclone系列迄今发售了3百多万片,在全球拥有3,000多位客户,对大批量低成本数字消费市场有着巨大的影响,该市场消纳了三分之一的器件。同时,CycloneII器件系列也在电信、计算机外设
5、、工业和汽车市场上获得了巨大的进步。CycloneII器件包含了许多新的特性,如嵌入存储器、嵌入乘法器、PLL和低成本的封装,这些都为诸如视频显示、数字电视(DTV)、机顶盒(STB)、DVD播放器、DSL调制解调器、家用网关和中低端路由器等批量应用进行了优化。CycloneII器件采用TSMC90nm低K绝缘材料工艺技术,这种技术结合Altera低成本的设计方式,使之能够在更低的成本下制造出更大容量的器件。这种新的器件比第一代Cyclone产品具有两倍多的I/O引脚,且对可编程逻辑,存储块和其它特性进行了最优的组合,具有许多新的增强特性低成本的配置器件编辑Altera为配置CycloneII
6、FPGA提供了低成本的串行配置器件。这些串行配置器件定价为批量应用,成本是相应CycloneIIFPGA的10%。四个串行配置器件(1Mbit,4Mbit,16Mbit和64Mbit)提供了节省空间的8脚和16脚SOIC封装。器件中任何不用于配置的存储器可用于一般存储,进一步增强其价值。IP编辑Altera也为CylconeII器件客户提供了40多个可定制IP核,Altera和AlteraMegafunction伙伴计划(AMPPSM)合作者提供的不同的IP核是专为CycloneII架构优化的,包括:NiosII嵌入式处理器;DDRSDRAM控制器;FFT/IFFT;PCI编译器;FIR编译器
7、;NCO编译器;POS-PHY编译器;ReedSolomon编译器;Viterbi编译器等等。II.数码管显示器液晶显示器按其功能可分为三类,笔段式液晶显示器,字符点阵式液晶显示器和图形点阵式液晶显示器。前两种可以显示数字,字符,符号等。而图形点阵式液晶显示器还可以显示汉子和任意图形,达到图文并茂的鲜果。在本课程设计中,受到试验箱的限制,在这里使用的是基本的数码管显示。当数码管特定的段加上电压后,这些特定的段就会发亮,以形成我们眼睛看到的字样了。如:显示一个“2”字,那么应当是a亮b亮g亮e亮d亮f不亮c不亮dp不亮。LED数码管有一般亮和超亮等不同之分,也有0.5寸、1寸等不同的尺寸。小尺寸
8、数码管的显示笔画常用一个发光二极管组成,而大尺寸的数码管由二个或多个发光二极管组成,一般情况下,单个发光二极管的管压降为1.8V左右,电流不超过30mA。发光二极管的阳极连接到一起连接到电源正极的称为共阳数码管,发光二极管的阴极连接到一起连接到电源负极的称为共阴数码管。常用LED数码管显示的数字和字符是0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。系统设计2.1 设计思想2.1.1 课题背景众所周知,随着科学技术的发展,以及数字电路的各种产品广泛应用,传统意义上的机械锁应用领域有限,且方便性不高。由于其构造简单,多数采用物理性结构且多数有常识的人对其构造了如指掌,安全性不高。
9、相对机械锁,电子密码锁其保密性高,使用灵活性好,安全系数高,可实时改变其密码,使用极其方便,在当今社会得到了极其广泛的应用,也将是未来发展的趋势。本设计使用EDA设计,使设计过程得到高度自动化,其具有强大的设计、测试、仿真分析、管理等功能。使用EDA环境完成电路的系统综合设计和仿真。在数字信息技术高速发展的今天,越来越多的地方需要电子密码锁来进行信息的加密与保密,而这种功能是传统机械锁无法实现的,因此,电子密码锁的设计越来越重要。其设计直接关系到其使用的安全性,灵活性,实用性,以及用户体验。所以,在这个背景下,学会和掌握密码锁的设计是尤其重要的,而且要在这个基础上,不断提高其灵活,实用,及用户
10、体验性。2.1.2 设计目的1 .以往机械锁使用繁琐,安全性低,灵活性差,应用领域有限。而密码锁可以应用于各个领域,如电子产品的保密,系统程序的保密等各种数字信息产品的加密保密。还可通过外接物理系统,取代传统机械锁,应用于日常生活的方方面面,例如最基本的门锁。可以说电子密码锁功能强大,安全性高,灵活性强,必将是未来发展的趋势。本设计基于VerilogHDL语言来设计密码锁,可以快速、灵活地设计出符合各种要求的密码锁。2 .掌握FPGA的设计方法与应用。2.2 工作原理及系统框图1、四个键,确认键,开始复位键,解密键,更改密码键。2、密码长度为5位,设置一个初始密码88888。3、在系统上电时,
11、输入88888(数码管同步显示),按下确认键即可开锁(密码正确,LED灯亮)。4、开锁状态下,按下更改密码键即可通过4*4矩阵键盘输入新密码。5、新密码数据格式为0F6、按确认键,新密码生效。7、按下解密键,输入新密码,按下确认键可解锁。8、重复上述步骤,输入新密码,即可开锁,且密码正确情况下LED灯亮若密码不正确,则LED灯不亮,锁闭,可继续输入密码,当三次输入密码错误时蜂鸣器响予以警告。9、以上为整个系统的工作原理及状态。10、实验参考框图。输入按扭开关11、总体框图如下总体框图数码管显示电路LED灯提示电路蜂鸣器报警电路控制模块密码设置4*4矩阵键盘LED灯指示显示部分七段数码管总原理图
12、:2.3 .子模块输入输出和功能密码锁分为六个个模块:顶层模块、数码显示模块、蜂鸣器模块、控制模块、LED灯指示模块、密码输入模块。其中由顶层模块调其他分模块来实现密码锁功能。1. 顶层及控制模块clkM13.0key_GMM23.0key_QRM33.0key_JMM43.0key_RSTM53.0key_readyfiled_alarmkey_value4.0pass_leddingcenginst2实现几个模块的配合工作,它能实现对密码的设置和显示,同时在密码正确时LED灯亮,错误三次时通过蜂鸣器发出警报。2. 数码管显示模块数码管常用于电子产品的显示部分,原理简单易于实现,这里为5个密
13、码,需要5个数码管来显示。showCLKsegData_13.0segData7.0segCtl4.0segData_23.0segData_33.0segData_43.0segData_53.0inst6个输入,其中CLK为时钟信号,segData1-5为每个密码。两个输出,segCtl7.0对数码管片选,segData7.0为译码后的段控制信号。3、蜂鸣器模块蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用各类电子产品中作发声器件。如图为其原理图:speakerENACOUTCLK2inst3图1.1蜂鸣器原理图结构蜂鸣器功能实现:程序共有两个输入信号分别为ENA,clk,
14、输出为COUT,密码输入错误三次,ENA置1,COUT置1,蜂鸣器响,需要注意的是,蜂鸣器模块时钟频率不能过快。5.LED灯指示模块OUTPUTpass_ledPIN_187OUTPUTpin_namePIN_198OUTPUTpin_name3PIN_208OUTPUTpin_name4PIN_199OUTPUTpin_name5PIN_182OUTPUTpin_name6PIN_195OUTPUTpin_name7PIN_206OUTPUTpin_name8PIN_201OUTPUTpin_name9PIN_205OUTPUTpin_name10PIN_203OUTPUTpin_name1
15、1PIN_192OUTPUTpin_name12PIN_180OUTPUTpin_name13PIN_176OUTPUTpin_name14PIN_189OUTPUTpin_name15PIN_200OUTPUTpin_name17PIN_207为了显示明显,用了所有LED,给同一pass_LED信号,低电平有效。6.键盘输入模块keyboardclkoutcol3.0rstkey_value4.0inrow3.0key_flaginst4实时动态扫描,输出按键有效值key_value4.0及按,键标志位key_fla。g软件设计3.1 程序流程图和状态机程序流程图:f开始是/GM=0且、FJ
16、M_flag=1?/XQR=0且XGM_flag=1?/RST=0?Y否J状态机:3.2 程序清单(1)Dingceng模块moduledingceng(clk,key_GM,key_QR,key_JM,key_RST,key_ready,key_value,M1,M2,M3,M4,M5,filed_alarm,pass_led);inputclk;inputkey_GM,key_QR,key_JM,key_RST,key_ready;input4:0key_value;output3:0M1;output3:0M2;output3:0M3;output3:0M4;output3:0M5;ou
17、tputfiled_alarm;outputpass_led;reg3:0M1;reg3:0M2;reg3:0M3;reg3:0M4;reg3:0M5;regfiled_alarm,pass_led;regJM_flag;regGM_flag;regsign;reg2:0main_state;reg3:0Old1;reg3:0Old2;reg3:0Old3;reg3:0Old4;reg3:0Old5;/cunfangyuanshimimareg2:0Q,QQ;/jilumimsshurucishureg1:0try_times;parameterDD=3b000,RS=3b001,JM=3b0
18、10,GM=3b011,QR=3b100;always(posedgeclk)if(!key_RST)main_state=RS;elsebegincase(main_state)DD:beginif(!key_JM)main_state=JM;elseif(key_GM=0)&(JM_flag=1)beginpass_led=1;GM_flag=1;filed_alarm=0;main_state=GM;endelsemain_state=DD;endRS:beginM1=0;M2=0;M3=0;M4=0;M5=0;Old1=8;Old2=8;Old3=8;Old4=8;Old5=8;fil
19、ed_alarm=0;JM_flag=0;try_times=0;main_state=DD;pass_led=1;Q=0;QQ=0;sign=0;endJM:beginif(key_ready=1)sign=1;elseif(key_ready=0&sign=1)beginsign=0;case(Q)0:beginM1=key_value;Q=3b001;main_state=DD;end1:beginM2=key_value;Q=3b010;main_state=DD;end2:beginM3=key_value;Q=3b011;main_state=DD;end3:beginM4=key
20、_value;Q=3b100;main_state=DD;end4:beginM5=key_value;Q=3b000;main_state=QR;endendcaseendelsemain_state=JM;endGM:beginif(key_ready=1)sign=1;elseif(key_ready=0&sign=1)beginsign=0;case(QQ)0:beginM1=key_value;QQ=3b001;main_state=DD;end1:beginM2=key_value;QQ=3b010;main_state=DD;end2:beginM3=key_value;QQ=3
21、b011;main_state=DD;end3:beginM4=key_value;QQ=3b100;main_state=DD;end4:beginM5=key_value;QQ=3b000;main_state=QR;endendcaseendelsemain_state=GM;endQR:if(key_QR=0)beginif(GM_flag=1)beginOld1=M1;Old2=M2;Old3=M3;Old4=M4;Old5=M5;GM_flag=0;main_state=DD;endelseif(Old1=M1)&(Old2=M2)&(Old3=M3)&(Old4=M4)&(Old
22、5=M5)beginpass_led=0;filed_alarm=0;try_times=2b00;JM_flag=1;M1=0;M2=0;M3=0;M4=0;M5=0;main_state2b01)beginfiled_alarm=1;pass_led=1;try_times=2b00;main_state=DD;M1=0;M2=0;M3=0;M4=0;M5=0;endelsebegintry_times=try_times+2b01;pass_led=1;filed_alarm=0;main_state=DD;M1=0;M2=0;M3=0;M4=0;M5=0;endendelsemain_
23、state=QR;default:;endcaseendendmodule(2)键盘模块keyboardmodulekeyboard(clk,rst,inrow,outcol,/行输入,列读出key_value,/键值key_flag,);inputclk,rst;/时钟25mhzinput3:0inrow;output3:0outcol;output4:0key_value;outputkey_flag;regclock;/定义25时钟regkey_flag;/按键标志位regjud_flag;/按键标志位reg3:0col;/行输入扫描值reg3:0inrow_reg;/寄存扫描列值reg
24、3:0outcol_reg;/寄存扫描行值reg2:0state;/状态标志-判断是否有按键按下reg4:0key_value;/读取按键值reg19:0count;reg7:0keynum_1;/寄存扫描列值/产生25hz时钟always(posedgeclk)begincount=20d50000)beginclock=clock;count=0;end/初值0/行扫描输入值/有键按下/开始扫描/总体判断是否有按键/有按键时直接进入状态5end/通过6状态状态机完成对键盘的扫描:总确定是否有按键逐行扫描统一处理always(posedgeclock)if(rst=1)beginstate=
25、0;key_flag=1b0;endelsebegincase(state)0:begincol=4b0000;key_flag=1b0;if(inrow!=4b1111)beginstate=1;col=4b1110;endelsestate=0;按下,确定按键标志位end1:beginif(inrow!=4b1111)beginstate=5;endelsebeginstate=2;col=4b1101;endend2:beginif(inrow!=4b1111)beginstate=5;endelsebeginstate=3;col=4b1011;endend3:beginif(inro
26、w!=4b1111)beginstate=5;endelsebeginstate=4;col=4b0111;endend4:beginif(inrow!=4b1111)beginstate=5;endelsestate=0;end5:beginif(inrow!=4b1111)begininrow_reg=inrow;/保存扫描行值/读得outcol_reg=col;/保存扫描列值从0开始key_flag=1b1;/有键按下为1state=0;/连续扫描状态5直至无按键按下,endelsestate=0;endendcaseend/always(clock)beginif(keynum_1=o
27、utcol_reg,inrow_reg)begin/连续2次检测到的按键值相同,稳定jud_flag=1;endelsebeginjud_flag=0;keynum_1=outcol_reg,inrow_reg;endend/对键盘扫描结果译码得到按键数值always(posedgekey_flag)begin/if(key_flag=1b1)begincase(outcol_reg,inrow_reg)8b1110_1110:begin8b1110_1101:begin8b1110_1011:begin8b1110_0111:begin8b1101_1110:begin8b1101_1101
28、:begin8b1101_1011:begin8b1101_0111:begin8b1011_1110:begin8b1011_1101:beginkey_value=0;endkey_value=1;endkey_value=2;endkey_value=3;endkey_value=4;endkey_value=5;endkey_value=6;endkey_value=7;endkey_value=8;endkey_value=9;end8b1011_1011:beginkey_value=10;end8b1011_0111:beginkey_value=11;end8b0111_111
29、0:beginkey_value=12;end8b0111_1101:beginkey_value=13;end8b0111_1011:beginkey_value=14;end8b0111_0111:beginkey_value=15;enddefault:key_value=16;/无按键按下或无效按键组合endcaseendendassignoutcol=col;endmodule(3)显示模块showmoduleshow(CLK,5segData,segCtl,segData_1,segData_2,segData_3,segData_4,segData);inputCLK;outpu
30、treg7:0segData;outputreg4:0segCtl;input3:0segData_1;input3:0segData_2;input3:0segData_3;input3:0segData_4;input3:0segData_5;reg7:0segDataReg;/段选扫描reg4:0segCtlReg;/位选扫描reg2:0segState;/状态扫描/reg15:0cnt1ms;regclk1000Hz;always(posedgeCLK)/1msbeginif(cnt1ms=16d12500)begincnt1ms=16b0;clk1000Hz=clk1000Hz;en
31、delsecnt1ms=cnt1ms+16b1;end/always(posedgeclk1000Hz)begincase(segState)3b000:beginsegCtlReg=5b00001;segState=segState+3b001;segDataReg=segData_1;end3b001:beginsegCtlReg=5b00010;segState=segState+3b001;segDataReg=segData_2;end3b010:beginsegCtlReg=5b00100;segState=segState+3b001;/状态扫描/初值为0/扫描下一状态/段选、位
32、选同时传值segDataReg=segData_3;end3b011:beginsegCtlReg=5b01000;segState=segState+3b001;segDataReg=segData_4;end3b100:beginsegCtlReg=5b10000;segDataReg=segData_5;segState=3b000;enddefault:;endcaseend/always(posedgeCLK)beginsegCtl=segCtlReg;/位选段选同时赋值、数码管译码case(segDataReg)4d15:segData=8b1000_1110;4d14:segDa
33、ta=8b1000_0110;4d13:segData=8b1010_0001;4d12:segData=8b1100_0110;4d11:segData=8b1000_0011;4d10:segData=8b1010_0000;4d9:segData=8b1001_0000;4d8:segData=8b1000_0000;4d7:segData=8b1111_1000;4d6:segData=8b1000_0010;4d5:segData=8b1001_0010;4d4:segData=8b1001_1001;4d3:segData=8b1011_0000;4d2:segData=8b101
34、0_0100;4d1:segData=8b1111_1001;4d0:segData=8b1100_0000;default:;endcaseendendmodule(4)蜂鸣模块speakermodulespeaker(ENA,CLK2,COUT);/ENA为使能信号,CLK为时钟信号规定工作频率inputENA,CLK2;outputCOUT;regCOUT;reg20:0Clk_f;regf;always(posedgeCLK2)beginif(Clk_f=2500)beginClk_f=0;f=f;endelseClk_f=Clk_f+1;endalways(posedgeCLK2)/
35、CLK2为敏感信号beginif(ENA)/当ENA为1并且Q1小于6时执行下面的语句/ENA为0时,执行下面的语句COUT=f;elseCOUTpin-jkoe7pin-nuin.n*抬pin_nelO输入错误时Pass_LED为1,灯不亮,说明,解锁失败。当密码三次输入错误时,filed_alarm使蜂鸣器使能信号置一,COUT置一,蜂鸣器工作当ENA为1时且CLK2上升沿到来时,COUT被置1,即蜂鸣器开始发出响声蜂鸣器功能波形4.2 分析运行结果初始密码输入正确,能成功解锁,并可设置新密码;错误三次蜂鸣器报警。五.设计总结5.1 错误分析4*4键盘矩阵,其标志位与按键值产生的先后,影响
36、了赋值顺序,导致按键与赋值总是相差一个周期,原来是用电平触发的,后来用标志位及key_ready的下降沿触发,成功解决了这一问题。设计模块与程序时,要从顶层思考整个框架,但要从底层编,由简单到复杂,不能一蹴而就。主程序逻辑问题。可以说,逻辑不正确,就肯定不会正确。而编译通过及正确的逻辑,却不一定能完成想要的功能,这种错误是最难发现的,需要耐心推敲,抓住细节。试验箱一按键无效,导致程序调试一只不成功,由于不知道是按键的原因,一直查程序的正误,浪费了大量时间。说明,在软件调试和在硬件上跑完全是两码事,软件调试,仿真都没问题,但硬件上不一定能跑成功,因此一定要认真走好每一步。5.2 心得体会这次课设
37、的过程可为一波三折,经历了制定方案,编完程,效果不理想,重新设计,后发现硬件上跑的时候又不是设想的那样,再次改程序。可以说,一个好程序不是一蹴而就就能写出来的,好程序都是改出来的。经历了几次小打击之后,我结合试验箱硬件跑的效果,不断更改与调试,最终完成了要求,尽管还有很多不足之处,但,感觉很充实,很有收获。通过本设计可以学的到很多的东西,同时不仅可以巩固所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次设计,进一步加深了对EDA的了解。每一个子模块编写调试,都需要非常用心。编写过程中遇到了不少问题,通过查找相关资料,并且细心的检查,找出了错误和警告。通过这次设计使我懂得了理论与实际相结合的重要性,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,用于实践,提高自己的实际动手能力和独立思考的能力。在设计的过程难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的最知后识理我解想得说不:够好深程刻,序掌是握得改不出够牢来固的。需,要软耐心件,调信心试去效完成果。与硬件最终结果是两码事,在程序及软件调试正确的情况下,硬件跑的效果不一定正确,实践是检验真理的唯一标准!要想成功,就必须付出汗水与努力,对于编程更要有耐心!