北邮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.mzph.cn/news/99116.shtml

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

相关文章

VxeTable 表格组件推荐

VxeTable 表格组件推荐 https://vxetable.cn 在前端开发中&#xff0c;表格组件是不可或缺的一部分&#xff0c;它们用于展示和管理数据&#xff0c;为用户提供了重要的数据交互功能。VxeTable 是一个优秀的 Vue 表格组件&#xff0c;它提供了丰富的功能和灵活的配置选项&…

更新Xcode 版本后运行项目出现错误 Unable to boot the Simulator 解决方法

错误截图 出现 Unable to boot the Simulator 错误原因很多&#xff0c;以下方法不一定都适用&#xff0c;我是通过以下方法解决的 打开命令终端输入以下命令&#xff0c;可能需要你输入开机密码 sudo rm -rf ~/Library/Developer/CoreSimulator/Caches

戏剧影视设计制作虚拟仿真培训课件提升学生的参与感

说起影视制作&#xff0c;知名的影视制片人寥寥无几&#xff0c;大多数人还在依靠摄影机拍摄实景或搭建实体场景来不断精进场景布局和导演效果&#xff0c;成本高、投入人员多且周期长&#xff0c;随着VR虚拟现实技术的不断发展&#xff0c;利用VR模拟仿真技术进行影视制作实操…

SpringBoot的流浪宠物系统

采用技术:springbootvue 项目可以完美运行

DALL·E 3 ChatGPT-4的梦幻联动

核心内容&#xff1a;DALLE 3 & ChatGPT-4的梦幻联动 hello&#xff0c;我是小索奇&#xff0c;最近DALL结合ChatGPT4的话题逐渐上升了起来&#xff0c;今天就带大家探索一下~ DALLE的主要功能是根据文本描述来生成图片。你可以告诉它一个穿着皮草的西瓜&#xff0c;它就能…

百度小程序制作源码 百度引流做关键词排名之技巧

百度作为国内最大的搜索引擎&#xff0c;对于关键词排名和流量获取的策略格外重要&#xff0c;下面给大家分享一个百度小程序制作源码和做百度引流、关键词排名的一些技巧。 移动设备的普及和微信小程序的火热&#xff0c;百度也推出了自己的小程序。百度小程序与微信小程序类…

充电保护芯片TP4054国产替代完全兼容DP4054DP4054H 锂电充电芯片

■产品概述 DP4054H是-款完整的采用恒定电流/恒定电压单节锂离子电池充电管理芯片。其SOT小封装和较少的外部元件数目使其成为便携式应用的理想器件&#xff0c;DP4054H可 以适合USB电源和适配器电源工作。 由于采用了内部PMOSFET架构&#xff0c;加上防倒充电路,所以不需要外…

机器学习基础-数据分析:房价预测

mac设置中文字体 #要设置下面两行才能显示中文 Arial Unicode MS 为字体 plt.rcParams[font.sans-serif] [Arial Unicode MS] #设置图片大小 plt.figure(figsize(20, 11), dpi200)pie官方文档 总体代码 python import pandas as pd import numpy as np import matplotlib.…

用PyTorch轻松实现二分类:逻辑回归入门

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

ViewPager、RecycleView实现轮播图

1.ViewPager实现轮播图形效果。 1&#xff09;layout中&#xff0c;PageIndicatorView轮播的View <RelativeLayoutandroid:layout_width"match_parent"android:layout_height"200dp"android:orientation"vertical"><androidx.viewpager…

巧用excel实现试卷向表格的转换

MID($E$10,FIND(D14,$E$10,1),FIND(D15,$E$10,1)-FIND(D14,$E$10,1)) MID($E$10,FIND(D15,$E$10,1),FIND(D16,$E$10,1)-FIND(D15,$E$10,1)) 中华人民共和国司法部

HarmonyOS/OpenHarmony原生应用-ArkTS万能卡片组件Span

作为Text组件的子组件&#xff0c;用于显示行内文本的组件。无子组件 一、接口 Span(value: string | Resource) 从API version 9开始&#xff0c;该接口支持在ArkTS卡片中使用。 参数&#xff1a; 参数名 参数类型 必填 参数描述 value string | Resource 是 文本内…

c++视觉---中值滤波处理

中值滤波&#xff08;Median Filter&#xff09;是一种常用的非线性平滑滤波方法&#xff0c;用于去除图像中的噪声。它不像线性滤波&#xff08;如均值滤波或高斯滤波&#xff09;那样使用权重来计算平均值或加权平均值&#xff0c;而是选择滤波窗口内的像素值中的中间值作为输…

docker搭建jenkins

1.拉取镜像 docker pull jenkinsci/blueocean 2.启动容器 docker run -d -u root -p 8666:8080 -p 50000:50000 -v /var/jenkins_home:/var/jenkins_home -v /etc/localtime:/etc/localtime --name MyJenkins jenkinsci/blueocean 3.访问ip:port,就能访问了 4.docker logs 容器…

主从复制的实现方案

读写分离技术架构图 实现读写分离的技术架构选型如上;需要自己去实践主从复制;为了节省资源&#xff0c;当然系统并发量并没有那么大,选择一主一丛;强制读主库,为了解决主从同步延迟带来的影响&#xff1b;对于实时性要求高的强制读主库&#xff1b;GTID 主要是一种事务标识技术…

docker搭建nginx

1.docker pull nginx 2.docker run --name nginx-test -p 8082:80 -d nginx 3.访问ip:8082

Linux 系统性能瓶颈分析(超详细)

Author&#xff1a;rab 目录 前言一、性能指标1.1 进程1.1.1 进程定义1.1.2 进程状态1.1.3 进程优先级1.1.4 进程与程序间的关系1.1.5 进程与进程间的关系1.1.6 进程与线程的关系 1.2 内存1.2.1 物理内存与虚拟内存1.2.2 页高速缓存与页写回机制1.2.3 Swap Space 1.3 文件系统1…

在PicGo上使用github图床解决typora上传csdn图片不显示问题(保姆级教程)

文章目录 在PicGo上使用github图床解决typora上传csdn图片不显示问题&#xff08;保姆级教程&#xff09;1、typora上传csdn图片不显示&#xff08;外链图片转存失败&#xff09;2、PicGo2.1、PicGo下载2.2、PicGo使用2.2.1、对PicGo完成基本的配置2.2.2、配置github图床2.2.3、…

R实现地图相关图形绘制

大家好&#xff0c;我是带我去滑雪&#xff01; 地图相关图形绘制具有许多优点&#xff0c;这些优点使其在各种领域和应用中非常有用。例如&#xff1a;地图相关图形提供了一种直观的方式来可视化数据&#xff0c;使数据更容易理解和分析。通过地图&#xff0c;可以看到数据的空…

UE4 Unlua 初使用小记

function M:Construct()print(Hello World)print(self.Va)local mySubsystem UE4.UHMSGameInstanceSubsystemUE4.UKismetSystemLibrary.PrintString(self,"Get Click Msg From UnLua ")end unlua中tick不能调用的问题&#xff1a; 把该类的Event Tick为灰色显示的删…