• 方案介绍
  • 附件下载
  • 相关推荐
申请入驻 产业图谱

简易单元门禁系统4x4矩阵键盘VHDL代码Quartus仿真

06/26 08:05
479
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

2-24010910033T42.doc

共1个文件

名称:简易单元门禁系统4x4矩阵键盘VHDL代码Quartus仿真

软件:Quartus

语言:VHDL

代码功能:

简易单元门禁系统4x4矩阵键盘

设计实现一个简易单元门禁系统,模拟呼叫住户和开关单元门的基本功能。

基本要求:

1、 本单元门禁系统的住户为 8 户,门牌号分别为 101、102、103、104、105、106、107 和 108),按键 BTN0-BTN7 为各家户内开单元门的按键(BTN0→101、BTN1→102、BTN2→103、BTN3→104、BTN4→105、BTN5→106、BTN6→107、BTN7→108),发光二极管 LD0-LD7 为 8 个住户被呼叫的指示灯(LD0→101、LD1→102、LD2→103、LD3→104、LD4→105、LD5→106、LD6→107、LD7→108)。

2、 来访客人用键盘(键盘设置见图 1)输入门牌号(以 103 为例),客人在键盘上输入的门牌号 103 的过程中,门牌号 103 要依次显示在数码管 DIP2-DISP0 上,当门牌号103 输入无误并按下确认键后,对应的发光二极管 LD2 亮起,同时蜂鸣器响起门铃音乐(乐曲自拟),103 户内的人听到门铃音乐后按一下对应的开门按键 BTN2 打开单元门(点阵演示开门动画),同时对应的发光二极管 LD2 熄灭,门铃音乐停止,数码管 DIP6 从 9 开始进行 10 秒倒计时,倒计时到 0 时,点阵演示关门动画,同时数码管 DIP2-DISP0 上显示的门牌号 103 熄灭,完成一次访客进单元门的过程;

3、 如果来访客人在输入门牌号时发生的错误,可以按删除键将已输入的数字删掉(数码管 DIP2-DISP0 上已经显示的数字熄灭),重新输入门牌号;

4、 住户进门时,同时按下小键盘最右列上面的三个键(刷卡键)一次打开单元门(模拟刷卡开门),点阵演示开门动画,同时数码管 DIP6 从 9 开始进行 10 秒倒计时,倒计时到 0 时,点阵演示关门动画,完成一次住户进单元门的过程;

5、 来访客人或住户出门离开所在单元时,按一下小键盘上右下角的出门按键(模拟单元门内的开门键)打开单元门,点阵演示开门动画,同时数码管 DIP6 从 9 开始进行 10 秒倒计时,倒计时到 0 时,点阵演示关门动画,完成一次访客出单元门的过程;

6、 单元门的开门和关门动画自拟,尽可能形象;

7、 系统上电时,实验板上所有的显示器件应都没有显示;

8、 系统工作流程合理,工作稳定。

FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com

设计文档:

一、整体框图

电路功能由key_module、key44、control_module、seg_display共4个模块组成。

二、模块功能

key_module:即独立按键处理模块,用于对8个独立按键进行消抖,输入为按键,输出为消抖后的按键上升沿。

key44:矩阵按键处理模块,该模块用于控制板子上的4*4矩阵键盘,输入为矩阵键盘的行控制信号,输出列信号和对应按键的键值。

control_module:即控制模块,该模块为系统主控模块,用于根据按键输入的内容判断是否开门及LED、点阵等相关的操作。

seg_display:数码管显示模块,根据控制模块输出的数码管显示内容控制对应的数码管点亮和显示相关数字和字母。

三、波形仿真

1. 独立按键处理模块仿真

图中,输入信号为key,代表了8个按键,每个按键高电平表示按下,以key[0]为例,在图中70ns附近变为高电平,输出信号为key_flag,图中可以看到,key_flag[0]信号在key[0]变为高电平后不久,就输出了一个脉冲信号,该脉冲就是key[0]信号消抖后的上升沿。

2. 矩阵按键处理模块

上图中仿真了矩阵键盘依次按下7,F,B,2的情况。矩阵键盘的最终输出是根据行和列的值确定输出按键值。即通过4位的row信号和4位的col信号进行拼接,再根据拼接后的信号输出key_value。以上图中200ns附近的波形为例说明:图中row值为1011,col_out值为1110,拼接后就是10111110。该拼接后的值对应的按键键值就是7(key44模块代码171行)。

3. ? ? 控制模块仿真

上图中仿真以了一种典型的情况,即来访客人用键盘输入门牌号103?,客人在键盘上输入 的门牌号?103?的过程中,门牌号?103 依次显示在数码管?DIP2-DISP0?上,当门牌号?103?输入无误并按下确认键后,对应的发光二极管?LD2?亮起,103?户内的按一下对应的开门按键?BTN2?打开 单元门,同时对应的发光二极管?LD2?熄灭, 数码管?DIP6?从?9?开始进行?10?秒倒计时。具体对应信号如下图所示:

4. 数码管显示模块

图中,display_num为显示内容。Seg为数码管的段选,用于控制8段数码管哪一段亮,低电平时亮,高电平灭。Sel为数码管的位选信号,需要不断的依次点亮。图中Sel可以看到在依次循环点亮。同时图中输入的待显示内容为AAAAA103,即模拟有用户按下103,其中A表不显示,对应数码管的段选信号为11111111,即该数码管不亮,因此实际数码管显示内容只有3个数码管亮,其他灭,数码管显示内容为103。

部分代码展示:

library?IEEE;
use?IEEE.STD_LOGIC_1164.ALL;
use?ieee.std_logic_arith.all;?
use?ieee.std_logic_unsigned.all;
--时钟分频模块
entity?clock_fenpin?is
generic(cycle:integer:=50000000);--50000000
port
(
clk??:in??std_logic;--系统时钟
rst??:in??std_logic;--系统复位,低有效
enable?:in??std_logic;--计数使能
clk_out??:out?std_logic?--分频信号输出
);
end?clock_fenpin;
architecture?Behavioral?of?clock_fenpin?is
signal?cnt:integer?range?0?to?99999999;
begin
--时钟分频计数
process(clk,rst)
begin
if(rst?=?'0')then
cnt?<=?0;?
elsif(rising_edge(clk))then
if(enable?=?'1')then
if(cnt?=?cycle-1)then
cnt?<=?0;
else?
cnt?<=?cnt+?1;??
end?if;
else?
cnt?<=?0;
end?if;
end?if;
end?process;
--分频后的时钟输出
process(clk,rst)
begin
if(rst?=?'0')then
clk_out?<=?'0';?
elsif(rising_edge(clk))then
if(cnt?=?cycle-1?and?enable?=?'1')then
clk_out?<=?'1';?
else?
clk_out?<=?'0';?
end?if;
end?if;
end?process;
end?Behavioral;

点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=515

  • 2-24010910033T42.doc
    下载

相关推荐