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;

四、总结

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

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FPGA可以通过外接按键来实现按键输入功能。一种常见的方法是使用GPIO(通用输入/输出)引脚来连接外部按键。通过将按键引脚连接到FPGA的GPIO引脚上,FPGA可以读取按键的状态并做出相应的响应。 具体的实现步骤如下: 1. 首先,确定FPGA开发板上哪些引脚可以用作GPIO引脚,并选择适当的引脚来连接按键。 2. 接下来,将按键的一个引脚连接到FPGA开发板上的GPIO引脚,可以使用导线或插座连接。 3. 在FPGA设计中,配置GPIO引脚为输入模式,以便可以读取外部按键的状态。 4. 在设计中添加逻辑电路或代码来检测按键的状态变化。可以使用时钟信号和状态机来处理按键的抖动问题,确保准确地检测按键按下和抬起的事件。 5. 根据按键状态的改变,FPGA可以执行相应的操作,例如触发其他逻辑电路、更新显示或发送信号给其他外设。 需要注意的是,具体的实现方法可能会因FPGA型号、开发板和设计需求而有所不同。因此,在实际设计时,需要参考FPGA芯片和开发板的规格说明,并根据需要进行相应的设置和配置。 引用中的代码段是一个示例,展示了在纯软件环境下处理按键输入的一种方法。在FPGA设计中,可以根据该代码段的逻辑来实现按键的处理,但需要结合FPGA开发工具和硬件资源进行相应的编程和配置。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [FPGA基础入门【13】开发板USB键盘控制,教你做硬核键盘侠](https://blog.csdn.net/qimoDIY/article/details/99920981)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [学fpga按键输入)](https://blog.csdn.net/feixiaoxing/article/details/124068798)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值