vhdl 密码锁 北京邮电大学
数字电路与逻辑设计实验
密码锁
实验任务与要求
设计并实现一个数字密码锁,密码锁有四位数字密码和一个确认开锁按键,密码输入正确, 密码锁打开,密码输入错误进行警示。
基本要求:
1、 密码设置:通过键盘进行 4 位数字密码设定输入,在数码管上显示所输入数字。通过 密码设置确定键(BTN 键)进行锁定。
2、 开锁:在闭锁状态下,可以输入密码开锁,且每输入一位密码,在数码管上显示“-”, 提示已输入密码的位数。输入四位核对密码后,按“开锁”键,若密码正确则系统 开...
北京邮电大学
数字电路与逻辑设计实验
密码锁
实验任务与要求
设计并实现一个数字密码锁,密码锁有四位数字密码和一个确认开锁按键,密码输入正确, 密码锁打开,密码输入错误进行警示。
基本要求:
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’
源代码及注释
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity mima is
port(
set : in std_logic;
clk : in std_logic;
close : in std_logic;
rel: in std_logic;
ok ,sure : in std_logic;
row : in std_logic_vector(3 downto 0);-----按键行
col : out std_logic_vector(3 downto 0);----------按键列
dianzhen_row : out std_logic_vector(7 downto 0);
dianzhen_col : out std_logic_vector(7 downto 0);
led:out std_logic;
cat : out std_logic_vector(5 downto 0);----------数码管位码
bt : out std_logic_vector(6 downto 0));---------数码管段码
end mima;
architecture a of mima is
signal start : std_logic;----------寄存器读数允许
signal dianzhen : std_logic;
signal counter : integer range 0 to 20;--------防抖计数
signal div_clk : std_logic; --------1kHz,数码管扫描信号,按键行扫描信号
signal div_count : integer range 0 to 24999;-----div_clk使用计数
signal dianzhen_count : integer range 0 to 7;
signal b_t : std_logic_vector(6 downto 0);--按键读数
signal temp : std_logic_vector(6 downto 0);
signal num : integer range 0 to 4;--输入密码个数
signal seg_count : integer range 0 to 5;
signal state : std_logic_vector(1 downto 0);--按键扫描状态
signal kbcol : std_logic_vector(3 downto 0);
signal key : std_logic_vector(7 downto 0);--按键行列情况
signal wcode : std_logic_vector(27 downto 0);----输入密码
signal code : std_logic_vector(27 downto 0);--内置密码
signal hang,lie:std_logic_vector(7 downto 0);
signal lock:std_logic;
signal ok_fd:std_logic;
signal ok_count:integer range 0 to 25000;
signal okcnt:integer range 0 to 2;
signal seg_state:integer range 0 to 2;
signal lock_kb:std_logic;
signal led_count:integer range 0 to 999;
begin
--code<="0011111011";
------------------------------------------------------
-- p1:分频器(1kHz)
------------------------------------------------------
p1:process(set,clk)--50000fen pin
begin
if set = '1' then
div_clk <= '0'; div_count <= 0;--set chongzhi
elsif clk'event and clk = '1' then
if div_count = 24999 then
div_count<= 0; div_clk <= not div_clk;
else
div_count<= div_count + 1;
end if;
--if seg_count = 5 then seg_count<= 0;
--else seg_count<= seg_count + 1;
--end if;
end if;
end process p1;
process(clk)
begin
if clk'event and clk = '1' then
if seg_count = 5 then seg_count<= 0;
else seg_count<= seg_count + 1;
end if;
end if;
end process;
---------------------------------------------
-- 按键扫描控制信号
---------------------------------------------
p3:process(set,clk)
begin
if set = '1' then
state<= "00";
elsif clk'event and clk = '1' then
if state = "11" then
state<= "00";
else
state<= state+1;
end if;
case state is
when "00" =>kbcol<= "0111";
when "01" =>kbcol<= "1011";
when "10" =>kbcol<= "1101";
when "11" =>kbcol<= "1110";
when others => null;
end case;
end if;
end process p3;
本文档为【vhdl 密码锁】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。