《E D A仿真与实践实习》学院:信息科学与工程学院课题名称:硬件描述语言设计——基于VHDL的电子密码锁的设计班级:学生:学号:指导教师:1 引言在日常的生活和工作中, 住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。
若使用传统的机械式钥匙开锁,人们常需携带多把钥匙, 使用极不方便, 且钥匙丢失后安全性即大打折扣。
随着科学技术的不断发展,人们对日常生活中的安全保险器件的要求越来越高。
为满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。
基于EDA技术设计的电子密码锁。
以其价格便宜、使用方便、安全性高、成本低、功耗低、易操作等优点,受到了人们的普遍关注。
而以可编程逻辑器件(FBDA)为设计载体,以硬件描述语言(VHDL)为主要表达方式,以QuartusⅡ5.1开发软件等为设计工具设计的电子密码锁,由于其能够实现密码输入、密码校验、密码设置和更改等功能,因此,能够满足社会对安全防盗的需求。
本设计的各个模块由相应的VHDL程序具体实现,并在QuartusⅡ5.1环境下进行了整体电路的模拟仿真,最终实现“密码锁控制器设计”的要求。
2 设计内容和要求2.1 设计内容:题目:电子密码锁内容:设计一个4位串行数字锁。
(1)开锁代码为4位二进制,当输入代码的位数与锁内给定的密码一致,且按规定程序开锁时,方可开锁,并点亮一个指示灯。
否则进入“错误”状态,并发出报警信号。
(2)锁内的密码可调,且预置方便,保密性好。
(3)串行数字锁的报警由点亮一个灯,直到按下复位开关,报警才停下。
此时,数字锁又自动等待下一个开锁状态。
要求:(1)通过查阅相关技术资料,详细描述电子密码锁的基本原理。
(2)编写电子密码锁的Verilog HDL或VHDL程序,并仿真编译下载验证。
(3)给出完整的系统顶层模块图与波形仿真图。
3 设计分案密码锁控制器是硬件与软件的结合。
根据设计要求,决定以FBDA 芯片和VHDL语言设计此电子密码锁。
用一片FBDA芯片实现,从而大大简化了系统结构,降低了成本,提高了系统的保密性和可靠性。
这种设计不仅简化了系统结构,降低了成本,更提高了系统的可靠性和保密性。
另外,采用可编程逻辑器件开发的数字系统,方便地升级和改进。
3.1 系统总框图本系统的硬件部分主要由密码锁控制电路、密码锁显示电路、LED显示电路、报警电路、密码更改与设置电路组成。
整体系统框图如下图2.1所示。
密码锁总框图3.2密码锁的内部结构及主要功能3.2.1密码锁的主要功能密码锁控制器的主要功能有:(1)密码输入:有二个按键来控制(分别代表0和1),每按下一个键,要求在数码管上显示,并依次左移。
(2)密码校验:如果有按键按下,直到松开该按键;红绿灯指示门的状态,也就是密码校验结果,如果密码校验正确,绿亮起,否则如果密码校验错误红灯亮,并凤鸣器响,表明密码错误。
(3)错误报警:密码输入错误开始报警。
(4)密码修改:输入密码正确后4秒内按按键输入要设置和更改的密码,按按键确认密码设置与更改,则密码设置成功4 系统硬件电路4.1 密码锁的显示模块段数码管是电子开发过程中常用的输出显示设备。
在本设计中使用的是8个四位一体、共阴极型七段数码管。
其单个静态数码管如下图所示。
由于七段数码管公共端连接到GND(共阴极型),当数码管的中的一个段被输入高电平,则相应的这一段被点亮。
反之则不亮。
共阳极性的数码管与之相反。
四位一体的七段数码管在单个静态数码管的基础上加入了用于选择哪一位数码管的位选信号端口。
八个数码管的a、b、c、d、e、f、g、h、dp都连在了一起,8个数码管分别由各自的位选信号来控制,被选通的数码管显示数据,其余关闭。
4.2 密码锁控制模块该模块的作用是将输入的密码(暂时寄存于ACC中)跟已经存储的密码(REG中的密码信息)进行对比,如果一样,则密码锁开锁。
而在通过密码验证后可以按按键设定密码。
在这里值得注意的是有一个密码“0000”为开始密码,如果改名密码了但是又忘记了密码,重新下载之后的初始密码只要输入的密码为“0000”则都可通过密码锁。
模块lock是整个设计的核心,它实现密码锁的逻辑功能。
在任何时候按动密码初始化按键内密码设置为程序初始化密码值(在本模块程序中此值为“0000”代码为4 位二进制数,当输入代码的位数和位值与锁内给定的密码一致,且按规定程序开锁时,方可开锁,并点亮开锁指示灯(緑灯)亮。
否则,系统进入“错误”状态,并发出报警信号。
串行数字锁的报警方式是点亮指示灯(红灯),并使喇叭鸣叫,直到按下复位开关,报警才停止。
此时,数字锁又自动进入等待下一次开锁的状态。
该4 位串行电子密码锁设置4 位二进制密码,要求锁内给定的密码是可调的,且设置方便,保密性好。
其具体操作分为输入密码和修改密码两部分4.2.1输入密码密码输入值的比较主要有两部分,密码位数和内容,任何一个条件不满足,都不能打开锁。
若锁内密码为“0000” , key2 和key1 置低电平,分别表示输入“1” 和“0” 。
输入密码前先进行复位操作,再按着从密码最低位到最高位的顺序依次正确输入0000,会在数码管逐一显示。
经检验,输入的密码等于锁内预先设置的密码密码锁开启信号,锁开启。
同时,密码修改控制信号rw置低电平。
若在输入密码的过程中,4 位二进制密码出现输入错误,那么锁不能开启,同时,指示灯红灯亮,发出报警信号。
直到按下复位开关,报警才停止。
此时,数字锁又自动进入等待下一次开锁的状态。
4.2.2修改密码为防止任意进行密码修改,必须在正确输入密码后,才能重新设置密码。
输入正确密码后,锁打开,同时,密码修改控制信号按键rw 置低电平,就可直接进行修改密码的操作。
修改密码实质就是用输入的新密码去取代原来的旧密码,按确定按键ok, 存储新密码时.5 VHDL程序设计密码锁控制器的各个功能模块都是通过VHDL语言来完成的。
本设计由密码锁显示显示模块、分频模块、密码输入及校验模块、报警模块、密码更改与设置模块几部分组成,各模块分工合作,最后达到密码锁控制器设计的要求。
表4-1 程序的管脚分配表VHDL程序总代码library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity lock isport(key1,key2:in std_logic;clk,start,ok,reset,rw,clr: in std_logic;red,green,beep:out std_logic:='1';dig:out std_logic_vector(7 downto 0);seg:out std_logic_vector(7 downto 0));end lock;architecture rt1 of lock issignal keyin,password:std_logic_vector(3 downto 0):="0000"; signal open1:std_logic:='0';signal beep1:std_logic:='1';signal a,shuru:std_logic;signal count: std_logic_vector(2 downto 0):="000";signal temp: std_logic_vector(1 downto 0):="00";beginprocess(clk)variable m:integer range 0 to 10;beginif clk'event and clk='1'thenif m=9 thenm:=0;a<='1';elsem:=m+1;a<='0';end if;end if;end process;process(clk,start,ok,clr,rw,reset)beginif clk'event and clk='1'thenif reset='0' thenred<='1';green<='1';beep1<='1';open1<='0';keyin<="0000";shuru<='0';count<="000 ";end if;if start='0' thenshuru<='1';end if;if rw='0' and open1='1'thenshuru<='1';count<="000";end if;if clr='0' thenkeyin<="0000";count<="000";shuru<='1';elsif a='1' and shuru='1' thenif key1='0' thenkeyin<=keyin(2 downto 0)&'0';elsif key2='0' thenkeyin<=keyin(2 downto 0)&'1';end if;if count="011" thenshuru<='0';count<=count+1;elsecount<=count+1;end if;end if;if ok='0'and open1='0' thenif (keyin=password)thenred<='1';green<='0';open1<='1';elsered<='0';green<='1';beep1<='0';open1<='0';end if;end if;if ok='0'and open1='1'thenpassword<=keyin;end if;end if;end process;process(clk,start,ok,clr,rw,reset)variable g:integer range 0 to 49999999;beginif clk'event and clk='1'thenif g=49999999 theng:=0;elseg:=g+1;end if;if g<=24999999 and beep1='0' thenbeep<='0';elsebeep<='1';end if;end if;end process;process(clk)variable n:integer range 0 to 50000;beginif clk'event and clk='1'thenif n=49999 thenn:=0;if temp="11"thentemp<="00";elsetemp<=temp+1;end if;elsen:=n+1;end if;if count="001" thencase temp iswhen "00" => dig<="01111111" ;if keyin(0)='0'then seg<="11000000";else seg<="11111001";end if;when others =>seg<="11111111" ;end case ;elsif count="010" thencase temp iswhen "00" => dig<="01111111" ;if keyin(1)='0'then seg<="11000000";else seg<="11111001";end if;when "01" => dig<="10111111" ;if keyin(0)='0'then seg<="11000000";else seg<="11111001";end if;when others =>seg<="11111111" ;end case ;elsif count="011" thencase temp iswhen "00" => dig<="01111111" ;if keyin(2)='0'then seg<="11000000";else seg<="11111001";end if;when "01" => dig<="10111111" ;if keyin(1)='0'then seg<="11000000";else seg<="11111001";end if;when "10" => dig<="11011111" ;if keyin(0)='0'then seg<="11000000";else seg<="11111001";end if;when others =>seg<="11111111" ;end case ;elsif count="100" thencase temp iswhen "00" => dig<="01111111" ;if keyin(3)='0'then seg<="11000000";else seg<="11111001";end if;when "01" => dig<="10111111" ;if keyin(2)='0'then seg<="11000000";else seg<="11111001";end if;when "10" => dig<="11011111" ;if keyin(1)='0'then seg<="11000000";else seg<="11111001";end if;when "11" => dig<="11101111" ;if keyin(0)='0'then seg<="11000000";else seg<="11111001";end if;when others =>null;end case ;elsedig<="11111111" ;seg<="11111111";end if;end if;end process ;end rt1;6 系统仿真当各个模块分别编译成功后,则创建一个个元件符号。