昆明理工大学FPGA实验
《FPGA技术基础》学习报告
基于FPGA的电子密码锁
姓 名:金 怀 康
学 号:201110401130
年级专业:2011级自动化
指导老师:汪 淑 娟
摘要
基于FPGA设计的电子密码锁是一个小型的数字系统,与普通机械锁相比,具有许多独特的优点:保密性好,防盗性强,可以不用钥匙,记住密码即可开锁等。目前使用的电子密码锁大部分是基于单片机技术,以单片机为主要器件,其编码器与解码器的生成为软件方式。在实际应用中,由于程序容易跑飞,系统的可靠性能较差。本文介绍一种基于现场可编程门阵列FPGA器件的电子密码锁的设计方法采用VHDL语言对系统进行描述。
关键字:电子密码锁, 扬声器。
1
一、前言
电子密码锁的使用体现了人们的消费水平、保安意识和科技水平的提高,而且避免了携带甚至丢失钥匙的麻烦。目前设计密码锁的方法很多,例如传统的PCB板设计、用PLC设计或者单片机设计等等。VHDL是一种符合IEEE
的硬件描述语言,其最大的特点是借鉴高级程序语言的功能特性,对电路的行为与结构进行高度的抽象化、规范化的形式描述,并对设计的不同层次、不同领域的模拟验证与综合优化等处理,使设计过程延到高度自动化。
二、
设计
密码锁的的构成主要由密码输入、密码设置、比较控制和报警部分组成, 此外密码锁必须能够保存已设置的密码,因而需要一个寄存器来保存密码,同时由于控制电路和报警电路要用到不同的时钟,因而需要一个时序产生电路来生成需要的不同信号,采用分频方法实现。
根据密码锁电路特点,选用的是实验箱的模式6电路,根据电路功能,在这里设计的密码锁以4位2进制代码作为密码的电子密码锁。其原理框图如下所示:
报警电路 时序产生电路
比较控制 开锁信号 密码输入
寄存器(保存设置的密码) 密码设置
图一、电子密码锁原理框图
三、功能模块的实现
1、时序电路
在密码锁的电路中,输入计时、报警计时需要的1HZ的时钟脉冲信号,而驱动蜂鸣器工作需要的很高频率的脉冲信号,因而这里采用输入一个高频脉冲(1024HZ)信号来驱动蜂鸣器,采用分频的方法得到1HZ的计时脉冲,程序如下:
2
process(clk_1k)
variable cnt1:integer:=0;
begin
if rising_edge(clk_1k) then
if cnt1=512 then
clk_1<=not clk_1;cnt1:=0;
else cnt1:=cnt1+1;end if;end if;
end process;
程序说明:clk_1k为输入的1024HZ高频脉冲,cnt为分频得到的1HZ计时脉冲。
2、密码设置
为了安全性,密码锁必须能够重复的设定密码,在设定密码锁后,应该设置
一个寄存器来存储设定的密码,程序如下:
process(rst,password,enter_p) is
begin
if rst='0' then
if enter_p='1' then
ram<=password;en1<='1';end if;end if;
end process;
程序说明:rst低电平时所有的模块复位,只有密码设置模块工作;
password为设置密码时的输入端,ram就是存储密码的寄存器;enter_p为在这
里为密码设置使能端,高电平有效。
3、密码输入
密码输入部分要求在密码开始输入时进行计时,超时了要求报警,因此在
密码输入时设置一个计时使能信号en2,密码开始输入时使能信号en2有效,控
制电路的计时器开始计时;而且在密码确认键按下之前,电路不能对输入密码和
已设置密码进行比较,因此需要设置一个寄存器,来存储输入的数据,当确认键
按下时,就将寄存器里的数据送给控制部分进行比较。程序如下:
process(rst,enter_c,en1,code)
begin
if rst='1' then
if en1='1' then
if enter_c='1' then
code_tmp<=code;en2<='1';end if;
else code_tmp<="0000";en2<='0';end if;
else code_tmp<="0000";en2<='0';end if;
end process;
程序说明: rst置高,设置密码模块不工作,其他部分正常工作,en1为高
时代表密码设置完毕,密码锁开始工作;enter_c是密码输入使能信号,高电平
时表示开始密码输入,此时code_tmp中开始存储输入的数据,计时使能信号en2
3
也变成高电平。
4、控制部分
此部分是密码锁设计的核心模块,它实现密码锁的逻辑功能。开锁代码为4位二进制数,当输入代码的位数和位值与锁内设置的密码一致,且在
时间内开锁,方可打开,并且点亮开锁指示灯led_g;否则,系统进入“错误”状态,并且发出警报。警报的方式为蜂鸣器发出警报,指示灯led_r闪烁。直到30秒过后或者按下复位键,经行下一次密码输入。
模块源程序:
process(rst,clk_1,en2)
variable lock:std_logic:='0';
variable cnt3:integer:=0;
begin
if rst='0' then
lock:='0';cnt3:=0;sp_en<='0';led_g<='0';led_r<='0';
else
if rising_edge(clk_1) then
if lock='0' then
if en2='1' then
if cnt3=5 then
sp_en<='1';led_g<='0';led_r<='1';cnt3:=0;lock:='1';
else
if code_en='1' then
if ram=code_tmp then
sp_en<='0';led_g<='1';led_r<='0';lock:='1';
else
sp_en<='1';led_g<='0';led_r<='1';
end if;end if;cnt3:=cnt3+1;end if;end if;else
cnt3:=0; end if;end if;end if;end process;
程序说明:
,、lock为自锁信号,lock为1时,系统进入自锁状态,不再工作。
,、Cnt3为密码输入计时信号,en2为1(即开始输入密码)时开始计时,当超过5秒而没有输入正确密码时,系统自锁并报警。
4
,、code_en为密码确认键,此键按下时,系统开始将输入的密码和设置的密码进行比较,若二者一致则发出开锁信号,若不一致则发出报警信号,系统进入自锁状态。
5、报警电路
报警电路的作用就是在密码输入错误或者输入超时的情况下经行报警,蜂鸣器发出声音,并且警报灯不停闪烁,直到复位键按下或者计时30s结束。
源程序如下:
process(rst,sp_en,clk_1,clk_1k)
variable tmp_en1:std_logic:='0';
variable cnt4:integer:=1;
begin
if rst='1' then
if rising_edge(clk_1) then
if sp_en='1' and cnt4>0 then
if cnt4=31 then
cnt4:=0;tmp_en1:='0';
else cnt4:=cnt4+1; tmp_en1:='1';end if;end if;end if;
else tmp_en1:='0';cnt4:=1;
end if;speaker<=tmp_en1 and clk_1k;led_f<=tmp_en1 and clk_1;
end process;
程序说明:
Cnt4是一个30进制计数器,对报警时间进行计时。
Sp_en是控制电路发出的报警信号。
四、总结
在基于FPGA的系统设计中,不同电路系统的设计往往采用自顶向下的设计方法,亦即将一个大的系统分解成单元电路。由于考虑到体积、成本等因素,本装置在性能上功能上还存在不足,还有待于进一步提高:
(1)增加语音播报功能,提高装置的灵敏度,同时方便用户操作。
(2)可在装置中增加一个语音芯片,将蜂鸣报警改为语音说明指示,可以根据输入的密码数字播报,同时可以扩展锁的安全防盗报警功能。
5