【小梅哥FPGA进阶教程】第十二章 数字密码锁设计
十二、数字密码锁设计
本文由山东大学研友袁卓贡献,特此感谢
实验目的
实现数字密码锁设计,要求矩阵按键输出且数码管显示输入密码,密码输入正确与否均会有相应标志信号产生。
实验平台
芯航线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进阶教程】第十二章 数字密码锁设计的更多相关文章
- 【小梅哥FPGA进阶教程】第十三章 四通道数字电压表
十三.四通道数字电压表 本文由山东大学研友袁卓贡献,特此感谢 实验目的 设计一个四通道的数字电压表 实验平台 芯航线FPGA核心板.AD/DA模块 实验现象 实现一个四通道的数字电压表,其中可以用按键 ...
- 【小梅哥FPGA进阶教程】第十一章 四通道幅频相可调DDS信号发生器
十一.四通道幅频相可调DDS信号发生器 本文由山东大学研友袁卓贡献,特此感谢 实验目标 实现多通道可调信号发生器 实验平台 芯航线FPGA核心板.ADDA模块 实验现象 实现基于FPGA的多通道可调信 ...
- 【小梅哥FPGA进阶教程】第十四章 TFT屏显示图片
十四.TFT屏显示图片 本文由杭电网友曾凯峰贡献,特此感谢 学习了小梅哥的TFT显示屏驱动设计后,想着在此基础上通过TFT屏显示一张图片,有了这个想法就开始动工了.首先想到是利用FPGA内部ROM存储 ...
- 【小梅哥FPGA进阶教程】串口发送图片数据到SRAM在TFT屏上显示
十五.串口发送图片数据到SRAM在TFT屏上显示 之前分享过rom存储图片数据在TFT屏上显示,该方法只能显示小点的图片,如果想显示TFT屏幕大小的图片上述方法rom内存大小不够.小梅哥给了个方案,利 ...
- 【小梅哥FPGA进阶教程】MC8051软核在FPGA上的使用
十.MC8051软核在FPGA上的使用 本教程内容力求以详细的步骤和讲解让读者以最快的方式学会 MC8051 IP core 的应用以及相关设计软件的使用,并激起读者对 SOPC 技术的兴趣.本实验重 ...
- 【小梅哥FPGA进阶教程】第九章 基于串口猎人软件的串口示波器
九.基于串口猎人软件的串口示波器 1.实验介绍 本实验,为芯航线开发板的综合实验,该实验利用芯航线开发板上的ADC.独立按键.UART等外设,搭建了一个具备丰富功能的数据采集卡,芯航线开发板负责进行数 ...
- 2017.2.13 开涛shiro教程-第十二章-与Spring集成(二)shiro权限注解
原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. 第十二章-与Spring集成(二)shiro权限注解 shiro注 ...
- 2017.2.13 开涛shiro教程-第十二章-与Spring集成(一)配置文件详解
原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. 第十二章-与Spring集成(一)配置文件详解 1.pom.xml ...
- python 教程 第二十二章、 其它应用
第二十二章. 其它应用 1) Web服务 ##代码 s 000063.SZ ##开盘 o 26.60 ##最高 h 27.05 ##最低 g 26.52 ##最新 l1 26.66 ##涨跌 c ...
随机推荐
- linux中的常用压缩与解压缩命令
linux中常用的压缩格式有 .zip .gz .bz2 .tar.gz .tar.bz2 一..zip 1.命令格式 zip 压缩文件名 源文件名 (压缩文件到当 ...
- 22_java之File对象
01IO技术概述 * A:IO技术概述 * a: Output * 把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作 * b: Input * 把持久设备上的数据读取到内存中的这 ...
- django之上传图片
上传图片 当Django在处理文件上传的时候,文件数据被保存在request.FILES FILES中的每个键为<input type="file" name="& ...
- 【转】javascript 执行环境,变量对象,作用域链
这篇文章比较清晰的解释了一些作用域链相关的概念,忍不住收藏了 原文地址:http://segmentfault.com/a/1190000000533094 前言 这几天在看<javascrip ...
- DataSnap 连接池 DSServer1Disconnect
DataSnap Server DSServer1Disconnect 这个函数什么时候执行? void __fastcall TServerContainer1::DSServer1Disconne ...
- Subversion Self Signed Certificates
When connecting to Subversion repositories using SSL connections the SVN client checks the server ce ...
- atl控件发布打包<转>
http://www.cnblogs.com/gengaixue/archive/2010/08/13/1799112.html ActiveX打包与发布 在VS2005或VS2008安装后发现路径* ...
- Windows下DOS命令大全(经典收藏)
copy \\ip\admin$\svv.exe c:\ 或:copy\\ip\admin$\*.* 复制对方admini$共享下的srv.exe文件(所有文件)至本地C: xcopy 要复制的文件或 ...
- java基础之HashSet如何保证对象的唯一性
首先Set集合是无序的 不可重复的 add的时候判断对象是否重复是用的equals HashSet<String> 存储String类型的数据时是可以保证数据的唯一性的 因为String类 ...
- Java故障分析基础
JVM基础 垃圾回收器 GC日志 jps, jinfo命令 jmap, jhat命令 jstat命令 线程dump jvisualVM / jconsole MAT(Memory Analyzer t ...