|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
" M/ {5 `+ W3 x3 P* D文章摘要:
* B/ Q4 D, [& a. L b本文主要描述了基于FPGA的按键处理模式及思路(抽样),看似比较基础的东西,在后续信号处理中,应用会用的比较多,实际上再复杂的逻辑,都可以分解成简单的基础来处理;! F( x7 d7 R% p: J4 i* g: b5 k
' S: g& S( i' l h" y设计思路:; o* H# y5 w: I# g
对于机械按键,在按下及弹起时,都会不可避免的产生机械抖动,按键处理的重点就在于消除抖动;FPGA处理的基本思路就是采用抽样的模式,降低采样频率,以滤去高频成分,通俗点讲,就是跳过抖动区域采样,(这种方法思路与单片机处理是完全不同的);
* `& w+ Y% K0 F3 i1 Z2 ~" ^$ C3 C I
知识要点:边沿检测逻辑(以后在信号处理中会经常用到);( ~! G7 n* T* H/ ?/ X
" X6 q9 c! ?. q, o& n' q
硬件平台: EP4CE6F17C85 w2 _- I3 F0 P7 S7 g
开发环境: Quartus II 13.1# q; ~$ P& _$ a! p+ B/ O `) R0 l
& k) m& J+ N& y/ D- L9 `% Z示例代码:
3 D8 V% K7 s" h: [- q' O- /*
- * 功能描述:按键例程,每一次有效按键反转LED显示
- */
- module key_test (
- input clk, // 时钟
- input keys, // 按键
- output light // 显示
- );
- // 50MHz时钟,1us = 50个计数,20ms = 1_000_000个计数;
- parameter KEY_SMP_CNT = 32'd1_000_000;
- reg[31:0] count;
- reg curr_status; // 当前的状态
- reg last_status; // 前一次的状态(每20ms检测一次)
- reg light_status; // 当前LED状态
- wire key_flag; // 按键有效标志
- //-------------------------------------------
- /*
- * 边沿(下降沿)检测逻辑(重点):
- * 当前状态为低,前一次为高时,产生一个上跳信号;
- * (只保持1个时钟周期)
- */
- assign key_flag = last_status & ~curr_status;
- // 按键采样时序(这里也是重点)
- always @(posedge clk)
- begin
- last_status <= curr_status; // 保存上次的采样值
- if(count == KEY_SMP_CNT) // 采样频率
- begin
- count <= 32'd0;
- curr_status <= keys; // 按键采样
- end
- else
- count <= count + 1'b1;
- end
- //-------------------------------------------
- /*
- * 以下按键测试代码(不重要),每按一次LED显示反转
- */
- always @(posedge clk)
- begin
- if(key_flag)
- light_status <= ~light_status; // 每次有效按键反转LED状态
- end
- assign light = light_status; // 更新LED显示
- endmodule
2 r( E. m6 V, @! a6 o
9 N$ M+ K+ ^& {0 u- b结果验证: 每按下一次按键,LED灯反转一次;6 s( v) i% P: r! j f1 U* y( k
& n$ G# F. k: r) Z. d3 w- y% X
后记:
8 z6 Q" G- v2 `$ F& P' Y这里没有什么高端教程,都是一些简单的应用,主要是一些过程和方法,以备以后查询方便,都是一些基础应用和一些想法,但都是经过实际测试过的东西,可能更适合于菜鸟少走弯路,在各位大牛面前有点搬门弄斧,不过一般的大牛可能不太愿意写这种很基本的东西吧。
' N0 k( B# e+ x: C |
|