一.设计要求
1、
设计一个密码锁的控制电路,当输入正确密码时,输入开锁信号以推动执行机构的作用,用红灯亮,绿灯熄灭,表示关锁;用红灯灭,绿灯亮,开锁。
2、
在锁的控制电路中储存一个可以修改的6位密码,其中6位全为实际有效密码,当开锁按钮开关的输入代码等于存储器代码时,实现开锁。否则一直关锁并持续产生报警信号。
3、
从{dy}个按钮触动后的5秒内若未就锁打开,则电路自动处于自锁状态。使之无法再打开。并由扬声器发出持续20秒的报警信号。
二.设计说明与提示
1.该题目的主要任务是产生一个开锁信号OPEN,而开锁信号的形成条件是,输入代码和已设密码相同。实现这种功能的电路构思有多种,本题目运用两片8位锁存器,一片存入密码,另一片输入开锁代码,通过比较的方式,若两者相等,则形成开锁信号。
2.在开锁信号产生时,要求输出声,光信号,声音的产生由开锁信号触动扬声器工作,光信号由开锁信号点亮LED指示灯。
3.用按钮开关的{dy}个动作信号触发一个5秒定时器,若5秒内无开锁信号产生,让扬声器发出特殊音响,以示警告,并输出一个信号推动LED不断闪烁。
三.设计思想
电子密码锁的系统结构框图分成两大部分:控制器和处理器。整个系统的输入信号有一个时钟脉冲CLK
,输出信号有表示开锁,关锁信号的红灯,绿灯以及报警信号SPEAKER。控制器中的所有按键按下时均为高电平,即高电平有效。RW
为“密码设定”信号, OK 为“确定”信号, RED=‘0’GREED=‘1’为开锁信号CNT
表示上一位密码正确时,控制器给出的可进行下一位二进制密码比较的信号,OPEN=‘1’ 为控制器给出的锁开信号, OPEN=‘0’
为控制器给出的密码错误信号。处理器中有一个计数器,计数器C1用是用来记录从{dy}个按钮触动后的5秒内若未将锁打开(即输入正确密码时间超过5秒),则电路自动复位并进入自锁状态,使之无法再打开,并由扬声器发出持续20秒的报警信号。
四.重要程序模块分析
1,密码设置模块
process(clk)
---定义个存储器将密码存放在keyin中
begin
if clk'event and clk='1' then
keyin<=key;
end if;
end process;
prr<=pdan or rw1 or rin or ok;
st:
process(keyin,prr,ok1)
-----{dy}次修改密码
begin
if ok1='1' then
start<='0';
elsif (keyin/="000000" and prr='0') then
start<='1';
else start<='0';
end if;
end process;
inkey: process(key,start,clk)
begin
----输入密码时间进入记时状态
if clk'event and clk='1' then
ok1<='0';ok2<='0';
if start='1' then
sbuf1<=keyin;
----将密码放入rom1暂存器中
if ok='1' then ok2<='1';
elsif cnt="100" then cnt<="000"
;ok1<='1';
--5秒到将cnt值零将ok1值置高
else cnt<=cnt+'1';
end
if ;
else
cnt<="000";sbuf1<=sbuf1;
----当start=‘1’时cnt永远保持‘0’
end if;
end if;
end
process;
2,报警信号产生模块:
pandan : process(ok,ok1,ok2,clk,start)
---输入密码用于判断密码是否正确
begin
if ok2='1' or ok1='1' then
pdan<='1';
------开锁信号
elsif clk'event and clk='1' then
if pdan='1' then
if cnt1="10011" then
pdan<='0';
--20秒后判断结束,进入等待外部输入状态
else
cnt1<=cnt1+'1';
end if;
else
cnt1<="00000";
---等待状态时cnt1一直为‘0’
end if;
end if;
end process;
3.显示模块
Display: process(open,rw
,rin,clk1)
-----显示程序
begin
if open='1'
then
------开锁信号密码正确
red<='0';green<='1';
speaker<='0'; -----红灯灭,绿灯亮
else
------密码错误
red<='1';green<='0';
speaker<=clk1; ----红灯亮,绿灯灭,
end if;
elsif rw='1'
then
----{dy}次修改密码显示状态
red<='1';green<='0';;speaker<='0';
elsif rin='1' then
red<='0';green<='0';
speaker<='0';
else
red<='1';green<='0';
speaker<='0';
end if;
end process;
仿真波形
波形图一(密码正确):
密码锁默认的密码为“00000”,当我们{dy}次设置的密码为key=”101000”,然后按OK键盘确认。这时密码已经设置完成。当我们输入密码key=”101000”时,我们可以清楚的看见greed=‘1’而red=‘0’,即实现红灯灭,绿灯亮的开锁功能。
波形图二(此波形图为波形图一的后续部分)(密码错误):
设置密码为key=“110111”。当我们输入密码“100111”
时,greed=‘0’,而red=‘1’,即实现了红灯亮,绿灯灭的关锁功能,并且于此同时speaker=‘1’,即由于密码不正确而产生喇叭发出声音的信号。当key=‘000000’时(即无开锁信号产生),可以从波形图中看见,speaker=‘1’,即发出报警声会持续一段时间。
设计原代码
library ieee;
use
ieee.std_logic_1164.all;
use
ieee.std_logic_unsigned.all;
entity lock_m is
port(
key:in std_logic_vector(5 downto 0);
clk,clk1,ok,rw: in std_logic;
red,green,speaker,rwled,okrw:out std_logic);
end lock_m;
architecture behav of lock_m
is
signal
ok1,ok2,ok0,prr,start,pdan,rw1,rin:std_logic :='0';
signal
sbuf1,sbuf2,keyin:std_logic_vector(5 downto
0):="000000";
signal mmst: std_logic_vector(5
downto 0):="000000";
signal cnt:std_logic_vector(2
downto 0):="000";
signal cnt1:std_logic_vector(4
downto 0):="00000";
begin
process(clk)
begin
if clk'event and clk='1' then
keyin<=key;
end if;
end
process;
prr<=pdan or rw1 or rin or ok;
st:
process(keyin,prr,ok1)
begin
if ok1='1' then
start<='0';
elsif (keyin/="000000" and prr='0') then
start<='1';
else start<='0';
end if;
end process;
inkey:
process(key,start,clk)
begin
if clk'event and clk='1' then
ok1<='0';ok2<='0';
if start='1' then sbuf1<=keyin;
if ok='1' then ok2<='1';
elsif cnt="100" then cnt<="000"
;ok1<='1';
else cnt<=cnt+'1';
end if ;
else
cnt<="000";sbuf1<=sbuf1;
end if;
end if;
end process;
pandan :
process(ok,ok1,ok2,clk,start)
begin
if ok2='1' or ok1='1' then pdan<='1';
elsif clk'event and clk='1' then
if pdan='1' then
if cnt1="10011" then
pdan<='0';
else
cnt1<=cnt1+'1';
end if;
else
cnt1<="00000";
end if;
end if;
end process;
comp:
process(pdan,rw1,sbuf1,mmst,rin,clk1)
begin
if pdan='1' then
if sbuf1=mmst then
red<='0';green<='1';rwled<='0';speaker<='0';okrw<='0';
else
red<='1';green<='0';rwled<='0';speaker<=clk1;okrw<='0';
end if;
elsif rw1='1' then
red<='1';green<='0';rwled<='1';speaker<='0';okrw<='0';
elsif rin='1' then
red<='0';green<='0';rwled<='1';speaker<='0';
okrw<='1';
else
red<='1';green<='0';rwled<='0';speaker<='0';okrw<='0';
end if;
end process;
rewrite:process(rw,keyin,ok0,clk,start,pdan,rin)
begin
if clk'event and clk='1' then
if ok0='1' then rw1<='0';
elsif keyin="000000" and pdan='0' and rin='0'
then
if rw='1' then
rw1<='1';
end if;
end if;
end if;
end process;
process(rw1,ok,keyin,clk)
begin
if clk'event and clk='1' then
ok0<='0';
sbuf2<=keyin;
if rw1='1' then
if ok='1' then
ok0<='1';
if mmst=sbuf2 then
rin<='1';
else
rin<='0';
end
if;
end if;
else
if rin='1' then
if ok='1' then
mmst<=sbuf2;
rin<='0';
else
mmst<=mmst;
end if;
else null;
end if;
end if;
end if;
end process;
end behav;