找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3036|回复: 1
打印 上一主题 下一主题
收起左侧

VHDL语言实现电子密码锁(门铃)程序设计

[复制链接]
跳转到指定楼层
楼主
ID:670450 发表于 2019-12-22 15:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

1.开锁代码为8位二进制数,当输入代码的位数和位值与锁内给定的密码一致,且按规定程序开锁时,方可开锁,并点亮开锁指示灯LT。否则,系统进入“错误”状态,并发出报警信号。

2.开锁程序由设计者确定,并要求锁内给定的密码是可调的,且预置方便,保密性好。

3.串行数字锁的报警方式是点亮77指示灯LF,并使喇叭鸣叫来报警,报警动作响1分钟,停10秒钟后再重复出现,直到按下复位开关,报警才停止。此时,数字锁自动进入等待下一次开锁的状态。

4.报警器可以兼作门铃用,门铃响的时间通常为7~10秒。

2 设计分析及系统方案设计

系统的结构图如下图所示:

本实验要求串行输入八位密码,密码可以随意设置,可以任意更改, 并且能够存储.而且能够显示出当前已经输入或者设置的位数,待输入八位后通过比较电路与预先设置的密码进行比较.如果输入的密码与存储的密码相同锁体打开 如果输入的密码与存储的密码不同则报警系统打开发出警报.由于还要求有门铃功能所以增加一个门铃输入当门铃按下后 门铃响十秒钟。


对于密码存储以及密码输入比较部分主要由load 控制。


Load

0

1

li

0

1

La

1

0

系统功能

设置密码

输入密码


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开发板上使用的元件要给出使用管脚编号。

接口

名称

类型

(输入/输出)

符号

引脚号

说明

CLK

输入

CLOCK_50

PIN_N2

输入50MHz的时钟频率

LOAD

输入

SW[17]

PIN_V2

修改(0)/设置(1)密码

K0

输入

KEY[0]

PIN_G26

输入密码0(低电平有效)

K1

输入

KEY[1]

PIN_N23

输入密码1(低电平有效)

Press

输入

KEY[2]

PIN_P23

门铃按钮(低电平有效)

CLR

输入

KEY[3]

PIN_W26

复位开关(低电平有效)

lt

输出

LEDR[0]

PIN_AE23

开锁成功指示灯

alm2

输出

LEDR[12]

PIN_AD15

门铃(小灯)

lf

输出

LEDR[16]

PIN_AE12

开锁失败指示灯

alm

输出

LEDR[17]

PIN_AD12

开锁失败报警器(小灯)

y0[0]

输出

HEX7[0]

PIN_L3

输入密码七段码显示

y0[1]

输出

HEX7[1]

PIN_L2

输入密码七段码显示

y0[2]

输出

HEX7[2]

PIN_L9

输入密码七段码显示

y0[3]

输出

HEX7[3]

PIN_L6

输入密码七段码显示

y0[4]

输出

HEX7[4]

PIN_L7

输入密码七段码显示

y0[5]

输出

HEX7[5]

PIN_P9

输入密码七段码显示

y0[6]

输出

HEX7[6]

PIN_N9

输入密码七段码显示

y1[0]

输出

HEX5[0]

PIN_T2

修改密码七段码显示

y1[1]

输出

HEX5[1]

PIN_P6

修改密码七段码显示

y1[2]

输出

HEX5[2]

PIN_P7

修改密码七段码显示

y1[3]

输出

HEX5[3]

PIN_T9

修改密码七段码显示

y14]

输出

HEX5[4]

PIN_R5

修改密码七段码显示

y1[5]

输出

HEX5[5]

PIN_R4

修改密码七段码显示

y1[6]

输出

HEX5[6]

PIN_R3

修改密码七段码显示


4 系统的VHDL设计

系统的主要功能是通过VHDL语言来实现的。语言代码如下。

  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3. use ieee.std_logic_unsigned.all;
  4. use ieee.std_logic_arith.all;
  5. entity mima is
  6.    port (clk:in std_logic;                                                                                   --定义时钟
  7.                             k0:in std_logic;                                                             --输入一位0
  8.                             k1:in std_logic;                                                             --输入一位1
  9.                             clr:in std_logic;                                                                        --复位
  10.                             load:in std_logic;                                                                        --改变状态
  11.                             press:in std_logic;                                                                      --门铃按钮
  12.                             alm2:out std_logic;                                                                        --门铃
  13.                             lt:out std_logic;                                                                --开锁信号
  14.                             y0:out std_logic_vector(6 downto 0);                                                         --输入位数显示
  15.                             y1:out std_logic_vector(6 downto 0);                                              --输出位数显示
  16.                             lf:out std_logic;                                                    --亮灯
  17.                             alm:out std_logic);                                                                        --报警铃
  18. end mima;
  19. architecture aaa of mima is
  20. signal shift,lock:std_logic_vector(7 downto 0):="00000000"; --定义shift,lock
  21.               signal lam1,lam:std_logic_vector(7 downto 0);         --定义lam1,lam
  22.               signal la,li:std_logic;                              --定义la,li
  23.               signal clk1:std_logic;                              --定义clk1
  24.               signal p:std_logic_vector (4 downto 0);                --定义p
  25.               signal aa:std_logic;                                --定义aa
  26. begin
  27. m16:process(clk)                                    --将clk 16M分频
  28. variable q: std_logic_vector(22 downto 0);
  29. begin
  30.               if clk'event and clk='1' then q:=q+1;                --检测clk上升沿 q=q+1
  31.               end if;                                      
  32. if q="11111111111111111111111" then clk1<='1';  -- clk1产生一个上升沿脉冲
  33.               else clk1<='0';               
  34.               end if;
  35. end process m16;               
  36. process(clk1,clr)                                      --判断是否复位                                             
  37.               begin
  38.                             if clr='0' then                                         
  39.                                           la<='0';                                                   
  40.                                           li<='0';        
  41.                             elsif clk1'event and clk1='1' then                 --检测clk1上升沿
  42.                                           if load='0' then                           --判断状态
  43.                                              la<='1';                              --设置密码
  44.                                           else           
  45.                                              li<='1';                                                    --输出密码
  46.                             end if;
  47.                             end if;
  48. end process;
  49. process(clk1,clr)                            --复位及输入设置密码
  50. variable a:integer range 0 to 8;                           
  51. begin
  52.               if clr='0' then                                 --复位
  53.                                lam<="00000000";                                         --lam置零
  54.                             lam1<="00000000";                                        --lam1置零
  55.                             shift<="00000000";                                       --shift置零
  56.                             a:=0;                                      --a置零
  57.                             lt<='0';                                    --开锁置零
  58.                             lf<='0';                                   --警报灯置零
  59.                             alm<='0';                                 --警报置零
  60.               elsif clk1'event and clk1='1' then                 --检测上升沿
  61.                             if li='1' then                              --输入密码
  62.                                           if a/=8 then                        --判断密码是否输入完毕
  63.                                                         if k1='0' then                       --输入1
  64.                                                                       shift<='1'&shift(7 downto 1 );         --依次输入一个1
  65.                                                                       lam<='1'&lam(7 downto 1);      --点亮对应的一个小灯
  66.                                                                       a:=a+1;                                                     
  67.                                                         elsif k0='0'then                            --输入一位0
  68.                                                                       shift<='0'&shift(7 downto 1);          --依次输入一个1
  69.                                                                       lam<='1'&lam(7 downto 1);      --点亮对应的一个小灯
  70.                                                                       a:=a+1;
  71.                                                         end if;
  72.                                           else
  73.                                                         a:=0;
  74.                                                         if shift=lock then              --判断密码是否正确
  75.                                                                       lt<='1';                  --正确 开锁
  76.                                                         else                                            
  77.                                                                       lf<='1';                   --错误 警报亮
  78.                                                                       alm<='1';                    --错误 警报响
  79.                                                         end if;
  80.                                           end if;
  81.                             elsif la='1' then                     --输入密码
  82.                                   a:=0;               
  83.                                           if k1='0' then                     --输入一位1
  84.                                                         lock<='1'&lock(7 downto 1);   --lock密码增加一位1
  85.                                                         lam1<='1'&lam1(7 downto 1);  --点亮对应的灯
  86.                                                         a:=a+1;
  87.                                           elsif k0='0' then                  --输入一位0
  88.                                                         lock<='0'&lock(7 downto 1);   --lock密码增加一位0
  89.                                                         lam1<='1'&lam1(7 downto 1 );  --点亮对应的灯
  90.                                                         a:=a+1;
  91.                                           end if;
  92.               end if;
  93. end if;
  94. end process;
  95. code1:process(lam)                      --将小灯泡显示转换到LED显示
  96.               begin
  97.                             case lam is
  98.                             when "00000000"=>y0<="1111111";    --显示0
  99.                             when "10000000"=>y0<="1111001";    --显示1
  100.                             when "11000000"=>y0<="0100100";                --显示2
  101.                             when "11100000"=>y0<="0110000";     --显示3
  102.                             when "11110000"=>y0<="0011001";     --显示4
  103.                             when "11111000"=>y0<="0010010";                            --显示5
  104.                             when "11111100"=>y0<="0000010";                            --显示6
  105.                             when "11111110"=>y0<="1111000";                            --显示7
  106.                             when "11111111"=>y0<="0000000";                            --显示8
  107.                             when others=>y0<="1111111";           --关闭数码管
  108.               end case;
  109.               end process;
  110.               code2:process(lam1)                     --显示位数                                 
  111.               begin
  112.                             case lam1 is
  113.                             when "00000000"=>y1<="1111111";      --显示0
  114.                             when "10000000"=>y1<="1111001";      --显示1
  115.                             when "11000000"=>y1<="0100100";      --显示2
  116.                             when "11100000"=>y1<="0110000";      --显示3
  117.                             when "11110000"=>y1<="0011001";      --显示4
  118.                             when "11111000"=>y1<="0010010";      --显示5
  119.                             when "11111100"=>y1<="0000010";      --显示6
  120.                             when "11111110"=>y1<="1111000";      --显示7
  121.                             when "11111111"=>y1<="0000000";      --显示8
  122.                             when others=>y1<="1111111";         --关闭数码管
  123.               end case;
  124.               end process;
  125.               pp:process(press)                        --门铃功能
  126. begin
  127.               if press='0' then                         --按下门铃
  128.                             alm2<='1';                          --门铃响
  129.               end if;
  130.               if clk1'event and clk1='1' then   p<=p+1;    --延时10秒
  131.               end if;
  132.               if p=30 then
  133.                             p<="00000";            
  134.                             alm2<='0';                         --关闭门铃
  135.               end if;
  136. end process pp;
  137. end aaa;
复制代码

本系统运行在联想计算机平台和Altera DE2平台,用的是quartus60软件调试环境,系统的参数选取均按照要求适当选取。

对密码模块:开始时,先给系统清零,即使clr为0(按下KEY[3]),若设置密码则SW[17]开关拨下使load为低电平,此时通过按去抖开关KEY[0],KEY[1]进行密码设置0和1,每输入一位密码则数目管显示的数字加1直到输入第8位

设置密码:仿真图如下如所示。设置密码时将SW[17]拨下使load为低电平并且clr为高电平此时可以设置密码,由图可以看出设置的密码为00000111每设置一位密码数码管HEX5的七个引脚都随着y1[0~6]的变化而变化,进而显示出当前的位数。

设置密码仿真图

当输入密码时,SW[17]开关拨上使load为高电平输入密码开始,此时通过按去抖开关KEY[0],KEY[1]进行密码设置0和1,每输入一位密码则数目管显示的数字加1直到输入第8位。系统自动将输入的密码与预设的密码进行比较如果相同则开锁。开锁成功仿真图如下如所示,此时设置的密码为00001111输入的密码为00001111,由图可以看每设置一位密码数码管HEX5的七个引脚都随着y1[0~6]的变化而变化,进而显示出当前的位数。此时clr为高电平load为低电平当密码输入完毕后将load变为高电平进行密码输入输入方法与设置密码相同没设置一位密码数码管HEX7的七个引脚都随着y0[0~6]的变化而变化,进而显示出当前的位数。当输完八位密码后系统将其与预先设置的密码进行对比,由于设置与输入的密码相同所以lt为高电平开锁,lf、alm为低电平没有反应。

                     密码正确开锁成功仿真图

开锁不成功仿真图如下如所示,此时设置的密码为00000111输入的密码为00000011,由图可以看每设置一位密码数码管HEX5的七个引脚都随着y1[0~6]的变化而变化,进而显示出当前的位数。此时clr为高电平load为低电平当密码输入完毕后将load变为高电平进行密码输入输入方法与设置密码相同没设置一位密码数码管HEX7的七个引脚都随着y0[0~6]的变化而变化,进而显示出当前的位数。当输完八位密码后系统将其与预先设置的密码进行对比,由于设置与输入的密码不同所以lt为低电平不开锁,lf、alm为高电平,警报响起,警报灯亮起

密码错误开锁不成功仿真图

门铃功能仿真图如下图所示。对于门铃部分 当检测到press信号的下降沿时门铃开始响,计数器开始计数,当计数器为30时门铃自动关闭

                     门铃功能仿真图


完整的Word格式文档51黑下载地址:

文档.doc (881 KB, 下载次数: 34)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:704279 发表于 2020-3-9 03:17 | 只看该作者
请问您下到板子上验证的代码和您上传的代码是否有改动呢?我下载您的代码后发现,无法下到fpga板子上。不知道您是否有空赐教
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表