EDA电子密码锁课程设计样本Word文档格式.docx
《EDA电子密码锁课程设计样本Word文档格式.docx》由会员分享,可在线阅读,更多相关《EDA电子密码锁课程设计样本Word文档格式.docx(29页珍藏版)》请在冰豆网上搜索。
矩阵式键盘是一种常用输入装置,在寻常生活中,矩阵式键盘在计算机、电话、手机、微波炉等各式电子产品上已经被广泛应用。
图1-2是一种3×
4矩阵式键盘面板配备图,其中数字0~9作为密码数字输入按键。
图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密码锁整体组装设计原理图
三、系统扩展思路
(1)本系统基本达到作为数字密码锁绝大某些功能,但尚有许多局限性或需完善地方。
例如说采用4×
4通用机械键盘受到键盘数量限制,在很大限度上限制了其功能扩展。
(2)设计外围电路:
系统用方波信号源,直流工作电源。
(3)可规定设计制作整个系统,涉及PCB制作。
四、实验收获
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力重要环节,是对学生实际工作能力详细训练和考察过程。
随着科学技术发展日新月异,FPGA已经成为当今计算机应用中空前活跃领域,在生活中可以说无处不在。
因而作为21世纪大学来说掌握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):
="
01111000"
;
signalclk_100k:
std_logic;
signalclkout:
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"
3a"
33"
34"
35"
36"
);
constantdata_buf0:
data_buffer:
=(x"
20"
bb"
aa"
,--华科武昌分校80
bf"
c6"
ce"
e4"
b2"
fd"
,x"
b7"
d6"
d0"
a3"
);
constantdata_buf1:
b5"
e7"
,--电子密码锁90
d7"
d3"
c3"
dc"
c2"
eb"
cb"
f8"
constantdata_buf2:
c7"
ca"
c8"
,--请输入密码:
88
constantdata_buf3:
d8"
,--重新输入
constantdata_buf4:
bd"
e2"
,x"
b3"
c9"
,--解锁成功
b9"
a6"
constantdata_buf5:
=(x"
,--进入死锁状态
c0"
b4"
cc"
ac"
constantdata_buf6:
,--
21"
begin
--U1:
divclk1portmap(clk,clk_100k);
process(clk)
variablecnt:
integerrange0todivide_to_100k;
if(clk'
eventandclk='
1'
)thencnt:
=cnt+1;
if(cnt=divide_to_100k)thencnt:
=0;
endif;
if(cnt<
divide_to_100k/2)thenclk_100k<
='
0'
elseclk_100k<
endprocess;
div_1Hz:
process(clk)
variablecnttemp:
integerrange0to49999999;
begin
ifclk='
andclk'
eventthen
ifcnttemp=49999999thencnttemp:
else
ifcnttemp<
25000000thenclkout<
elseclkout<
cnttemp:
=cnttemp+1;
endprocessdiv_1Hz;
disp_time(7)<
=DATAIN(3downto0)+x"
30"
disp_time(6)<
=DATAIN(7downto4)+x"
disp_time(5)<
=DATAIN(11downto8)+x"
disp_time(4)<
=DATAIN(15downto12)+x"
disp_time(3)<
=DATAIN(19downto16)+x"
;
disp_time
(2)<
=DATAIN(23downto20)+x"
disp_time
(1)<
=DATAIN(27downto24)+x"
disp_time(0)<
=DATAIN(31downto28)+x"
read_time:
process(time)
endprocess;
process(clk_100k)
variablecnt1:
integerrange0to10000;
variablecnt_1:
integerrange0to1000;
variablecode_cnt:
integerrange0to13;
variabledata_cnt:
integerrange0to480;
if(clk_100k'
eventandclk_100k='
)then
casecurrent_sis
whens0=>
rw<
rs<
e<
cnt1:
=cnt1+1;
ifcnt1<
500thenlcd_rst<
elsifcnt1<
1000thenlcd_rst<
elsifcnt1=1000then
lcd_rst<
current_s<
=s1;
whens1=>
cnt_1:
=cnt_1+1;
ifcnt_1<
1*3thene<
elsifcnt_1<
2*3thenlcd_data<
=x"
0c"
10*3thene<
elsifcnt_1=10*3thencnt_1:
=s2;
whens2=>
90"
=s3;
whens3=>
=data_buf1(data_cnt);
elsifcnt_1=2*3thendata_cnt:
=data_cnt+1;
100thene<
cnt_1:
ifcnt_1=100thencnt_1:
ifdata_cnt=16thencurrent_s<
=s4;
data_cnt:
whens4=>
88"
=s5;
whens5=>
=data_buf2(data_cnt);
=s6;
whens6=>
80"
=s7;
whens7=>
=data_buf0(data_cnt);
=s8;
--动态显示
whens8=>
9a"
=s9;
whens9=>
=disp_time(data_cnt);
ifdata_cnt=8thencurrent_s<
=s10;
endif;
--------------------------------------------------------------
whens10=>
ifdin<
=10then
=s11;
elsecurrent_s<
=s12;
whens11=>
=data_buf4(data_cnt);
=s0;
whens12=>
=s13;
whens13=>
=data_buf3(data_cnt);
=s14;
whens14=>
98"
elsifcnt_1=10*3