按键去抖FPGA设计 改良版-.doc

上传人:博****1 文档编号:543069381 上传时间:2023-02-01 格式:DOC 页数:4 大小:66KB
返回 下载 相关 举报
按键去抖FPGA设计 改良版-.doc_第1页
第1页 / 共4页
按键去抖FPGA设计 改良版-.doc_第2页
第2页 / 共4页
按键去抖FPGA设计 改良版-.doc_第3页
第3页 / 共4页
按键去抖FPGA设计 改良版-.doc_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《按键去抖FPGA设计 改良版-.doc》由会员分享,可在线阅读,更多相关《按键去抖FPGA设计 改良版-.doc(4页珍藏版)》请在金锄头文库上搜索。

1、按键消抖sw_debounce 什么是debounce,为什么要debounce? 當按下按鈕時,表面上只按了一下。但是訊號的傳遞並不是很單純的由1直接跳到0。實際上的訊號會如上圖所示,當我們按下按鈕後,訊號會在高低電位之間彈跳(bounce)。則電路所收到的訊號可能會像111110110110000000,會和我們所預期的111111111000000000不同。如此一來,雖然我們只按了一下按鈕,電路可能會解讀成按了好幾下按鈕。debounce的目的就是為了要除去訊號在高低電位之間彈跳所造成的不正確輸入。 具体原理:通常,按键抖动会产生10-20MS的毛刺,因此要做的实际上就是在20MS中采

2、样一次,当检测到按键突变的时候,就认定按下,其他状态忽略。 采用50MHz晶振,时钟周期是20ns,消除按键消抖的关键在于,在检测到按键电平发生跳变后的20ms内,不对按键电平进行判定。这就需要引入脉冲边沿检测法。脉冲边沿检测法,个人觉得, 在FPGA里的应用实在是太多了,几乎所有的程序都要用到,作用无非是防止竞争冒险,将一个信号延迟一个时钟周期,原来的信号取反,2个信号与一下,从而产生一个宽度为一个时钟周期(20ns)的脉冲,然后将这个脉冲作为控制信号去控制别的进程。 下面是之前开发板的一个按键程序:module sw_debounce( clk, rst_n, sw1_n, sw2_n,

3、sw3_n, /output led_d1, / led 1-off,0-on led_d2, led_d3 );input clk;input rst_n;input sw1_n,sw2_n,sw3_n; /Active low 低电平有效output led_d1;output led_d2;output led_d3;/脉冲边沿检测法(当按键电平发生突变时产生一个时钟周期的高电平,用这个高电平控制计数器的工作)reg 2:0 key_rst;always(posedge clk or negedge rst_n) if (!rst_n) key_rst=3b111; else key_r

4、st=sw3_n,sw2_n,sw1_n;reg 2:0 key_rst_r;always(posedge clk or negedge rst_n) if (!rst_n) key_rst_r=3b111; else key_rst_r=key_rst;wire 2:0 key_an= key_rst_r2:0&(key_rst2:0);/ -reg 19:0 cnt;/ 时钟频率50MHz,周期20ns,所以20ms对应的需要10的6次方个周期,需要一个20位计数器计数。always (posedge clk or negedge rst_n) if (!rst_n) cnt = 20d0

5、; else if (key_an) /利用脉冲边沿检测法控制计数器计数 cnt=20d0; else cnt = cnt + 1b1;reg 2:0 low_sw;always (posedge clk or negedge rst_n) if (!rst_n) low_sw = 3b111; else if (cnt = 20hfffff) /每隔20MS检测一次按键 low_sw = sw3_n,sw2_n,sw1_n; / -/ - reg 2:0 low_sw_r; /将low_sw信号锁存一个时钟周期,延时不是真的“锁存”always ( posedge clk or negedg

6、e rst_n ) if (!rst_n) low_sw_r = 3b111; else low_sw_r = low_sw; wire 2:0 led_ctrl = low_sw_r2:0 & ( low_sw2:0); /当检测到按键有下降沿变化时,代表该按键被按下,按键有效reg d1;reg d2;reg d3;always (posedge clk or negedge rst_n) if (!rst_n) begin d1 = 1b0; d2 = 1b0; d3 = 1b0; end else begin if ( led_ctrl0 ) d1 = d1; if ( led_ctrl1 ) d2 = d2; if ( led_ctrl2 ) d3 = d3; /当任意一个按键被按下的时候,对应的LED灯会亮灭切换 endassign led_d1 = d1 ? 1b0 : 1b1;assign led_d2 = d2 ? 1b0 : 1b1;assign led_d3 = d3 ? 1b0 : 1b1;endmodule

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号