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

news2024/12/31 5:20:23

北邮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;						//数码管显示数字0
	seg[1]<=9'h06;						//数字1
	seg[2]<=9'h5b;						//数字2
	seg[3]<=9'h4f;						//数字3
	seg_data[0]<=9'h3f;				    //右初始数字显示数字0
	cnt<=2'b11;							//计数器初始值3
	end
	
	always @ (posedge clk or negedge rst)	//时钟边沿触发或复位按键触发
	begin
	if(!rst)									//复位
		begin							
		sgn<=2'b11;								//亮灯均火
		seg_data[0]<=seg[3];					//右显示数字3
		cnt<=2'b11;								//计数器复位到3
		lock<=2'b11;							//程序锁默认状态1(正常)
		end
		
		else if (confirm_dbs && lock)		    //按下确认键,此处用的消抖后的脉冲信号,\
                                                //若程序已锁则不执行
		begin
			if(sw_password == password)	        //密码正确
				begin
				sgn<=2'b10;						//绿灯亮
				seg_data[0]<=9'h40;			    
				seg_data[1]<=9'h40;			    //密码输入正确后两根数码管显示两根横线
				lock=2'b10;					   	//程序锁进入状态2(可调密码)
				end
			else if(cnt==2'b11)
				begin
				sgn<=2'b01;						//红灯亮
				seg_data[0]<=seg[2];			//数码管显示数字2
				cnt<=2'b10;						//计数器移至2
				end
			else if(cnt==2'b10)
				begin
				sgn<=2'b01;						//红灯亮
				seg_data[0]<=seg[1];			//数码管显示数字1
				cnt<=2'b01;						//计数器移至1
				end
			else if(cnt==2'b01)
				begin
				sgn<=2'b00;						//绿灯和红灯同时亮
				seg_data[0]<=seg[0];			//数码管显示数字0
				lock=0;							//程序锁进入状态0(锁死)
				end
		end
	end
	
	assign 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)
          begin
             if (!rst) begin
                 key_rst <= {N{1'b1}};       //初始化时给key_rst赋值全为1,{}中表示N个1
                 key_rst_pre <= {N{1'b1}};
             end
             else begin
                 key_rst <= key;             
                //第一个时钟上升沿触发之后key的值赋给key_rst,
                //同时key_rst的值赋给key_rst_pre
                 key_rst_pre <= key_rst;     
                //非阻塞赋值。相当于经过两个时钟触发,
                //key_rst存储的是当前时刻key的值,
                //key_rst_pre存储的是前一个时钟的key的值
             end    
           end
 
        assign  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)
           begin
             if(!rst)
                cnt <= 18'h0;
             else if(key_edge)
                cnt <= 18'h0;
             else
                cnt <= cnt + 1'h1;
             end  
 
        reg     [N-1:0]   key_sec_pre;                //延时后检测电平寄存器变量
        reg     [N-1:0]   key_sec;                    
 
 
        //延时后检测key,如果按键状态变低产生一个时钟的高脉冲。
        //如果按键状态是高的话说明按键无效
        always @(posedge clk  or  negedge rst)
          begin
             if (!rst) 
                 key_sec <= {N{1'b1}};                
             else if (cnt==18'h3ffff)
                 key_sec <= key;  
          end
       always @(posedge clk  or  negedge rst)
          begin
             if (!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.coloradmin.cn/o/1072104.html

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

相关文章

Qt 对界面类重命名的步骤

有些时候因为一些原因&#xff0c;需要修改Qt中创建的界面类&#xff0c;修改的地方比较多&#xff0c;一定要留意有没有修改完全&#xff0c;否则会出现各种奇怪报错。 比如&#xff0c;将MainWindow界面类名修改为lb_logdisplay 修改步骤&#xff1a; 修改文件名&#xff1a;…

【Redis】字符串类型命令

目录 字符串类型命令SETGETMGETSETNXINCRINCRBYDECRDECYBYINCRBYFLOATAPPENDGETRANGESETRANGESTRLEN 字符串类型命令 SET 将string类型的value设置到key中。如果key之前存在&#xff0c;则覆盖&#xff0c;⽆论原来的数据类型是什么。之前关于此key的TTL也全部失效。 SET key…

一文拿捏线程池

1 谈谈你对线程池理解 1 概念 线程池是一种用于管理线程的机制&#xff0c;核心思想是资源复用&#xff0c;避免频繁地创建和销毁线程所带来的性 能开销。 2 原理 线程池的原理是预先创建一定数量的线程&#xff0c;并将它们放入一个线程池中。当有任务需要执行时&#xff0…

人工智能(AI)技术的实际应用

人工智能&#xff08;AI&#xff09;技术在各个领域都有广泛的实际应用。这些示例只是AI技术的一小部分应用&#xff0c;AI正在不断演化中。以下是一些常见的实际AI应用示例&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#…

动态内存管理之经典笔试题

目录 C/C程序的内存开辟 题目1 题目2 题目3 题目4 今天我们来接着讲几道经典的笔试题。首先来了解一下c\c程序的内存开辟&#xff0c;使我们做题的头脑更加清晰。 C/C程序的内存开辟 内核空间 是用户代码不能读写的栈区是用来开辟 局部变量 形式参数&#xff0c;函数栈…

0基础学python,给大家首推这些书!

对于0基础的人来说&#xff0c;学习Python首推的书就是这本 《Python 编程&#xff1a;从入门到实践》 。 这本书常居各网站编程图书销量榜第一名&#xff0c;目前在全球范围内被翻译成 12 国语言&#xff0c;仅在中国就帮助了超过 120 万对 Python 有需求的学习者入门&#x…

【华为OD机考B卷 | 100分】五子棋迷(JAVA题解——也许是全网最详)

前言 本人是算法小白&#xff0c;甚至也没有做过Leetcode。所以&#xff0c;我相信【同为菜鸡的我更能理解作为菜鸡的你们的痛点】。 题干 1. 题目描述 张兵和王武是五子棋迷&#xff0c;工作之余经常切磋棋艺。走了一会儿&#xff0c;轮到张兵了&#xff0c;他对着一条线思…

Vue CLI和Vite区别

1.Vue CLI脚手架 什么是Vue脚手架&#xff1f; 在真实开发中我们不可能每一个项目从头来完成所有的webpack配置&#xff0c;这样显示开发的效率会大大的降低&#xff1b;所以在真实开发中&#xff0c;我们通常会使用脚手架来创建一个项目&#xff0c;Vue的项目我们使用的就是…

在线世界各国语言翻译器

最近失业&#xff0c;无聊之极&#xff0c;想着搞点啥东西&#xff0c;一上午撸了一个世界各国语言跟汉语的互相翻译的功能&#xff0c;提供的语言列表无所不包含&#xff0c;这里列一下给大家看看&#xff0c;算了语言列表实在太长了&#xff0c;我还是把界面先放前面吧, 对的…

vue-5

一、文章内容概括 1.自定义指令 基本语法&#xff08;全局、局部注册&#xff09;指令的值v-loading的指令封装 2.插槽 默认插槽具名插槽作用域插槽 3.综合案例&#xff1a;商品列表 MyTag组件封装MyTable组件封装 4.路由入门 单页应用程序路由VueRouter的基本使用 二…

常用求解器安装

1 建模语言pyomo Pyomo是一个Python建模语言&#xff0c;用于数学优化建模。它可以与不同的求解器&#xff08;如Gurobi&#xff0c;CPLEX&#xff0c;GLPK&#xff0c;SCIP等&#xff09;集成使用&#xff0c;以求解各种数学优化问题。可以使用Pyomo建立数学优化模型&#xf…

笔试强训选择题

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析&#xff08;3&#xff09; 目录 &#x1f449;&#x1f3fb;Day7 &#x1f449;&#x…

抖音seo源码开发部署市场分析及注意事项分享---SaaS开源

抖音seo源码开发部署市场背景分析 对于抖音SEO源码开发部署的背景分析&#xff0c;可以从以下几个方面来展开&#xff1a; 抖音平台的发展和趋势&#xff1a;随着移动互联网的快速发展&#xff0c;抖音作为短视频领域的领军企业&#xff0c;其用户规模和市场规模也在不断扩大。…

2023年中国电容炭受益于超级电容器需求及进口替代双重驱动,行业呈快速增长态势[图]

电容炭是目前在超级电容器领域实现商业化应用的最为主要的电极材料。电容炭具有“三高三低”的优势&#xff0c;即高比表面积、高孔容、高电导率、低灰分、低金属离子、低粒径&#xff0c;是超级电容电极的核心材料。 电容炭是超级电容器的电极材料。电容炭指标关系着超级电容器…

Vue 识别移动设备还是PC设备跳转相应的路由

1. 先在router/index.js文件中配置好不同端口跳转的路由 import Vue from vue import VueRouter from vue-router// 解决ElementUI导航栏中的vue-router在3.0版本以上重复点菜单报错问题 const originalPush VueRouter.prototype.push VueRouter.prototype.push function pu…

GitHub要求开启2FA,否则不让用了。

背景 其实大概在一个多月前&#xff0c;在 GitHub 网页端以及邮箱里都被提示&#xff1a;要求开启 2FA &#xff0c;即双因子认证&#xff1b;但是当时由于拖延症和侥幸心理作祟&#xff0c;直接忽略了相关信息&#xff0c;毕竟“又不是不能用”。。 只到今天发现 GitHub 直接…

超越日历的智慧:探索节日节气、宜忌和星座生肖等信息的万年历API

引言 当今社会&#xff0c;人们对时间的需求不仅仅是简单地知道日期&#xff0c;更多地是追求个性化、文化化和精确化的时间信息。在这个背景下&#xff0c;万年历API变得越来越重要&#xff0c;因为它可以提供超越传统日历的智慧&#xff0c;为我们带来了丰富的日期信息&…

JVM篇---第十篇

系列文章目录 文章目录 系列文章目录一、对象头具体都包含哪些内容?二、你知道哪些JVM调优参数?三、说一下 JVM 有哪些垃圾回收器?一、对象头具体都包含哪些内容? 在我们常用的Hotspot虚拟机中,对象在内存中布局实际包含3个部分: 对象头实例数据对齐填充 而对象头包含两…

ESD门禁闸机的使用说明

ESD门禁闸机是一种用于控制静电敏感区域人员出入的门禁设备&#xff0c;具有防静电和防电磁干扰的功能。以下是ESD门禁闸机的使用方法&#xff1a; 门禁卡或密码的获取&#xff1a;员工需要在公司或部门领取门禁卡或设置个人密码&#xff0c;方可进入静电敏感区域。 门禁卡或…

2023年中国CEM-3型覆铜板市场供需现状、销售收入及行业趋势分析[图]

CEM-3指覆铜板的一种&#xff0c;以玻纤布半固化片与玻纤粘半固化片层压铜箔达到固化形成的板材&#xff0c;属于复合型基材&#xff0c;CEM-3由于其良好的加工性能主要用于FR-4中厚板的替代&#xff0c;有着良好的发展前景。 随着CEM-3覆铜板品质的不断改进和提高&#xff0c;…