EDA电子密码锁课程设计 2.docx
《EDA电子密码锁课程设计 2.docx》由会员分享,可在线阅读,更多相关《EDA电子密码锁课程设计 2.docx(31页珍藏版)》请在冰豆网上搜索。
![EDA电子密码锁课程设计 2.docx](https://file1.bdocx.com/fileroot1/2023-1/5/5296517f-6110-42fd-909b-73702a9f463b/5296517f-6110-42fd-909b-73702a9f463b1.gif)
EDA电子密码锁课程设计2
概述
在当今社会中,人们对于隐私的保护和对物品安全的重视程度与日俱增。
因此,使用了现代电子技术的电子密码锁便有了广泛的应用前景。
本次所设计的电子密码锁,能够实现该六位十进制并行密码保护,当输入的密码与锁内密码一致时,绿灯亮,开锁;当输入的密码与锁内的密码不一致时,红灯亮,不能开锁。
密码锁的密码可由用户自行设置,并可在液晶显示屏上显示所输入的密码。
为人们的财产、信息安全提供了可靠地保障。
本次设计基于VHDL语言,对并行六位电子密码锁进行设计,并对设计过程进行了详细描述。
采用VHDL语言进行电子密码锁的设计可使设计工作简洁直观,快速实现既定功能。
电子密码锁在对财产安全保护等方面都有着重要作用,应用前景非常广泛。
开锁代码为六位十进制数,当输入代码的位数和位值与锁内给定的密码一致,且按规定程序开锁时,方可开锁,并点亮开锁指示灯。
否则,系统进入“错误”状态,并发出报警信号。
开锁程序由设计者确定,并要求锁内给定的密码是可调的,且预置方便,保密性好。
并行数字锁的报警方式是点亮指示灯,并使喇叭鸣叫来报警,直到按下复位开关,报警才停止。
此时,数字锁又自动进入等待下一次开锁的状态。
一、设计主要内容
1、密码锁串行输入几位十进制数字口令
2、输入口令全部正确即开锁并有绿灯显示
3、口令输入最大次数3次,要求在完全输入六位之后进行判断口令正确与否;输入3次之后还不能开锁,进入死锁状态并报警
4、有相应的显示功能
5、开锁后能再次上锁
二、系统设计方案
作为通用电子密码锁,主要由三个部分组成:
数字密码输入电路、密码锁控制电路和密码锁显示电路。
(1)密码锁输入电路包括时序产生电路、键盘扫描电路、键盘译码电路等几个小的功能电路。
(2)密码锁控制电路包括按键数据的缓冲存储电路,密码的清除、存储、激活电锁电路(寄存器清除信号发生电路),密码核对(数值比较电路),解锁电路(开/关门锁电路)等几个小的功能电路。
(3)密码显示电路主要是在液晶显示屏显示输入的数值。
2.1密码锁输入电路的设计
是电子密码锁的输入电路框图,由键盘扫描电路、弹跳消除电路、键盘译码电路、按键数据缓存器,加上外接的一个4×4矩阵式键盘组成。
7
9
8
按键数据
键盘输入
4
6
5
工作时钟脉冲信号
键盘扫描信号
弹跳消除电路
键盘译码电路
按键数据缓存器
0
3
2
1
键盘扫描电路
图1-1密码锁的输入电路框图
1.矩阵式键盘的工作原理
KC1
KC2
矩阵式键盘是一种常见的输入装置,在日常的生活中,矩阵式键盘在计算机、电话、手机、微波炉等各式电子产品上已经被广泛应用。
图1-2是一个3×4矩阵式键盘的面板配置图,其中数字0~9作为密码数字输入按键。
KC0
KR0(11)
KR1(10)
KR2(01)
KR3(00)
0111
1011
1101
1110
3
0
2
1
6
5
4
7
9
8
图1-24×4矩阵式键盘的面板配置
2.2密码锁输入电路各主要功能模块的设计
1)时序产生电路
本时序产生电路中使用了三种不同频率的工作脉冲波形:
系统时钟脉冲(它是系统内部所有时钟脉冲的源头,且其频率最高)、弹跳消除取样信号、键盘扫描信号。
2)键盘扫描电路
扫描电路的作用是用来提供键盘扫描信号的,扫描信号变化的顺序依次为1110-1101-1011-0111-1110......依序地周而复始。
3)弹跳消除电路
由于本设计中采用的矩阵式键盘是机械开关结构,因此在开关切换的瞬间会在接触点出现信号来回弹跳的现象,对于电子密码锁这种灵敏度较高的电路这种弹跳将很可能会造成误动作输入,从而影响到密码锁操作的正确性。
从图1-3中可以观察出弹跳现象产生的原因,虽然只是按下按键一次然后放掉,然而实际产生的按键信号却不止跳动一次,经过取样信号的检查后,将会造成误判断,以为键盘按了两次。
如果调整抽样频率(如图4.5所示),可以发现弹跳现象获得了改善。
图1-3弹跳现象产生错误的抽样结果
图1-4调整抽样频率后得到的抽样结果
4)键盘译码电路
上述键盘中的按键可分为数字按键和文字按键,每一个按键可能负责不同的功能,例如清除数码、退位、激活电锁、开锁等。
5)按键存储电路
因为每次扫描会产生新的按键数据,可能会覆盖前面的数据,所以需要一个按键存储电路,将整个键盘扫描完毕后的结果记录下来。
按键存储电路可以使用移位寄存器构成。
图1-5输入电路仿真波形图
2.3密码锁控制电路的设计
密码锁的控制电路是整个电路的控制中心,主要完成对数字按键输入和功能按键输入的响应控制。
1.数字按键输入的响应控制
(1)如果按下数字键,第一个数字会从显示器的最右端开始显示,此后每新按一个数字时,显示器上的数字必须左移一格,以便将新的数字显示出来。
(2)假如要更改输入的数字,可以按倒退按键来清除前一个输入的数字,或者按清除键清除所有输入的数字,再重新输入六位数。
(3)由于这里设计的是一个六位的电子密码锁,所以当输入的数字键超过四个时,电路不予理会,而且不再显示第六个以后的数字。
2.4功能按键输入的响应控制
(1)清除键:
清除所有的输入数字,即做归零动作。
(2)激活电锁键:
按下此键时可将密码锁的门上锁。
(上锁前必须预先设定一个六位的数字密码。
)
(3)解除电锁键:
按下此键会检查输入的密码是否正确,若密码正确无误则开门。
输入文字模式
开始输入六位数字,在输入过程中可能用到删除键
上锁工作模式
密码锁激活上锁
开锁工作模式
检查输入的密码是否有效
核对输入的密码是否有效
都正确后解除电锁
图1-5电子密码锁的三种模式及关系
2.5密码锁显示电路的设计
密码锁显示电路的设计比较复杂,这里直接采用12864液晶屏进行显示。
2.6密码锁的整体组装设计
将前面各个设计好的功能模块进行整合,可得到一个完整的电子密码锁系统的整体组装设计原理图,如图1-6所示。
图1-6密码锁的整体组装设计原理图
3、系统扩展思路
(1)本系统基本达到作为数字密码锁的绝大部分功能,但还有许多不足或需完善的地方。
比如说采用4×4的通用机械键盘受到键盘数量的限制,在很大的程度上限制了其功能的扩展。
(2)设计外围电路:
系统用方波信号源,直流工作电源。
(3)可要求设计制作整个系统,包括PCB的制作。
4、实验收获
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。
随着科学技术发展的日新月异,FPGA已经成为当今计算机应用中空前活跃的领域,在生活中可以说无处不在。
因此作为二十一世纪的大学来说掌握eda的开发技术是十分必要的。
回顾此次课程设计,我感慨颇多,的确,从理论到实践,在很长的一段时间里,可以说是苦多于甜,但确实学到了很多东西,不仅可以巩固以前学到的知识,还学到许多没学过的知识。
通过此次课程设计,使我了解了理论与实际结合的重要性,只有理论知识是远远不够的。
在设计的过程中,发现自己以前学习的知识理解不够深刻,掌握不够牢固等等。
通过这次课设之后,一定要把以前学习的知识温故知新。
这次的课设终于完成,通过老师的细心讲解,我解决了很多问题。
在这里,感谢老师的细心指导。
同时对于帮助我的同学,也表示衷心感谢。
附录
1、液晶显示程序
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useIEEE.STD_LOGIC_ARITH.ALL;
entityclock_lcd_dispis
generic(divide_to_100k:
integer:
=500);
port(clk:
instd_logic;
DATAIN:
instd_logic_vector(31downto0);
din:
inINTEGERRANGE15DOWNTO0;
rw,rs,e,lcd_rst:
outstd_logic;
lcd_data:
outstd_logic_vector(7downto0));
endclock_lcd_disp;
architecturetclofclock_lcd_dispis
signalmima:
std_logic_vector(31downto0):
="00010010001101000101011001111000";
signalclk_100k:
std_logic;
signalclkout:
std_logic;
signaltemp:
std_logic_vector(7downto0);
typestateis(s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16,s17,s18,s19,s20,s21,s22,s23,s24,s25,s26,s27,s28,s29,s30,s31);
signalcurrent_s:
state;
typedata_bufferisarray(0to15)ofstd_logic_vector(7downto0);
typedata_buffer1isarray(0to7)ofstd_logic_vector(7downto0);
signaltime:
std_logic_vector(23downto0);
signaldisp_time:
data_buffer1:
=(
x"31",x"32",x"3a",x"33",
x"34",x"3a",x"35",x"36");
constantdata_buf0:
data_buffer:
=(x"20",x"20",x"bb",x"aa",--湘潭大学80
x"bf",x"c6",x"ce",x"e4",
x"b2",x"fd",x"b7",x"d6",
x"d0",x"a3",x"20",x"20");
constantdata_buf1:
data_buffer:
=(x"20",x"20",x"b5",x"e7",--电子密码锁90
x"d7",x"d3",x"c3",x"dc",
x"c2",x"eb",x"cb",x"f8",
x"20",x"20",x"20",x"20");
constantdata_buf2:
data_buffer:
=(x"20",x"20",x"c7",x"eb",
x"ca",x"e4",x"c8",x"eb",--请输入密码:
88
x"c3",x"dc",x"c2",x"eb",
x"3a",x"20",x"20",x"20");
constantdata_buf3:
data_buffer:
=(x"20",x"20",x"d6",x"d8",
x"d0",x"c2",x"ca",x"e4",--重新输入
x"c8",x"eb",x"20",x"20",
x"20",x"20",x"20",x"20");
constantdata_buf4:
data_buffer:
=(x"20",x"20",x"bd",x"e2",x"cb",x"f8",x"b3",x"c9",--解锁成功
x"b9",x"a6",x"20",x"20",
x"20",x"20",x"20",x"20");
constantdata_buf5:
data_buffer:
=(x"20",x"20",--进入死锁状态
x"bd",x"f8",x"c8",x"eb",
x"cb",x"c0",x"cb",x"f8",
x"d7",x"b4",x"cc",x"ac",
x"20",x"20");
constantdata_buf6:
data_buffer:
=(x"20",x"20",x"bd",x"e2",--
x"cb",x"f8",x"b3",x"c9",
x"b9",x"a6",x"21",x"20",
x"20",x"20",x"20",x"20");
begin
--U1:
divclk1portmap(clk,clk_100k);
process(clk)
variablecnt:
integerrange0todivide_to_100k;
begin
if(clk'eventandclk='1')thencnt:
=cnt+1;
if(cnt=divide_to_100k)thencnt:
=0;
endif;
if(cntelseclk_100k<='1';
endif;
endif;
endprocess;
div_1Hz:
process(clk)
variablecnttemp:
integerrange0to49999999;
begin
ifclk='1'andclk'eventthen
ifcnttemp=49999999thencnttemp:
=0;
else
ifcnttemp<25000000thenclkout<='1';
elseclkout<='0';
endif;
cnttemp:
=cnttemp+1;
endif;
endif;
endprocessdiv_1Hz;
disp_time(7)<=DATAIN(3downto0)+x"30";
disp_time(6)<=DATAIN(7downto4)+x"30";
disp_time(5)<=DATAIN(11downto8)+x"30";
disp_time(4)<=DATAIN(15downto12)+x"30";
disp_time(3)<=DATAIN(19downto16)+x"30";
disp_time
(2)<=DATAIN(23downto20)+x"30";
disp_time
(1)<=DATAIN(27downto24)+x"30";
disp_time(0)<=DATAIN(31downto28)+x"30";
read_time:
process(time)
begin
endprocess;
process(clk_100k)
variablecnt1:
integerrange0to10000;
variablecnt_1:
integerrange0to1000;
variablecode_cnt:
integerrange0to13;
variabledata_cnt:
integerrange0to480;
begin
if(clk_100k'eventandclk_100k='1')then
casecurrent_sis
whens0=>rw<='1';rs<='1';e<='1';cnt1:
=cnt1+1;
ifcnt1<500thenlcd_rst<='0';
elsifcnt1<1000thenlcd_rst<='1';
elsifcnt1=1000then
lcd_rst<='1';cnt1:
=0;current_s<=s1;
endif;
whens1=>cnt_1:
=cnt_1+1;
ifcnt_1<1*3thene<='1';rs<='0';rw<='0';
elsifcnt_1<2*3thenlcd_data<=x"0c";
elsifcnt_1<10*3thene<='0';
elsifcnt_1=10*3thencnt_1:
=0;current_s<=s2;
endif;
whens2=>cnt_1:
=cnt_1+1;
ifcnt_1<1*3thene<='1';rs<='0';rw<='0';
elsifcnt_1<2*3thenlcd_data<=x"90";
elsifcnt_1<10*3thene<='0';
elsifcnt_1=10*3thencnt_1:
=0;current_s<=s3;
endif;
whens3=>
ifcnt_1<1*3thene<='1';rs<='1';rw<='0';
elsifcnt_1<2*3thenlcd_data<=data_buf1(data_cnt);
elsifcnt_1=2*3thendata_cnt:
=data_cnt+1;
elsifcnt_1<100thene<='0';
endif;
cnt_1:
=cnt_1+1;
ifcnt_1=100thencnt_1:
=0;
ifdata_cnt=16thencurrent_s<=s4;
data_cnt:
=0;
endif;
endif;
whens4=>cnt_1:
=cnt_1+1;
ifcnt_1<1*3thene<='1';rs<='0';rw<='0';
elsifcnt_1<2*3thenlcd_data<=x"88";
elsifcnt_1<10*3thene<='0';
elsifcnt_1=10*3thencnt_1:
=0;current_s<=s5;
endif;
whens5=>
ifcnt_1<1*3thene<='1';rs<='1';rw<='0';
elsifcnt_1<2*3thenlcd_data<=data_buf2(data_cnt);
elsifcnt_1=2*3thendata_cnt:
=data_cnt+1;
elsifcnt_1<100thene<='0';
endif;
cnt_1:
=cnt_1+1;
ifcnt_1=100thencnt_1:
=0;
ifdata_cnt=16thencurrent_s<=s6;
data_cnt:
=0;
endif;
endif;
whens6=>cnt_1:
=cnt_1+1;
ifcnt_1<1*3thene<='1';rs<='0';rw<='0';
elsifcnt_1<2*3thenlcd_data<=x"80";
elsifcnt_1<10*3thene<='0';
elsifcnt_1=10*3thencnt_1:
=0;current_s<=s7;
endif;
whens7=>
ifcnt_1<1*3thene<='1';rs<='1';rw<='0';
elsifcnt_1<2*3thenlcd_data<=data_buf0(data_cnt);
elsifcnt_1=2*3thendata_cnt:
=data_cnt+1;
elsifcnt_1<100thene<='0';
endif;
cnt_1:
=cnt_1+1;
ifcnt_1=100thencnt_1:
=0;
ifdata_cnt=16thencurrent_s<=s8;
data_cnt:
=0;
endif;
endif;
--动态显示
whens8=>cnt_1:
=cnt_1+1;
ifcnt_1<1*3thene<='1';rs<='0';rw<='0';
elsifcnt_1<2*3thenlcd_data<=x"9a";
elsifcnt_1<10*3thene<='0';
elsifcnt_1=10*3thencnt_1:
=0;current_s<=s9;
endif;
whens9=>
ifcnt_1<1*3thene<='1';rs<='1';rw<='0';
elsifcnt_1<2*3thenlcd_data<=disp_time(data_cnt);
elsifcnt_1=2*3thendata_cnt:
=data_cnt+1;
elsifcnt_1<100thene<='0';
endif;
cnt_1:
=cnt_1+1;
ifcnt_1=100thencnt_1:
=0;
ifdata_cnt=8thencurrent_s<=s10;
data_cnt:
=0;
endif;
endif;
--------------------------------------------------------------
whens10=>cnt_1:
=cnt_1+1;
ifdin<=10then
ifcnt_1<1*3thene<='1';rs<='0';rw<='0';
elsifcnt_1<2*3thenlcd_data<=x"88";
elsifcnt_1<10*3thene<='0';
elsifcnt_1=10*3thencnt_1:
=0;current_s<=s11;
endif;
elsecurrent_s<=s12;
endif;
whens11=>
ifcnt_1<1*3thene<='1';rs<='1';rw<='0';
elsifcnt_1<2*3thenlcd_data<=data_buf4(data_cnt);
elsifcnt_1=2*3thendata_cnt:
=data_cnt+1;
elsifcnt_1<100thene<='0';
endif;
cnt_1:
=cnt_1+1;
ifcnt_1=100thencnt_1:
=0;
ifdata_cnt=8thencurrent_s<=s0;
data_cnt:
=0;
endif;
endif;
whens12=>cnt_1:
=cnt_1+1;
ifcnt_1<1*3thene<='1';rs<='0';rw<='0';
elsifcnt_1<2*3thenlcd_data<=x"88";
elsifcnt_1<10*3thene<='0';
elsifcnt_1=10*3thencnt_1:
=0;current_s<=s13;
endif;
w