十二、数字密码锁设计

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

实验目的

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

实验平台

芯航线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. C# 接口(Interface)

    接口定义了所有类继承接口时应遵循的语法合同.接口定义了语法合同 "是什么" 部分,派生类定义了语法合同 "怎么做" 部分. 口定义了属性.方法和事件,这些都是接 ...

  2. 数据分析之Numpy-数组计算

    引言 : 数据分析 : 就是把隐藏在一些看似杂乱无章的数据背后的信息提炼出来,总结出研究对象的内在规律 . 数据分析三剑客 : Numpy   数组计算    Pandas   表计算与数据分析   ...

  3. Django models拆分

    大多数Django教程都是将models放在models.py文件(模块)中, 然而随着models类的增加, 将类放在一个文件中太混乱了, 于是将models做成一个package: 这样就可以将m ...

  4. 使用json格式去call外部系统

    1. 使用postman去call post方式 body填入对应的json请求 格式选json 2. 使用java 代码去call import java.io.BufferedReader; im ...

  5. kibana-4.6.3-linux-x86_64.tar.gz的安装(图文详解)(升级)

     前期博客 kibana-4.6.3-linux-x86_64.tar.gz的下载(图文详解) 因为,我的机器情况是如下: 1.上传 [hadoop@master app]$ rz [hadoop@m ...

  6. Centos6、7 PHP5.4 5.5 5.6安装

    https://www.mojowill.com/geek/howto-install-php-5-4-5-5-or-5-6-on-centos-6-and-centos-7/ https://blo ...

  7. Apache Hive (一)Hive初识

    转自:https://www.cnblogs.com/qingyunzong/p/8707885.html Hive 简介 什么是Hive 1.Hive 由 Facebook 实现并开源 2.是基于 ...

  8. bootstrap-select用法详解

    首先需要引入 <!-- Latest compiled and minified CSS --> <link rel="stylesheet" href=&quo ...

  9. LIN通讯

    1.定义 LIN(Local Interconnect Network)总线是基于UART/SCI(通用异步收发器/串行接口)的低成本串行通讯协议.其目标定位于车身网络模块节点间的低端通信,主要用于智 ...

  10. 670. Maximum Swap 允许交换一个数 求最大值

    [抄题]: Given a non-negative integer, you could swap two digits at most once to get the maximum valued ...