电子密码锁_大连理工大学数电课设
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
大连理工大学本科实验报告
题目:电子密码锁
课程名称: 数字电路课程设计
学院(系): 电子信息及电气工程学部
专业:电气工程及其自动化
班级:
学生姓名:
学号:
完成日期:
成绩:
题目:电子密码锁
1 设计要求
设计一个8位串行数字锁,并验证其操作。具体要求如下:1.开锁代码为8位二进制数,当输入代码的位数和位值与锁内给定的密码一致,且按规定程序开锁时,方可开锁,并点亮开锁指示灯LT。否则,系统进入“错误”状态,并发出报警信号。
2.开锁程序由设计者确定,并要求锁内给定的密码是可调的,且预置方便,保密性好。
3.串行数字锁的报警方式是点亮77指示灯LF,并使喇叭鸣叫来报警,报警动作响1分钟,停10秒钟后再重复出现,直到按下复位开关,报警才停止。此时,数字锁自动进入等待下一次开锁的状态。
4.报警器可以兼作门铃用,门铃响的时间通常为7~10秒。
2 设计分析及系统方案设计
系统的结构图如下图所示:
本实验要求串行输入八位密码,密码可以随意设置,可以任意更改, 并且能够存储.而且能够显示出当前已经输入或者设置的位数,待输入八位后通过比较电路与预先设置的密码进行比较.如果输入的密码与存储的密码相同锁体打开如果输入的密码与存储的密码不同则报警系统打开发出警报.由于还要求有门铃功能所以增加一个门铃输入当门铃按下后门铃响十秒钟。
对于密码存储以及密码输入比较部分主要由load 控制。
load为0时系统功能为设置密码,此时只需要顺序串行输入八位0/1密码即可,系统将输入的密码自动保存在存储器内以便于输入的密码进行比较,当load为1时系统功能为输入密码,此时只需要顺序串行输入八位0/1即可,待输入八位后系统自动将刚输入的密码与存储器内的密码进行比较如果密码正确则开锁信号lt为1,否则警报信号lf 和响铃信号alm为1 lt为0 对于门铃部分当检测到press信号的下降沿时门铃开始响,计数器开始计数,此时始终脉冲频率为50MHz/16MHz=3.125Hz ,此时当计数器为30时既时间为30/3.125=9.6秒时门铃自动关闭。
3系统以及模块硬件电路设计
系统电路图
系统电路图如上如所示其中clk1脚接入50MHz的方波,load有两种状态----高电平和低电平状态。k0 k1 press clr 分别接到四个去抖开关上开关按下去为低
电平lt alm2 lf alm分别接到四个发光二级管上,当输出为1时二极管发光。
y0[0~6]分别接到HEX7对应的引脚上实现数码管显示功能。Y1[0~6]分别接到HEX5对应的引脚上实现数码管显示功能。其余各种逻辑功能由芯片内部计算执行来实现。芯片内部程序通过对clk、load、k0、k1、press、clr输入信号的处理通过lt、alm2、lf、alm、y0[0~6]、y1[0~6]进行输出来达到系统所需要的功能。
DE2开发板上使用的元件要给出使用管脚编号。
4 系统的VHDL设计
系统的主要功能是通过VHDL语言来实现的。语言代码如下。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity mima is
port (clk:in std_logic; --定义时钟
k0:in std_logic; --输入一位0
k1:in std_logic; --输入一位1
clr:in std_logic; --复位
load:in std_logic; --改变状态
press:in std_logic; --门铃按钮
alm2:out std_logic; --门铃
lt:out std_logic; --开锁信号
y0:out std_logic_vector(6 downto 0); --输入位数显示
y1:out std_logic_vector(6 downto 0); --输出位数显示
lf:out std_logic; --亮灯
alm:out std_logic); --报警铃end mima;
architecture aaa of mima is
signal shift,lock:std_logic_vector(7 downto 0):="00000000"; --定义shift,lock signal lam1,lam:std_logic_vector(7 downto 0); --定义lam1,lam
signal la,li:std_logic; --定义la,li
signal clk1:std_logic; --定义clk1
signal p:std_logic_vector (4 downto 0); --定义p
signal aa:std_logic; --定义aa begin
m16:process(clk) --将clk 16M分频
variable q: std_logic_vector(22 downto 0);
begin
if clk'event and clk='1' then q:=q+1; --检测clk上升沿q=q+1
end if;
if q="11111111111111111111111" then clk1<='1'; -- clk1产生一个上升沿脉冲else clk1<='0';
end if;
end process m16;
process(clk1,clr) --判断是否复位begin
if clr='0' then
la<='0';
li<='0';
elsif clk1'event and clk1='1' then --检测clk1上升沿if load='0' then --判断状态
la<='1'; --设置密码
else
li<='1'; --输出密码end if;
end if;
end process;
process(clk1,clr) --复位及输入设置密码variable a:integer range 0 to 8;
begin
if clr='0' then --复位
lam<="00000000";
--lam置零
lam1<="00000000";
--lam1置零
shift<="00000000";
--shift置零
a:=0; --a置零
lt<='0'; --开锁置零
lf<='0'; --警报灯置零
alm<='0'; --警报置零elsif clk1'event and clk1='1' then --检测上升沿if li='1' then --输入密码