FPGA基于verilog HDL的密码锁_第1页
FPGA基于verilog HDL的密码锁_第2页
FPGA基于verilog HDL的密码锁_第3页
FPGA基于verilog HDL的密码锁_第4页
FPGA基于verilog HDL的密码锁_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

1、EDA课程设计课设名称: 密码锁课设日期: 2014.6.237.5姓 名:陈飞学 号:110250101哈尔滨工业大学(威海)信电学院电子信息工程2014.6一. 所用软件与硬件介绍1.1所用软件介绍QuartusII是Altera公司的综合性PLD/FPGA开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware Description Language)等多种设计输入形式,内嵌的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。 QuartusII可以在XP、Linux以及Unix上使用,除了可以使用TCL脚本完成设计流程外,提供

2、了完善的用户图形界面设计方式。具有运行速度快,界面统一,功能集中,易学易用等特点。 QuartusII支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三方EDA工具。 此外,QuartusII 通过和DSP Builder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。 Ma

3、xplus II 作为Altera的上一代PLD设计软件,由于其出色的易用性而得到了广泛的应用。目前Altera已经停止了对MaxplusII 的更新支持,QuartusII 与之相比不仅仅是支持器件类型的丰富和图形界面的改变。Altera在QuartusII 中包含了许多诸如SignalTapII、Chip Editor和RTL Viewer的设计辅助工具,集成了SOPC和HardCopy设计流程,并且继承了MaxplusII 友好的图形界面及简便的使用方法。1.2所用硬件介绍硬件的总体设计:FPGA数码管显示外部时钟声音报警键盘矩阵控制温度传感器故由上图,将整个硬件电路部分主要分成五个部分

4、,即:FPGA电路设计,数码管显示驱动电路设计,温度传感器电路设计,报警电路设计,键盘矩阵控制电路设计。I.FPGA芯片的介绍在本次课程设计中选用Altera公司Cyclone II系列FPGA器件。Altera公司2004年推出了新款Cyclone II系列FPGA器件。Cyclone II FPGA的成本比第一代Cyclone器件低30%,逻辑容量大了三倍多,可满足低成本大批量应用需求。随着低复杂度FPGA器件成本的不断下降,具有灵活性和及时面市优势的FPGA与 ASIC相比更有竞争性,在数字消费市场上的应用也急剧增加。第一代Cyclone系列迄今发售了3百多万片,在全球拥有3,000多位

5、客户,对大批量低成本数字消费市场有着巨大的影响,该市场消纳了三分之一的器件。同时,Cyclone II器件系列也在电信、计算机外设、工业和汽车市场上获得了巨大的进步。Cyclone II器件包含了许多新的特性,如嵌入存储器、嵌入乘法器、PLL和低成本的封装,这些都为诸如视频显示、数字电视(DTV)、机顶盒(STB)、DVD播放器、DSL调制解调器、家用网关和中低端路由器等批量应用进行了优化。Cyclone II器件采用TSMC90nm低K绝缘材料工艺技术,这种技术结合Altera低成本的设计方式,使之能够在更低的成本下制造出更大容量的器件。这种新的器件比第一代Cyclone产品具有两倍多的I/

6、O引脚,且对可编程逻辑,存储块和其它特性进行了最优的组合,具有许多新的增强特性低成本的配置器件编辑Altera为配置Cyclone II FPGA提供了低成本的串行配置器件。这些串行配置器件定价为批量应用,成本是相应Cyclone II FPGA的10%。四个串行配置器件(1Mbit,4Mbit,16Mbit和64Mbit)提供了节省空间的8脚和16脚SOIC封装。器件中任何不用于配置的存储器可用于一般存储,进一步增强其价值。IP编辑Altera也为Cylcone II器件客户提供了40多个可定制IP核,Altera和Altera Megafunction伙伴计划(AMPPSM)合作者提供的不

7、同的IP核是专为Cyclone II架构优化的,包括:Nios II嵌入式处理器;DDR SDRAM控制器;FFT/IFFT;PCI编译器;FIR编译器;NCO编译器;POS-PHY编译器;Reed Solomon编译器;Viterbi编译器等等。II.数码管显示器液晶显示器按其功能可分为三类,笔段式液晶显示器,字符点阵式液晶显示器和图形点阵式液晶显示器。前两种可以显示数字,字符,符号等。而图形点阵式液晶显示器还可以显示汉子和任意图形,达到图文并茂的鲜果。在本课程设计中,受到试验箱的限制,在这里使用的是基本的数码管显示。当数码管特定的段加上电压后,这些特定的段就会发亮,以形成我们眼睛看到的字样

8、了。如:显示一个“2”字,那么应当是a亮b亮g亮e亮d亮f不亮c不亮dp不亮。LED数码管有一般亮和超亮等不同之分,也有0.5寸、1寸等不同的尺寸。小尺寸数码管的显示笔画常用一个发光二极管组成,而大尺寸的数码管由二个或多个发光二极管组成,一般情况下,单个发光二极管的管压降为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. 以往机械锁使用繁琐,安全性低,灵活性差,应用领域有限。而密码锁可以应用于各个领域,如电子产品的保密,系统程序的保密等各种数字信息产品的加密保密。还可通过外接物理系统,取代传统机械锁,应用于日常生活的方方面面,例如最基本的门锁。可以说电子密码锁功能强大,安全性高,灵活性强,必将是未来发展的趋势。 本设计基于Verilog HDL语言来设计密码锁,可以快速、灵活地设计出符合各种要求的密码锁。 2.掌握FPG

11、A的设计方法与应用。2.2工作原理及系统框图1、四个键,确认键,开始复位键,解密键,更改密码键。2、密码长度为5位,设置一个初始密码88888。3、在系统上电时,输入88888(数码管同步显示),按下确认键即可开锁(密码正确,LED灯亮)。4、开锁状态下,按下更改密码键即可通过4*4矩阵键盘输入新密码。5、新密码数据格式为0F6、按确认键,新密码生效。7、按下解密键,输入新密码,按下确认键可解锁。8、重复上述步骤,输入新密码,即可开锁,且密码正确情况下LED灯亮若密码不正确,则LED灯不亮,锁闭,可继续输入密码,当三次输入密码错误时蜂鸣器响予以警告。9、以上为整个系统的工作原理及状态。10、实

12、验参考框图。LED灯提示电路蜂鸣器报警电路输入按扭开关输入锁存电路密码存储电路开锁控制电路数码管显示电路11、总体框图如下 总体框图控制模块密码设置4*4矩阵键盘 调用部分顶层模块 报警部分蜂鸣器LED灯指示显示部分七段数码管总原理图:2.3.子模块输入输出和功能 密码锁分为六个个模块:顶层模块、数码显示模块、蜂鸣器模块、控制模块、LED灯指示模块、密码输入模块。其中由顶层模块调其他分模块来实现密码锁功能。1. 顶层及控制模块 实现几个模块的配合工作,它能实现对密码的设置和显示,同时在密码正确时LED灯亮,错误三次时通过蜂鸣器发出警报。2. 数码管显示模块数码管常用于电子产品的显示部分,原理简

13、单易于实现,这里为5个密码,需要5个数码管来显示。 6个输入,其中CLK为时钟信号,segData1-5为每个密码。两个输出,segCtl7.0 对数码管片选,segData7.0为译码后的段控制信号。3、蜂鸣器模块蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用各类电子产品中作发声器件。如图为其原理图: 图 1.1 蜂鸣器原理图结构蜂鸣器功能实现:程序共有两个输入信号分别为ENA,clk,输出为COUT,密码输入错误三次,ENA置1,COUT置1,蜂鸣器响,需要注意的是,蜂鸣器模块时钟频率不能过快。 5.LED灯指示模块 为了显示明显,用了所有LED,给同一pass_LED信号

14、,低电平有效。6.键盘输入模块 实时动态扫描,输出按键有效值key_value4.0,及按键标志位key_flag。三软件设计3.1程序流程图和状态机程序流程图:状态机: 3.2程序清单(1)Dingceng模块 module dingceng(clk,key_GM,key_QR,key_JM,key_RST,key_ready,key_value,M1,M2,M3,M4,M5,filed_alarm,pass_led);input clk;input key_GM,key_QR,key_JM,key_RST,key_ready;input 4:0 key_value;output 3:0 M

15、1;output 3:0 M2;output 3:0 M3;output 3:0 M4;output 3:0 M5;output filed_alarm;output pass_led;reg 3:0 M1;reg 3:0 M2;reg 3:0 M3;reg 3:0 M4;reg 3:0 M5;reg filed_alarm,pass_led;reg JM_flag;reg GM_flag;reg sign;reg 2:0 main_state;reg 3:0 Old1;reg 3:0 Old2;reg 3:0 Old3;reg 3:0 Old4;reg 3:0 Old5; /cun fang

16、 yuan shi mi mareg 2:0 Q,QQ;/ji lu mi ms shu ru ci shureg 1:0 try_times;parameter DD=3b000, RS=3b001, JM=3b010, GM=3b011, QR=3b100;always(posedge clk ) if(!key_RST) main_state=RS; else begin case(main_state) DD: begin if(!key_JM) main_state=JM; else if(key_GM=0)&(JM_flag=1) begin pass_led=1; GM_flag

17、=1; filed_alarm=0; main_state=GM; end else main_state=DD; end RS: begin M1=0;M2=0;M3=0;M4=0;M5=0; Old1=8;Old2=8;Old3=8;Old4=8;Old5=8; filed_alarm=0; JM_flag=0; try_times=0; main_state=DD; pass_led=1;Q=0; QQ=0; sign=0; end JM: begin if(key_ready=1) sign=1; elseif(key_ready=0 & sign=1)begin sign=0;cas

18、e(Q) 0:begin M1=key_value;Q=3b001; main_state=DD;end 1:begin M2=key_value;Q=3b010; main_state=DD;end 2:begin M3=key_value;Q=3b011; main_state=DD;end 3:begin M4=key_value;Q=3b100; main_state=DD;end 4:begin M5=key_value;Q=3b000; main_state=QR;end endcase end else main_state=JM; end GM: begin if(key_re

19、ady=1) sign=1; elseif(key_ready=0 & sign=1)begin sign=0;case(QQ) 0:begin M1=key_value;QQ=3b001; main_state=DD;end 1:begin M2=key_value;QQ=3b010; main_state=DD;end 2:begin M3=key_value;QQ=3b011; main_state=DD;end 3:begin M4=key_value;QQ=3b100; main_state=DD;end 4:begin M5=key_value;QQ=3b000; main_sta

20、te=QR;end endcase end else main_state=GM; end QR: if(key_QR=0) begin if(GM_flag=1) begin Old1=M1; Old2=M2; Old3=M3; Old4=M4; Old5=M5; GM_flag=0; main_state=DD; end else if(Old1=M1)&(Old2=M2)&(Old3=M3)&(Old4=M4)&(Old5=M5) begin pass_led=0; filed_alarm=0; try_times=2b00; JM_flag=1; M1=0;M2=0;M3=0;M4=0

21、;M5=0; main_state2b01) begin filed_alarm=1; pass_led=1; try_times=2b00; main_state=DD; M1=0;M2=0;M3=0;M4=0;M5=0; end else begin try_times=try_times+2b01; pass_led=1; filed_alarm=0; main_state=DD; M1=0;M2=0;M3=0;M4=0;M5=0; end end else main_state=QR; default:; endcase end endmodule (2)键盘模块keyboardmod

22、ule keyboard(clk,rst,inrow,outcol,/行输入,列读出key_value,/键值key_flag,);input clk,rst; /时钟25mhzinput 3:0 inrow; output 3:0 outcol; output 4:0 key_value; output key_flag; reg clock; /定义25时钟reg key_flag; /按键标志位reg jud_flag; /按键标志位reg 3:0 col; /行输入扫描值reg 3:0 inrow_reg; /寄存扫描列值reg 3:0 outcol_reg; /寄存扫描行值reg 2

23、:0 state; /状态标志-判断是否有按键按下reg 4:0 key_value; /读取按键值reg 19:0 count;reg 7:0 keynum_1; /寄存扫描列值/产生25hz时钟always(posedge clk) begin count=20d50000) begin clock=clock; count逐行扫描统一处理always(posedge clock)if(rst=1)beginstate=0; key_flag=1b0;endelsebegincase(state)0: /初值0begincol=4b0000; /行扫描输入值key_flag=1b0;if(

24、inrow!=4b1111) /有键按下beginstate=1;col=4b1110; /开始扫描endelse state=0; /总体判断是否有按键按下,确定按键标志位end1:beginif(inrow!=4b1111)beginstate=5; /有按键时直接进入状态5end elsebeginstate=2;col=4b1101;endend2:beginif(inrow!=4b1111)beginstate=5;end elsebeginstate=3;col=4b1011;endend3:beginif(inrow!=4b1111)beginstate=5;end elsebe

25、ginstate=4;col=4b0111;endend4: beginif(inrow!=4b1111)beginstate=5;endelse state=0;end5:beginif(inrow!=4b1111)begininrow_reg=inrow; /保存扫描行值 /读得outcol_reg=col; /保存扫描列值key_flag=1b1; /有键按下为1state=0; /连续扫描状态5直至无按键按下,从0开始endelse state=0;endendcaseend /always(clock)beginif (keynum_1 = outcol_reg,inrow_reg)

26、 begin /连续2次检测到的按键值相同,稳定jud_flag=1; end else beginjud_flag=0;keynum_1=outcol_reg,inrow_reg; endend/对键盘扫描结果译码得到按键数值always(posedge key_flag)begin / if(key_flag=1b1) begincase(outcol_reg,inrow_reg) 8b1110_1110:begin key_value=0;end 8b1110_1101:begin key_value=1;end 8b1110_1011:begin key_value=2;end 8b1

27、110_0111:begin key_value=3;end 8b1101_1110:begin key_value=4;end 8b1101_1101:begin key_value=5;end 8b1101_1011:begin key_value=6;end 8b1101_0111:begin key_value=7;end 8b1011_1110:begin key_value=8;end 8b1011_1101:begin key_value=9;end 8b1011_1011:begin key_value=10;end 8b1011_0111:begin key_value=11

28、;end 8b0111_1110:begin key_value=12;end 8b0111_1101:begin key_value=13;end 8b0111_1011:begin key_value=14;end 8b0111_0111:begin key_value=15;end default: key_value = 16; /无按键按下或无效按键组合endcase endendassign outcol=col;endmodule(3)显示模块showmodule show( CLK, segData,segCtl,segData_1,segData_2,segData_3,se

29、gData_4,segData_5);input CLK;output reg 7:0segData;output reg 4:0segCtl;input 3:0segData_1;input 3:0segData_2;input 3:0segData_3;input 3:0segData_4;input 3:0segData_5;reg 7:0segDataReg; /段选扫描reg 4:0segCtlReg; /位选扫描reg 2:0segState; /状态扫描/reg 15:0cnt1ms;reg clk1000Hz;always(posedge CLK) /1ms begin if(

30、cnt1ms=16d12500) begin cnt1ms=16b0; clk1000Hz=clk1000Hz; end else cnt1ms=cnt1ms+16b1; end /always(posedge clk1000Hz) /状态扫描 begin case(segState) /初值为0 3b000: beginsegCtlReg=5b00001;segState=segState+3b001; /扫描下一状态segDataReg=segData_1; /段选、位选同时传值 end 3b001: beginsegCtlReg=5b00010;segState=segState+3b0

31、01;segDataReg=segData_2; end 3b010: beginsegCtlReg=5b00100;segState=segState+3b001;segDataReg=segData_3; end 3b011: beginsegCtlReg=5b01000;segState=segState+3b001;segDataReg=segData_4; end 3b100: beginsegCtlReg=5b10000;segDataReg=segData_5;segState=3b000; end default:;endcase end/always(posedge CLK)

32、 beginsegCtl=segCtlReg; /位选段选同时赋值、数码管译码 case(segDataReg) 4d15:segData=8b1000_1110; 4d14:segData=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=

33、8b1000_0010; 4d5:segData=8b1001_0010; 4d4:segData=8b1001_1001; 4d3:segData=8b1011_0000; 4d2:segData=8b1010_0100; 4d1:segData=8b1111_1001; 4d0:segData=8b1100_0000; default:;endcase endendmodule(4)蜂鸣模块speakermodule speaker(ENA,CLK2,COUT); /ENA为使能信号,CLK为时钟信号规定工作频率input ENA,CLK2;output COUT;reg COUT;reg 20:0 Clk_f;reg f;always(posedge CLK2) begin if(Clk_f=2500) begin Clk_f=0; f=f; end else Clk_f=Clk_f+1; endalways(posedge CLK2 ) /CLK2为敏感信号begin if(ENA) /当ENA为1并且Q1小于6时执行下面的语句 /ENA为0时,执行下面的

温馨提示

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

评论

0/150

提交评论