按键消抖:
简介:
目前,在大部分的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