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

本文主要是介绍北邮22级信通院数电:Verilog-FPGA(4)第四第五周实验 密码保险箱的设计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

北邮22信通一枚~

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

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

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

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

目录

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

显示:

输入部分:

确认键:

复位键:

输出部分:

二.verilog代码

三.消抖模块

四.管脚分配


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

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

显示:

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

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

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

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

输入部分:

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

确认键:

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

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

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

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

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

复位键:

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

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

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

输出部分:

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

二.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

四.管脚分配

这篇关于北邮22级信通院数电:Verilog-FPGA(4)第四第五周实验 密码保险箱的设计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/167925

相关文章

数据库oracle用户密码过期查询及解决方案

《数据库oracle用户密码过期查询及解决方案》:本文主要介绍如何处理ORACLE数据库用户密码过期和修改密码期限的问题,包括创建用户、赋予权限、修改密码、解锁用户和设置密码期限,文中通过代码介绍... 目录前言一、创建用户、赋予权限、修改密码、解锁用户和设置期限二、查询用户密码期限和过期后的修改1.查询用

Python中的可视化设计与UI界面实现

《Python中的可视化设计与UI界面实现》本文介绍了如何使用Python创建用户界面(UI),包括使用Tkinter、PyQt、Kivy等库进行基本窗口、动态图表和动画效果的实现,通过示例代码,展示... 目录从像素到界面:python带你玩转UI设计示例:使用Tkinter创建一个简单的窗口绘图魔法:用

Java中的密码加密方式

《Java中的密码加密方式》文章介绍了Java中使用MD5算法对密码进行加密的方法,以及如何通过加盐和多重加密来提高密码的安全性,MD5是一种不可逆的哈希算法,适合用于存储密码,因为其输出的摘要长度固... 目录Java的密码加密方式密码加密一般的应用方式是总结Java的密码加密方式密码加密【这里采用的

mysql重置root密码的完整步骤(适用于5.7和8.0)

《mysql重置root密码的完整步骤(适用于5.7和8.0)》:本文主要介绍mysql重置root密码的完整步骤,文中描述了如何停止MySQL服务、以管理员身份打开命令行、替换配置文件路径、修改... 目录第一步:先停止mysql服务,一定要停止!方式一:通过命令行关闭mysql服务方式二:通过服务项关闭

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

怎么让1台电脑共享给7人同时流畅设计

在当今的创意设计与数字内容生产领域,图形工作站以其强大的计算能力、专业的图形处理能力和稳定的系统性能,成为了众多设计师、动画师、视频编辑师等创意工作者的必备工具。 设计团队面临资源有限,比如只有一台高性能电脑时,如何高效地让七人同时流畅地进行设计工作,便成为了一个亟待解决的问题。 一、硬件升级与配置 1.高性能处理器(CPU):选择多核、高线程的处理器,例如Intel的至强系列或AMD的Ry

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

SprinBoot+Vue网络商城海鲜市场的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质创作者,全网30w+

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD