十二、数字密码锁设计

本文由山东大学研友袁卓贡献,特此感谢

实验目的

实现数字密码锁设计,要求矩阵按键输出且数码管显示输入密码,密码输入正确与否均会有相应标志信号产生。

实验平台

芯航线FPGA核心板、数码管_VGA_PS2模块、矩阵按键模块

实验原理

随着生活质量的提高,当代人们也认识到了安全的重要性,已经不再满足于老式的机械钥匙。近年来越来越多的技术开始在安全领域应用,例如普通的按键输入、指纹输入或者虹膜输入等。

本节设计一款按键输入式密码锁,用矩阵键盘输入密码,输入完成后进行密码比对,如密码输入正确则输出开门信号以及灯光指示,如密码输入错误则蜂鸣器进行报警以及灯光指示。

综合以上要求可以看出此处系统框图如图1所示。

图1 系统框图

其中各模块功能描述如表1所示。

表1 各模块功能描述

矩阵按键模块

现在分开介绍,矩阵按键输入控制模块的框图及其接口列表如下所示,详细内容可以参考芯航线关于矩阵按键的教程,此处不再详述。

图2 矩阵按键模块框图

表2 矩阵按键模块接口列表

密码比较模块:

现介绍密码检测模块,其主要功能即比较输入与预设的密码是否一致,

图2 密码检测模块框图

表2 密码检测模块列表

这里先将密码设置为4位十进制数1234,如下所示

parameter PASSWORD = 'b0001_0010_0011_0100;

通过计数矩阵按键按下标志信号,依次将数据暂存到寄存器mima_r中。

    always@(posedge Clk or negedge Rst_n) begin
if(!Rst_n)
key_cnt <= 'b0;
else if(key_flag) begin
if(key_cnt == 'd3)
key_cnt <= 'b0;
else
key_cnt <= key_cnt + 'b1;
end
else
key_cnt <= key_cnt;
end always@(posedge Clk or negedge Rst_n) begin
if(!Rst_n)
mima_r <= 'b0;
else if(key_flag)
case(key_cnt)
'd0: mima_r[15:12] <= key_value[3:0];
'd1: mima_r[11:8] <= key_value[3:0];
'd2: mima_r[7:4] <= key_value[3:0];
'd3: mima_r[3:0] <= key_value[3:0];
default: mima_r <= ;
endcase
else
mima_r <= mima_r;
end

这里通过一个独立按键来控制比较信号,用到了按键消抖模块,详细内容可以参考芯航线有关章节。

    wire key_startbj_flag;wire key_startbj_state;

    key_filter key_filter_start(
.Clk(Clk),
.Rst_n(Rst_n),
.key_in(start_bj),
.key_flag(key_startbj_flag),
.key_state(key_startbj_state)
);

当开始比较后,根据实际情况判断后输出正确与否。

    always@(posedge Clk or negedge Rst_n)begin
if(!Rst_n) begin
error <= 'b0;
right <= 'b0;
end
else if(key_startbj_flag && !key_startbj_state)begin
if(mima_r == PASSWORD) begin
right <= 'b1;
error <= 'b0;
end
else begin
right <= 'b0;
error <= 'b1;
end
end
else begin
error <= 'b0;
right <= 'b0;
end
end

控制模块:

现在介绍模块的控制单元。本模块主要功能是根据密码检测模块的输出确定,开关门信号以及声光信号。其模块接口列表及功能描述如下所示。

图3 控制模块框图

表3 控制模块接口列表

在这里使用三段式状态机进行描述。

    parameter   IDLE  = 'b001,
PASS = 'b010,
ALARM = 'b100;

第一个always块:

    always@(posedge Clk or negedge Rst_n) begin
if(!Rst_n)
current_state <= IDLE;
else
current_state <= next_state;
end

第二个always块:

    always@(current_state or error or right or cnt_2s) begin
case(current_state)
IDLE: begin
if(right)
next_state = PASS;
else if(error)
next_state = ALARM;
else
next_state = IDLE;
end
PASS: begin
if(cnt_2s) //door_close
next_state = IDLE;
else
next_state = PASS;
end
ALARM: begin
if(cnt_2s)
next_state = IDLE;
else
next_state = ALARM;
end
default: next_state = IDLE;
endcase
end

第三个always块:

    always@(posedge Clk or negedge Rst_n) begin
if(!Rst_n) begin
door_open_r <= 'b0; led_alarm_r <= 1'b0;
led_right_r <= 'b0; beep_En <= 1'b0;
end
else begin
case(next_state)
IDLE: begin
door_open_r <= 'b0; led_alarm_r <= 1'b0;
led_right_r <= 'b0; beep_En <= 1'b0;
end
PASS: begin
if(cnt_2s)begin
door_open_r <= 'b0; led_alarm_r <= 1'b0;
beep_En <= 'b0; led_right_r <= 1'b0;
end
else begin
door_open_r = 'b1;led_right_r = 1'b1;
end
end
ALARM: begin
if(cnt_2s) begin
led_alarm_r = 'b0; beep_En = 1'b0;
end
else begin
led_alarm_r = 'b1; beep_En = 1'b1;
end
end
default: begin
door_open_r <= door_open_r; led_alarm_r <= led_alarm_r;
beep_En <= beep_En;
led_right_r <= led_right_r;
end
endcase
end
end

数码管显示模块:

Hex8为数码管显示模块,其框图以及其接口列表如下所示,具体功能介绍可参见芯航线相关内容。

图4 数码管显示模块框图

表4 数码管显示模块接口列表

顶层设计:

最后在顶层例化各模块即可,分配引脚后全编译无误后即可下载到芯航线开发板中观测到对应现象。

图5 顶层文件RTL Viewer

如有更多问题,欢迎加入芯航线 FPGA 技术支持群交流学习:472607506

小梅哥

芯航线电子工作室

关于学习资料,小梅哥系列所有能够开放的资料和更新(包括视频教程,程序代码,教程文档,工具软件,开发板资料)都会发布在我的云分享。(记得订阅)链接:http://yun.baidu.com/share/home?uk=402885837&view=share#category/type=0

赠送芯航线AC6102型开发板配套资料预览版下载链接:链接:http://pan.baidu.com/s/1slW2Ojj 密码:9fn3

赠送SOPC公开课链接和FPGA进阶视频教程。链接:http://pan.baidu.com/s/1bEzaFW 密码:rsyh

【小梅哥FPGA进阶教程】第十二章 数字密码锁设计的更多相关文章

  1. 【小梅哥FPGA进阶教程】第十三章 四通道数字电压表

    十三.四通道数字电压表 本文由山东大学研友袁卓贡献,特此感谢 实验目的 设计一个四通道的数字电压表 实验平台 芯航线FPGA核心板.AD/DA模块 实验现象 实现一个四通道的数字电压表,其中可以用按键 ...

  2. 【小梅哥FPGA进阶教程】第十一章 四通道幅频相可调DDS信号发生器

    十一.四通道幅频相可调DDS信号发生器 本文由山东大学研友袁卓贡献,特此感谢 实验目标 实现多通道可调信号发生器 实验平台 芯航线FPGA核心板.ADDA模块 实验现象 实现基于FPGA的多通道可调信 ...

  3. 【小梅哥FPGA进阶教程】第十四章 TFT屏显示图片

    十四.TFT屏显示图片 本文由杭电网友曾凯峰贡献,特此感谢 学习了小梅哥的TFT显示屏驱动设计后,想着在此基础上通过TFT屏显示一张图片,有了这个想法就开始动工了.首先想到是利用FPGA内部ROM存储 ...

  4. 【小梅哥FPGA进阶教程】串口发送图片数据到SRAM在TFT屏上显示

    十五.串口发送图片数据到SRAM在TFT屏上显示 之前分享过rom存储图片数据在TFT屏上显示,该方法只能显示小点的图片,如果想显示TFT屏幕大小的图片上述方法rom内存大小不够.小梅哥给了个方案,利 ...

  5. 【小梅哥FPGA进阶教程】MC8051软核在FPGA上的使用

    十.MC8051软核在FPGA上的使用 本教程内容力求以详细的步骤和讲解让读者以最快的方式学会 MC8051 IP core 的应用以及相关设计软件的使用,并激起读者对 SOPC 技术的兴趣.本实验重 ...

  6. 【小梅哥FPGA进阶教程】第九章 基于串口猎人软件的串口示波器

    九.基于串口猎人软件的串口示波器 1.实验介绍 本实验,为芯航线开发板的综合实验,该实验利用芯航线开发板上的ADC.独立按键.UART等外设,搭建了一个具备丰富功能的数据采集卡,芯航线开发板负责进行数 ...

  7. 2017.2.13 开涛shiro教程-第十二章-与Spring集成(二)shiro权限注解

    原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. 第十二章-与Spring集成(二)shiro权限注解 shiro注 ...

  8. 2017.2.13 开涛shiro教程-第十二章-与Spring集成(一)配置文件详解

    原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. 第十二章-与Spring集成(一)配置文件详解 1.pom.xml ...

  9. python 教程 第二十二章、 其它应用

    第二十二章. 其它应用 1)    Web服务 ##代码 s 000063.SZ ##开盘 o 26.60 ##最高 h 27.05 ##最低 g 26.52 ##最新 l1 26.66 ##涨跌 c ...

随机推荐

  1. OD 实验(十七) - 对一个程序的逆向分析

    程序: 运行程序 弹出一个对话框,点击 OK 来到主界面,点击 Help -> Register Now 这是输入注册码的地方 按关闭程序的按钮 会提示剩下 30 天的使用时间 用 Ressco ...

  2. 第一个 Windows 界面程序

    编译器 使用的编译器为 Visual Studio 2017 菜单栏 -> 文件 -> 新建 -> 项目 选择 Windows 桌面应用程序,然后填好相关信息后点击“确定” 在解决方 ...

  3. Python 小知识点(10)--异常结构记录

    try: print("try中") except KeyError as e: # 异常时,执行该块 print("异常中") else: # 主代码块(tr ...

  4. 修改SecureCRT终端的Home和End功能键。

    SecureCRT真是个不错的ssh客户端工具,但在使用时发现跟自己的一些使用习惯不符合,例如home.end.pageup.pagedown和delete等键. 默认情况下一些按键的功能如下: pa ...

  5. JSTL中EL表达式无法直接取size的处理

    jsp中使用${list.size }会编译成list.getSize()方法,并不能获取list的长度,因为程序回去找List对象中的getSize()方法,所以只能想别的办法, 一种方法是在后台程 ...

  6. Nginx在Windows下的使用与配置

    前往官网下载对应的windows版本 官网 下载后进入安装目录,启动命令行窗口,输入: nignx -c conf\nginx.conf 则nginx服务器已经启动. 打开浏览器,在标题栏输入: lo ...

  7. Windows安装Mysql5.7.22

    1.下载Mysql,5.7版本,将zip包解压到某个安装目录下面,最好不要放C盘,选择一个容量大的磁盘.下载地址:https://dev.mysql.com/downloads/mysql/ 2.进入 ...

  8. 读书笔记 Week7 2018-4-24

    <程序员的自我修养> 首先来大致说一下读这本书的感觉,可以说对于我自己而言,是第一次对于编程有了个纯粹的认识,或者说的更明确一点,是对整个操作系统有了一个大致的感觉.虽然自己这一年也算是写 ...

  9. C++ const引用

    (1)       在实际的程序中,引用主要被用做函数的形式参数--通常将类对象传递给一个函数.引用必须初始化. 但是用对象的地址初始化引用是错误的,我们可以定义一个指针引用. 1 int ival ...

  10. 【LA5135 训练指南】井下矿工 【双连通分量】

    题意 有一座地下稀有金属矿由n条隧道和一些连接点组成,其中每条隧道连接两个连接点.任意两个连接点之间最多只有一条隧道.为了降低矿工的危险,你的任务是在一些连接点处安装太平井和相应的逃生装置,使得不管哪 ...