北邮22级信通院数电:Verilog-FPGA(5)第四第五周实验 密码保险箱的设计

北邮22信通一枚~

跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章

持续关注作者 迎接数电实验学习~

获取更多文章,请访问专栏:

北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客

目录

一.密码箱的功能和安全性

显示:

输入部分:

确认键:

复位键:

输出部分:

二.verilog代码

三.消抖模块

四.管脚分配


一.密码箱的功能和安全性

下面介绍本博客实现的密码箱的显示、输入和输出构架:

显示:

FPGA开发版上右数码管常亮,显示你还有几次尝试机会。

代码中人为规定了尝试机会为3次。

每错一次,右数码管上显示的数字都会减少1。

如果三次尝试都失败了,密码箱会被锁死。

输入部分:

四位二进制密码:四个拨码开关的调节。

确认键:

四位二进制密码输入完成后,按确认键;

FPGA会通过亮灯形式通知你输入的密码是否正确;

如果正确,FPGA开发板上的绿灯亮起,右数码管上的数字变成一条横线;

如果错误,FPGA开发板上的红灯亮起,右数码管上的数字减一;

 

如果连续三次尝试错误,FPGA开发板上红灯绿灯同时亮起,右数码管显示数字0,密码箱锁死。

复位键:

主要是为了解决密码箱锁死之后还想继续测试的情况。

当密码箱锁死之后,按下复位键,程序会将所有数据重置,开发板(密码箱)回到初始状态。

确认键和复位键都通过按键开关来实现。

输出部分:

如上描述,输出部分包括右数码管的数字显示、红灯和绿灯的两个指示灯。

二.verilog代码

module password(clk,rst,key_confirm,key_set,sw_password,led,sega);input clk;							//时钟input rst;							//重置input key_confirm;				    //复位键input key_set;						//修改密码input [3:0] sw_password;		    //四位二进制密码output [1:0] led;					//是否解锁指示灯output [8:0] sega;				    //右数码管output [8:0] segb;				    //左数码管reg password =4'b0000;			    //初始密码reg [1:0] sgn;						//两位指示灯信号,对应两路指示灯reg [8:0] seg[3:0];				    //9位宽信号,用来储存数码管数字显示器reg [8:0] seg_data[1:0];		    //数码管显示信号寄存器reg [1:0] cnt;						//计数器,泳衣统计错误次数reg lock;							//程序锁,用于结束程序wire confirm_dbs;					//消抖后确认脉冲initial begin						//初始化seg[0]<=9'h3f;						//数码管显示数字0seg[1]<=9'h06;						//数字1seg[2]<=9'h5b;						//数字2seg[3]<=9'h4f;						//数字3seg_data[0]<=9'h3f;				    //右初始数字显示数字0cnt<=2'b11;							//计数器初始值3endalways @ (posedge clk or negedge rst)	//时钟边沿触发或复位按键触发beginif(!rst)									//复位begin							sgn<=2'b11;								//亮灯均火seg_data[0]<=seg[3];					//右显示数字3cnt<=2'b11;								//计数器复位到3lock<=2'b11;							//程序锁默认状态1(正常)endelse if (confirm_dbs && lock)		    //按下确认键,此处用的消抖后的脉冲信号,\//若程序已锁则不执行beginif(sw_password == password)	        //密码正确beginsgn<=2'b10;						//绿灯亮seg_data[0]<=9'h40;			    seg_data[1]<=9'h40;			    //密码输入正确后两根数码管显示两根横线lock=2'b10;					   	//程序锁进入状态2(可调密码)endelse if(cnt==2'b11)beginsgn<=2'b01;						//红灯亮seg_data[0]<=seg[2];			//数码管显示数字2cnt<=2'b10;						//计数器移至2endelse if(cnt==2'b10)beginsgn<=2'b01;						//红灯亮seg_data[0]<=seg[1];			//数码管显示数字1cnt<=2'b01;						//计数器移至1endelse if(cnt==2'b01)beginsgn<=2'b00;						//绿灯和红灯同时亮seg_data[0]<=seg[0];			//数码管显示数字0lock=0;							//程序锁进入状态0(锁死)endendendassign led=sgn;							    //绿灯代表密码正确,红灯代表密码错误assign sega=seg_data[0];				    //右数码管随输入信号变化改变数值debounce key_confirm_dbs				    //消抖模块,用以消抖确认键(    .clk(clk),.rst(rst),.key(key_confirm),.key_pulse(confirm_dbs));
endmodule	

三.消抖模块

module debounce (clk,rst,key,key_pulse);parameter       N  =  1;                //要消除的按键的数量input             clk;input             rst;input 	[N-1:0]   key;                  //输入的按键					output  [N-1:0]   key_pulse;                //按键动作产生的脉冲	reg     [N-1:0]   key_rst_pre;       //定义一个寄存器型变量存储上一个触发时的按键值reg     [N-1:0]   key_rst;           //定义一个寄存器变量储存储当前时刻触发的按键值wire    [N-1:0]   key_edge;          //检测到按键由高到低变化是产生一个高脉冲//利用非阻塞赋值特点,将两个时钟触发时按键状态存储在两个寄存器变量中always @(posedge clk  or  negedge rst)beginif (!rst) beginkey_rst <= {N{1'b1}};       //初始化时给key_rst赋值全为1,{}中表示N个1key_rst_pre <= {N{1'b1}};endelse beginkey_rst <= key;             //第一个时钟上升沿触发之后key的值赋给key_rst,//同时key_rst的值赋给key_rst_prekey_rst_pre <= key_rst;     //非阻塞赋值。相当于经过两个时钟触发,//key_rst存储的是当前时刻key的值,//key_rst_pre存储的是前一个时钟的key的值end    endassign  key_edge = key_rst_pre & (~key_rst);//脉冲边沿检测。当key检测到下降沿时,//key_edge产生一个时钟周期的高电平reg	[17:0]	  cnt; //产生延时所用的计数器,系统时钟12MHz,//要延时20ms左右时间,至少需要18位计数器     //产生20ms延时,当检测到key_edge有效是计数器清零开始计数always @(posedge clk or negedge rst)beginif(!rst)cnt <= 18'h0;else if(key_edge)cnt <= 18'h0;elsecnt <= cnt + 1'h1;end  reg     [N-1:0]   key_sec_pre;                //延时后检测电平寄存器变量reg     [N-1:0]   key_sec;                    //延时后检测key,如果按键状态变低产生一个时钟的高脉冲。//如果按键状态是高的话说明按键无效always @(posedge clk  or  negedge rst)beginif (!rst) key_sec <= {N{1'b1}};                else if (cnt==18'h3ffff)key_sec <= key;  endalways @(posedge clk  or  negedge rst)beginif (!rst)key_sec_pre <= {N{1'b1}};else                   key_sec_pre <= key_sec;             end      assign  key_pulse = key_sec_pre & (~key_sec);     endmodule

四.管脚分配

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/129423.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 类和对象篇(八) const成员函数和取地址运算符重载

目录 一、const成员函数 1. const成员函数是什么&#xff1f; 2. 为什么有const成员函数&#xff1f; 3. 什么时候需要使用const修饰成员函数&#xff1f; 二、取地址运算符重载 1. 为什么需要重载取地址运算符&#xff1f; 2. 默认取地址运算符重载函数 3. 默认const取地址运…

mac连接easyconnnect显示“本地环境出现异常”

mac连接easyconnnect显示“本地环境出现异常” 解决方法&#xff1a; 终端下输入&#xff1a;vim ~/.zprofile文件内加入如下内容&#xff0c;如下图&#xff1a; ####解决连接easyconnnect显示“本地环境出现异常问题 function EC_start(){/Applications/EasyConnect.app/Co…

使用ChatGPT和MindShow一分钟生成PPT模板

对于最近学校组织的实习答辩&#xff0c;由于时间太短了&#xff0c;而且小编也特别的忙&#xff0c;于是就用ChatGPT结合MindShow一分钟快速生成PPT&#xff0c;确实很实用。只要你跟着小编后面&#xff0c;你也可以快速制作出这个PPT&#xff0c;下面小编就来详细介绍一下&am…

【数据结构初阶】七、非线性表里的二叉树(堆的实现 -- C语言顺序结构)

相关代码gitee自取&#xff1a; C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 【数据结构初阶】六、线性表中的队列&#xff08;链式结构实现队列&#xff09;-CSDN博客 1 . 非线性表里的 树(Tree) 树的概念及结构&#xff1a; 树的概念 树是一种非线性的数据…

Spring中的设计模式

目录 工厂模式 组合模式 适配器模式 代理模式 单例模式 观察者模式 模板方法模式 责任链模式 Spring有着非常优雅的设计&#xff0c;很多地方都遵循SOLID原则&#xff0c;里面的设计模式更是数不胜数大概有以下几种&#xff1a; 工厂模式 所谓的工厂模式&#xff0c;核…

二十九、高级IO与多路转接之epollreactor(收官!)

文章目录 一、Poll&#xff08;一&#xff09;定义&#xff08;二&#xff09;实现原理&#xff08;三&#xff09;优点&#xff08;四&#xff09;缺点 二、I/O多路转接之epoll&#xff08;一&#xff09;从网卡接收数据说起&#xff08;二&#xff09;如何知道接收了数据&…

【 构建maven工程时,配置了阿里云的前提下,依旧使用中央仓库下载依赖导致失败的问题!】

构建maven工程时&#xff0c;配置了阿里云的前提下&#xff0c;依旧使用中央仓库下载依赖导致失败的问题&#xff01;&#xff01;&#xff01; 错误提示信息: Cannot download ZIP distribution from https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3…

yolov7的bug,无法指定显卡(程序默认0号卡)

**问题&#xff1a;**命令行参数指定的是4号卡&#xff0c;但实际却总是在0号卡建立进程 真抽象啊&#xff0c;这一步&#xff0c;模型被送到0号卡&#xff0c;但实际上&#xff0c;送到了4号卡&#xff08;进程是在4号卡上建立的&#xff09; 解决办法&#xff1a; 在train.py…

【Linux】Linux 之用户管理

Linux 之用户管理 1.Linux 下的用户2.配置文件3.用户管理3.1 useradd3.1.1 创建用户并指定用户 ID3.1.2 指定用户的主目录3.1.3 指定用户的主组 3.2 adduser3.3 userdel3.4 密码文件3.4.1 字段含义解释3.4.2 给用户添加密码 3.5 其他与用户相关的命令 4.修改用户的信息4.1 user…

中国替代方案探索:替代谷歌企业邮箱的选择

“谷歌企业邮箱在中国有哪些替代方案&#xff1f;在中国市场上表现出色的企业邮箱有腾讯企业邮箱、网易企业邮箱、阿里企业邮箱以及适合外贸的Zoho Mail企业邮箱。” 在中国由于各种原因&#xff0c;包括网络安全、数据隐私保护以及与GFW(防火长城)等&#xff0c;谷歌企业邮箱并…

FFmpeg 基础模块:AVIO、AVDictionary 与 AVOption

目录 AVIO AVDictionary 与 AVOption 小结 思考 我们了解了 AVFormat 中的 API 接口的功能&#xff0c;从实际操作经验看&#xff0c;这些接口是可以满足大多数音视频的 mux 与 demux&#xff0c;或者说 remux 场景的。但是除此之外&#xff0c;在日常使用 API 开发应用的时…

深入理解Docker:简化部署与管理的利器

文章目录 引言Docker简介Docker的背景和发展Docker的优势和特点 Docker的基本概念和架构镜像&#xff08;Image&#xff09;容器&#xff08;Container&#xff09;仓库&#xff08;Repository&#xff09;Docker架构 Docker的常用命令和操作Docker的安装和配置Docker镜像的管理…