数字电路设计实验简易密码锁Word格式.docx
《数字电路设计实验简易密码锁Word格式.docx》由会员分享,可在线阅读,更多相关《数字电路设计实验简易密码锁Word格式.docx(35页珍藏版)》请在冰点文库上搜索。
密码锁输入电路包括时序产生电路,键盘扫描电路,键盘译码电路等,将用户手动输入的相关密码信息转换为软件所能识别的编码,作为整个电路的输入。
密码锁控制电路包括相应的数据存储电路,密码核对电路,能够进行数值的比较,进行电路解锁,开锁,密码的重新设置等。
密码锁显示电路包括将待显示数据的BCD码转换成数码管的七段显示驱动编码,密码锁在相应的状态下的点阵输出以及蜂鸣器的报警输出。
总体框图
按复位键
键入初始密码0000
密码错误
密码正确
按确认键
分块设计
✓键盘扫描电路
首先,向列扫描地址逐列输出低电平,然后从行码地址读回,如果有键摁下,则相应行的值应为低,如果没有按键按下,由于上拉的作用,行码为高。
这样就可以通过输出列码和读取的行码来判断按下的是什么键。
在判断有按键的按下后,要有一定的延时,防止键盘抖动。
entitykeyboardis
port(
row:
instd_logic_vector(3downto0);
col:
outstd_logic_vector(3downto0);
keyout:
q:
outstd_logic;
clk:
instd_logic
);
endkeyboard;
architecturestructofkeyboardis
signalcol_buffer1:
std_logic_vector(3downto0);
signalcol_buffer2:
signalkey:
std_logic_vector(7downto0);
signalcounter:
integerrange0to3;
signaldelay:
integerrange0to10;
signalstop:
std_logic;
begin
col<
=col_buffer2;
q<
=stop;
process(CLK,row,stop)
begin
ifclk'
eventandclk='
1'
then
ifcounter=3then
counter<
=0;
else
=counter+1;
//由于只要求输入四个数字所以需要计数
endif;
casecounteris
when0=>
col_buffer1<
="
1110"
;
when1=>
1101"
when2=>
1011"
when3=>
0111"
endcase;
endif;
endprocess;
key<
=row&
col_buffer2;
process(clk,key)
begin
ifclk'
0'
casekeyis
when"
01111110"
=>
stop<
='
keyout<
="
0000"
01111101"
0001"
01111011"
0010"
01110111"
0011"
10111110"
0100"
10111101"
0101"
10111011"
0110"
10110111"
11011110"
1000"
11011101"
1001"
whenothers=>
stop<
='
//仅仅在摁0~9的时候会有显示,在摁除了这十个键之外的键的时候是不会有反应的,将keyout的值转换为相应的数码管值,来控制数码管的显示
endcase;
endif;
process(clk,stop)
ifclk'
then
ifstop='
col_buffer2<
=col_buffer1;
endif;
endstruct;
✓点阵显示电路
采用行扫描的方式,每经过一段时间,给一行一个低电平。
则若在列的方向上如果接入高电平,则会使相应的二极管发光。
由于人眼的的暂留效应就回使我们看到我们想要的图案。
libraryieee;
useieee.std_logic_1164.all;
entityledis
port(
row:
outstd_logic_vector(7downto0);
num:
instd_logic_vector(1downto0);
clk:
instd_logic;
col:
outstd_logic_vector(7downto0)
);
endentity;
architecturestructofledis
signalcounter:
integerrange0to7;
process(clk)
ifcounter=7then
counter<
else
=counter+1;
endprocess;
process(clk,counter)
then
ifnum<
00"
then//键入状态
row<
11111110"
00111100"
11111101"
11111011"
11110111"
when4=>
11101111"
when5=>
11011111"
00011000"
when6=>
10111111"
when7=>
01111111"
elsifnum="
01"
then//闭锁状态
11111111"
01000010"
10"
then//开锁状态
00000000"
00011111"
10011111"
10001000"
01110000"
else
casecounteris//报警状态
✓数码管显示
其中引脚图的两个COM端连在一起,是公共端,共阴数码管要将其接地,共阳数码管将其接正5伏电源。
一个八段数码管称为一位,多个数码管并列在一起可构成多位数码管,它们的段选线(即a,b,c,d,e,f,g,dp)连在一起,而各自的公共端称为位选线。
显示时,都从段选线送入字符编码,而选中哪个位选线,那个数码管便会被点亮。
数码管的8段,对应一个字节的8位,a对应最低位,dp对应最高位。
所以如果想让数码管显示数字0,那么共阴数码管的字符编码为00111111;
共阳数码管的字符编码为11000000。
casecounteris//选通,可使数码管只单独亮一位
when0=>
cat<
111110"
ao<
=a0;
when1=>
111101"
=a1;
when2=>
111011"
=a2;
when3=>
110111"
=a3;
when4=>
101111"
=a4;
when5=>
011111"
=a5;
endcase;
process(ao)
caseaois//将键盘输入的一系列值翻译成接通数码管值
when"
a<
1111110"
0110000"
1101101"
1111001"
0110011"
1011011"
1011111"
1110000"
1111111"
1111011"
1010"
0000001"
whenothers=>
0000000"
endcase;
●仿真波形及波形分析
如图,程序开始运行的时候,给键盘扫描,系统会给出相应的键盘输出,是点阵显示出输入状态
图为一系列当键盘键入的时候,一系列数码管显示
在键入改变的初始密码之后,系统会变成闭锁状态,点阵如图显示
当输入的密码错误的时候,摁清零键的时候,会发出警报
entitylockis
//时钟信号
rr:
//重置清零键
s:
//确认键
warn:
//警报信号
ou:
----key
key_row:
//键盘扫描行列
key_col:
----led
led_col:
//点阵扫描行列
led_row:
----seg
cat:
outstd_logic_vector(5downto0);
//数码管选通
a:
outstd_logic_vector(6downto0)//数码管显示
architecturestructoflockis
signalkeynum:
integerrange0to9;
signalwarn_on:
signalstatus:
signalnum_counter:
integerrange0to5;
signalclk_1000:
signalclk_1:
signalq:
signalr:
signalw:
signalnum:
std_logic_vector(1downto0);
signalkey:
signalinput:
signalseg_num:
std_logic_vector(2downto0);
signalp1,p2,p3,p4:
signalpassword:
std_logic_vector(15downto0);
integerrange0to31;
componentdivis//分频器
clk_in:
clk_1000:
clk_1:
outstd_logic
endcomponent;
componentkeyboardis//键盘扫描
componentledis//点阵显示
componentsegis//数码管
r:
outstd_logic_vector(6downto0);
w:
input:
instd_logic_vector(2downto0)
componentOneis
i:
o:
IC1:
divportmap(clk,clk_1000,clk_1);
IC2:
keyboardportmap(key_row,key_col,key,q,clk_1000);
IC3:
ledportmap(row=>
led_row,num=>
num,clk=>
clk_1000,col=>
led_col);
IC4:
segportmap(r=>
r,clk=>
clk_1000,cat=>
cat,a=>
a,w=>
w,input=>
input,num=>
seg_num);
--status
process(s,rr,status)
ifrr='
ifstatus=2then
status<
elsifstatus=3then
=1;
elsifs'
eventands='
ifstatus=0then
status<
password<
=p1&
p2&
p3&
p4;
elsifstatus=1then
ifpassword=p1&
p4then
=2;
else
=3;
//statue0代表的是输入状态,statue1是闭锁状态,statue2是开锁状态,statue3是报警状态,状态转移图在前面已经画出
process(s,rr,clk_1000)
r<
elsifs='
elsifclk_1000'
eventandclk_1000='
---num_counter
process(s,rr,q,clk_1000)
ifs='
num_counter<
elsifrr='
elsifq'
eventandq='
ifstatus=0orstatus=1then
i