基于VHDL的数字密码锁设计.docx
《基于VHDL的数字密码锁设计.docx》由会员分享,可在线阅读,更多相关《基于VHDL的数字密码锁设计.docx(22页珍藏版)》请在冰豆网上搜索。
基于VHDL的数字密码锁设计
河南机电高等专科学校
《职业技术培训》结课大作业
基于VHDL的数字密码锁设计
姓名:
专业班级:
学号:
任课教师:
时间:
成绩:
基于VHDL的数字密码锁设计
医电08级1班任课教师:
摘要:
本文要紧介绍运用删,技术设计数字密码锁统分解为假设干子系统,而且进一步细划为假设干模块,然后用硬件描述语言VHDL来设计这些模块,而且别离进行软件和硬的仿真。
仿真结果说明:
该数字密码锁能够校验3位十进制数密码,且能够预置密码,显示输入密码,具有输入错误指示有效指示等相应的状态指示。
该密码锁体积小,功耗低,操作简单,不怕掉电,保护和升级都十分方便,具有较好的应用前景。
关键词:
QUARlrIISII;VHDL;数字密码锁
1.概述
随着社会物质财富的日趋增加,平安防盗已成为社会问题。
而锁自古以来确实是把守门户的铁将军,人们对它要求甚高,既要平安靠得住地防盗,又要利用方便,这也是制者长期以来研制的主题。
数字密码锁是实际生活中运用普遍的一种数字电路,要紧功能是对某些操作进行加密爱惜,目的是幸免无权人员利用某些设施或进行越权操作,例如自动柜员机,自动售货机,门卡系统或保险柜都含有这种密码器[1]。
数字密码锁是集运算机技术、电子技术、数字密码技术为一体的机电一体化高科技产品,具有平安性高,利用方便等优势圈。
2.设计要求
1)密码预先在内部设置,能够设置任意位密码,那个地址采纳6位十进制数字作为密码;
2)密码输入正确后,密码器将启动开启装置。
那个地址密码器只同意前6位密码输入,并以按键音提示,多余位数的密码输入将不起作用;
3)许诺密码输入错误的最大次数为三次,密码错误次数超过三次那么进入死锁状态,并发出警报;
4)报警后,内部人员能够通过按键SETUP使密码器回到初始等待状态;
5)密码器具有外接键盘,能够用来输入密码和操作指令;
3.整体设计
先对数字密码器进行顶层设计并写出相应的VHDL程序,然后将数字密码器划分为分频模块、消抖同步模块、使能电路模块、密码预置模块、编码模块、比较模块、计数器选择模块、数码管显示译码模块、指示电路模块、数码管扫描模块、误码模块和操纵器模块12个部份,将各个模块一一实现。
顶层设计中各个模块是作为元件来引用的,因此那个地址需要将各个模块设计成独立设计实体的具体形式,如此即能够在顶层设计来引用这些模块了。
数字密码锁的要紧功能
(1)密码器的工作时钟由外部晶振来提供,时钟频率为4MHz[印;
(2)密码的设置和输入由外接键盘完成;
(3)密码能够由锁的所有者随意设置,并可更改,那个地址
采纳3位十进制数字作为密码,不怕断电,这是本设计的一个创新点,
(4)开锁时,不限制密码的输入位数,这将增强密码锁的保密性,
(5)不警惕输错1位密码,能够从头输入;
依照上述的功能分析,能够取得如图3-1所示的数字密码锁的系统结构图
图3-1数字密码锁的系统结构图
4.各单元电路的设计和实现
第一,密码器通过外接键盘输入数字密码,然后密码需要通过10线至4线编码器变成BCD码;接下来通过4位比较器与存储在系统中的预置密码进行比较,同时将输入的密码通过数码管扫描模块和数码管显示译码模块显示出来;最后将比较的结果DEP送到操纵器模块中。
本次设计中的密码是串行输入的,每次别离与一个预置码比较。
可见,6个十进制的密码别离有24个端口送入,因此需要利用一个数据选择器来进行选择。
那个地址,数据选择器是一个4位的六选一数据选择器,它的两位选择信号是由一个模6的计数器来给出的,计数器的操纵信号是由操纵信号RESET和时钟信号CNP是由操纵模块来提供的。
外接键盘每送一个密码数字,计数器的计数值加1。
若是计数器的数值计到6时,那么表示6个密码已经输入完毕。
接下来计数器应向操纵器发出反馈信号FULL,这表示操纵器已经能够进入到启动状态。
计数器2用来记录输入密码错误次数,当密码输入错误时,密码器将发出警报,并提示用户还能够输入密码的次数。
当密码输入错误的达到次数三次时,计数器2应向操纵器反馈信号NOTC,密码器将进入死锁状态,并发出警报。
这时只能通过内部按键SETUP使密码器回到初始状态。
数字密码器的实现
密码器的顶层设计由各个子模块组成。
其中各个模块是以元件的形式给出的,第一必需进行元件的说明,然后进行元件的例化挪用就能够够组成顶层模块。
顶层设计的模块图如图4-1所示。
图4-1顶层设计模块图
由上图能够给出数字密码器的对外接口信号,即输入和输出信号。
1、数字按键输入信号A0~A9,用来进行密码的输入操作;
2、外部时钟信号CLK,用来作为内部操作时钟和驱动蜂鸣器;
3、按键输入信号READY,用来设置密码器的预备操作状态;
分频模块设计
一、分频模块的输入、输出
图4-2分频模块图
分频模块的模块图如图4-2所示,能够概念输入、输出信号如下:
CLK:
系统输入时钟,300Hz。
CLK_DIV一、CLK_DIV2:
分频输出时钟信号,别离为10Hz、1Hz。
二、模块描述
在数字密码器中,它的外部时钟信号CLK是由外部晶振来提供的,时钟频率为300Hz。
对CLK进行分频输出两路时钟CLK_DIV1和CLK_DIV2,其中CLK_DIV1作为按键检测消抖时钟和操纵器模块时钟,而CLK_DIV2作为密码错误次数计数模块的时钟。
CLK时钟信号还作为蜂鸣器启动信号和LED显示扫描时钟信号。
CLK_DIV1设为CLK的30分频,为10Hz。
再将CLK_DIV1进行10分频能够取得CLK_DIV2时钟,为1HZ。
因此,分频模块能够采纳10分频和30分频电路来组成,如图4-5所示。
3、VHDL设计
30分频电路
10分频电路
CLK
CLK_DIV1
CLK_DIV1
CLK_DIV2
图4-5
由图2-5可知,分频模块内部含有两个单元电路:
30分频电路和10分频电路。
第一需要进行30分频和10分频这两个单元电路的VHDL设计,这两个单元电路的设计能够采纳计数的方式来完成。
而关于分频模块的设计,能够通过对两个单元电路元件的例化挪用来实现。
其中30分频电路和10分频电路的VHDL程序别离为,;分频模块的VHDL程序为。
消抖同步模块设计
一、消抖同步模块的输入、输出信号概念
图4-6消抖同步模块图
消抖同步模块的模块图如图2-6所示,由图能够取得输入、输出信号概念:
1)输入信号
C一、C二、C3、C4:
别离由WAIT_T、SETUP、READY、OPEN_T操作指令取得;AOO~A90:
由使能模块提供;CLK:
由分频模块输出的CLK_DIV1(10Hz)来提供;
2)输出信号
C1一、C2二、C33、C44:
由WAIT_T、SETUP、READY、OPEN_T通过消抖后产生;A01~A91:
有AOO~A90通过消抖后产生。
二、模块描述
在数字密码器中,由按键方式产生的数字密码A0~A九、READY、OPEN_T、WAIT_T、SETUP的产生时刻和持续长短是随机不定的,同时存在因开关簧片反弹而引发的电平抖动现象,因此必需添加消抖同步模块,目的是保证系统能捕捉到输入脉冲,同时保证每按一键只形成一个宽度为系统时钟周期的脉冲。
3、VHDL设计
在数字电路中,消抖同步电路的设计方案[11]较多,本设计采纳的是一种应用较为普遍的消抖同步电路。
如图2-7所示。
因为采纳与非门组成的触发器利用底电平触发,因此按键输入的数字或操作指令要设计成低电平有效。
&
&
D
Q
CP
Q
D
Q
CP
Q
&
输出
输入
CLK
图4-7
依照图4-7能够看出消抖同步电路含有两个与非门、一个与门和两个D触发器。
因此第一必需进行D触发器的VHDL设计,然后组成消抖同步电路的VHDL设计,最后通过元件例化挪用完成消抖同步模块的VHDL设计。
其中,D触发器的VHDL程序为,消抖同步电路的VHDL程序为,消抖同步模块的VHDL程序为。
使能电路模块设计
一、使能电路模块的输入、输出信号概念
图4-8使能电路模块图
使能电路模块的模块图如图4-8所示,模块的输入、输出信号概念如下:
1)输入信号
A0~A9:
由按键0~9提供;EN:
由操纵器模块提供。
2)输出信号
A00~A90:
当其为低电平0时,表示对应的A0~A9有信号输入。
该输出用于提供给消抖同步模块。
二、模块描述
在数字密码器中,数字密码A0~A9的按键输入信号是通过操纵器模块给出的使能信号EN来进行操纵的:
当使能信号有效(高电平)时,输入的信号A0~A9有效;不然输出为高电平。
3、VHDL设计
使能电路模块的VHDL程序为。
密码预置模块设计
一、输入输出概念信号概念
图4-9密码预置输出模块图
密码预置输出模块的模块图如图4-9所示,模块的输入、输出信号概念如下:
1)输入信号S0、S一、S2:
由计数器选择模块提供。
2)输出信号E一、E二、E3、E4:
密码预置信号。
二、模块描述
该模块用来预置密码器的密码,用于与输入的数字密码进行比较操作。
密码器的密码能够设置成任意位,那个地址设为6位,为“654321”。
它的输入有三个,别离为s二、s一、s0,由计数器选择模块提供;输出有为4位的2进制密码。
3、VHDL设计
密码预置输出模块的VHDL程序为。
编码模块设计
一、输入输出信号概念
图4-10密码预置输出模块图
密码预置输出模块的模块图如图4-10所示,模块的输入、输出概念如下:
1)输入信号
A01~A91:
由消抖同步模块提供,对应于数字按键0~9;RESET:
由操纵器模块提供;DUS:
由操纵器模块提供,用于检测是不是有按键输入;
2)输出信号
B1~B4:
由按键信号转换成4位BCD码,用来提供给比较模块;DATA_IN:
当其为高电平是,表示有密码输入,用来提供给操纵器模块;DI:
按键音信号,用来提供给指示模块,以驱动扬声器。
IN1~IN6:
用于按顺序存储密码,其中IN1用于存储第一名密码,IN6用于存储第六位密码。
该信号提供给数码管扫描信号,用于动态显示输入的密码。
二、模块描述
编码模块为子模块中的第二大模块,该模块用于将输入的按键信号转换成4位BCD码B1~B4送入到比较器中,这一步将通过10线至4线编码器来完成。
除此之外,该模块还将输入的按键信号通过移位寄放器依照按键的顺序存储到6个4位BCD码输出信号in1~in6中,用于提供给数码管扫描模块的输入信号。
同时还将输出di信号提供给指示电路模块用于产生按键音。
关于编码器的输出来讲,B4是MSB,B1是LSB。
3、VHDL设计
编码模块的VHDL程序为。
比较模块设计
一、输入输出信号概念
图4-11比较模块图
比较模块的模块图如图4-11所示,模块的输入、输出信号概念如下:
1)输入信号
B一、B二、B3、B4:
由编码模块提供,用于与密码预置模块输出的预置密码信号进行比较;E一、E二、E3、E4:
密码预置信号,由密码预置模块提供。
2)输出信号DEP:
该信号用于反馈给操纵器模块,用于说明比较的结果。
二、模块描述
在数字密码器中,比较模块的要紧功能是对编码模块的输出B1~B4这4位数据和密码预置输出模块的输出E1~E4这4位数据进行比较,然后将比较的结果送入操纵器模块的DEP端口上。
比较器的具体工作原理是:
当比较结果相等是,DEP的输出为1;当比较结果不相等时,DEP的输出为0。
3、VHDL设计
比较模块的VHDL程序为。
5.功能仿真及其结果
将各个模块用原件引用语句及原件例化语句进行链接后,就能够够进行相应的仿真了。
将整个系统程序进行全编译,进行整个系统的软件仿真,仿真图如图4所示。
从图5-1中能够看出,第一wait_l指示灯亮,说明密码锁处于等待状态,然后按下setup,进入密码设置,现在ls指示灯亮,设置的密码为“987”,然后再次按下setup,表设置完毕,现在ls熄灭,wait_l亮,表示从头回到初始态。
接着按下ready键,预备输入密码,1s熄灭。
输入的密码为“987”,按下try确认,现在lo指示灯亮,说明输入正确锁已开启,按下wait键,锁又关闭,回到初始等待态。
然后,依照先前的操作,再输3次密码,别离为“98”,“1”“9876”,每确认1次,le指示灯都会亮,表示密码错误,了第3次,speak就会显现4kHz的周期脉冲信号,驱动扬声报警,现在按下setup报警就解除
图5-1系统软件仿真图
6.编译、下载及调试
顶层模块
LIBRARYIEEE;
USEcipher_topIS
PORT(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9:
INstd_logic;
wait_t:
INstd_logic;
ready:
INstd_logic;
setup:
INstd_logic;
open_t:
INstd_logic;
clk:
INstd_logic;
led_g,led_r,alert:
OUTstd_logic;
a,b,c,d,e,f,g:
OUTstd_logic;
sel:
OUTstd_logic_vector(2DOWNTO0));
ENDcipher_top;
ARCHITECTUREcipher_top_archOFcipher_topIS
COMPONENTkeysync_model—消抖模块
PORT(c1,c2,c3,c4:
INstd_logic;
a00,a10,a20,a30,a40,a50,a60,a70,a80,a90:
INstd_logic;
clk:
INstd_logic;
c11,c22,c33,c44:
OUTstd_logic;
a01,a11,a21,a31,a41,a51,a61,a71,a81,a91:
OUTstd_logic);
ENDCOMPONENT;
COMPONENTenable_model—使能电路模块
PORT(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9:
INstd_logic;
en:
INstd_logic;
a00,a10,a20,a30,a40,a50,a60,a70,a80,a90:
OUTstd_logic);
ENDCOMPONENT;
COMPONENTmux4_model—密码预置模块
PORT(s0,s1,s2:
INstd_logic;
e1,e2,e3,e4:
OUTstd_logic);
ENDCOMPONENT;
COMPONENTencoder_model--编码模块
PORT(a01,a11,a21,a31,a41,a51,a61,a71,a81,a91:
INstd_logic;
reset,dus:
INstd_logic;
b1,b2,b3,b4:
OUTstd_logic;
data_in,di:
OUTstd_logic;
in1,in2,in3,in4,in5,in6:
OUTstd_logic_vector(3DOWNTO0));
ENDCOMPONENT;
COMPONENTcomparator_model—比较模块
PORT(b1,b2,b3,b4:
INstd_logic;
e1,e2,e3,e4:
INstd_logic;
dep:
OUTstd_logic);
ENDCOMPONENT;
COMPONENTcounter_model—计数模块
PORT(reset:
INstd_logic;
cnp:
INstd_logic;
s0,s1,s2:
OUTstd_logic;
full:
OUTstd_logic);
ENDCOMPONENT;
COMPONENTdecoder_model—数码显示模块
PORT(data:
INstd_logic_vector(3DOWNTO0);
a,b,c,d,e,f,g:
OUTstd_logic);
ENDCOMPONENT;
COMPONENTindicator_model—指示模块
PORT(wait_l:
INstd_logic;
s_lg:
INstd_logic;
s_lr:
INstd_logic;
di,bjy:
INstd_logic;
clk_div1:
INstd_logic;
led_g,led_r,alert:
OUTstd_logic);
ENDCOMPONENT;
COMPONENTcontrol_model—操纵模块
PORT(c11,c22,c33,c44:
INstd_logic;
data_in:
INstd_logic;
dep,dsw:
INstd_logic;
full,notc:
INstd_logic;
clk:
INstd_logic;
en,dus,anc:
OUTstd_logic;
cnp,reset:
OUTstd_logic;
ds,ret:
OUTstd_logic;
s_lr,s_lg,wait_l:
OUTstd_logic);
ENDCOMPONENT;
COMPONENTclkdiv_model—分频模块
PORT(clk:
INstd_logic;
clk_div1:
OUTstd_logic;
clk_div2:
OUTstd_logic);
ENDCOMPONENT;
COMPONENTkeyscan_model
PORT(clkscan,reset:
INstd_logic;
in1,in2,in3,in4,
in5,in6,in7,in8:
INstd_logic_vector(3DOWNTO0);
data:
OUTstd_logic_vector(3DOWNTO0);
sel:
OUTstd_logic_vector(2DOWNTO0));
ENDCOMPONENT;
U1:
keysync_model
PORTMAP(wait_t,setup,ready,open_t,a00,a10,a20,a30,a40,a50,a60,a70,a80,a90,
clk_div1,c11,c22,c33,c44,a01,a11,a21,a31,a41,a51,a61,a71,
a81,a91);
U2:
enable_model
PORTMAP(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,en,a00,a10,
a20,a30,a40,a50,a60,a70,a80,a90);
U3:
mux4_model
PORTMAP(s0,s1,s2,e1,e2,e3,e4);
U4:
encoder_model
PORTMAP(a01,a11,a21,a31,a41,a51,a61,a71,a81,a91,reset,dus,b1,
b2,b3,b4,data_in,di,in1,in2,in3,in4,in5,in6);
U5:
comparator_model
PORTMAP(b1,b2,b3,b4,e1,e2,e3,e4,dep);
U6:
counter_model
PORTMAP(reset,cnp,s0,s1,s2,full);
U7:
decoder_model
PORTMAP(data,a,b,c,d,e,f,g);
U8:
indicator_model
PORTMAP(wait_l,s_lg,s_lr,di,bjy,clk,led_g,led_r,alert);
U9:
control_model
PORTMAP(c11,c22,c33,c44,data_in,dep,dsw,full,notc,clk_div1,en,dus,anc,cnp,reset,
ds,ret,s_lr,s_lg,wait_l);
U10:
clkdiv_model
PORTMAP(clk,clk_div1,clk_div2);
U11:
keyscan_model
PORTMAP(clk,reset,in1,in2,in3,in4,in5,in6,in7,in8,data,
sel);
U12:
wrong3_model
PORTMAP(anc,ds,clk_div2,ret,in7,in8,notc,dsw,bjy);
ENDcipher_top_arch;
1.230分频单元电路
LIBRARYIEEE;
USEclk_div30IS
PORT(clk:
INstd_logic;
clk_div:
OUTstd_logic);
ENDclk_div30;
ARCHITECTUREbehaveOFclk_div30IS
BEGIN
PROCESS(clk)
VARIABLEcount:
std_logic_vector(3DOWNTO0);
VARIABLEclk_tmp:
std_logic;
BEGIN
IF(clk'eventANDclk='1')THEN
IF(count="1110")THEN
count:
=(OTHERS=>'0');
clk_tmp:
=NOTclk_tmp;
ELSE
count:
=count+1;
ENDIF;
ENDIF;
clk_div<=clk_tmp;
ENDPROCESS;
ENDbehave;
预备就绪状态是指密码器在被按下WAIT_T键后处于的一种状态。
这时若是操作人员按下READY键,密码器将会进入到第3种状态,等待密码数字的输入。
在这种情形下,RESET将被置1,DS信号将被置0。
WHENQC=>reset<='0';cnp<='0';en<='1';
dus<='0';anc<='0';
IF(c44='1')THEN
current_state<=QF;
anc<='1';
ELSIF(c33='1')THEN
current_state<=QC;
reset<='1';
ELSIF(full='1')THEN
current_state<=QD;
ELSIF(data_in='0')THEN
current_state<=QC;
ELSE
dus<='1';
IF(dep='0')THEN
current_state<=QE;
ELSE
cnp<='1';
IF(full='1')THEN
current_state<=QD;
ELSE
current_state<=QC;
ENDIF;
ENDIF;
ENDIF;
密码输入状态是操纵器模块的第3个状态,这是密