基于VHDL的电子密码锁

更新时间:2023-09-11 00:29:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

程硕

《基于VHDL的电子密码锁设计》

1 / 14

华南师范大学 课程设计实验报告

课程名称: 课程设计题目: 姓 名: 学院: 专 业: 年 级: 学 号:

可编程数字系统设计

电子密码锁

程硕

物理与电信工程学院

理综一班 2011 20112600104

程硕 《基于VHDL的电子密码锁设计》

2 / 14

一、设计原理

用VHDL设计电子密码锁方案:作为通用电子密码锁,主要由 3 个部分组成:数字密码按键输入电路、密码锁控制电路和密码锁显示电路,作为电子密码锁的输入电路。可供选择的方案有数字机械式键盘和触摸式数字键盘等多种。 (1)密码锁输入电路包括时序产生电路、键盘检测电路、键盘消抖电路等几个小的功能电路。

(2)密码锁控制电路包括按键数据存储电路,恢复出厂密码、两次正确输入后可修改密码、密码核对,多次错误报警,清屏等几个小的功能电路。

(3)八段数码管显示电路主要将待显示数据的BCD码转换成数码器的八段显示驱动编码。

二、系统分析

本次课程设计成功地设计了一个简单的数字电子密码锁,密码为 4 位。将电子密码锁分为以下几个模块:按键消抖模块、密码锁逻辑控制模块和密码锁显示模块,实现了以下功能:

(1)密码输入:KEY1按下一次,数码管上显示数字加一,相应位置输入密码加一 (2)位置选择:KEY2按下一次,数码管选择位左移一位

(3)密码确认:KEY3按下一次,比较外部输入密码与原密码,正确LED长亮,错

误LED变暗,同时显示密码置0;

(4)密码修改:正确输入两次密码后,按下KEY4一次,将当前输入设为新的密码; (5)清屏:KEY5按下一次,外部输入置0;

(6)恢复出厂设置:连续按下KEY5三次后恢复出厂密码“1234”;

程硕 《基于VHDL的电子密码锁设计》

3 / 14

三、程序设计

1

由于程序稍显庞大,故采取分层次设计的方法,顶层采用画图法设计,底层采用VHDL语言进行设计。顶层电路图如图1所示

图1

Xiao_dou模块为按键消抖模块,main为密码锁控制模块,yima为数码管显示译码模块。Set_shuma端口为数码管段选端口,用于选择数码管。Led端口为led灯端口,key1,key2,key3,key4,key5为五个按键接口,show_shuma端口为数码管位选选择端口。

2 底层设计

a) 由于按键为机械按键,故按下一次会产生多次脉冲,当产生第一次下降沿的时候延

时一段时间后,再继续检测是否有下降沿产生。主体程序如下:

b) 数码管译码显示进程:将0至9的4位矢量型数字转化为相应8位数码管显示数字

程硕 《基于VHDL的电子密码锁设计》

4 / 14

c) 电子密码锁控制电路:

i. 数码管位置选择进程:当数码管位置选择时钟到来时,数码管显示位左移一位,

利用人眼的视觉余辉效果,产生4位数码管同时点亮的效果。

ii.

数码管位置选择时钟信号发生进程:将系统时钟分频,产生500HZ占空比为1:1的方波,用于控制数码管位置选择。

iii.

整型密码转化为矢量型密码,位选选择进程:利用CASE语句将不同位置的密码值显示在相应的数码管上。

iv.

外部输入密码变更进程:当KEY1按下时外部输入密码加1,并在数码管上显

程硕 《基于VHDL的电子密码锁设计》

5 / 14

示出来,数字从1至9循环;后半部分为当清屏信号到来时,外部输入密码置0。

v.

按键位置选择进程:KEY2按下时数码管位置选择端左移一位,后半部分为当清屏信号到来时,位置置0。

vi.

密码设置,重置进程:当密码连续正确两次后,按下KEY4键,将现在显示的密码置为新密码。后半部分为恢复出厂设置密码。

vii.

清屏,恢复出厂设置进程:当KEY5按下时产生清屏信号,当KEY5连续按下三

程硕 《基于VHDL的电子密码锁设计》

6 / 14

次后产生恢复出厂设置信号。后半部分为清屏与恢复出厂设置信号的清除程序,用于清除产生的清屏与恢复出厂设置信号。

viii.

密码比较进程:比较当前输入密码与内部密码的值,如相同则LED长亮,如不同则LED暗,如连续3次输入错误密码则LED闪烁报警。

ix.

LED闪烁脉冲发生进程:用于产生LED闪烁所需方波脉冲

程硕 《基于VHDL的电子密码锁设计》

7 / 14

四、仿真/实验结果

1. 密码正确:

2. 密码错误:

3. 清屏:

五、结论或分析

各项实验结果均成功,能够很好的实现,密码比较,设置密码,清屏,恢复出厂设置等各项功能。

六、使用说明

1. 2. 3. 4. 5.

S5:KEY1按下后外部输入密码加1;

S4:KEY2按下后输入选择位置左移一位; S3:KEY3按下后比较输入密码与内部密码;

S4:KEY4连续输入两次正确密码后按下,将当前显示密码设为新密码; S5:KEY5按下一次清屏,连续按下三次后恢复出厂设置。

程硕 《基于VHDL的电子密码锁设计》

8 / 14

七、源程序

1. 控制电路源程序 library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; entity main is

port(key1,key2,key3,key4,key5 :in std_logic; clk :in std_logic; num_shuma :out std_logic_vector(3 downto 0); set_shuma : out std_logic_vector(3 downto 0); led :out std_logic:='0'; sel :out std_logic); end entity main;

architecture lock of main is

signal temp_1,temp_led, temp_shuma,reset_all,reset_mima

,temp_reset,key1_clear,key2_clear,key3_clear,key4_clear: std_logic; signal bit_one_in :integer range 0 to 9:=1; --inside of number signal bit_two_in :integer range 0 to 9:=2; signal bit_three_in :integer range 0 to 9:=3; signal bit_four_in :integer range 0 to 9:=4;

signal show_shuma_location:std_logic_vector(1 downto 0); --location of shuma

signal bit_one_out,bit_two_out,bit_three_out,bit_four_out :integer range 0 to 9; --outside of number

signal location :std_logic_vector(1 downto 0); --inside location of number signal number_led :integer range 0 to 5000000; signal number_shuma :integer range 0 to 50000; signal number_error :integer range 0 to 3; signal twice :integer range 0 to 2; signal clear_num:integer range 0 to 3; begin

show_location_set:process(temp_shuma) --the location of shuma_guan begin

if(temp_shuma'event and temp_shuma='1')then show_shuma_location<=show_shuma_location+1; end if;

end process;

show_shuma:process(clk) --the number of shuma_guan begin

程硕 《基于VHDL的电子密码锁设计》

9 / 14

case show_shuma_location is when \ num_shuma<=conv_std_logic_vector(bit_one_out,4); set_shuma<=\ when \ num_shuma<=conv_std_logic_vector(bit_two_out,4); set_shuma<=\ when \ num_shuma<=conv_std_logic_vector(bit_three_out,4); set_shuma<=\ when \ num_shuma<=conv_std_logic_vector(bit_four_out,4); set_shuma<=\ end case; if(reset_all='1')then num_shuma<=\ --xian shi zhi 0 end if;

end process;

shuma_200:process(clk) --use to delay location set begin

if(clk'event and clk='1')then if(number_shuma=50000)then number_shuma<=0; temp_shuma<=not temp_shuma; else number_shuma<=number_shuma+1; end if; end if;

end process shuma_200;

add_outside:process(clk,reset_all) --key1 add num begin

if(key1'event and key1='0')then key1_clear<='1'; case location is when \ if(bit_one_out=9)then bit_one_out<=0; end if; when \ if(bit_two_out=9)then bit_two_out<=0; end if;

程硕 《基于VHDL的电子密码锁设计》

10 / 14

when \ if(bit_three_out=9)then bit_three_out<=0; end if; when \ if(bit_four_out=9)then bit_four_out<=0; end if; end case; end if;

if(clear_num=0)then key1_clear<='0'; end if;

if(reset_all='1')then bit_one_out<=0; bit_two_out<=0; bit_three_out<=0; bit_four_out<=0; end if;

end process add_outside;

location_set:process(clk,reset_all) begin if(key2'event and key2='0')then --led<='0'; key2_clear<='1'; location<=location+1; end if; if(reset_all='1')then location<=\ end if;

if(clear_num=0)then key2_clear<='0'; end if;

end process;

set_mima:process(clk,clear_num) begin

if(twice=2)then if(key4'event and key4='0')then --led<='0'; key4_clear<='1'; bit_one_in<=bit_one_out; bit_two_in<=bit_two_out; bit_three_in<=bit_three_out; bit_four_in<=bit_four_out;

--key2 location_set

--key4 set mima

程硕 《基于VHDL的电子密码锁设计》

11 / 14

end if; end if;

if(clear_num=0)then key4_clear<='0'; end if;

if(clear_num=3)then bit_one_in<=1; bit_two_in<=2; bit_three_in<=3; bit_four_in<=4; end if;

end process;

reset:process(clk,temp_reset,key1_clear,key2_clear,key3_clear,key4_clear) --key5 clear and reset begin

if(key5'event and key5='0')then --led<='0'; reset_all<='1'; if(clear_num=3)then clear_num<=0; else clear_num<=clear_num+1; end if; end if;

if(location=\and bit_one_out=0 and bit_two_out=0 and bit_three_out=0 and bit_four_out=0)then reset_all<='0'; end if;

if(temp_reset='1')then reset_all<='1'; end if;

if(key1_clear='1' or key2_clear='1' or key3_clear='1' or key4_clear='1')then --if other key clear num clear_num<=0; end if;

end process;

compare:process(clk,reset_all) --key3 compare begin

if(key3'event and key3='0')then key3_clear<='1'; if(bit_one_in=bit_one_out and bit_two_in=bit_two_out and

程硕 《基于VHDL的电子密码锁设计》

12 / 14

bit_three_in=bit_three_out and bit_four_in=bit_four_out)then led<='1'; temp_1<='0'; temp_reset<='1'; number_error<=0; if(twice=2)then twice<=twice; else twice<=twice+1; end if; else twice<=0; if(number_error=3)then number_error<=1; temp_1<='1'; else number_error<=number_error+1; led<='0'; temp_1<='0'; end if; end if; end if;

if(clear_num=0)then key3_clear<='0'; end if;

if(location=\and bit_one_out=0 and bit_two_out=0 bit_four_out=0)then --clear tong xin temp_reset<='0'; end if;

if(temp_1='1')then led<=temp_led; end if; end process compare ;

one_second:process(clk) begin

if(clk'event and clk='1')then if(number_led=5000000)then number_led<=0; temp_led<=not temp_led; else number_led<=number_led+1;

and bit_three_out=0 and 程硕

end if; end if;

end process one_second;

end architecture lock;

《基于VHDL的电子密码锁设计》

13 / 14

2. 消抖源程序 library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity xiao_dou is port(clk: in std_logic; din: in std_logic; dout: out std_logic); end entity xiao_dou;

architecture a of xiao_dou is

signal num :integer range 0 to 1000000; signal temp_10,temp,temp1 :std_logic; begin

process(clk) begin

if(clk'event and clk='1')then if(din='0')then if(num=1000000) then num<=num; else num<=num+1; end if; if(num=999999)then dout<='1'; else dout<='0'; end if; else num<=0; end if; end if;

end process;

end architecture a;

3. 译码源程序 library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity yima is

port(yuanma:in std_logic_vector(3 downto 0); shuma: out std_logic_vector(7 downto 0));

程硕 《基于VHDL的电子密码锁设计》

14 / 14

end entity yima;

architecture a of yima is begin

process(yuanma)is begin

case yuanma is when\ when\ when\ when\ when\ when\ when\ when\ when\ when\ when others=>shuma<=\end case; end process;

end architecture a ;

本文来源:https://www.bwwdw.com/article/mweh.html

Top