找回密码
 注册
关于网站域名变更的通知
查看: 278|回复: 1
打印 上一主题 下一主题

转——FPGA开发笔记--按键

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-3-27 10:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
转——FPGA开发笔记--按键

& b9 p1 \$ i' t  Q. q文章摘要:
6 G( h' I% T( i; ^% e9 x本文主要描述了基于FPGA的按键处理模式及思路(抽样),看似比较基础的东西,在后续信号处理中,应用会用的比较多,实际上再复杂的逻辑,都可以分解成简单的基础来处理;
# O0 J; [& p$ d
0 q+ v  x9 c: b7 f设计思路:
; m2 {8 C0 Q4 `, O' c1 A对于机械按键,在按下及弹起时,都会不可避免的产生机械抖动,按键处理的重点就在于消除抖动;FPGA处理的基本思路就是采用抽样的模式,降低采样频率,以滤去高频成分,通俗点讲,就是跳过抖动区域采样,(这种方法思路与单片机处理是完全不同的);0 I) z5 b2 [+ O# a4 c) Z  ^- f3 ]7 x

& ^* W, w1 _% Z- i% X知识要点:边沿检测逻辑(以后在信号处理中会经常用到);! Q$ M/ L" d5 ^) o

! ?8 U3 j" p; C; `1 f8 J3 H: }# G3 G0 u- D硬件平台: EP4CE6F17C8
, ?1 ^, }* q9 ]* s, `开发环境: Quartus II 13.1
( p: c- r7 _6 q0 T. j& [5 P; {
2 |" t& V* l- L# {示例代码:7 |& F: G  \. P$ A
  • /*
  • * 功能描述:按键例程,每一次有效按键反转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# G( s" w" q. l% E9 J* c7 Y- a
  _+ u" }; K1 w" u$ v- r2 @
结果验证: 每按下一次按键,LED灯反转一次;7 X+ |( }2 z9 S7 S$ D& V/ ^
: x9 k- J9 f9 w
后记:" F) ^- @, W, x+ T4 L
这里没有什么高端教程,都是一些简单的应用,主要是一些过程和方法,以备以后查询方便,都是一些基础应用和一些想法,但都是经过实际测试过的东西,可能更适合于菜鸟少走弯路,在各位大牛面前有点搬门弄斧,不过一般的大牛可能不太愿意写这种很基本的东西吧。; p4 Z, h$ Y- v( g3 u

该用户从未签到

2#
发表于 2019-3-27 15:41 | 只看该作者
很实用的东东
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-8 20:41 , Processed in 0.140625 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表