基于FPGA的电子密码锁设计

一.设计要求

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;

 

郑重声明:资讯 【基于FPGA的电子密码锁设计】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——