FPGA按键检测

开发板:黑金AX301

AX301/AX4010 开发板上共有 4 个白色按键,分别为 Reset 和 KEY1~KEY3,我们这里
要实验的就是这四个用户按键。 按键的电路设计如下
 


实现原理:

四个按键 KEY1~KEY4 分别对应的 FPGA 管脚情况如下:
Reset 键------PIN:N13
KEY1 键------PIN:M15
KEY2 键------PIN:M16
KEY3 键------PIN:E16
按键没有按下的时候,连接到 FPGA 管脚的按键信号的电平为高,当有按键按下的时候,连接到 FPGA 管脚的此按键信号的电平被拉低。




`timescale 1ns / 1ps
module key(
				clk, 
				//rst_n,
				key_in, 
				led_out
			);
			
input  clk;
//input  rst_n;
input  [3:0]key_in;
output [3:0]led_out;

wire rst_n = 1'b1;

//寄存器定义
reg [19:0]count;
reg [3:0] key_scan;

//核心程序
always@(posedge clk or negedge rst_n)
begin
	if(~rst_n)
		count <=20'd0;
	else//20ms为去抖时间
	begin
		if(count == 20'd999_999)
		begin
			count <= 20'd0;
			key_scan <= key_in;
		end 
		else 
			count <= count + 20'd1;
	end
end

reg[3:0]key_scan_r;
always@(posedge clk)
	key_scan_r <= key_scan;
	
wire [3:0]flag_key = key_scan_r[3:0]&(~key_scan[3:0]);
reg [3:0]temp_led;


always @ (posedge clk or negedge rst_n) //检测时钟的上升沿和复位的下降沿
begin
if (!rst_n) //复位信号低有效
temp_led <= 4'b1111; //LED 灯控制信号输出为低, LED 灯全灭
else
begin
if ( flag_key[0] ) temp_led[0] <= ~temp_led[0]; //按键 KEY1 值变化时,LED1 将做亮灭翻转
if ( flag_key[1] ) temp_led[1] <= ~temp_led[1]; //按键 KEY2 值变化时,LED2 将做亮灭翻转
if ( flag_key[2] ) temp_led[2] <= ~temp_led[2]; //按键 KEY3 值变化时,LED3 将做亮灭翻转
if ( flag_key[3] ) temp_led[3] <= ~temp_led[3]; //按键 KEY4 值变化时,LED4 将做亮灭翻转
end
end
assign led_out[0] = temp_led[0];
assign led_out[1] = temp_led[1];
assign led_out[2] = temp_led[2];
assign led_out[3] = temp_led[3];

endmodule

操作结果:

每 20ms 程序会检查一下按键的状态,如果这次检测为低电平而且上次检测为高电平的话,说明有按键按下,相对应的 LED 灯反转。一般按键按下时的按键抖动为低于 20ms 的脉冲信号,这些高频脉冲信号会被滤除。提高了按键的可靠性。 

按一下按键 Reset,LED0 变亮, 再按一下按键 Reset,LED0 熄灭。实验结果是否跟我们
的设计的思路一样。



  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值