EDA课程设计电子密码锁.docx
《EDA课程设计电子密码锁.docx》由会员分享,可在线阅读,更多相关《EDA课程设计电子密码锁.docx(22页珍藏版)》请在冰豆网上搜索。
EDA课程设计电子密码锁
1概述和设计要求
1.1概述
随着科技的发展,电子产品的应用越来越广泛,电子电路的设计也越来越重要。
随着人们生活水平的提高,如何实现家庭防盗这一问题也变得尤其的突出,传统的机械锁由于结构简单,被撬的事件屡见不鲜,电子锁由于其保密性高,使用灵活性好,安全系数高,受到广大用户的亲昵。
同时随着电子产品向智能化和微型化的不断发展,数字逻辑电路电子芯片已成为电子产品研制和开发首选的控制器。
用电子逻辑电路设计的密码锁经实际操作表明,该密码锁具有安全、实用、成本低等优点,符合一般用锁的需要,具有一定的现实意义。
在本次课程设计中,我的的题目是电子密码锁,由输入密码、设定密码、寄存电路、比较电路、显示电路、修改密码组成。
主要工作部分是将输入密码与正确密码进行比较,密码正确时红色发光二极管亮,表示开锁成功,密码错误则蜂鸣器响三秒,表示开锁失败。
同时经过显示译码器作用到数码显示器显示密码。
随着电子产品向智能化和微型化的不断发展,数字逻辑电路电子芯片已成为电子产品研制和开发首选的控制器。
1.2设计要求
利用基于所学EDA以及QuartusII7.2软件相关知识设计一个具有较高安全性和较低成本的通用电子密码锁,其具体功能要求如下:
(1) 数码输入:
每按下一个数字键,就输入一个数值,并在显示器上的最右方显示出该数值,同时将先前输入的数据依序左移一个数字位置。
(2) 数码清除:
按下此键可清除前面所有的输入值,清除成为“0000”。
(3) 密码更改:
按下此键时会将目前的数字设定成新的密码。
(4) 激活电锁:
按下此键可将密码锁上锁。
(5) 解除电锁:
按下此键会检查输入的密码是否正确,密码正确即开锁。
2功能模块整体结构设计
作为通用电子密码锁,主要由三个部分组成:
数字密码输入电路、密码锁控制电路和密码锁显示电路。
根据以上选定的输入设备和显示器件,并考虑到实现各项数字密码锁功能的具体要求,整个电子密码锁系统的总体组成框图如图2.1所示。
(1) 密码锁输入电路包括时序产生电路、键盘扫描电路、键盘弹跳消除电路、键盘译码电路等几个小的功能电路。
(2) 密码锁控制电路包括按键数据的缓冲存储电路,密码的清除、变更、存储、激活电锁电路(寄存器清除信号发生电路),密码核对(数值比较电路),解锁电路(开/关门锁电路)等几个小的功能电路。
(3) 七段数码管显示电路主要将待显示数据的BCD码转换成数码器的七段显示驱动编码。
图2.1数字电子密码锁系统总体框图
图2.2是电子密码锁的输入电路框图,由键盘扫描电路、弹跳消除电路、键盘译码电路、按键数据缓存器,加上外接的一个3×4矩阵式键盘组成。
图2.2电子密码锁的输入电路框图
3各模块详细设计
3.1输入电路
(1)时序产生电路
本时序产生电路中使用了三种不同频率的工作脉冲波形:
系统时钟脉冲(它是系统内部所有时钟脉冲的源头,且其频率最高)、弹跳消除取样信号、键盘扫描信号。
(2)键盘扫描电路
扫描电路的作用是用来提供键盘扫描信号(表4.1中的KY3~KY0)的,扫描信号变化的顺序依次为1110-1101-1011-0111-1110......依序地周而复始。
(3)键盘译码电路
上述键盘中的按键可分为数字按键和文字按键,每一个按键可能负责不同的功能,例如清除数码、退位、激活电锁、开锁等,详细功能参见表2.3。
表2.3键盘参数表
扫描位置
KY3~KY0
键盘输出
KX2~KX0
对应键盘按键
键盘译码输出
实现按键功能
1110
011
1
F=0001
数码输入
101
2
F=0010
数码输入
110
3
F=0011
数码输入
1101
011
4
F=0100
数码输入
101
5
F=0101
数码输入
110
6
F=0110
数码输入
1011
011
7
F=0111
数码输入
101
8
F=1000
数码输入
(4)弹跳消除电路
弹跳消除电路的实现原理如图1.6所示,先将键盘的输入信号D_IN做为电路的输入信号,CLK是电路的时钟脉冲信号,也就是取样信号,D_IN经过两级D触发器延时后再使用RS触发器处理。
图2.6弹跳消除电路的内部实现原理图
此处RS触发器的前端连接和非门的处理原则是:
(1) 因为一般人的按键速度至多是10次/秒,亦即一次按键时间是100 ms,所以按下的时间可估算为50 ms。
以取样信号CLK的周期为8 ms计,则可以取样到6次。
(2) 对于不稳定的噪声,在4 ms以下则至多抽样一次。
(3) 在触发器之前,接上AND-NOT之后,SR的组态如表1.2所示。
表2.2 RS触发器真值表
S
R
D-OUT
0
0
不变
1
0
1
0
1
0
(5)按键存储电路
因为每次扫描会产生新的按键数据,可能会覆盖前面的数据,所以需要一个按键存储电路,将整个键盘扫描完毕后的结果记录下来。
按键存储电路可以使用移位寄存器构成。
(6)密码锁输入电路模块框图
输入电路引脚图如下图所示,图中CLK_1K为系统原始时钟脉冲(1kHz)
KEY_IN为键盘按键输入,CLK_SCAN为键盘扫描序列输出,DATA_N:
数字输出功能,DATA_F:
功能输出,FLAG_N为数字输出标志,FLAG_F为功能输出(上锁及开锁)标志,CLK_CTR是控制电路工作时钟信号,CLK_DEBOUNCE是去抖电路工作时钟信号,大约125Hz。
图2.7.密码输入模块框图
3.2控制模块
密码锁的控制电路是整个电路的控制中心,主要完成对数字按键输入和功能按键输入的响应控制。
(1)数字按键输入的响应控制
1) 如果按下数字键,第一个数字会从显示器的最右端开始显示,此后每新按一个数字时,显示器上的数字必须左移一格,以便将新的数字显示出来。
2) 假如要更改输入的数字,可以按倒退按键来清除前一个输入的数字,或者按清除键清除所有输入的数字,再重新输入四位数。
3) 由于这里设计的是一个四位的电子密码锁,所以当输入的数字键超过四个时,电路不予理会,而且不再显示第四个以后的数字。
(2)功能按键输入的响应控制控制功能如下:
1) 清除键:
清除所有的输入数字,即做归零动作。
2) 激活电锁键:
按下此键时可将密码锁的门上锁。
(上锁前必须预先设定一个四位的数字密码。
3) 解除电锁键:
按下此键会检查输入的密码是否正确,若密码
正确无误则开门。
图2.8电子密码锁的三种模式及关系
(3)密码控制模块图
模块引脚如下图所示:
图中DATA_N[3..0]:
4位行输入.DATA_N[3..
0]:
为4位列扫描输出,FLAG_N和FLAG_F则对应ENLOCK实现清除/上锁功能,
CLK为全局时钟信号,DATA_BCD[15..0]为输出16位BCD码,经译码器后转换
为4位密码输出。
图2.9.密码控制模块图
3.3显示模块
密码锁显示电路的设计比较简单,这里直接采用四个4-7译码器来实现。
BCD---七段显示译码器(74LS48) 1)输入:
8421BCD码,用A3A2A1A0表示(4位)。
2)输出:
七段显示,用Ya~Yg表示(7位)
图中A[3..0]为按键输入在经过去抖电路后的的BCD码的高4位输入数值,经过4-7译码器译码后输出0~9之间的数值,因为输入为16位的BCD码,而每一个译码器仅4位输入,故一共需要4个译码器来实现密码锁显示电路的设计。
译码器引脚如下图所示:
图2.10.七段译码器输入输出引脚图
4逻辑仿真与时序仿真的实现
1)将各个模块连接在一起实现。
将前面各个设计好的功能模块进行整合,可得到一个完整的电子密码锁系统的整体组装设计原理图,如图1.8所示
图3.1密码锁的整体组装设计原理
2)各个模块VHDL源程序及其仿真波形图
(1)键盘输入去抖电路的VHDL源程序(附仿真图)
--DEBOUNCING.VHD
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
LIBRARYALTERA;
USEALTERA.MAXPLUS2.ALL;
ENTITYDEBOUNCINGIS
PORT(D_IN,CLK:
INSTD_LOGIC;
DD1,DD0,QQ1,QQ0:
OUTSTD_LOGIC;
D_OUT,D_OUT1:
OUTSTD_LOGIC);
ENDENTITYDEBOUNCING;
ARCHITECTUREARTOFDEBOUNCINGIS
COMPONENTDCFQIS
PORT(CLK,CLRN,PRN,D:
INSTD_LOGIC;
Q:
OUTSTD_LOGIC);
ENDCOMPONENTDCFQ;
SIGNALVCC,INV_D:
STD_LOGIC;
SIGNALQ0,Q1:
STD_LOGIC;
SIGNALD1,D0:
STD_LOGIC;
BEGIN
VCC<='1';
INV_D<=NOTD_IN;
U1:
DCFQPORTMAP(CLK=>CLK,CLRN=>INV_D,PRN=>VCC,D=>VCC,Q=>Q0);
U2:
DCFQPORTMAP(CLK=>CLK,CLRN=>Q0,PRN=>VCC,D=>VCC,Q=>Q1);
PROCESS(CLK)
BEGIN
IFCLK'EVENTANDCLK='1'THEN
D0<=NOTQ1;
D1<=D0;
ENDIF;
ENDPROCESS;
DD0<=D0;DD1<=D1;QQ1<=Q1;QQ0<=Q0;
D_OUT<=NOT(D1ANDNOTD0);
D_OUT1<=NOTQ1;
ENDARCHITECTUREART;
--DCFQ.VHD
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYDCFQIS
PORT(CLK,CLRN,PRN,D:
INSTD_LOGIC;
Q:
OUTSTD_LOGIC);
ENDENTITYDCFQ;
ARCHITECTUREARTOFDCFQIS
BEGIN
PROCESS(CLK,CLRN,PRN)
BEGIN
IFCLRN='0'ANDPRN='1'THEN
Q<='0';
ELSIFCLRN='1'ANDPRN='0'THEN
Q<='1';
ELSIFCLK'EVENTANDCLK='1'THEN
Q<=D;
ENDIF;
ENDPROCESS;
ENDARCHITECTUREART;
对上述去抖电路源程序用quartus7.2进行时序仿真,得到仿真图如下:
图中输出信号QQ0,QQ1,D_OUT1,DD0,DD1是为便于仿真时观察中间结果而增加的观测点的输出,可以在程序中去掉,CLK为时钟脉冲
信号,当检测到有键按下时,即D_IN为高电平时接触点出现信号来回弹跳的现象。
图4.1键盘输入去抖电路DEBOUNCING.VHD的仿真结果图
(2)密码锁输入电路的VHDL源程序(附仿真图)
--KEYBOARD.VHD
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYKEYBOARDIS
PORT(CLK_1K:
INSTD_LOGIC;
--系统原始时钟脉冲(1kHz)
KEY_IN:
INSTD_LOGIC_VECTOR(2DOWNTO0);--按键输入
CLK_SCAN:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
--(仿真时用)键盘扫描序列
DATA_N:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);--数字输出
DATA_F:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);--功能输出
FLAG_N:
OUTSTD_LOGIC;--数字输出标志
FLAG_F:
OUTSTD_LOGIC;--功能输出标志
CLK_CTR:
OUTSTD_LOGIC;--控制电路工作时钟信号
CLK_DEBOUNCE:
OUTSTD_LOGIC;--(仿真时用)去抖电路工作时钟信号
);
ENDENTITYKEYBOARD;
ARCHITECTUREARTOFKEYBOARDIS
COMPONENTDEBOUNCINGIS
PORT(D_IN:
INSTD_LOGIC;
CLK:
INSTD_LOGIC;
D_OUT:
OUTSTD_LOGIC);
ENDCOMPONENTDEBOUNCING;
SIGNALCLK:
STD_LOGIC;--电路工作时钟脉冲
SIGNALC_KEYBOARD:
STD_LOGIC_VECTOR(1DOWNTO0);
--键扫信号“00-01-10-11”寄存器
SIGNALC_DEBOUNCE:
STD_LOGIC;
--去抖时钟信号
SIGNALC:
STD_LOGIC_VECTOR(2DOWNTO0);
--键盘输入去抖后的寄存器
SIGNALN,F:
STD_LOGIC_VECTOR(3DOWNTO0);
--数字、功能按键译码值的寄存器
SIGNALFN,FF:
STD_LOGIC;
--数字、功能按键标志值数字、功能按键
SIGNALSEL:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
--内部连接
DATA_N<=N;
DATA_F<=F;
FLAG_N<=FN;
FLAG_F<=FF;
CLK_CTR<=CLK;
--扫描信号发生器
COUNTER:
BLOCKIS
SIGNALQ:
STD_LOGIC_VECTOR(5DOWNTO0);
SIGNALSEL:
STD_LOGIC_VECTOR(3DOWNTO0);
--1110-1101-1011-0111
BEGIN
PROCESS(CLK_1K)IS
BEGIN
IFCLK_1K'EVENTANDCLK_1K='1'THEN
Q<=Q+1;
ENDIF;
C_DEBOUNCE<=Q
(2);--去抖时钟信号,大约125Hz
C_KEYBOARD<=Q(2DOWNTO1);
--产生键扫信号***“00-01-10-11”,大约16Hz
--C_DEBOUNCE<=Q
(1);--仿真时用
--C_KEYBOARD<=Q(5DOWNTO4);--仿真时用
CLK<=Q(0);
ENDPROCESS;
CLK_DEBOUNCE<=C_DEBOUNCE;
SEL<="1110"WHENC_KEYBOARD=0ELSE
"1101"WHENC_KEYBOARD=1ELSE
"1011"WHENC_KEYBOARD=2ELSE
"0111"WHENC_KEYBOARD=3ELSE
"1111";
CLK_SCAN<=SEL;
ENDBLOCKCOUNTER;
--键盘去抖
DEBOUNUING:
BLOCKIS
BEGIN
U1:
DEBOUNCINGPORTMAP(D_IN=>KEY_IN(0),D_OUT=>C(0),
CLK=>C_DEBOUNCE);
U2:
DEBOUNCINGPORTMAP(D_IN=>KEY_IN
(1),D_OUT=>C
(1),
CLK=>C_DEBOUNCE);
U3:
DEBOUNCINGPORTMAP(D_IN=>KEY_IN
(2),D_OUT=>C
(2),
CLK=>C_DEBOUNCE);
ENDBLOCKDEBOUNUING;
--键盘译码
KEY_DECODER:
BLOCK
SIGNALZ:
STD_LOGIC_VECTOR(4DOWNTO0);--按键位置
BEGIN
PROCESS(CLK)
BEGIN
Z<=C_KEYBOARD&C;
IFCLK'EVENTANDCLK='1'THEN
CASEZIS
WHEN"11101"=>N<="0000";--0
WHEN"00011"=>N<="0001";--1
WHEN"00101"=>N<="0010";--2
WHEN"00110"=>N<="0011";--3
WHEN"01011"=>N<="0100";--4
WHEN"01101"=>N<="0101";--5
WHEN"01110"=>N<="0110";--6
WHEN"10011"=>N<="0111";--7
WHEN"10101"=>N<="1000";--8
WHEN"10110"=>N<="1001";--9
WHENOTHERS=>N<="1111";
ENDCASE;
ENDIF;
IFCLK'EVENTANDCLK='1'THEN
CASEZIS
WHEN"11011"=>F<="0100";--*_LOCK
WHEN"11110"=>F<="0001";--#_UNLOCK
WHENOTHERS=>F<="1000";
ENDCASE;
ENDIF;
ENDPROCESS;
FN<=NOT(N(3)ANDN
(2)ANDN
(1)ANDN(0));
FF<=F
(2)ORF(0);
ENDBLOCKKEY_DECODER;
ENDARCHITECTUREART;
说明1、键盘译码电路除了负责将键盘送出的数据进行译码外,另外就是在译码的同时,必须判别所按下的是数字键还是功能键。
2、若为数字键,则flag_numb=1,且out_num输出BCD码显示电路。
3、若为功能键,则flag_func=1,且out_func输出4位码,并送往电锁控制电路。
4、对密码锁输入模块仿真如下图:
图中的输出信号CLK_SCAN,C_DEBOUNCE是为便于仿真时观察中间结果而增加的观测点的输出,FLAG_N为数字输出标志,当输入为数字时为高电平,DATA_F为功能输出(4位),FLAG_F为功能输出标志当按键输入为退格键或确认键时为高电平输出,DATA_N为数字输出,即在数字输出标志为高电平时确认输出数值。
图4.2输入电路仿真结果图
(3)密码锁控制电路的VHDL源程序(附仿真图)
--CTRL.VHD
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CTRL IS
PORT (DATA_N:
IN STD_LOGIC_VECTOR(3 DOWNTO 0);
DATA_F:
IN STD_LOGIC_VECTOR(3 DOWNTO 0);
FLAG_N:
IN STD_LOGIC;
FLAG_F:
IN STD_LOGIC;
CLK:
IN STD_LOGIC;
ENLOCK:
OUT STD_LOGIC; --1:
LOCK, 0:
UNLOCK
DATA_BCD:
OUT STD_LOGIC_VECTOR (15 DOWNTO 0));
END ENTITY CTRL ;
ARCHITECTURE ART OF CTRL IS
SIGNAL ACC, REG:
STD_LOGIC_VECTOR (15 DOWNTO 0);
--ACC用于暂存键盘输入的信息,REG用于存储输入的密码
SIGNAL NC:
STD_LOGIC_VECTOR (2 DOWNTO 0);
SIGNAL RR2, CLR, BB, QA, QB:
STD_LOGIC;
SIGNAL R1, R0:
STD_LOGIC;
BEGIN
--寄存器清零信号的产生进程
PROCESS(CLK)
BEGIN
IF CLK'EVENT AND CLK='1' THEN
R1<=R0; R0<=FLAG_F;
END IF;
RR2<=R1 AND NOT R0;
CLR<=RR2;
END PROCESS;
--按键输入数据的存储、清零进程
KEYIN_PROCESS :
BLOCK IS
SIGNAL RST, D0, D1:
STD_LOGIC ;
BEGIN
RST <= RR2;
PROCESS(FLAG_N, RST) IS
BEGIN
IF RST = '1' THEN
ACC <= "0000000000000000" ; --CLEAR INPUT
NC <= "000" ;
ELSE
IF FLAG_N'EVENT AND FLAG_N = '1' THEN
IF NC < 4 THEN
ACC <= ACC(11 DOWNTO 0) & DATA_N ;
NC <= NC + 1 ;
END IF;
END IF ;
END IF ;
END PROCESS ;
END BLOCK KEYIN_PROCESS ;
--上锁/开锁控制进程
LOCK_PROCESS :
BLOCK IS
BEGIN
PROCESS(CLK, DATA_F) IS
BEGIN
IF (CLK'EVENT AND CLK = '1') THEN
IF NC = 4 THEN
IF DATA_F
(2) = '1' THEN