EDA电子密码锁.docx
《EDA电子密码锁.docx》由会员分享,可在线阅读,更多相关《EDA电子密码锁.docx(24页珍藏版)》请在冰豆网上搜索。
EDA电子密码锁
EDA电子密码锁
电子密码锁
设计要求
1)设计一个密码锁的控制电路,当输入正确代码时,输出开锁信号以推动执行机构工作,用红灯亮、绿灯熄灭表示关锁,用绿灯亮、红灯熄灭表示开锁;
2)在锁的控制电路中储存一个可以修改的4位代码,当开锁按钮开关(可设置成6位至8位,其中实际有效为4位,其余为虚设)的输入代码等于储存代码时,开锁;
3)从第一个按钮触动后的5秒内若未将锁打开,则电路自动复位并进入自锁状态,使之无法再打开,并由扬声器发出持续20秒的报警信号。
1、方案论证与对比
1.1方案一
方案一是用以AT89C2051为核心的单片机控制方案。
共设了9个用户输入键,其中只有4个是有效的密码按键,其它的都是干扰按键,若按下干扰键,键盘输入电路自动清零,原先输入的密码无效,需要重新输入;如果用户输入密码的时间超过40秒(一般情况下,用户不会超过40秒,若用户觉得不便,还可以修改)电路将报警80秒,若电路连续报警三次,电路将锁定键盘5分钟,防止他人的非法操作。
设计方框图如图1所示。
1.2方案二
图4密码锁顶层文件原理图
3.2密码输入模块
1、本按键输入模块包括设置密码并读取、密码清零、输入密码、系统复位功能。
该模块中我们设置了8个按键,各个按键的功能分别为:
按键1、2、3、4、5、6分别对应6位二进制密码输入、键7为密码清零按键、键8为系统复位和密码读取按键。
2、以上各子模块的设计均采用VHDL语言实现,其具体实现程序如下:
LibraryIEEE;
useIEEE.std_logic_1164.all;
useIEEE.std_logic_unsigned.all;
entitykeyis
port(key_in1,key_in2,key_in3,key_in4,key_in5,key_in6:
instd_logic;
clk:
instd_logic;
str:
instd_logic;
resert:
instd_logic;
clk20:
instd_logic;
ds:
instd_logic;
key_out:
outstd_logic_vector(5downto0);
key_read:
outstd_logic;
key_resert:
outstd_logic;
key_r:
outstd_logic);
endkey;
architecturekey_mimaofkeyis
图5密码输入模块
signalm:
std_logic_vector(5downto0);
signalsa:
std_logic_vector(5downto0);
signaldd:
std_logic:
='0';
signaldd1:
std_logic;
signalcount:
std_logic_vector(3downto0);
signalcount2:
std_logic_vector(3downto0);
signalcount3:
std_logic_vector(3downto0);
begin
c0:
process(resert,key_in1,key_in2,key_in3,key_in4,key_in5,key_in6)
begin
ifresert='1'thendd<='0';--全部清零
elseifkey_in1='1'orkey_in2='1'orkey_in3='1'orkey_in4='1'orkey_in5='1'orkey_in6='1'
thendd<='1';endif;endif;--只要有键按下,dd将为高电平不变
key_r<=dd;
endprocessc0;
cc:
process(key_in5,key_in6,clk,resert)
begin
ifclk'eventandclk='1'then
ifds='1'
then--保持ds='1',持续5秒高电平5秒后产生低电平,第5秒为低电平
--按下键八5秒后读取密码
ifcount<6then
key_read<='0';count<=count+1;elsecount<=count;
endif;
ifcount=5thenkey_read<='1';endif;
elsecount<="0000";key_read<='0';
endif;
endif;
endprocesscc;
cc2:
process(key_in1,key_in2,clk,resert)
begin
ifclk'eventandclk='1'then
ifds='1'
then--保持ds='1',持续3秒高电平3秒后产生低电平,第3秒为低电平
--按下按下键八三秒后对错误复位
ifcount2<4then
key_resert<='0';count2<=count2+1;elsecount2<=count2;
endif;
ifcount2=3thenkey_resert<='1';endif;
elsecount2<="0000";key_resert<='0';
endif;
endif;
endprocesscc2;
c1:
process(key_in1,str,sa)--按键1输入
begin
ifstr='1'orsa(0)='1'thenm(0)<='0';else
ifkey_in1'eventandkey_in1='1'thenm(0)<=notm(0);endif;
endif;
endprocessc1;
c2:
process(key_in2,str,sa)--按键2输入
begin
ifstr='1'orsa
(1)='1'thenm
(1)<='0';else
ifkey_in2'eventandkey_in2='1'thenm
(1)<=notm
(1);endif;
endif;
endprocessc2;
c3:
process(key_in3,str,sa)--按键3输入
begin
ifstr='1'orsa
(2)='1'thenm
(2)<='0';else
ifkey_in3'eventandkey_in3='1'thenm
(2)<=notm
(2);endif;
endif;
endprocessc3;
c4:
process(key_in4,str,sa)--按键4输入
begin
ifstr='1'orsa(3)='1'thenm(3)<='0';else
ifkey_in4'eventandkey_in4='1'thenm(3)<=notm(3);endif;
endif;
endprocessc4;
c5:
process(key_in5,str,sa)--按键5输入
begin
ifstr='1'orsa(4)='1'thenm(4)<='0';else
ifkey_in5'eventandkey_in5='1'thenm(4)<=notm(4);endif;
endif;
endprocessc5;
c6:
process(key_in6,str,sa)--按键6输入
begin
ifstr='1'orsa(5)='1'thenm(5)<='0';else
ifkey_in6'eventandkey_in6='1'thenm(5)<=notm(5);endif;
endif;
endprocessc6;
v22:
process(resert,clk20)
begin
ifclk20'eventandclk20='1'then
ifresert='1'then
ifcount3=7thencount3<=count3;else
count3<=count3+1;sa<="000000";
ifcount3=5thensa<="111111";elsesa<="000000";endif;
endif;
elsecount3<="0000";
endif;endif;
endprocessv22;
key_out<=mand(notsa);
endkey_mima;
3.3显示模块
1、本设计要求输入正确密码时,绿灯亮、红灯熄灭;当输入错误密码时,5S后红灯亮绿灯灭,同时要求发出20S的报警。
为此我们设计发光二极管D7和D8分别表示红灯和绿灯,并用蜂鸣器作为报警电路。
2、LED显示电路的VHDL程序如下:
LibraryIEEE;
useIEEE.std_logic_1164.all;
useIEEE.std_logic_unsigned.all;
entityledis
port(r:
instd_logic;
str:
instd_logic;
str5:
instd_logic;
ar:
outstd_logic);
endled;
architectureled_mimaofledis
signals1:
std_logic:
='0';
begin
b1:
process(str,r,str5)
begin
ifstr='0'then
ifr'eventandr='1'thenifstr5='1'thens1<='1';endif;endif;
elses1<='0';
endif;
endprocessb1;
ar<=s1;
endled_mima;
3、报警电路程序设计如下:
LibraryIEEE;
useIEEE.std_logic_1164.all;
useIEEE.std_logic_unsigned.all;
entitysoundis
port(str:
instd_logic;
图7报警模块
clk:
instd_logic;
sound_out:
outstd_logic);
endsound;
architecturexd_soundofsoundis
signalss:
std_logic;
begin
process(str,clk)--产生20报警电路,需要str为高电平20秒
begin
ifstr='1'then
ss<=clk;
elsess<='0';
endif;
sound_out<=ss;
endprocess;
endxd_sound;
3.4延时模块
1、针对本设计中要求的输入错误密码后5S报错和20S报警,我们设计了5S和20S的两个延时模块。
2、延时5S程序设计
LibraryIEEE;
useIEEE.std_logic_1164.all;
useIEEE.std_logic_unsigned.all;
entitymcis
port(str:
instd_logic;
图8延时5秒模块
clk:
instd_logic;
key_out:
outstd_logic);
endmc;
architecturemc_mimaofmcis
signalcount:
std_logic_vector(3downto0);
begin
process(str,clk)
begin
ifclk'eventandclk='1'then
ifstr='1'then--保持str为15秒高电平5秒后产生低电平,第6秒为低电平
ifcount<6thenkey_out<='1';
count<=count+1;elsecount<=count;
endif;
ifcount=5thenkey_out<='0';endif;
elsecount<="0000";key_out<='0';
endif;
endif;
endprocess;
endmc_mima;
3、延时20S程序如下:
LibraryIEEE;
useIEEE.std_logic_1164.all;
useIEEE.std_logic_unsigned.all;
entitym20is
port(str:
instd_logic;
clk:
instd_logic;
key_out:
outstd_logic);
endm20;
architecturem20_mimaofm20is
signalcount:
std_logic_vector(4downto0);
begin
process(str,clk)
begin
ifclk'eventandclk='1'then
ifstr='1'then--保持str为120秒高电平20秒后产生低电平,第21秒为低电平
ifcount<21thenkey_out<='1';
count<=count+1;elsecount<=count;
endif;
ifcount=20thenkey_out<='0';endif;
elsecount<="00000";key_out<='0';
endif;
endif;
endprocess;
endm20_mima;
3.5设置密码以及验证模块
1、中要求密码可以设置,为了更清晰的了解密码,我们除了设计密码设置键外,还设置了数码管显示设置好的密码。
该模块采用VHDL语言设计而成。
2、设置密码输入程序如下:
LibraryIEEE;
useIEEE.std_logic_1164.all;
useIEEE.std_logic_unsigned.all;
entityledwis
port(ee:
instd_logic;
tr:
instd_logic;
tr5:
instd_logic;
aw:
outstd_logic);
图10密码及验证模块
endledw;
architectureledw_mimaofledwis
signals1:
std_logic:
='0';
begin
process(str,ee,str5)
begin
ifstr='0'then
ifstr5'eventandstr5='0'then
ifee='0'then
s1<='1';
endif;
endif;
elses1<='0';endif;
endprocess;
aw<=s1;
endledw_mima;
3、密码校对电路程序设计如下:
LibraryIEEE;
useIEEE.std_logic_1164.all;
useIEEE.std_logic_unsigned.all;
entityxdis--密码校对
port(str:
instd_logic;
a:
instd_logic_vector(5downto0);
b:
instd_logic_vector(5downto0);
key_out:
outstd_logic);
endxd;
architecturexd_mimaofxdis
signalss:
std_logic:
='0';
begin
process(a(0),a
(1),a
(2),a(3),a(4),a(5),str)
begin
ifstr='1'then
ifa=bthen
ss<='1';
elsess<='0';endif;
elsess<='0';endif;
key_out<=ss;
endprocess;
endxd_mima;
4.系统仿真
将程序下载Cyclone系列芯片中,同时在EDA试验箱上进行硬件验证。
本文提出的电子密码锁由于采用VHDL语言设计,用一片FPGA实现,因而体积小,功耗低,稍加修改就可以改变密码的位数和输入密码的次数,具有较好的应用前景。
但由于结构还比较简单,有待进一步完善。
1)密码锁输入模块的仿真,如图12所示。
图12密码锁输入模块仿真
2)电子密码锁整个系统的仿真如图13:
图13电子密码锁整个电路系统仿真图
5.硬件测试
1)仿真波形正确后,便可进行下载;
2)选择GW48系列EDA试验开发系统;
3)使用Cyclone系列芯片EP1C6Q240C8;
4)先进行引脚锁定,具体引脚锁定如图14;
5)选择模式3;
6)选择好硬件和模式后就可以下载都EDA实验箱;
图14密码锁引脚锁定
6.结束语
通过两星期的紧张工作,最后完成了我的设计任务——基于VHDL语言的智能密码锁设计。
通过本次课程设计的学习,我深深的体会到设计课的重要性和目的性所在。
本次设计课不仅仅培养了我们实际操作能力,也培养了我们灵活运用课本知识,理论联系实际,独立自主的进行设计的能力。
它不仅仅是一个学习新知识新方法的好机会,同时也是对我所学知识的一次综合的检验和复习,使我明白了自己的缺陷所在,从而查漏补缺。
希望学校以后多安排一些类似的实践环
附录
主控制程序参考如下:
LIBRARYieee;
USEieee.std_logic_1164.all;
LIBRARYwork;
ENTITYlockIS
port(str:
INSTD_LOGIC;
clk20:
INSTD_LOGIC;
clk1:
INSTD_LOGIC;
ds:
INSTD_LOGIC;
key:
INSTD_LOGIC_VECTOR(5downto0);
green:
OUTSTD_LOGIC;
red:
OUTSTD_LOGIC;
sound:
OUTSTD_LOGIC;
xianshi:
OUTSTD_LOGIC;
key_read:
OUTSTD_LOGIC;
display:
OUTSTD_LOGIC_VECTOR(5downto0);
key_tell:
OUTSTD_LOGIC_VECTOR(5downto0));
ENDlock;
ARCHITECTUREbdf_typeOFlockIS
componentled
PORT(r:
INSTD_LOGIC;
str:
INSTD_LOGIC;
str5:
INSTD_LOGIC;
ar:
OUTSTD_LOGIC);
endcomponent;
componentsound
PORT(str:
INSTD_LOGIC;
clk:
INSTD_LOGIC;
sound_out:
OUTSTD_LOGIC);
endcomponent;
componentmc
PORT(str:
INSTD_LOGIC;
clk:
INSTD_LOGIC;
key_out:
OUTSTD_LOGIC);
endcomponent;
componentxd
PORT(str:
INSTD_LOGIC;
a:
INSTD_LOGIC_VECTOR(5downto0);
b:
INSTD_LOGIC_VECTOR(5downto0);
key_out:
OUTSTD_LOGIC);
endcomponent;
componentmima
PORT(clk_mima:
INSTD_LOGIC;
key:
INSTD_LOGIC_VECTOR(5downto0);
mima_out:
OUTSTD_LOGIC_VECTOR(5downto0));
endcomponent;
componentm20
PORT(str:
INSTD_LOGIC;
clk:
INSTD_LOGIC;
key_out:
OUTSTD_LOGIC);
endcomponent;
componentkey
PORT(key_in1:
INSTD_LOGIC;
key_in2:
INSTD_LOGIC;
key_in3:
INSTD_LOGIC;
key_in4:
INSTD_LOGIC;
key_in5:
INSTD_LOGIC;
key_in6:
INSTD_LOGIC;
clk:
INSTD_LOGIC;
str:
INSTD_LOGIC;
resert:
INSTD_LOGIC;
clk20:
INSTD_LOGIC;
ds:
INSTD_LOGIC;
key_read:
OUTSTD_LOGIC;
key_resert:
OUTSTD_LOGIC;
key_r:
OUTSTD_LOGIC;
key_out:
OUTSTD_LOGIC_VECTOR(5downto0));
endcomponent;
componentledw
PORT(ee:
INSTD_LOGIC;
str:
INSTD_LOGIC;
str5:
INSTD_LOGIC;
aw:
OUTSTD_LOGIC);
endcomponent;
signala:
STD_LOGIC_VECTOR(5downto0);
signalb:
STD_LOGIC_VECTOR(5downto0);
signalc:
STD_LOGIC_VECTOR(5downto0);
signalSYNTHESIZED_WIRE_0:
STD_LOGIC;
signalSYNTHESIZED_WIRE_11:
STD_LOGIC;
signalSYNTHESIZED_WIRE_2:
STD_LOGIC;
signalSYNTHESIZED_WIRE_3:
STD_LOGIC;
signalSYNTHESIZED_WIRE_5:
STD_LOGIC;
signalSYNTHESI