EDA电子密码锁程序 求分析 20

 我来答
好好评测
2011-07-01 · 专注于电脑网络信息技术
好好评测
采纳数:620 获赞数:1556

向TA提问 私信TA
展开全部
1、设计一个密码锁的控制电路,当输入正确代码时,输出开锁信号以推动执行机构工作,用红灯亮、绿灯熄灭表示关锁,用绿灯亮、红灯熄灭表示开锁;
2、在锁的控制电路中储存一个可以修改的4位二进制代码,当开锁按钮开关的输入代码等于储存代码时,开锁;
3、 从第一个按钮触动后的30秒内若未将锁打开,则电路长报警5S,若输入密码错误1或2次,则每次短报警1S,若输错三次密码则长报警。

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity lock is
port(clk_1k:in std_logic; --1024HZ频率输入管脚
enter_2,enter_1: in std_logic; --设密码确认及输入密码确认
datain:in std_logic_vector(3 downto 0); --密码数据输入
speaker:out std_logic; --喇叭
led_g,led_r:out std_logic); --绿灯及红灯
end entity lock;

architecture behave of lock is
signal ram:std_logic_vector(3 downto 0);
signal judge:std_logic;
signal clk:std_logic;
signal turn_on,turn_off:std_logic;
begin
process(Clk_1k)
variable clk_count:std_logic_vector(8 downto 0):="000000000";
begin
if clk_1k'event and clk_1k='1' then --分频
if clk_count<511 then
clk_count:=clk_count+1;
else
clk_count:="000000000";
clk<=not clk;
end if;
end if;
end process;

process(datain,enter_1) --设置密码
begin
if enter_1'event and enter_1='1' then
ram<=datain;
end if;
end process;

process(clk_1k) --判断第一位密码按下时开始计时
begin
if clk_1k'event and clk_1k='1' then
if enter_1='0' then
judge<='0';
end if;
if judge='0' and enter_1='1' then
if datain/=ram then judge<='1';end if;
end if;
end if;
end process;

process(judge,clk,enter_2)
variable count:std_logic_vector(4 downto 0):="00000"; --判断自第一个按键开始的时间是否超30秒
variable judge_sh:std_logic_vector(1 downto 0):="00"; --判断输入错误密码次数
variable switch:std_logic:='0'; --判断是否锁定键盘
begin
if clk'event and clk='1' then
if enter_1='0' then --数据复位
count:="00000";judge_sh:="00";switch:='0';
end if;
if switch='0' then
if judge='1' then
if count<"11110" then --30 秒计时
count:=count+1;
if enter_2='1' then
if datain = ram then
turn_on<='1';turn_off<='0';switch:='1'; --开锁
else
if judge_sh<"10" then
judge_sh:=judge_sh+1;turn_on<='1';turn_off<='1';switch:='0'; -
else
turn_on<='0';turn_off<='1';switch:='1'; -- 3次 end if;
end if;
else
turn_on<='0';turn_off<='0';switch:='0'; --等待下次输入
end if;
else
turn_on<='0';turn_off<='1';switch:='1';
end if;
end if;
end if;
end if;
end process;

process(clk,clk_1k,turn_on)
variable count:std_logic_vector(3 downto 0):="0000"; --长报警时间
variable count_sh:std_logic_vector(1 downto 0):="00"; --短报警时间
variable temp,temp_sh:std_logic:='0'; --判断是短报警或长报警
begin
if clk'event and clk='1' then
if enter_1='0' then --数据复位
count:="0000";count_sh:="00";temp:='0';temp_sh:='0';
end if;
if turn_on='0' and turn_off='1' then
if count<"0101" then --响5秒
count:=count+1;
temp:='1';
led_g<='0';led_r<='1';
else
temp:='0';
end if;
elsif turn_on='1' and turn_off='0' then
led_g<='1';led_r<='0';
elsif turn_on='1' and turn_off='1' then
temp_sh:='1'; --响1秒
elsif turn_on='0' and turn_off='0' then
led_g<='0';led_r<='1';temp_sh:='0';
else null;
end if;
end if;
speaker<=(temp or temp_sh) and clk_1k; --驱动喇叭
end process;
end behave;
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式