vhdl 密码锁.docx
- 文档编号:8496488
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:19
- 大小:170.57KB
vhdl 密码锁.docx
《vhdl 密码锁.docx》由会员分享,可在线阅读,更多相关《vhdl 密码锁.docx(19页珍藏版)》请在冰豆网上搜索。
vhdl密码锁
北京邮电大学
数字电路与逻辑设计实验
密码锁
实验任务与要求
设计并实现一个数字密码锁,密码锁有四位数字密码和一个确认开锁按键,密码输入正确,密码锁打开,密码输入错误进行警示。
基本要求:
1、密码设置:
通过键盘进行4位数字密码设定输入,在数码管上显示所输入数字。
通过密码设置确定键(BTN键)进行锁定。
2、开锁:
在闭锁状态下,可以输入密码开锁,且每输入一位密码,在数码管上显示“-”,提示已输入密码的位数。
输入四位核对密码后,按“开锁”键,若密码正确则系统开锁,若密码错误系统仍然处于闭锁状态,并用蜂鸣器或led闪烁报警。
3、在开锁状态下,可以通过密码复位键(BTN键)来清除密码,恢复初始密码“0000”。
闭锁状态下不能清除密码。
4、用点阵显示开锁和闭锁状态。
提高要求:
1、输入密码数字由右向左依次显示,即:
每输入一数字显示在最右边的数码管上,同时将先前输入的所有数字向左移动一位。
2、密码锁的密码位数(4~6位)可调。
3、自拟其它功能。
二、系统设计
设计思路
本设计按照不同功能将具体实现分为不同模块,分别是时钟分频,防抖动,数码管扫描与显示,报警模块,密码验证模块,点阵显示模块,键盘输入模块以及功能键模块。
总体框图
分块设计
时钟模块:
密码锁的工作时钟由外部晶振提供,时钟频率为50Mhz。
对CLK进行分频输出三路时钟CLK1Khz,CLK1,CLK2,频率分别为1Khz,5hz,1hz。
数码管显示与扫描
七段数码管是电子开发过程中常用的输出显示设备。
当数码管的中的一个段被输入高电平,则相应的这一段被点亮。
反之则不亮。
四位一体的七段数码管在单个静态数码管的基础上加入了用于选择哪一位数码管的位选信号端口。
八个数码管的a、b、c、d、e、f、g、h、dp都连在了一起,8个数码管分别由各自的位选信号来控制,被选通的数码管显示数据,其余关闭。
在键盘获取到行值和列值以后,组合成一个8位的数据,根据实现不同的编码在对每个按键进行匹配,找到键值后在7段码管显示。
键盘输入
键盘扫描过程:
对于4×4键盘,通常连接为4行、4列,因此要识别按键,只需要知道是哪一行和哪一列即可,为了完成这一识别过程,我们的思想是,首先固定输出4行为高电平,然后输出4列为低电平,在读入输出的4行的值,通常高电平会被低电平拉低,如果读入的4行均为高电平,那么肯定没有按键按下,否则,如果读入的4行有一位为低电平,那么对应的该行肯定有一个按键按下,这样便可以获取到按键的行值。
同理,获取列值也是如此,先输出4列为高电平,然后在输出4行为低电平,再读入列值,如果其中有哪一位为低电平,那么肯定对应的那一列有按键按下。
防抖动
本实验中防抖动分为两个部分,一个由降低时钟频率为1kHz的分频器构成,另一个在键盘有键按下时停止扫描键盘,读取键值,避免了由于扫描频率过快,在按键弹起前已扫描到另一行导致读数错误。
密码验证
密码在输入之后被储存起来,随后在输入完密码后进行比较,输入正确打开密码锁。
仿真波形及波形分析
正常状况下,键盘扫描如下,连续扫描0111,1011,1101,1110
重置密码0000后,输入0000,按下ok解锁,开锁后led=‘1’
源代码及注释
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitymimais
port(
set:
instd_logic;
clk:
instd_logic;
close:
instd_logic;
rel:
instd_logic;
ok,sure:
instd_logic;
row:
instd_logic_vector(3downto0);-----按键行
col:
outstd_logic_vector(3downto0);----------按键列
dianzhen_row:
outstd_logic_vector(7downto0);
dianzhen_col:
outstd_logic_vector(7downto0);
led:
outstd_logic;
cat:
outstd_logic_vector(5downto0);----------数码管位码
bt:
outstd_logic_vector(6downto0));---------数码管段码
endmima;
architectureaofmimais
signalstart:
std_logic;----------寄存器读数允许
signaldianzhen:
std_logic;
signalcounter:
integerrange0to20;--------防抖计数
signaldiv_clk:
std_logic;--------1kHz,数码管扫描信号,按键行扫描信号
signaldiv_count:
integerrange0to24999;-----div_clk使用计数
signaldianzhen_count:
integerrange0to7;
signalb_t:
std_logic_vector(6downto0);--按键读数
signaltemp:
std_logic_vector(6downto0);
signalnum:
integerrange0to4;--输入密码个数
signalseg_count:
integerrange0to5;
signalstate:
std_logic_vector(1downto0);--按键扫描状态
signalkbcol:
std_logic_vector(3downto0);
signalkey:
std_logic_vector(7downto0);--按键行列情况
signalwcode:
std_logic_vector(27downto0);----输入密码
signalcode:
std_logic_vector(27downto0);--内置密码
signalhang,lie:
std_logic_vector(7downto0);
signallock:
std_logic;
signalok_fd:
std_logic;
signalok_count:
integerrange0to25000;
signalokcnt:
integerrange0to2;
signalseg_state:
integerrange0to2;
signallock_kb:
std_logic;
signalled_count:
integerrange0to999;
begin
--code<="0110000110110111110011111011";
------------------------------------------------------
--p1:
分频器(1kHz)
------------------------------------------------------
p1:
process(set,clk)--50000fenpin
begin
ifset='1'then
div_clk<='0';div_count<=0;--setchongzhi
elsifclk'eventandclk='1'then
ifdiv_count=24999then
div_count<=0;div_clk<=notdiv_clk;
else
div_count<=div_count+1;
endif;
--ifseg_count=5thenseg_count<=0;
--elseseg_count<=seg_count+1;
--endif;
endif;
endprocessp1;
process(clk)
begin
ifclk'eventandclk='1'then
ifseg_count=5thenseg_count<=0;
elseseg_count<=seg_count+1;
endif;
endif;
endprocess;
---------------------------------------------
--按键扫描控制信号
---------------------------------------------
p3:
process(set,clk)
begin
ifset='1'then
state<="00";
elsifclk'eventandclk='1'then
ifstate="11"then
state<="00";
else
state<=state+1;
endif;
casestateis
when"00"=>kbcol<="0111";
when"01"=>kbcol<="1011";
when"10"=>kbcol<="1101";
when"11"=>kbcol<="1110";
whenothers=>null;
endcase;
endif;
endprocessp3;
--按键读取模块
p4:
process(clk)--根据按键点亮相应的b_t
begin
ifclk'eventandclk='0'then
casekeyis
when"11100111"=>b_t<="1111110";--0
when"11010111"=>b_t<="0110000";--1
when"10110111"=>b_t<="1101101";--2
when"01110111"=>b_t<="1111001";------3
when"11101011"=>b_t<="0110011";
when"11011011"=>b_t<="1011011";
when"10111011"=>b_t<="1011111";
when"01111011"=>b_t<="1110000";------7
when"11101101"=>b_t<="1111111";
when"11011101"=>b_t<="1111011";--9
when"10111101"=>b_t<="1101101";
when"01111101"=>b_t<="1101101";------11
when"11101110"=>b_t<="1101101";
when"11011110"=>b_t<="1101101";
when"10111110"=>b_t<="0000001";------14
when"01111110"=>b_t<="0000110";------15
whenothers=>b_t<="0000000";
endcase;
endif;
endprocessp4;
-----------------------------------------------------------
--按键数据存储模块
-----------------------------------------------------------
p5:
process(clk,b_t,ok_fd)
constanttemp1:
std_logic_vector(6downto0):
="0000001";
begin
ifset='1'then
code<="1111110111111011111101111110";
okcnt<=0;
dianzhen<='0';
num<=0;
seg_state<=1;
elsifclk'eventandclk='1'then
ifcounter=20then
casetempis
when"0000001"=>---------14键删除
ifnum/=0then
num<=num-1;wcode<="0000000"&wcode(27downto7);
endif;
when"0000110"=>
wcode<="0000000000000000000000000000";num<=0;-----15键清空密码
whenothers=>
casenumis
when0=>wcode<=wcode(20downto0)&temp;num<=num+1;
when1=>wcode<=wcode(20downto0)&temp;num<=num+1;
when2=>wcode<=wcode(20downto0)&temp;num<=num+1;
when3=>wcode<=wcode(20downto0)&temp;num<=num+1;
whenothers=>null;
endcase;
endcase;
counter<=0;
elsifb_t/="0000000"then
iftemp/=b_tthen
temp<=b_t;counter<=0;
else
counter<=counter+1;
endif;
endif;
ifnum=4then
ifok_fd='1'then
iflock='0'then
ifcode=wcodethen
dianzhen<='1';
lock<='1';
seg_state<=2;
wcode<="0000000000000000000000000000";num<=0;
else
dianzhen<='0';
lock<='0';
wcode<="0000000000000000000000000000";num<=0;
ifokcnt/=2then
okcnt<=okcnt+1;
seg_state<=1;
else
seg_state<=0;
--okcnt<=0;
endif;
endif;
else
wcode<="0000000000000000000000000000";num<=0;
endif;
endif;
endif;
iflock='1'andsure='1'then
code<=wcode;
lock<='0';
dianzhen<='0';
wcode<="0000000000000000000000000000";num<=0;
endif;
ifclose='1'then
lock<='0';
dianzhen<='0';
wcode<="0000000000000000000000000000";num<=0;
endif;
iflock='1'then
seg_state<=2;----
endif;
ifseg_state=0then
ifrel='1'then
seg_state<=1;
okcnt<=0;
wcode<="0000000000000000000000000000";num<=0;
endif;
endif;
endif;
endprocessp5;
----按键输入显示
p6:
process(seg_count)----数码管显示
begin
ifseg_state=1then----闭锁输入
casenumis
when0=>
caseseg_countis
when0=>cat<="011111";bt<="0000000";
when1=>cat<="101111";bt<="0000000";
when2=>cat<="110111";bt<="0000000";
when3=>cat<="111011";bt<="0000000";
when4=>cat<="111101";bt<="0000000";
when5=>cat<="111110";bt<="0000000";
endcase;
when1=>
caseseg_countis
when0=>cat<="011111";bt<="0000000";
when1=>cat<="101111";bt<="0000000";
when2=>cat<="110111";bt<="0000000";
when3=>cat<="111011";bt<="0000000";
when4=>cat<="111101";bt<="0000000";
when5=>cat<="111110";bt<="0000001";
endcase;
when2=>
caseseg_countis
when0=>cat<="011111";bt<="0000000";
when1=>cat<="101111";bt<="0000000";
when2=>cat<="110111";bt<="0000000";
when3=>cat<="111011";bt<="0000000";
when4=>cat<="111101";bt<="0000001";
when5=>cat<="111110";bt<="0000001";
endcase;
when3=>
caseseg_countis
when0=>cat<="011111";bt<="0000000";
when1=>cat<="101111";bt<="0000000";
when2=>cat<="110111";bt<="0000000";
when3=>cat<="111011";bt<="0000001";
when4=>cat<="111101";bt<="0000001";
when5=>cat<="111110";bt<="0000001";
endcase;
when4=>
caseseg_countis
when0=>cat<="011111";bt<="0000000";
when1=>cat<="101111";bt<="0000000";
when2=>cat<="110111";bt<="0000001";
when3=>cat<="111011";bt<="0000001";
when4=>cat<="111101";bt<="0000001";
when5=>cat<="111110";bt<="0000001";
endcase;
endcase;
endif;
ifseg_state=2then----锁开输入状态
caseseg_countis
when0=>cat<="011111";bt<="0000000";
when1=>cat<="101111";bt<="0000000";
when2=>cat<="110111";bt<=wcode(27downto21);
when3=>cat<="111011";bt<=wcode(20downto14);
when4=>cat<="111101";bt<=wcode(13downto7);
when5=>cat<="111110";bt<=wcode(6downto0);
endcase;
endif;
ifseg_state=0then----三次输入错误后显示ERROR
caseseg_countis
when0=>cat<="011111";bt<="0000000";
when1=>cat<="101111";bt<="1001111";
when2=>cat<="110111";bt<="1110111";
when3=>cat<="111011";bt<="1110111
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- vhdl 密码锁