大连理工大学本科实验报告题目:电子密码锁课程名称: 数字电路课程设计学院(系): 电子信息及电气工程学部专业:电气工程及其自动化班级:学生姓名:学号:完成日期:成绩:题目:电子密码锁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 isport (clk:in std_logic; --定义时钟k0:in std_logic; --输入一位0k1:in std_logic; --输入一位1clr: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 issignal shift,lock:std_logic_vector(7 downto 0):="00000000"; --定义shift,lock signal lam1,lam:std_logic_vector(7 downto 0); --定义lam1,lamsignal la,li:std_logic; --定义la,lisignal clk1:std_logic; --定义clk1signal p:std_logic_vector (4 downto 0); --定义psignal aa:std_logic; --定义aa beginm16:process(clk) --将clk 16M分频variable q: std_logic_vector(22 downto 0);beginif clk'event and clk='1' then q:=q+1; --检测clk上升沿q=q+1end if;if q="11111111111111111111111" then clk1<='1'; -- clk1产生一个上升沿脉冲else clk1<='0';end if;end process m16;process(clk1,clr) --判断是否复位beginif clr='0' thenla<='0';li<='0';elsif clk1'event and clk1='1' then --检测clk1上升沿if load='0' then --判断状态la<='1'; --设置密码elseli<='1'; --输出密码end if;end if;end process;process(clk1,clr) --复位及输入设置密码variable a:integer range 0 to 8;beginif 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 --输入密码if a/=8 then --判断密码是否输入完毕if k1='0' then --输入1shift<='1'&shift(7 downto 1 ); --依次输入一个1lam<='1'&lam(7 downto 1); --点亮对应的一个小灯a:=a+1;elsif k0='0'then --输入一位0shift<='0'&shift(7 downto 1); --依次输入一个1lam<='1'&lam(7 downto 1); --点亮对应的一个小灯a:=a+1;end if;elsea:=0;if shift=lock then --判断密码是否正确lt<='1'; --正确开锁elself<='1'; --错误警报亮alm<='1'; --错误警报响end if;end if;elsif la='1' then --输入密码a:=0;if k1='0' then --输入一位1lock<='1'&lock(7 downto 1); --lock密码增加一位1lam1<='1'&lam1(7 downto 1); --点亮对应的灯a:=a+1;elsif k0='0' then --输入一位0lock<='0'&lock(7 downto 1); --lock密码增加一位0lam1<='1'&lam1(7 downto 1 ); --点亮对应的灯a:=a+1;end if;end if;end if;end process;code1:process(lam) --将小灯泡显示转换到LED显示begincase lam iswhen "00000000"=>y0<="1111111"; --显示0when "10000000"=>y0<="1111001"; --显示1when "11000000"=>y0<="0100100"; --显示2when "11100000"=>y0<="0110000"; --显示3when "11110000"=>y0<="0011001"; --显示4when "11111000"=>y0<="0010010"; --显示5when "11111100"=>y0<="0000010"; --显示6when "11111110"=>y0<="1111000"; --显示7when "11111111"=>y0<="0000000"; --显示8when others=>y0<="1111111"; --关闭数码管end case;end process;code2:process(lam1) --显示位数begincase lam1 iswhen "00000000"=>y1<="1111111"; --显示0when "10000000"=>y1<="1111001"; --显示1when "11000000"=>y1<="0100100"; --显示2when "11100000"=>y1<="0110000"; --显示3when "11110000"=>y1<="0011001"; --显示4when "11111000"=>y1<="0010010"; --显示5when "11111100"=>y1<="0000010"; --显示6when "11111110"=>y1<="1111000"; --显示7when "11111111"=>y1<="0000000"; --显示8when others=>y1<="1111111"; --关闭数码管end case;end process;pp:process(press) --门铃功能beginif press='0' then --按下门铃alm2<='1'; --门铃响end if;if clk1'event and clk1='1' then p<=p+1; --延时10秒end if;if p=30 thenp<="00000";alm2<='0'; --关闭门铃end if;end process pp;end aaa;5 结论以及结果说明本系统运行在联想计算机平台和Altera DE2平台,用的是quartus60软件调试环境,系统的参数选取均按照要求适当选取。