1目录第一章概要1.1背景简介1.2设计要求:第二章设计思路2.1端口定义2.2总体结构2.3设计方案第三章单元电路设计3.1简述3.2密码锁输入电路的设计3.3密码控制电路的设计3.3.1VHDL源程序3.3.2仿真波形3.4密码显示电路的设计3.4.1密码锁显示电路设计简介3.4.2VHDL程序第四章整体组装4.1VHDL源程序或原理图4.2整体仿真波形第五章设计体会2第一章概要1.1背景简介:数字密码锁随着电子工业的发展,数字电子技术已经深入到了人们生活的各个层面,而且各种各样的电子产品也正在日新月异地向着高精尖技术发展。由于电子产品的功能不断增加,使用也越来越方便,有些产品已经成为了人们日常生活中不可缺少的必备物品。发展历史悠久的机械式门锁,因其功能单一,安全性能较差等缺点,必将被新一代的电子门锁所代替。新颖的多功能电子门锁,集电子门锁、防盗报警器,门铃等功能于一身,而且还具有定时器呼唤,断电自动报知,显示屋内有无人和自动留言等诸多附加功能。在未来的生活中,数字密码锁必将在学领域再创新的成绩,将给我们的生活带来更大的便利,前景不可估量。1.2设计要求(1).具有密码输入功能;(2).设计一个密码锁的控制电路,当输入正确代码时,输出开锁信号以推动执行机构工作,用红灯亮、绿灯熄灭表示关锁,用绿灯亮、红灯熄灭表示开锁;(3).从第一个按钮触动后的5秒内若未将锁打开,则电路自动复位并进入自锁状态,使之无法再打开,并由扬声器发出持续20秒的报警信号。第二章设计思路2.1端口定义:输入:采样时钟clk;译码输入data[3..0];3输出:七段数码管驱动q[6..0];数值译码q1[3..0].按键指示key.2.2总体结构:(1)显示器(2)VHDL程序输入(3)FPGA芯片扬声器2.3设计方案密码锁控制器是硬件测试密码锁控制器是硬件与软件的结合。根据设计要求,决定以FPGA芯片和VHDL语言设计此电子密码锁。用一片FPGA芯片实现,从而大大简化了系统结构,降低了成本,提高了系统的保密性和可靠性。这种设计不仅简化了系统结构,降低了成本,更提高了系统的可靠性和保密性。另外,采用可编程逻辑器件开发的数字系统,方便地升级和改进。根据系统的设计要求,系统设计采用自顶向下的设计方法。顶层设计采用原理图的设计方式和系统的整体组装,分别由密码锁输入模块、密码锁控制模块和密码锁显示译码模块等部分组成。即按照这三个组成模块定义相应的芯片引脚和输入输出的参数。第三章单元电路设计3.1简述:密码锁的内部结构及主要功能密码锁的内部结构即密码锁控制器由密码锁主体部分和外部指示电路组成。其中密码锁主要作用是接收输入的密码并进行密码的验证操作;外部指示电路的主要作用是用LED数码管显示输入的密码以及根据密码验证的结果给出不同的LED指示灯和数码管显示;当连续输入三次次错误密码时,启动报警装置,报警装置则采用扬声器。密码锁控制器的主要功能有:(1)密码输入:每按下一个键,要求在数码管上显示,并依次左移。(2)密码校验:如果有按键按下,LED1亮起,直到松开该按键;用LED2指示门的状态,也就是密码校验结果,如果密码校验正确,LED2亮起,否则如果密码校验错误LED2闪烁4次,然后熄灭,表明密码错误。4(3)错误报警:密码输入连续三次错误开始报警。(4)密码修改:输入密码正确后5秒内按*号键输入要设置和更改的密码,按#号键确认密码设置与更改,连续输入两次,则密码设置成功。3.2密码锁输入电路的设计密码锁输入模块由时序产生电路、键盘扫描电路、键盘译码电路和按键存储电路组成。通过这几个部分的组成可以将键盘输入的信号有时序的扫描存储而后传入控制模块来控制密码锁的动作。因此,定义键盘按键的位置和数码的关系如下表所示:扫描000000010101101010111111输出信号001101010110001101010110001101010110001101010110按键号123456789*0#备注:扫描位置是CSR[1.0],键盘输出信号SEL[3.2.1.0],按键号即为键盘的位置密码锁输入电路仿真图如下:3.3密码锁控制器设计密码锁控制电路软键盘的实现,通常在一个键盘中使用了一个瞬时接触开关,微处理器可以容易地检测到闭合。当开关打开时,通过处理器的I/O口的一个上拉电阻提供逻辑1;当开关闭合时,处理器的I/O口的输入将被拉低得到逻辑0。53.3.1VHDL源程序libraryieee;useieee.std_logic_1164.all;entitydecoderisport(clk:instd_logic;--译码器元件声明data:instd_logic_vector(3downto0);q:outstd_logic_vector(6downto0);q1:outstd_logic_vector(3downto0));enddecoder;architecturert1ofdecoderisbeginprocess(clk,data)beginifrising_edge(clk)thencasedataiswhen0000=q=0111111;q1=0000;when0001=q=0000110;q1=0001;when0010=q=1011011;q1=0010;when0011=q=1001111;q1=0011;whenothers=NULL;endcase;endif;endprocess;endrt1;3.3.2密码锁控制模块仿真图:63.4密码显示电路的设计3.4.1密码锁显示电路设计简介七段数码管是电子开发过程中常用的输出显示设备。在本设计中使用的是8个四位一体、共阴极型七段数码管。由于七段数码管公共端连接到GND(共阴极型)当数码管的中的一个段被输入高电平,则相应的这一段被点亮。反之则不亮。共阳极性的数码管与之相反。四位一体的七段数码管在单个静态数码管的基础上加入了用于选择哪一位数码管的位选信号端口。八个数码管的a、b、c、d、e、f、g、h、dp都连在了一起,8个数码管分别由各自的位选信号来控制,被选通的数码管显示数据,其余关闭。在键盘获取到行值和列值以后,组合成一个8位的数据,根据实现不同的编码在对每个按键进行匹配,找到键值后由7段码管显示即可。3.4.2显示电路的VHDL程序如下:libraryieee;useieee.std_logic_1164.all;entityled_dispisport(datain:instd_logic_vector(3downto0);dataout:outstd_logic_vector(7downto0));endled_disp;architecturertlofled_dispisbeginprocess(datain)begincasedatainiswhen1010=dataout=11000000;--0when0001=dataout=11111001;--1when0010=dataout=10100100;--27when0011=dataout=10110000;--3when0100=dataout=10011001;--4when0101=dataout=10010010;--5when0110=dataout=10000010;--6when0111=dataout=11111000;--7when1000=dataout=10000000;--8when1001=dataout=10010000;--9whenothers=null;endcase;endprocess;endrtl;第四章整体组装4.1密码锁整体原理图VHDL源程序:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;8entityexp19isport(Clk:instd_logic;--时钟信号Rst:instd_logic;--复位信号Kr:instd_logic_vector(3downto0);--键盘行Kc:bufferstd_logic_vector(3downto0);--键盘列SPK:outstd_logic;--扬声器输出KEY_State:outstd_logic;--按键指示Display:outstd_logic_vector(7downto0);--七段码管显示SEG_SEL:bufferstd_logic_vector(2downto0));--七段码管片选endexp19;architecturebehaveofexp19issignalkeyr,keyc:std_logic_vector(3downto0);signalkcount:std_logic_vector(2downto0);signalkflag1,kflag2:std_logic;signalbuff1,buff2,buff3,buff4,buff5,buff6:integerrange0to15;signalpush_num:integerrange0to15;--按键次数signalDisp_Temp:integerrange0to15;signalDisp_Decode:std_logic_vector(7downto0);signalSEC1,SEC10:integerrange0to9;signalClk_Count1:std_logic_vector(3downto0);--1KHz时钟分频计数器signalClk_Count2:std_logic_vector(9downto0);--2Hz时钟分频计数器signalClk1KHz:std_logic;signalClk2Hz:std_logic;signalClk1Hz:std_logic;signalError_Num:integerrange0to3;signalError_Flag:std_logic;signalError_Count:std_logic_vector(2downto0);signalMusic_Count:std_logic_vector(2downto0);beginprocess(Clk)beginif(Clk'eventandClk='1')thenif(Clk_Count110)thenClk_Count1=Clk_Count1+1;elseClk_Count1=0001;endif;endif;endprocess;Clk1KHz=Clk_Count1(2);9process(Clk1KHz)beginif(Clk1KHz'eventandClk1KHz='1')thenif(Clk_Count21000)thenClk_Count2=Clk_Count2+1;elseClk_Count2=0000000001;endif;endif;endprocess;Clk2Hz=Clk_Count2(9);process(Clk2Hz)beginif(Clk2Hz'eventandClk2Hz='1')thenClk1Hz=notClk1Hz;endif;endprocess;process(Clk1KHz)--扫描键盘beginif(Clk1KHz'eventandClk1KHz='1')thenif(Kr=1111)thenkflag1='0';kcount=kcount+1;if(kcount=0)thenkc=1110;elsif(kcount=1)thenkc=1101;elsif(kcount=2)thenkc=1011;elsekc=0111;endif;elsekflag1='1';keyr=Kr;keyc=Kc;10endif;kfl