电子密码锁.docx
《电子密码锁.docx》由会员分享,可在线阅读,更多相关《电子密码锁.docx(26页珍藏版)》请在冰点文库上搜索。
电子密码锁
绍兴文理学院
数理信息学院
课程设计报告书
题目电子密码锁设计
姓名小丢
学号
专业班级
指导教师
时间2013年1月14日
课程设计任务书
班级
姓名
题目
电子密码锁设计
技术参数、设计要求、
检测数据等
在EDA实验箱上利用FPGA、4*4键盘及数码管实现电子密码锁,功能要求如下:
●模拟实现电子密码锁的开锁、解锁、改密码等基本功能
●实现万能密码功能
●当用户密码连续3次输入错误时,报警并锁定键盘
●当用户密码输入时间超过一定值(如30秒)时,提示超时
●在密码设置状态下输入密码时,所输入数字在数码管显示;其余状态下,所输密码在对应数码管上以特殊字符屏蔽显示
设计进度安排或工作计划
2013.1.4~2013.1.4:
任务分配,熟悉课题,查询相关资料,出方案初稿。
2013.1.5~2013.1.5:
方案交流并定稿,划分设计模块,课程设计开展。
2013.1.6~2013.1.7:
各模块设计实现及调试、验证。
(其中8、9号暂停)
2013.1.10~2013.1.13:
设计整体实现、调试及验证,并开始撰写报告。
2013.1.14~2013.1.15:
设计完成,课程设计报告撰写并定稿,上交。
其它
认真阅读EDA技术课程设计报告撰写规范;课题小组经协商好要指定组长并明确分工,形成良好团队工作氛围;基于课题基本要求,各小组课再细化、增加要求;课题小组每成员均需各自撰写一份课程设计报告。
电子密码锁设计
摘要
本文介绍了一种采用单片FPGA芯片进行电子密码锁的设计方法,主要阐述如何使用新兴的EDA器件取代传统的电子设计方法,利用FPGA的可编程性,简洁而又多变的设计方法,缩短了研发周期。
电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。
它的种类很多,有简易的电路产品,也有基于芯片的性价比较高的产品。
密码锁是以芯片为核心,通过编程来实现的,其性能和安全性已大大超过了机械锁。
[1]该电子密码锁以QuartusII软件平台完成电子密码锁的功能设计和仿真,并在FPGA芯片EP1C12Q240C8和EDAV+开发系统上进行功能验证。
结果表明,该密码锁具有高安全性、操作简单等特点。
关键词:
FPGA;EDA;VHDL;电子密码锁
目录
课程设计任务书I
摘要II
1.设计概述4
1.1设计背景4
1.2电子密码锁的发展前景4
2.设计方案5
2.1输入电路:
5
2.2控制模块电路:
6
2.3显示模块电路:
6
3.电子密码锁的实现6
3.1系统的总体原理图6
3.2系统各模块的实现6
4.设计验证10
4.1软件仿真10
4.2硬件验证11
5.总结12
参考文献12
附录源码13
1.设计概述
1.1设计背景
随着电子技术的发展,具有防盗报警功能的电子密码锁越来越受到人们的青睐,用其代替密码量少、安全性差的机械密码锁已是必然趋势。
电子密码锁与普通机械锁相比,具有无可比拟的优越性,如保密性好、防盗性强、可以不用钥匙记住密码即可开锁等。
目前使用的密码锁大部分是基于单片机技术,以单片机为主要器件,以软件的方式生成编码器和解码器。
而在实际应用中,由于程序容易跑飞,使得系统的可靠性较差。
基于FPGA器件的电子密码锁,所有算法完全由硬件电路实现,使得系统的可靠性大为提高。
[2]
1.2电子密码锁的发展前景
在当今社会中,人们对于隐私的保护和对物品安全的重视程度与日俱增。
因此,使用了现代电子技术的电子密码锁便有了广泛的应用前景。
电子密码锁与普通机械密码锁相比,具有无可比拟的优越性,如保密性好,防盗性强,可以不用钥匙记住密码即开锁等,密码锁的主要功能是用来对某些操作进行加密保护,目的是避免无权人员使用,它的实际应用十分广泛,例如门卡系统,自动售货机,银行自动柜员机或者保险柜中都含有这种密码锁,本次所设计的电子密码锁,能够实现该四位十进制并行密码保护,当输入的密码与锁内密码一致时,绿灯亮,开锁;当输入的密码与锁内的密码不一致时,红灯亮,不能开锁。
密码锁的密码可由用户自行设置,并可在LED数码管显示屏上显示所输入的密码。
为人们的财产、信息安全提供了可靠地保障。
[3]
2.设计方案
图2-1方案一系统框图
2.1输入电路:
作为电子密码锁的输入模块,课题选用的方案有按键来控制输入和触摸式键盘输入等多种。
本实验主要采用8*4矩阵键盘作为输入电路。
其主要分为以下三大模块:
(1)时序产生模块:
对主时钟进行分频,提供各模块的时钟信号。
(2)按键去抖模块:
防止机械按键抖动引起误判。
(3)键盘扫描模块:
判断键盘输入的按键键值。
2.2控制模块电路:
(1)预置密码寄存器:
将密码设置模式下输入的密码值保存。
(2)比较模块:
将密码输入模式下输入的密码与预置密码比较,判断正误。
如果错误三次则进入报警模式。
(3)万能密码:
避免忘记密码引起的诸多麻烦。
2.3显示模块电路:
电子密码锁的显示模块电路可采用LED数码管显示和液晶屏显示两种,因液晶显示屏成本高,适应能力差,所以采用LED数码管显示。
(1)显示密码:
在密码设置模式下显示密码数值。
(2)屏蔽密码显示:
在密码输入状态下屏蔽密码显示,以防密码泄露。
根据以上选定的输入设备与显示器件,并考虑现实各项密码锁功能的具体需求,与系统设计的要求,系统设计采用自顶向下的设计方案。
3.电子密码锁的实现
3.1系统的总体原理图
图3-1系统总体原理图
系统的总体框图由FPGA作为中心控制模块,时钟输入与键盘扫描输入作为信号输入,LED显示模块和报警模块作为输出。
FPGA芯片采用Cyclone公司的EP1C12Q240C8作为主控模块。
3.2系统各模块的实现
电子密码锁主要有输入电路模块、控制电路模块、显示电路模块和报警电路模块四个模块。
由于显示模块比较简单,重点介绍输入电路、控制电路和报警电路。
3.2.1时钟输入模块
系统采用1kHz时钟作为主频。
因键盘扫描模块的扫描频率不宜过高,且LED显示模块为动态扫描,因此采用1kHz时钟作为系统主时钟。
3.2.2键盘扫描模块
该系统的键盘输入模块为8*4矩阵键盘,该模块又划分为时钟产生模块、键盘消抖模块、键盘扫描模块三部分。
(1)时钟产生模块。
该时钟即为系统主时钟1kHz,通过该时钟的上升沿产生键盘扫描所需的时钟。
(2)键盘消抖模块。
键盘消抖模块是键盘扫描中比较关键的部分。
通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。
因而在闭合及断开的瞬间均伴随有一连串的抖动,而这种会影响键盘扫描模块。
[4]如果不作消抖处理,在键盘抖动期间获取键值,则会造成键值的错误或丢失,影响系统的稳定性。
图3-2按键抖动波形图[4]
键盘消抖分为硬件消抖和软件消抖,由于硬件消抖在开发板中难以实现的局限性,该系统采用的键盘消抖方式为软件消抖:
根据系统时钟1kHz且通常的键盘抖动时间为10毫秒左右,所以在程序中连续采样十次均为同一键值时,判定按下的按键已通过抖动时间,即键值已经稳定,这时采样的键值便为正确键值。
(3)键盘扫描模块。
键盘输入模块采用的是8*4矩阵键盘。
该矩阵键盘行数为8,列数为4,且行扫描信号通过译码芯片74HC138接入信号Sel3~Sel0。
通过给Sel3~Sel0赋值“000”~“111”,行信号将依次产生“11111110”~“01111111”,由于列引脚通过5k的电阻上拉且矩阵键盘列信号和行信号的“线与”,当行信号为低电平且该行有按键按下时,按键所在的列信号将被拉为低电平,该信号输入FPGA控制模块,由核心控制模块获取列信号的值,即可判断矩阵键盘被按下的键值,从而将数据发送LED显示模块进行显示。
由于使用电子密码锁所需的按键为数不多,因此只需按键“0”到按键“F”,和功能按键“Ctrl”、“Esc”和“Enter”即可。
扫描输出信号Sel3~Sel0的值及相应列信号返回值对应的键值如下表所示。
表3-1矩阵键盘键值表[5]
Sel3~Sel0
Keyin3~Keyin0
键值
000
1110
0
1101
6
1011
None
0111
CTRL
001
1110
1
1101
7
1011
None
0111
None
010
1110
2
1101
None
1011
C
0111
None
011
1110
3
1101
None
1011
D
0111
None
100
1110
None
1101
8
1011
E
0111
None
101
1110
ESC
1101
9
1011
F
0111
None
110
1110
4
1101
A
1011
None
0111
None
111
1110
5
1101
B
1011
ENTER
0111
None
矩阵键盘功能键相应功能如下表所示:
表3-2功能键功能表
键值
功能
ESC
清除输入或上锁
CTRL
设置密码
ENTER
完成密码输入
3.2.3FPGA控制模块
系统的核心部分FPGA模块接收系统信号输入,处理接收数据,并为系统外设输出信号。
其中的关键部分是处理接受数据。
该系统围绕有限状态机(FSM)进行设计,采用的有限状态机类型为Mealy型状态机,状态的切换不仅与当前状态有关,并与输入信号有关。
下面列出了各状态的名称以及特性。
(1)密码输入状态:
当前状态为密码输入状态,由矩阵键盘中“0~F”为键值的按键进行输入,输入过程中可按下“ESC”键进行清除。
输入完成后按下“ENTER”键进行输入操作的完成,然后由FPGA判断密码输入是否正确。
(2)密码设置状态:
当前状态为密码设置状态。
在密码输入状态下按下“CTRL”进入该状态,同样由矩阵键盘中“0~F”为键值的按键进行输入,“ESC”键进行已输入值的清除。
输入完成下按下“ENTER”键进行密码设置的完成,重新进入密码输入状态。
(3)解锁状态:
当前状态为解锁状态。
在密码输入完成后由FPGA将输入的值与密码预设值进行比较,若输入正确则进入解锁状态,若不正确则对错误次数进行计数。
解锁状态将点亮解锁指示灯。
(4)报警状态:
当前状态为报警状态。
当连续三次出现错误输入后,将进入该状态。
报警状态将驱动蜂鸣器报警,并且锁定键盘。
进入该状态后将无法进入其他状态。
3.2.4LED显示模块
显示模块采用4位共阴极数码管进行显示。
在多位LED显示时,为了简化电路,降低成本,将所有的段选线并联在一起,段选码,每送一次后延时,因为人眼视觉暂留时间100ms显示间隙不超过20ms,并保持延时一段时间,以造成视觉暂留效果,给人看上去每个数码管都在亮。
[6]
(1)密码输入状态:
在密码输入状态要求用特殊字符对密码值进行屏蔽,采用该位数码管8段全亮的方法。
(2)密码设置状态:
在密码设置状态对已输入的密码值进行显示,以免产生用户忘记密码造成诸多不便的情况。
4.设计验证
4.1软件仿真
4.1.1LED显示模块
图4-1LED显示模块仿真波形
使用QuartusII软件对LED显示模块进行时序仿真。
如图4-1所示,在每个时钟信号的上升沿,4位数码管的位选信号增加1,且数码管的段选信号为相应的数值的段码,实现了数码管的动态扫描功能。
4.1.2软件按键去抖模块
图4-2软件按键去抖模块仿真波形
图4-2为软件按键去抖模块的仿真波形。
该波形中的列选信号从高电平变为低电平的过程中产生了大约8ms的抖动。
从图中可以看出低电平计数器“Counter”在抖动期间几乎没有计数,而在抖动消失之后计数器的值到达5,系统此时取走键值,即四位密码中的最高位取走键值。
从图中易观察得到仿真波形中该次按键的键值为“9”,从而赋值给“Code3”,由“Word3”显示其值。
因此可以得出结论,该软件去抖方法具有较好的效果,可以有效地去除键盘抖动。
4.1.3键盘扫描模块
图4-3键盘扫描模块仿真波形
图4-3为键盘扫描模块仿真波形。
按下对应按键,“Word3”由初始值“0”变为“8”,同时数码管的段选信号在位选信号为“011”时其值为“7F”,即共阴数码管中数值“8”的段码。
此仿真波形可证明按键按下后系统可正确获取键值并正确地显示在数码管上。
经过以上三步软件仿真,可初步证明该设计的合理性和完整性。
由于输入时间超时等功能较简单,可在硬件电路上直接验证,因此不再赘述。
但是软件仿真的成功不代表硬件电路的实现,因此在EDAV+试验箱连接硬件电路并验证实际电路的可行性。
4.2硬件验证
图4-4密码输入状态实图
图4-4为该设计的硬件验证实物图。
经验证和调试,该设计完成了电子密码锁的开锁、解锁、改密码等基本功能。
当用户密码连续三次输入错误时,蜂鸣器报警并且锁定键盘。
超时功能为在密码输入或设置密码状态下5秒无输入动作时,超时提示灯亮。
万能密码为“FFFF”,该功能亦实现。
在密码设置状态下显示密码值,在密码输入状态下用数码管八段全亮屏蔽密码,即如上图所示。
经过验证,证明该设计较好地完成了设计的要求。
5.总结
这次EDA技术课程设计历时两个星期,课程设计的过程中不算艰辛,不过碰到的问题也是不少的。
首先是查找资料的过程,平时我们都习惯于直接在网上查找资料。
但是网上的资料良莠不齐,难以辨别资料的好坏,因此选择在图书馆查找资料和在维普网查找专业人士发表的期刊。
我主要负责程序的编写,在编程的过程中也是碰到了不少问题,比如矩阵键盘的扫描问题,VHDL的所有进程是并发进程,因此在控制其时序方面不如C语言那样简明和易于控制。
这点是值得我们学习的,控制系统的复杂性和全局性也有利于编程能力的提升。
同时也感谢指导老师的不吝指导,帮助我们分析和解决问题,在此过程中收益颇丰,让我懂得了分析问题的循序渐进是很重要的。
当碰到问题时不应该盲目尝试各种方法解决问题,而是应该理性分析然后选择最优方案。
总之这次课程设计让我的研究能力又有了提高,是非常有益的。
参考文献
[1]薛明明.VHDL设计电子密码锁[J].吉林省教育学院学报.2012,28(10):
148-150
[2]曹昕燕.EDA技术实验与课程设计[M].第一版.北京:
清华大学出版社,2006.117-119
[3]李秀霞.电子系统EDA设计实训[M].第一版.北京.北京航空航天大学出版社,2011.237-260
[4]bankrate1.按键消抖[EB/OL].
GWcoUtp7AQig1QexDEmTqzGJ5j4P2rAhSxpH8sYEDkS1xjUjzLG5NSCx28wA3upq,2014.1.7
[5]邹其洪.EDA技术实验教程[M].第一版.北京:
中国电力出版社,2009.117-119
[6]李珍.基于FPGA的可靠性电子密码锁设计[J].现代电子技术.2013,36(7):
151-153
附录源码
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityLockis
port(Clock:
instd_logic;--MainClockInput:
1KHz
Column:
instd_logic_vector(3downto0);--MatrixKeyboardInput
LEDSegment:
outstd_logic_vector(7downto0);--LEDSegmentSelection
Sel:
bufferstd_logic_vector(2downto0):
="000";--LEDPositionSelectionandKeyPosition
Alarm,LED,NoticeLED:
outstd_logic:
='0';--WrongCodeInputWarningandUnlockSignal
Word0,Word1,Word2,Word3:
outintegerrange0to30;
Counter:
outintegerrange0to50000
);
endentityLock;
architecturebhvofLockis
TypeFSM_TypeDefis(
InputState3,InputState2,InputState1,InputState0,InputStateDone,
SetState0,SetState1,SetState2,SetState3,SetStateDone,
UnlockState,WarningState);--FSMDefinition
signalState:
FSM_TypeDef:
=InputState3;
signalSet0,Set1,Set2,Set3:
integerrange0to30:
=15;--PreSetCode:
"FFFF"
signalCode0,Code1,Code2,Code3:
integerrange0to30:
=0;--CodeInput
signalShow0,Show1,Show2,Show3:
integerrange0to30;--NumbersUsedtoDisplay
signalDivCounter:
integerrange0to500:
=0;--CounterUsedtoFrequenceDivision
signalKeyCounter:
integerrange0to50000:
=0;--CounterUsedtoClearKeyboardTrembling
signalKeyValue:
integerrange0to30;--KeyValuereturned
signalErrorCounter:
integerrange0to3:
=0;--ErrorTimesCounter
signalEClock:
std_logic;
signalLoose:
std_logic_vector(7downto0);--SignalUsedtoJudgeKeyLoosenornot
signalNoticeCounter:
integerrange0to5000:
=0;--InputOvertimeCounter
functionDecode(signalx:
inintegerrange0to30)--LEDDecodeFunction
returnstd_logic_vectoris
begin
casexis
when0=>returnx"3f";
when1=>returnx"06";
when2=>returnx"5b";
when3=>returnx"4f";
when4=>returnx"66";
when5=>returnx"6d";
when6=>returnx"7d";
when7=>returnx"07";
when8=>returnx"7f";
when9=>returnx"6f";
when10=>returnx"77";
when11=>returnx"7c";
when12=>returnx"39";
when13=>returnx"5e";
when14=>returnx"79";
when15=>returnx"71";
when20=>returnx"40";
when30=>returnx"ff";
when25=>returnx"00";
whenothers=>returnx"40";
endcase;
endfunction;
BEGIN
----Assignments----
Alarm<='1'whenState=WarningStateelse
'0';
LED<='1'whenState=UnlockStateelse
'0';
Show0<=20when(((State=SetState0orState=InputState0)andEClock='1')orState=UnlockState)else
Set0when(State=SetState3orState=SetState2orState=SetState1orState=SetStateDone)else
30when(State=WarningStateorState=InputState3orState=InputState2orState=InputState1orState=InputStateDone)else
25when((State=SetState0orState=InputState0)andEClock='0')else
20;-----UnlockStateandWarningState
Show1<=20when(((State=SetState1orState=InputState1)andEClock='1')orState=UnlockState)else
Set1when(State=SetState3orState=SetState2orState=SetState0orState=SetStateDone)else
30when(State=WarningStateorState=InputState3orState=InputState2orState=InputState0orState=InputStateDone)else
25when((State=SetState1orState=InputState1)andEClock='0')else
20;
Show2<=20when(((State=SetState2orState=InputState2)andEClock='1')orState=UnlockState)else
Set2when(State=SetState3orState=SetState0orState=SetState1orState=SetStateDone)else
30when(Stat