十二、数字密码锁设计

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

实验目的

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

实验平台

芯航线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. 在centos7上搭建mongodb副本集

    1.安装副本集介绍 副本集(Replica Set)是一组MongoDB实例组成的集群,由一个主(Primary)服务器和多个备份(Secondary)服务器构成.通过Replication,将数据的 ...

  2. http的短连接和长连接

    首先http是无状态的,这个是一定的. 然后短连接和长连接本身和客户端请求没有关系. 1.短连接:客户端请求,服务器立刻响应,服务器响应后此次http请求立刻结束. 2.长连接:客户端请求,服务器可以 ...

  3. python开发_function annotations

    在看python的API的时候,发现了一个有趣的东东,即:python的方法(函数)注解(Function Annotation) 原文: 4.7.7. Function Annotations Fu ...

  4. Foglight 5.6.7 控制台jboss报404

    Foglight 5.6.7 控制台jboss报404 [终极问题原来就一数据库权限问题!下文是由问题源找到的类似的dell support的相关文章,但却是关于sql server error的,感 ...

  5. leetcode705

    class MyHashSet { public: /** Initialize your data structure here. */ MyHashSet() { } void add(int k ...

  6. **python中的类和他的成员

    面向对象是一种编程方式,此编程方式的实现基于对 类 和 对象 的使用. Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的. 在这里,为文章中使用 ...

  7. python web框架简介Bottle Flask Tornado

    Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Python的标准库外,其不依赖任何其他模块. ? 1 2 3 4 pip inst ...

  8. MySQL 主从同步失败,数据表修复

    问题描述: 接到报警称一台 MySQL 从库同步失败.登录服务器查看错误日志信息如下: Last_Error: Error 'Incorrect key file for table './bfcc/ ...

  9. spring的传播行为和隔离级别

    7个传播行为,4个隔离级别(转自 http://www.blogjava.net/freeman1984/archive/2010/04/28/319595.html) Spring事务的传播行为和隔 ...

  10. Nginx负载均衡高可用

    1.   Nginx负载均衡高可用 首先介绍一下Keepalived,它是一个高性能的服务器高可用或热备解决方案,Keepalived主要来防止服务器单点故障的发生问题,可以通过其与Nginx的配合实 ...