一、设计思想
本设计采用EDA技术和VHDL语言设计了一种按键输入密码并数码管回显,当输入正确密码时轰动绿灯亮、红灯熄灭表示开锁,而当输入错误密码时,红灯亮、绿灯熄灭表示关锁。根据系统设计要求,系统设计采用自顶向下的设计方法。 1.基本原理
在本实验中采用的是VHDL编程,通过文本编辑方式建立模块,通过原理图方式将生成的图形符号连接,然后再下载,进行硬件的仿真。密码锁要达到的功能为:
为达到密码锁的以上功能,可将电子密码锁分为以下几个模块:密码锁输入电路、密码锁控制电路、LED输出显示电路。
⑴、密码输入:每按下一个数字键,就输入一个数值,并在显示器上显示出该数值。同时将先前输入的数据依次左移一个数字位置。程序下载后系统进入原始状态(原始密码000000),按下键8发光二极管8(绿灯)亮、法官二极管7(红灯)灭。当要重新设置密码时,直接输入自己想要设置的密码并按下键8,持续5S,数码管8由0变为1,此时7段数码管1、2、3、4、5、6对应显示新设置的密码。当要输入密码时,按下键7,先将密码清零,再随机输入一组6位密码,假如密码正确,发光二极管8(绿灯)立即亮;反之如不正确,等待5S,发光二极管7(红灯)亮并由蜂鸣器发出20S的报警信号。
⑵、密码清除:按下清除键可清除前面所有的输入值,清除成为“0000”。 ⑶、密码更改:按下更改键可将目前数据设定为新的密码。 ⑷、密码上锁:按下上锁键可将密码锁上锁。
1
⑸、密码解除:按下解除键首先检查输入的密码是否正确,密码正确即解锁。 2.设计框图
为达到密码锁的以上功能,可将电子密码锁分为以下几个模块:密码锁输入电路、密码锁控制电路、LED输出显示电路。和报警电路等四部分组成顶层设计采用原理图设计方式,系统的整体组装设计原理图如图1所示。
密 码 模 块 校 对 模 块 5S延时脉冲模块 20延时脉冲模块 红灯灭绿灯亮 关锁 绿灯灭红灯亮 开锁 20S报警 图1 系统整体组装设计原理图
二、设计步骤和调试过程
1、模块设计和相应模块代码 (1)分频
由于要产生5秒、20秒的计时信号,故对系统时钟clk_1k进行分频来得到1Hz的时钟clk。其模块及部分程序如下:
图2 分频模块
process(clk_1k)
2
variable count:std_logic_vector(9 downto 0); begin
if(clk_1k'event and clk_1k='1') then count:=count+1; end if; clk<=count(9); end process;
仿真波形如下:
图3 分频仿真图
(2) 设置密码
本模块主要是将设置的密码锁存到中间变量ram中去,同时控制灯的变化,由于这里的灯并不能作为最终的输出,所以这里先用led_r_temp1、led_r_temp2代替。其模块及部分程序如下:
图4 设置密码模块
process(enter1,set)
begin
3
if(enter1'event and enter1='1') then
if(set='0') then ram<=datain;
led_r_temp1<='1';led_g_temp1<='0'; else led_r_temp1<='0';led_g_temp1<='0';
end if; end if; end process;
仿真波形如下:
图5 设置密码仿真图
(3) 输入密码时第一个按键判断信号
本模块主要在密码输入下,当第一个按键按下时产生一个judge信号(高电平有效),其模块及部分程序如下:
judge
clk_1ksetdatain[3..0]instjudge图6 判断信号模块
process(set,clk_1k,datain) begin
4
if(clk_1k'event and clk_1k='1') then if(set='0') then judge<='0'; elsif(set='1') then
if((datain(0) or datain(1) or datain(2) or datain(3))='0') then
judge<='0';
els if((datain(0) or datain(1) or datain(2) or datain(3))='1')
then judge<='1'; else judge<='0'; end if; end if; end if; end process;
仿真波形如下:
图7 判断信号仿真图
从仿真波形上看,当按键按下后judge信号由0变为1,但是当按键重新弹回0时,judge信号又回到0,所以需对judge高电平信号进行锁存:
5