一、前言
电子密码锁的使用体现了人们的消费水平、保安意识和科技水平的提高,而且避免了携带甚至丢失钥匙的麻烦。目前设计密码锁的方法很多,例如传统的PCB板设计、用PLC设计或者单片机设计等等。而用VHDL可以更加快速、灵活地设计出符合各种要求的密码锁,优于其他设计方法。VHDL是一种符合IEEE标准的硬件描述语言,其最大的特点是借鉴高级程序语言的功能特性,对电路的行为与结构进行高度的抽象化、规范化的形式描述,并对设计的不同层次、不同领域的模拟验证与综合优化等处理,使设计过程延到高度自动化。
二、方案设计
密码锁的的构成主要由密码输入、密码设置、比较控制和报警部分组成, 此外密码锁必须能够保存已设置的密码,因而需要一个寄存器来保存密码,同时由于控制电路和报警电路要用到不同的时钟,因而需要一个时序产生电路来生成需要的不同信号,采用分频方法实现。
根据密码锁的电路特点,选用的是实验箱的模式6电路,根据电路功能,在这里设计的密码锁以4位2进制代码作为密码的电子密码锁。
其原理框图如下所示:
报警电路 时序产生电路 开锁信号 比较控制 密码输入
寄存器(保存
设置的密码) 密码设置
图一、电子密码锁原理框图
三、功能模块的实现 1、时序电路
在密码锁的电路中,输入计时、报警计时需要的1HZ的时钟脉冲信号,而驱动蜂鸣器工作需要的很高频率的脉冲信号,因而这里采用输入一个高频脉冲(1024HZ)信号来驱动蜂鸣器,采用分频的方法得到1HZ的计时脉冲,程序如下:
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为在这里为密码设置使能端,高电平有效。
密码设置的仿真波形如下图,由图中可以清楚地看到在enter_p高电平时 寄存器ram中得到了输入的密码1001。
图二、密码设置仿真波形
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<=\ end if;
else code_tmp<=\ end if; end process;
程序说明: rst置高,设置密码模块不工作,其他部分正常工作,en1为高时代表密码设置完毕,密码锁开始工作;enter_c是密码输入使能信号,高电平时表示开始密码输入,此时code_tmp中开始存储输入的数据,计时使能信号en2也变成高电平。
密码输入仿真波形如下,由图中可清楚的看到在enter_c为高时,寄存器code_tmp中存储了输入的数据code(系统仿真时有10ns的延时)。
图三、密码输入仿真波形
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;
程序说明:
1、lock为自锁信号,lock为1时,系统进入自锁状态,不再工作。 ○
2、Cnt3为密码输入计时信号,en2为1(即开始输入密码)时开始计时,○
当超过5秒而没有输入正确密码时,系统自锁并报警。
3、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是控制电路发出的报警信号。
四、 软件仿真
将完整的程序在Quartus软件下进行编译,通过之后进行波形仿真,观察 仿真波形看是否实现了密码锁的逻辑功能,下面是在密码输入正确、密码输入超时和密码输入错误时的仿真波形图。
图四、密码输入正确仿真波形
如图所示,首先在rst为0时将密码设为1001,然后输入密码1001,当确认键code_en按下时,系统判断密码正确,输出一个开锁信号,开锁指示灯led_g点亮。
图五、密码输入错误仿真波形
如图,密码设置仍然为1001,但输入一个错误的密码1000,当密码确认按下时,系统发出错误警报,蜂鸣器Speaker发出响声,报警灯led_f闪烁。
图六、出入超时仿真波形
如图,密码设置不变,依旧是1001,但是密码输入按键enter_c按下,输入密码后不按下确认键,五秒过后,系统判断密码输入超时,此时输出超时警报,蜂鸣器报警,led_g点亮,led_f闪烁。
五、 心得体会
这次的课程设计安排在了假期以后,上学期的VHDL语言已经有些生疏了,这给编程带来了一些难度,但是经过复习还是重新熟悉了编程的方法和技巧。
在写程序的时候有时候不注意仿真,犯了想当然的毛病,认为程序会实现想象中的逻辑功能,但实际不然,所以在编程过程中,不能单凭想象来做,必须写完一部分后就进行一次仿真,及时发现问题,及时改正,避免可在写完程序之后才发现错误,这时再修改就会很麻烦了。
这次的课程设计标题是密码锁设计,通过在查阅资料的过程中了解了电子密码锁的发展前景和FPGA的广泛应用,在日常生活中会有许多的电子设备都与FPGA有关,因此学好EDA技术对自己的以后的发展会有很大的帮助。
基于FPGA的电子密码锁设计
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)