首页 > 其他分享 >FPGA实例——按键消抖和自定义IP封装

FPGA实例——按键消抖和自定义IP封装

时间:2024-11-02 20:50:24浏览次数:6  
标签:封装 自定义 FPGA IP 按下 key 按键

按键消抖:

简介:

目前,在大部分的FPGA开发板上都带有机械按键,由于机械按键的物理特性,按键在按下和释放的过程中,存在一段时间的抖动,这就导致在识别按键的时候可以检测到多次的按键按下,而通常检测到一次按键输入信号的状态为低电平,就可以确认按键被按下了,所以我们在使用按键时往往需要进行按键消抖,以确保按键被按下一次只检测到一次低电平。按键稳定闭合时间长短是由操作人员决定的,通常都会在 100ms 以上,刻意快速按的话能达到 40-50ms 左右,很难再低了,抖动时间,一般都会在 10ms以内。 按键的抖动对于人类来说是感觉不到的,但是对于芯片来说,则是完全可以检测到电平的变化的,如果不对按键进行消抖处理,芯片可能会做出错误的判断,也就会导致我们的实验失败,所以进行按键消抖是非常有必要的。


实际按键和理想按键:

理想按键:

实际按键:

在真实的情况下,按键就会存在按下时和松开时的一个抖动现象,这个抖动时间一般为10ms~20ms之间,这就是为什么有点时候按下一次按键,然而却会显示多次按下的一个例子,就是由于芯片对这种抖动太过于敏感,因此就需要去对它进行消抖处理。


verilog代码:


module key_flag(
input  wire  sysclk    ,//系统时钟
input  wire  rst_n     ,//复位信号
input  wire  key       ,//按键
output wire  key_flag   //按键按下一次有效信号
    );
    
parameter delay_20ms = 1000000;//按键按下的时间为20ms,超过这个时间就保持住,不超过这个时间就清0
reg [31:0] cnt;//计时器

always @(posedge sysclk)
   if(!rst_n)
      cnt <= 0;
   else if(key == 0)begin //按键按下低有效
       if(cnt == delay_20ms - 1)//当时间达到20ms时
           cnt <= cnt ;//就保持住
       else
           cnt <= cnt + 1;//不满足就累加
   end
   else
       cnt <= 0;

assign key_flag = (cnt == delay_20ms - 2)?1:0;//三目运算符来判断按键按下时间达到20ms后就输出一个高脉冲信号
    
endmodule

仿真代码:

`timescale 1ns / 1ps

module key_tb();
reg  sysclk   ;
reg  rst_n    ;
reg  key      ;
wire key_flga ;

initial begin
sysclk = 0;
rst_n = 0;
key = 1;
#101 
rst_n = 1;
#20
key = 0;
#20000000;
key = 1;

end

always #10 sysclk = ~sysclk;

key_flag key_flag_u(
.  sysclk    ( sysclk  )  ,
.  rst_n     ( rst_n   )  ,
.  key       ( key     )  ,
.  key_flag  ( key_flag)
    );

endmodule

仿真结果:

没有达到20ms:

按键按下时间没有达到20ms,那key_flag信号就不会拉高,会自动被过滤掉

达到20ms:

在过了101ns的时候,复位信号拉高,开始工作,又过了20ns,按键按下,此时cnt计时器开始计时

此时在delay_20ms-2的时候,采集到按键是出于按下状态,因此产生一个高脉冲信号key_flag,后续需要通过按键去控制其它器件,就可以使用这个高脉冲信号,就可以精准的记录按键按下的次数


自定义IP封装:

简介:

在真实的开发过程中,并不是所有的代码都需要开发者自己去手写,有些难度确实太大了,并且也非常的耗费时间,可能最后写出来的代码也存在很多的bug。那么,针对这类现象呢,Xilinx官方也是提供了许多的IP核可以供我们去调用,大大的帮开发者节省了时间。用户也可以自己去自定义IP核,将自己所写好的代码封装起来,后期可以直接调用,节约时间开发时间。这里的话我们就以刚才所写的这个按键消抖的代码去进行封装,后期需要使用到的时候直接调用出来就可以,就不需要再去创建文件,重新写一遍代码了。


封装步骤:Vivado 2020.1

首先将自己要封装的代码置顶,无论是跑综合还是跑仿真都需要将文件置顶,这一点在刚接触FPGA的小白来说是经常会忽略的问题,最后也发现跑出来的不是自己的文件,这点要注意。这里封装的话最好是去新建一个工程再封装

第二步在Tools下选择第一个,自定义新建一个IP

点击next

选择第一个,将当前项目进行封装

选择这个IP核的一个存放路径,这里的话推荐最好是新建一个文件夹,专门用来存放自定义封装的IP核

点击next,选择OK

点击Finish完成

等待生成IP核,加载完过后会出现一个新的页面,第一个的话就它的一个基本信息,名称和存放路径,可以根据自己的需要去进行更改

第二个的话是支持的芯片型号,用户可以自行去修改,这个IP核支持在哪些芯片上使用

第三个的话是文件组,就是这个IP核里面包含了哪些文件

第四个的话是自定义参数,由于上面的那个按键消抖就只有一个时钟参数,所以这里也就只有一个

后面就是端口信息,存储管理

第七个的话就是一个图形用户界面,这里可以看到我们的这个IP核的输入输出端口和里面的时间参数这些,根据自己的需求,可以在这里去对这个时钟参数进行修改

最后一步的话就是打包,在我们选择完上面的参数后,就可以去生成IP核了

生成IP核过后找到存放的文件夹,里面就会有三个文件,那这样的话IP核就生成成功了


调用IP:

调用用户自定义封装的IP,首先要将自己所封装的IP文件给添加到工程里去,不然是找不到自定义IP的,首先点击设置

出现以下界面后,找到IP

打开后,点击第一个,在右边点击+号

找到自己存放的IP文件夹

添加完后就像这个样子,确定是自己需要的IP后,点击ok

加载完过后,就可以在这个工程里去使用自定义的IP核了


总结:

本次的话就主要去介绍了如何进行按键消抖,顺便介绍了一下自定义IP的封装流程以及如何去调用,至于IP核如何去使用的话,后面会讲到的。最后的话就是有错误的地方希望大家能够指出,谢谢!

标签:封装,自定义,FPGA,IP,按下,key,按键
From: https://blog.csdn.net/joker0518/article/details/143356514

相关文章

  • ScriptBasedMapping: Script /etc/hadoop/conf/topology_script-py
    spark-sql初始化时异常spark-sql初始化的突然发现spark返回无法解决hostname的问题,网上检索也是说hosts配置不对,但是检查后确实没有因此猜测hosts问题不对也可能引发该问题,但是其他问题也能存在引发问题的情况,因为发现由于执行etc/hadoop/conf/topology_script-p......
  • javaScript 和 Java 的语法区别(有前端基础)
    目录一、语法风格1.变量声明2.代码块3.分号二、面向对象编程1. 类和对象的定义2. 方法和属性的访问修饰符3.继承方式 三、数据类型和类型转换1.数据类型 2.类型转换四、异常处理1.语法结构2.异常类型五、开发工具和生态系统1.开发工具2.运行环境各......
  • JavaScript。—关于语法基础的理解—
    一、程序控制语句JavaScript提供了if、if else 和 switch 3种条件语句,条件语句也可以嵌套。(一)、条件语句1、单向判断: if...(1)概述<if>元素用于在判断该语句是否满足特定条件。如果条件不成立,<if>元素内的语句不会被执行。(2)语法格式if(条件){......
  • MiniPCIe 接口 CANFD卡
    概述基于MiniPCIe高性能接口CANFD卡采用标准MiniPCIe接口尺寸设计,方便PC机或嵌入式设备快速拓展出CANFD接口,实现数据采集与数据处理。兼容高速CAN和CANFD两种通信需求、支持CAN2.0A、CAN2.0B协议,符合ISO11898-1规范。规格PC接口:高速MiniPCIE接口,PCIExpressx1规格;......
  • 云专线是属于IEPL还是IPLC
    在云计算时代,数据中心的互联与云服务的接入成为企业业务运营不可或缺的一部分。为了满足这一需求,云专线应运而生,它为用户提供了本地数据中心与云上虚拟私有云(VPC)之间的高安全、高速度、低延迟、稳定可靠的专属连接通道。然而,在探讨云专线时,我们往往会将其与IEPL(国际以太网私......
  • NOIP2024模拟赛21
    省流:没过T1,玩了1h俄罗斯,不好评价。还好T3一个小时写完了平方暴力,还没菜到离谱,感觉这才是一个正常的分数。但是好像正解要不到1h?T2的dp优化是我弱项,做不出正常,spdarkle是真逆天。怎么一眼的怎么一眼的怎么一眼的怎么一眼的怎么一眼的怎么一眼的怎么一眼的。发现后面又......
  • 多校A层冲刺NOIP2024模拟赛17
    多校A层冲刺NOIP2024模拟赛17T1、网格首先看上去很麻烦,但是最终所有的式子都可以写成几个数的积相加的形式,那么我们只要处理数(拼接起来)、数的积以及积的和。那么我们维护三个变量,第一个是$x$,表示最后一个积前面所有的数和,第二个是$y$,表示目前的积,第三个是z,表......
  • 使用机器学习预测FPGA的执行时间与功耗:一种创新的方法
    随着科技的飞速发展,现场可编程门阵列(FPGA)在高性能计算、数据中心、人工智能等领域的应用日益广泛。然而,FPGA设计的复杂性和功耗问题一直是制约其性能提升的关键因素。近年来,机器学习(ML)技术的兴起为FPGA的执行时间与功耗预测提供了新的解决方案。本文将探讨如何使用机器学习进行FPG......
  • 共享IPAM地址池实现多账号下地址统一规划管理
    多账号体系架构中,企业网络管理员使用IPAM功能规划和管理工作中的IP地址;规划完成后,可通过资源共享功能,将创建的IPAM地址池共享给业务账号,实现企业内部网络地址的统一分配与管理,简化网络管理流程,助力企业专注于核心业务创新。功能简介资源共享多账号架构体系中,如果存在某一特......
  • 创建和管理IPAM地址池
    当您需要有效管理阿里云账号内的私网IP地址,以防止IP地址冲突或重叠,您可以使用IPAM地址池并预置CIDR。此时该地址池可以为专有网络VPC分配资源并检测可能的地址冲突。您也可以从该地址池中分配自定义CIDR,将其保留供以后使用。前提条件您已经创建了IPAM。具体操作,请参见创建和......