FPGA学习之按键篇_fpga按键-程序员宅基地

技术标签: fpga开发  

FPGA学习之按键篇



前言

按键作为FPGA最基本的外设,由于按键的机械特性,按键被按下后会发生抖动,影响FPGA对输入电平信号的采集,所以我们要对输入的按键信号进行消抖处理,才能得到稳定的按键触发信号。


一、按键抖动与消抖原理

如下图所示,按键按下后会有一段时间的抖动,称为抖动前沿,中间为稳定时期,持续时间为20ms左右,弹起时也会有一段抖动,称为抖动后沿。要想稳定读取按键信号,需要避开抖动前沿,采集中间的稳定状态,这时需要定义一个计数器来检测中间的稳定状态。当检测到按键引脚电平变化时开始计数,如果遇到按键抖动,则把计数器归零,在稳定时期才能计数到最大值(设定为20ms),这时就输出一个周期的按键触发信号,表示按键已经按下。
在这里插入图片描述

按键抖动示意图

二、代码编写

module key_debounce(
	input sys_clk,    //50MHz系统时钟
	input rst_n,	  //系统复位
	input key_in,     //按键输入
	output reg led	      //LED输出
);
parameter CNT_MAX  = 24'd10000000;  // 50MHz时钟下计数20ms
reg [23:0] cnt;
always @(posedge sys_clk or negedge rst_n) begin
	if(!rst_n)
		cnt <= 24'd0;
	else if(key_in == 1'b0)
		if(cnt <= CNT_MAX )
			cnt <= cnt  + 1'b1;
		else
			cnt <= cnt ;
	else 
		cnt <= 24'd0;
end

always @(posedge sys_clk or negedge rst_n) begin
	if(!rst_n)
		led <= 1'b0;
	else if(cnt == CNT_MAX - 1'b1)
		led <= ~led;
	else 
		led <= led;
end

三、代码分析

计数器cnt的位宽大小与时钟频率有关,50MHz时钟频率下计数20ms,计数最大值为10^6,代码中采用cnt == CNT_MAX - 1’b1来翻转led保证一次按键触发只会翻转一次。
如果要输出触发信号,只需对代码做如下更改即可

reg key_flag;
always@(posedge sys_clk or negedge rst_n)
	if(!rst_n)
		key_flag <= 1'b0;
	else if(cnt == CNT_MAX - 1'b1)
		key_flag <= 1'b1;
	else
		key_flag <= 1'b0;

四、总结

学习了按键抖动和消抖原理,本代码可以轻松的从一位按键扩展到多位按键。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44227086/article/details/123908483

智能推荐

java重定向和请求转发区别_java重定向和转发的区别-程序员宅基地

文章浏览阅读1.9k次,点赞5次,收藏11次。请求转发:request.getRequestDispatcher().forward();重定向:response.sendRedirect();例如:请求转发:request.getRequestDispatcher("/student_list.jsp").forward(request,response);重定向:response.sendRedirect(request.getContextPath + "/student_list.jsp")转发过.._java重定向和转发的区别

html背景向四周散开,纯css3圆形从中心向四周扩散动画-程序员宅基地

文章浏览阅读1.1k次。查看效果:http://hovertree.com/texiao/css3/37/以下为讲解和代码。可以通过 @keyframes 规则,创建动画。创建动画的原理是,将一套 CSS 样式逐渐变化为另一套样式。在动画过程中,您能够多次改变这套 CSS 样式。以百分比来规定改变发生的时间,或者通过关键词 "from" 和 "to",等价于 0% 和 100%。0% 是动画的开始时间,100% 动画的结..._css3 背景扩散效果

目标检测YOLO实战应用案例100讲-智能目标检测系统在FPGA中的设计与实现_yolo fpga-程序员宅基地

文章浏览阅读1.7k次。本文结合FPGA芯片的高并行、低功耗、可重配置等优势,对基于卷积神经网络结构的目标检测算法,在端侧场景下的加速与部署进行研究与实现。本章节对本文涉及到的基本理论知识与技术手段进行介绍,为后续系统的方案分析与系统设计奠定理论基础。首先,介绍了卷积神经网络的基本组成部分及其原理。然后,对FPGA及其开发技术进行简单介绍。最后,对当前常用的部分基于FPGA的卷积神经网络加速方法进行概述。_yolo fpga

缓冲区溢出(Buffer Overflow)_buffer over flow l-程序员宅基地

文章浏览阅读1.2w次。堆栈溢出堆栈溢出通常是所有的缓冲区溢出中最容易进行利用的。了解堆栈溢出之前,先了解以下几个概念:缓冲区 简单说来是一块连续的计算机内存区域,可以保存相同数据类型的多个实例。 堆栈 堆 栈是一个在计算机科学中经常使用的抽象数据类型。堆栈中的物体具有一个特性:最后一个放入堆栈中的物体总是被最先拿出来,这个特性通常称为后进先出 (LIFO)队列。堆栈中定义了一些操作。两个最重要的是PU..._buffer over flow l

AQS 源码流程分析_aqs 入对之后就一定顺序执行-程序员宅基地

文章浏览阅读455次。我们日常开发中,经常会碰到并发的场景,在 Java 中语言体系里,我们会想到 ReentrantLock、CountDownLatch、Semaphore 等工具,但你是否清楚它们内部的实现原理?这些工具都很类似,底层都是基于AbstractQueuedSynchronizer(AQS)来实现的。今天我们就来一起学习 AQS 内部原理。_aqs 入对之后就一定顺序执行

C语言--编写程序,绘制菱形图_c语言画菱形-程序员宅基地

文章浏览阅读4.1k次。编写一个程序,在屏幕上显示如下图形(图形的层数有输入者自行定义)源代码如下所示:#include<stdio.h>int main(){ int line; // 菱形总行数 int column; // 菱形总列数 int i; // 当前行 int j; // 当前列 printf("请输入菱形的行数(奇数):"); scanf("%d", &line); while(2) { if(line%_c语言画菱形

随便推点

苹果 macOS Sonoma 14 开发者预览版 Beta 3 发布_mac os sonoma最新版本-程序员宅基地

文章浏览阅读81次。苹果今日向 Mac 电脑用户推送了 macOS 14 开发者预览版 Beta 3 更新。但是并未发现 macOS 14 Sonoma 的第三个开发者测试版的新功能,且更新日志和 Beta 2 类似。_mac os sonoma最新版本

ES6-17【类、类的继承、类的实现、类的修饰】_es6 类修饰 详解-程序员宅基地

文章浏览阅读270次。一.类(1).基础最简单的定义方式class Person{}log(new Person());//Person{}log(typeof Person);function标准写法class Person{ constructor(name = "zhangsan",age = "18"){ //私有属性 this.name = name; this.age = age; } //公有属性 _es6 类修饰 详解

Java 常用类 03 可变字符串和BigDecimal(BigInteger)_java字符串和bigdecimal类-程序员宅基地

文章浏览阅读335次。3.1 可变字符串和BigDecimal3.1.1 可变字符串由于我们的字符串,是不可变的。每次都要在 字符串池里 新建和共享。这样效率很低,而且占用空间大。我们的 Java 就开发了 可变字符串下面的两者,都比传统的 String 类型要快很多。① StringBuffer:JDK1.0提供的,效率低,线程安全。它是实现开辟一个缓冲区,然后操作的时候,直接在 缓冲区里进行操作。② StringBuilder:JDK5.0提供的,效率高,线程不安全3.1.2 StringBuffer①_java字符串和bigdecimal类

【基于FPGA的芯片设计】32×32位寄存器堆_fpga2s需要多少位寄存器-程序员宅基地

文章浏览阅读2.6k次,点赞9次,收藏2次。32×32位寄存器堆设计,杭电计算机组成原理实验四,实验的开发工具是vivado2018,vivado2022也兼容2018_fpga2s需要多少位寄存器

STM32F103 软件实现随机数_stm32f103c8t6可以生成随机数么-程序员宅基地

文章浏览阅读644次。因为STM32F103C8T6,没有硬件随机数,所以需要自己通过软件配置。最后得到的mmm1变量为一个0~100的随机值。首先增加一段include用于产生真随机数。_stm32f103c8t6可以生成随机数么

微信h5页面打开微信内置地图及wx.openLocation回调成功调不起页面的问题_h5 wx.openlocation-程序员宅基地

文章浏览阅读4.5k次。先说下需求吧,我们的需求是通过一个经纬度,然后打开微信内置的地图页面代码如下://导航到停车场 gogogo() { //获取当前页面url //var url = location.href.split('#')[0]; // alert(11111) // window.location.href = // "https://apis.map.qq.com/uri/v1/marker?marker=coord:30.595810_h5 wx.openlocation

推荐文章

热门文章

相关标签