北邮22级信通院数电:Verilog-FPGA(9)第九周实验(3)实现一个具有清零功能的按键计数器,对按键进行计数并显示

news2024/10/7 14:27:25

北邮22信通一枚~

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

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

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

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

 

目录

一.代码部分

1.1 counter.v

1.2 debounce.v

二.管脚分配

三.实现效果


一.代码部分

1.1 counter.v

module counter
(
	input clk,
	input rst,
	input button_1,
	input button_2,
	
	output [8:0] seg_1,
	output [8:0] seg_2
);

	reg [8:0] seg [9:0];
	wire key_pulse_1;
	wire key_pulse_2;
	
	reg [6:0] counting=2'b00;
	reg [3:0] seg_data_1=1'b0;
	reg [3:0] seg_data_2=1'b0;
	
	initial 
		begin 
			seg[0]=9'h3f;
			seg[1]=9'h06;
			seg[2]=9'h5b;
			seg[3]=9'h4f;
			seg[4]=9'h66;
			seg[5]=9'h6d;
			seg[6]=9'h7d;
			seg[7]=9'h07;
			seg[8]=9'h7f;
			seg[9]=9'h6f;
		end
	
	debounce debounce_1
	(
		.clk(clk),
		.rst(rst),
		.key(button_1),
		.key_pulse(key_pulse_1)
		
	);
	
	debounce debounce_2
	(
		.clk(clk),
		.rst(rst),
		.key(button_2),
		.key_pulse(key_pulse_2)
	);

	
always @ (posedge clk or negedge rst)
	begin
		if(!rst)
			begin counting<=0; end
		else 
			begin 
				if(key_pulse_1)
					begin counting<=(counting+1)%100;end
				else if(key_pulse_2)
					begin counting<=(counting-1+100)%100;end
				else
					begin counting<=counting; end
					
				seg_data_1<=counting/10;
				if(counting%10==0)
					begin seg_data_2<=0;end
				else 
					begin seg_data_2<=counting-10*seg_data_1;end
			end
	end
	assign seg_1=seg[seg_data_1];
	assign seg_2=seg[seg_data_2];
endmodule
			
			
			
			
			

1.2 debounce.v

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/1221254.html

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

相关文章

MIKE水动力笔记20_由dfs2网格文件提取dfs1断面序列文件

本文目录 前言Step 1 MIKE Zero工具箱Step 2 提取dfs1 前言 在MIKE中&#xff0c;dfs2是一个一个小格格的网格面的时间序列文件&#xff0c;dfs1是一条由多个点组成的线的时间序列文件。 如下两图&#xff1a; 本博文内容主要讲如何从dfs2网格文件中提取dfs1断面序列文件。 …

大数据Doris(二十五):数据导入演示和其他导入案例

文章目录 数据导入演示和其他导入案例 一、数据导入演示

jvm 内存结构 ^_^

1. 程序计数器 2. 虚拟机栈 3. 本地方法栈 4. 堆 5. 方法区 程序计数器 定义&#xff1a; Program Counter Register 程序计数器&#xff08;寄存器&#xff09; 作用&#xff0c;是记住下一条jvm指令的执行地址 特点&#xff1a; 是线程私有的 不会存在内存溢出 虚拟机栈…

【MATLAB源码-第81期】基于matlab的polar码三种译码算法比较(SC,SCL,BP)。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 Polar码&#xff08;Polar Codes&#xff09;是一种前向纠错编码方法&#xff0c;被认为是实现信道容量极限的编码方法之一。它在某些场合下&#xff0c;如5G通信标准中得到了应用。Polar码的主要译码算法包括Successive Can…

Flutter 应用启动从闪屏页短暂黑屏再到第一个页面

由于应用初始状态启动会有白屏现象&#xff0c;便使用 flutter_native_splash 2.3.5 插件生成了启动相关的配置&#xff0c;并且按照示例使用了 import package:flutter_native_splash/flutter_native_splash.dart;void main() {WidgetsBinding widgetsBinding WidgetsFlutte…

【SAP-ABAP】--MRKO隐式增强字段步骤

业务需求&#xff1a;给MRKO增加几个增强字段 给标准表进行增强 1.如果标准表或者结构&#xff0c;带CL_***&#xff0c;一般表示SAP预留的增强位置&#xff0c;可以 直接双击这个类型&#xff0c;点击创建&#xff0c;然后直接在预留的结构里面添加自己 需要增加的字段 2.如…

MySQL事务特性原理

文章目录 事务四特性预备知识checkpoint机制redo日志redo的流程事务提交后什么时候进行刷盘 undo日志&#xff1a;数据还未被修改、也是备份Undo日志的作用undo的存储结构回滚段与事务回滚段中的数据分类undo的类型undo log的生命周期 MVCC一、 原子性原理如何通过undo日志实现…

001.HCIA_网络基本概念

1、网络历史 网络历史——数通为什么产生? 1946年:世界上第一台计算机诞生。军事科研--高速运算 1962年:古巴导弹危机 1969年:美国国防部高级研究计划署ARPA“巨型网络”--ARPAnet 阿帕网 厂商垄断——不能大规模普及 IBM 每个厂商都单独定义标准 问题:网络没有标准 1…

QMenuBar和QToolBar使用同一个QAction

文章目录 前言一、编辑QMenuBar二、将QMenuBar中的Action添加到toolbar总结 前言 qmenubar中的action添加到toolbar&#xff0c;不是在toolbar中再添加action&#xff0c;效果图如下 一、编辑QMenuBar 正常编辑QMenuBar&#xff0c;以下图为例 二、将QMenuBar中的Action添…

双极性集成电路芯片 D7312,可用于小型收录机中作前置放大电路。电源开关冲击噪音小、 反应快

一块双极性集成电路芯片 D7312。可用于小型收录机中作前置放大电路。 主要特点&#xff1a; ● 含ALC电路和ALC检波电路。 ● 外接元件少。 ● 增益高&#xff0c;噪声低。 ● 静态电流小 ● 电源开关冲击噪音小、 反应快 ● 具有过热保护功能 …

本地生活视频号团购怎么做?一部分人已经吃到红利!

重磅消息&#xff01;视频号本地生活团购上线了&#xff01;作为新的流量聚集地&#xff0c;视频号通过带货达人、商家、团购商品三者在微信平台提升了更多的曝光量与转化率&#xff0c;同时在短视频挂载、直播挂载的基础上&#xff0c;实现了视频号团购的交易闭环&#xff0c;…

VSCode 运行java程序中文乱码

现象描述 java文件中包含中文&#xff0c;运行java程序后&#xff0c;乱码报错。 解决方法 原本运行指令为 cd "d:\programProjects\Java_proj\" ; if ($?) { javac Solution.java } ; if ($?) { java Solution } 需要添加 编码格式 -encoding utf8 cd &quo…

企业防泄密软件——域之盾软件

在当今这个数字化时代&#xff0c;信息的安全性变得越来越重要。对于企业而言&#xff0c;保护核心信息不被泄露显得尤为重要。域之盾软件作为企业防泄密软件&#xff0c;旨在为企业提供全方位的信息安全保障。 其具有出色的防护功能&#xff0c;能够有效地防止企业内部信息泄露…

Linux输入设备应用编程(键盘,按键,触摸屏,鼠标)

目录 一 输入设备编程介绍 1.1 什么是输入设备呢&#xff1f; 1.2 什么是输入设备的应用编程&#xff1f; 1.3 input子系统 1.4 数据读取流程 1.5 应用程序如何解析数据 1.5.1 按键类事件&#xff1a; 1.5.2 相对位移事件 1.5.3 绝对位移事件 二 读取 struct input_e…

使用Microsoft Dynamics AX 2012 - 2. 入门:导航和常规选项

Microsoft Dynamics AX的核心原则之一是为习惯于Microsoft软件的用户提供熟悉的外观和感觉。然而&#xff0c;业务软件必须适应业务流程&#xff0c;这可能相当复杂。 用户界面和常见任务 在我们开始进行业务流程和案例研究之前&#xff0c;我们想了解一下本章中的常见功能。…

linux 查看命令使用说明

查看命令的使用说明的命令有三种&#xff0c;但并不是每个命令都可以使用这三种命令去查看某个命令的使用说明&#xff0c;如果一种不行就使用另外一种试一试。 1.whatis 命令 概括命令的作用 2.命令 --help 命令的使用格式和选项的作用 3.man 命令 命令的作用和选项的详细…

小白必看,接口测试神器 Jmeter 如何实现测试关联

明年三四月份赶上跳槽高峰期&#xff0c;面试中&#xff0c;接口测试部分的关联是经常被提及的知识点之一&#xff0c;经常有同学因此错失良机&#xff0c;“关联”可谓是重中之重了&#xff0c;今天就写一篇关于Jmeter关联的文章&#xff0c;以作备忘。 所谓关联&#xff0c;…

交易者最看重什么?anzo Capital这点最重要!

交易者最看重什么&#xff1f;有人会说技术&#xff0c;有人会说交易策略&#xff0c;有人会说盈利&#xff0c;但anzo Capital认为Vishal 最看重的应该是眼睛吧&#xff01; 29岁的Vishal Agraval在9年前因某种原因失去了视力&#xff0c;然而&#xff0c;他的失明并未能阻…

回顾——自我监督的 Vision Transformer 学到了什么?

一、说明 在尝试自我监督学习时&#xff0c;主要有两种方法&#xff1a;对比学习&#xff08;CL&#xff09;和掩模图像建模&#xff08;MIM&#xff09;。然而&#xff0c;随着MIM最近受到关注&#xff0c;很多人使用MIM&#xff0c;但他们可能不知道为什么使用它以及何时应该…

每天一道算法题(四)——移动零(将数组中的零移到最后面)

文章目录 前言1、问题2、示例3、解决方法&#xff08;1&#xff09;方法1&#xff08;2&#xff09;方法2&#xff08;双指针&#xff09; 前言 提示&#xff1a; 1、问题 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的…