四位电子密码锁设计.docx
- 文档编号:3098519
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:26
- 大小:697.33KB
四位电子密码锁设计.docx
《四位电子密码锁设计.docx》由会员分享,可在线阅读,更多相关《四位电子密码锁设计.docx(26页珍藏版)》请在冰点文库上搜索。
四位电子密码锁设计
高级电子线路实验报告
题目:
基于FPGA的四位电子密码锁设计
院(系):
信息与通信学院
专业:
学生姓名:
学号:
2015年6月18日
基于FPGA的的四位电子密码锁设计
摘要
本文主要介绍了一种运用可编程逻辑器件(FPGA)技术来编程实现电子密码锁的设计方法。
在整个系统设计实现中采用FPGA器件作为控制器,继而了解密码锁系统的总体流程、各个模块的功能与接口的分配。
基于FPGA,使用VHDL语言编写模块程序,再通过QuartusII集成开发环境下进行设计、综合与仿真。
要求用VerilogHDL语言实现系统中的各个模块功能,并且能够仿真,验证本次设计四位密码锁的功能。
每按下一个数字键,就输入一个数值,并显示该数值,当按下密码更改键时会将目前的数字设定成新的密码。
当按下激活电锁键的时候可以将密码锁上锁。
当按下解除电锁键时会检查输入的密码是否正确,密码正确即开锁。
电子密码锁由键盘扫描模块、分频模块、密码计数模块、比较器模块、存储模块、显示模块和控制模块七大部分组成。
通过硬件描述,验证了整个设计的正确性以及系统的完整性。
关键词:
可编程逻辑器件;电子密码锁;硬件描述;时序仿真
引言
本设计利用QuartusⅡ工作平台硬件描述语言,设计一种电子密码锁,并通过用FPGA芯片实现。
用VHDL语言使用自顶向下的方法对系统进行了描述,并在FPGA芯片上实现。
设计充分利用了FPGA的资源可编程特性,可高效率的对系统进行升级与改进。
设计的密码锁可设置任意密码,比一般的四位密码锁具有更高的安全可靠性,因此,采用FPGA开发的数字系统,不仅具有很高的工作可靠性,其升级与改进也极其的方便,应用前景十分宽广。
随着人们生活水平的提高和安全意识的加强,对安全的要求也就越来越高,因此导致了电子行业的蓬勃发展。
随着电子技术的发展,各类电子产品应运而生,电子密码锁就是其中之一。
在安全技术防范领域,具有防盗报警功能的电子密码锁逐渐代替传统的机械式密码锁,克服了机械式密码锁密码量少、安全性能差的缺点,使密码锁无论在技术上还是在性能上都获得了大大的提高。
随着大规模集成电路技术的发展,特别是单片机的问世,出现了带微处理器的智能密码锁,它除具有电子密码锁的功能外,还引入了智能化管理、专家分析系统等功能,从而使密码锁具有很高的安全性、可靠性,应用日益广泛。
1总体方案设计
1.1方案论证
方案一:
采用数字电路控制。
利用数字逻辑电路,实现对锁的电子控制,突破了传统的机械锁的单一性、保密性低、易撬性的缺点,数字电子密码锁具有保密性高、使用灵活性好、安全系数高的优点。
虽然采用数字密码锁电路的好处是设计简单,但是由于其实纯电路实际,在系统运行时,延时会比较严重。
方案二:
通过单片机实现。
现在一种新的方案就是采用一种以AT89S51为核心的单片机控制方案。
虽然有灵活的设计和丰富的IO端口,但是单片机运行的缺点是程序运行时容易出现跑飞现象。
通过以上比较显然单片机方案有较大的活动空间,不但能实现所要求的功能,而且能在很大程度上扩大功能,并可以方便的对系统进行升级。
但是由于所学知识不能将其有效运用,现有环境不能满足,而且以单片机为核心的密码锁有一定的不足之处,在运行时会产生PC指针错误,因此提出了第三种方案。
方案三:
利用FPGA设计数字密码锁。
FPGA即现场可编程门阵列,它是在PAL、GAL、EPLD等可编程器件的基础上进一步发展的产物,是一种超大规模集成电路,具有对电路可重配置能力。
通常FPGA都有着上万次的重写次数,也就是说现在的硬件设计和软件设计一样灵活、方便。
相对于基于单片机技术的电子密码锁,用FPGA器件来构成系统,可靠性提高,并且由于FPGA具有的现场可编程功能,使得电子密码锁的更改与升级更为方便简单。
通过以上比较描述,本设计采用基于FPGA的数字密码设计方案。
1.2基于FPGA的数字密码锁系统流程图
根据所要实现的数字密码锁的功能,设计出所要完成的的系统流程,系统设计的流程图如3.1所示。
图3.1详细的描述了一个数字密码锁所要完成的功能,开始时,首先要对密码锁系统进行复位初始化,将所要设置的密码首先存入到存储模块当中。
然后进行键盘输入,键盘输入分为密码输入和功能输入,如果是密码输入就要把输入的密码与预置的密码进行比较,如果相同则开锁,不相同则报警,而其中密码的个数由计数器限制;如果是功能输入,则看是什么功能,本设计主要设计了四个功能:
设置密码键、退出键、清零键和关锁键,密码锁会根据所要求的功能进行相应的操作。
如果是其他的不与功能相对应的键输入,密码锁将进行系统复位初始化阶段,重新开始操作。
图3.1系统流程图
3.3基于FPGA的数字密码锁总体框图
通过数字密码锁系统结构的分析,我们知道通用的数字密码锁主要由八个部模块组成:
分频模块、键盘扫描模块、比较模块、计数模块、寄存模块、存储模块、显示模块和控制模块。
根据系统流程图的设计以及各个模块之间的逻辑关系将得到系统总体框图,如图3.2所示。
图3.2数字电子密码锁系统总体框图
键盘扫描模块:
设定数字键0—9,以及功能键;
分频模块:
设定系统时钟CLK的频率,对其分频,分别作为按键检测时钟和LED控制器扫描时钟;
密码计数模块:
统计所输密码位数;
比较器模块:
比较所输两数是否相等;
比较结果寄存器模块:
存储比较器模块的结果;
存储模块:
存储所设置的密码;
显示模块:
显示所输数字;
控制模块:
根据分析的数字密码结果,控制单元的算法。
2系统详细设计
2.1分频模块设计
分频模块的主要功能是所给频率转化成系统所需频率。
通常数字电路中的分频操作是采用计数来进行。
就是利用一个自由计数器来产生各种需要的频率,也就是先建立一个N位计数器,N的大小根据电路的需求来决定,N的值越大,电路可以分频的次数就越多,这样就可以获得更大的频率变化,以便提供多种不同频率的时钟信号。
本密码系统所设计的分频模块是执行十分频功能的模块,其目的是为了得到频率为时钟频率十分之一的clk_scan。
主要程序如下所示。
if(clk'eventandclk='1')then
if(cnt=cnt'high)then
cnt<=0;
else
cnt<=cnt+1;
endif;
endif;
process(cnt,clk)
begin
if(clk'eventandclk='1')then
if(cnt>cnt'high/2)then
clk_scan<='1';
else
clk_scan<='0';
endif;
endif;
endprocess;
分频模块源代码编译后所生成的示意图如图4.1所示。
图4.1分频模块示意图
分频模块的输入输出管脚及代表的意义如下表所示。
表4.1分频模块输入输出变量定义
输入端子
clk
输入时钟信号
输出端子
clk_scan
输出时钟信号
源程序编译以后,建立仿真波形,所得功能仿真波形如图4.2所示。
图4.2分频模块功能仿真波形图
图中输入的时钟频率clk是1亿赫兹(1/10ns),经过程序编译以后,输出的波形是clk_scan为1千万赫兹(1/10ns),符合十分频的要求。
2.2键盘扫描模块设计
行列式键盘又叫做矩阵式键盘【4】。
用带有I/O口的线组成行列结构,按键设置在行列的交点上。
本次试验用到的是4×4的行列结构键盘,可以构成16个按键。
这样,当按键数量平方增长是,I/O口只是线性增长,这样就可以节省I/O口。
行列式键盘的原理如图4.3所示。
key_col{0..3}上拉电阻
key_row{3…0}
图4.3行列式键盘的原理
按键设置在行列线交叉点,行、列线分别连接到按键开关的两端。
列线通过上拉电阻接+5V的电压,即列线的输出被嵌位在高电平状态。
判断按键中有无键按下时通过行线输入扫描信号,然后从列线读取到状态实现的。
其方法是依次给行线送低电平,检查列线的输入。
如果列线信号全为高电平,则代表低电平所在的行中无按键按下;如果列线有输入为低电平,则低电平信号所在的行和出现低电平的列的交点处有按键按下。
部分程序如下所示。
process(temp,scan_en)
beginifscan_en='0'then
casetempis
when"11101110"=>key_code_reg<="00000";
key_out_reg<="0000000000000001";
temp_num<='1';temp_function<='0';
when"11101101"=>key_code_reg<="00001";
key_out_reg<="0000000000000010";
temp_num<='1';
temp_function<='0';
when"11101011"=>key_code_reg<="00010";
key_out_reg<="0000000000000100";
temp_num<='1';temp_function<='0';
…
设行扫描信号为key_row{3…0},列线按键输入信号key_col{0..3}与按键位置的关系如表4.2所示。
表4.2行扫描信号、列线按键输入信号与按键位置的关系
key_row{3…0}
key_col{0..3}
对应的按键
1110
1110
0(key_num)
1101
1(key_num)
1011
2(key_num)
0111
3(key_num)
1101
1110
4(key_num)
1101
5(key_num)
1011
6(key_num)
0111
7(key_num)
1011
1110
8(key_num)
1101
9(key_num)
1011
A(设置密码键)
0111
B(退出键)
0111
1110
C(清零键)
1101
D(没有设置)
1011
E(没有设置)
0111
F(关锁键)
键盘扫描模块源代码编译后所生成的示意图如图4.4所示。
图4.4键盘扫描模块示意图
键盘扫描模块的输入输出管脚及代表的意义如下图所示。
表4.3键盘扫描模块输入输出变量定义
输入
端子
clk_scan
时钟扫描信号
key_col[3..0]
键盘列扫描
输出
端子
key_row[3..0]
键盘行扫描
key_code[3..0]
键值输出
key_out[15..0]
键盘按键one-hot码输出
key_press
有键按下
key_num
数字键
key_func
功能键
源程序编译以后,建立仿真波形,所得功能仿真波形如图4.5所示。
图4.5键盘扫描模块功能仿真波形图
在图5.5中,键盘扫描的列输入为1011,行输出为1011,由图5.3可得,此时按下的键应该是功能键A键,因此key_func、key_press变为高电平,key_num为低电平,而以one-hot码(独热码)编码的key_out输出为0000010000000000,符合源程序逻辑。
2.3比较模块
比较模块的主要功能是比较输入的密码和预置的开锁密码是否一致。
部分程序如下所示。
ifen='1'then
if(a=b)then
y<='1';
else
y<='0';
endif;
else
y<='Z';
endif;
比较模块源代码编译后所生成的示意图如图4.6所示。
图4.6比较模块示意图
比较模块的输入输出管脚及代表的意义如下图所示。
表4.4比较模块输入输出变量定义
输入
端子
a
输入数字
b
输入数字
en
使能
输出端子
y
比较结果
源程序编译以后,建立仿真波形,所得功能仿真波形如图4.7所示。
图4.7比较模块功能仿真波形图
如图4.7中,当输入输入a为5、b为9时,说明输入的密码与预置密码不一样,此时输出y变为低电平;当输入a、b都为4时,说明输入的密码与密码锁系统初始化时的密码相同,此时输出y变为高电平,符合源程序逻辑。
2.4计数模块
本计数器模块设计的是一个加减计数器,带有清零端,模值为4。
当up_down[1..0]为“10”时,执行的是加计数;当up_down[1..0]为“01”时,执行的是减计数。
部分程序如下所示,本程序执行的是加计数情况下的计数情况。
ifup_down="10"then
empty<='0';
ifnum="100"then
num<="100";full<='1';carry<='1';
elsifnum="011"then
num<="100";full<='1';carry<='0';
else
num<=num+1;full<='0';carry<='0';
endif;
endif;
计数模块源代码编译后所生成的示意图如图4.8所示。
计数器的作用有两个:
(1)输出作为存储器的地址输入;
(2)计数满指示送给控制模块,表示密码长度是否满足。
图4.8计数模块示意图
计数模块的输入输出管脚及代表的意义如下图所示。
表4.5计数模块输入输出变量定义
输入
端子
clk
时钟输入信号
clr
清零
up_down[1..0]
加/减控制端
输出
端子
num[2..0]
密码的位数
empty
密码输入为空
full
密码输入为满
carry
密码输入位数溢出
borrow
密码输入位数借位
源程序编译以后,建立仿真波形,所得功能仿真波形如图4.9所示。
图4.9计数模块功能仿真波形图
在图4.9前面一部分,up_down[1..0]为“10”,此时进行加计数,来一个时钟加一次,加到4以后,已满,一直保持为4,直到up_down[1..0]变为“01”时,变为减计数,来一个时钟减一次,直到为0保持。
2.5显示模块
显示模块的主要功能是显示所输入的密码。
本模块设计的是一个可以左右移位的移位显示器,左右移动由left_right[1..0]来控制,当left_right[1..0]为10时为左移,当left_right[1..0]为01时为右移。
部分程序如下所示。
ifclr='1'then
foriin0to(m-1)loop
shift_memory(i)<=(others=>'0');
endloop;
elsifrising_edge(clk)then
ifleft_right="10"andfull/='1'then
shift_memory(0)<='1'&din;
foriin1to(m-1)loop
shift_memory(i)<=shift_memory(i-1);
endloop;
elsifleft_right="01"andempty/='1'then
shift_memory(m-1)<=(others=>'0');
foriin(m-1)downto1loop
shift_memory(i-1)<=shift_memory(i);
endloop;
endif;
endif;
经源代码编译以后生成的显示模块示意图如图4.10所示。
图4.10显示模块示意图
显示模块的输入输出管脚及代表的意义如下图所示。
表4.6显示模块输入输出变量定义
输入
信号
clk
时钟信号
clr
清零
full
数字输入满
empty
数字输入空
left_right[1..0]
数字左移位右移位
din[n-2..0]
比较结果
输出
信号
reg0[n-1..0]
显示数字第一位
reg0[n-1..0]
显示数字第二位
reg0[n-1..0]
显示数字第三位
reg0[n-1..0]
显示数字第四位
reg0[n-1..0]
显示数字第五位
reg0[n-1..0]
显示数字第六位
源程序编译以后,建立仿真波形,所得功能仿真波形如图4.11所示。
图4.11显示模块功能仿真波形图
如图4.11所示,当left_right[1..0]为10时,每按下一个数字键,输入一个数值,就在数码管reg0上显示该数值,并将以前已经输入的数据依序左移一个数字位置。
当full为高电平时,reg0不再移入新的数字。
当left_right[1..0]为01时,将reg5~reg0所显示数值依序右移,最高位移入0。
2.6存储模块
在数字密码锁中,密码存储模块是它的密码规定电路,其主要功能是存储预置的开锁密码。
密码存储模块的地址选择信号由计数器模块电路来进行选择。
部分程序如下所示。
process(wr,ld,addr1,datain)
beginifwr='1'then
rom0(addr1)<=datain;
elsifld='1'then
foriin0to(m-1)loop
rom1(i)<=rom0(i);
endloop;
endif;
endprocess;
process(rd,sel,addr1)
begin
ifaddr1>0andaddr1<7then
ifrd='1'andsel='0'then
dataout<=rom0(addr1);
elsifrd='1'andsel='1'then
dataout<=rom1(addr1);
else
dataout<=(others=>'Z');
endif;
else
dataout<=(others=>'Z');
endif;
endprocess;
比较存储模块源代码编译后所生成的示意图如图4.12所示。
图4.12存储模块示意图
存储模块的输入输出管脚及代表的意义如下图所示。
表4.7存储模块输入输出变量定义
输入
信号
addr[1-1..0]
地址
ld
置数端
wr
写入
rd
读
sel
片选
datain[n-1..0]
输入数字
输出信号
dataout[n-1..0]
输出数字
源程序编译以后,建立仿真波形,所得功能仿真波形如图4.13所示。
图4.13存储模块功能仿真波形图
当wr为高电平时,将datain所输入的数据存储到rom0中addr所对应的位置;当sel为低电平时,从rom0中addr所对应的位置读出数据并输出到dataout端口;当sel为高电平时,从rom1中addr所对应的位置读出数据并输出到dataout端口。
当ld为高电平时,将rom0中的数据复制到rom1中的对应位置。
2.7控制模块
控制模块是数字密码锁系统的核心,是本设计中最重要的一部分。
它相当于计算机CPU,负责接收从其他模块传来的输入信号,再根据系统的功能产生相应的控制信号送到相应的模块。
控制模块源代码编译后所生成的示意图如图5.14所示。
图5.14控制模块示意图
控制模块是整个电路的控制中心,主要完成如下功能:
(1)密码核对:
在密码更改、开锁之前必须核对密码;
(2)密码变更:
按下此键将目前输入的密码作为新密码;
(3)激活电锁:
上锁,上锁之前必须设定密码;
(4)解除电锁:
检查输入的密码是否正确,正确才能开锁;
(5)报警:
当输入的密码错误时,密码锁报警。
下表显示的是控制模块的输入输出管脚,以及每个管脚的意义。
表4.8控制模块输入输出变量定义
输入信号
clk
时钟输入信号
preset
上电复位
key_press
按下键
key_num
数字键
key_func
功能键
key_out[15..10]
键盘one-hot译码输出
input_end
输入完成
carry
密码输入位数溢出
epual
输出结果
输出信号
set_lock
关锁
set_alarm
报警
reset_c
复位
cp
按键信号
up_down[1..0]
加/减控制端
ps[3..0]
现态
ns[3..0]
次态
wr
写入
ld
置数
rd
读取
sel
片选端
cs
比较器与比较结果寄存器的使能端
f_end
第一遍密码输入完成
s_end
第二遍密码输入完成
h_code
密码设定完成
控制模块主要由状态机电路组成,采用有效状态机设计【5】,将系统分为10个状态机,即空闲状态(idle)、第一次密码输入状态(firstcode)、第二次密码输入状态(secondcode)、密码输入状态(firstcode)、戴锁状态(firstcode)、关锁状态(firstcode)、消除状态(firstcode)、密码输入状态(firstcode)、输入完成状态(firstcode)和报警状态(firstcode)输入状态。
密码锁上电复位后,可进行密码设置,当第一次输入密码以后,led所显示数码逐位左移,第一次密码输入完成后f_end为高。
若第二次所设密码和第一次所设的密码一致,s_end为高。
此后h_code始终为高,代表密码锁内已经存有密码。
此时密码锁处于开锁状态,set_lock为低。
最后按下F(关锁键),进入关锁状态,set_lock输出高电平。
假设密码已经设置好,按下错误密码确认后,set_alarm输出为高,报警。
按下清零键C清除报警状态。
若要修改之前所设置的密码,可在开锁状态下按下A(设置密码键),此时f_end与s_end均为低电平。
若要重设密码,第一次输入完成后f_end变为高,第二次所设密码与第一次一致时,s_end输出为高。
同时,控制模块ld端输出一个正脉冲,将新密码设定密码锁中。
在修改密码过程中,若按下B(退出键),则可退出密码设置状态,原先所设密码保持不变。
源程序编译以后,建立仿真波形,所得功能仿真波形如图5.15所示。
图4.15控制模块功能仿真波形图
3系统顶层模块设计
3.1顶层原理图
在QuartusII环境下通过对数字密码锁分频模块、键盘扫描模块、计数模块、比较模块、比较结果寄存器模块、存储模块、显示模块和控制模块的VHDL源程序进行编译得到各个模块的实体图,然后把各个模块的实体图按对应接口连接起来,再加上时钟信号、上电复位信号、列密码输入等
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子 密码锁 设计