FPGA-按键消抖

打印 上一主题 下一主题

主题 1010|帖子 1010|积分 3030

按键消抖

1. 原理


2. 关键步伐实现

  1. always @(posedge clk or negedge rst) begin
  2.     if(!rst)begin
  3.         cnt_wait <= 26'd0;
  4.     end else if(flag_nege || flag_pose)begin
  5.         cnt_wait <= 26'd1;
  6.     end else if(cnt_wait == MAX_CNT) begin
  7.         cnt_wait <= 26'd0;
  8.     end else if(cnt_wait > 26'd0 && cnt_wait < MAX_CNT)begin
  9.         cnt_wait <= cnt_wait + 26'd1;
  10.     end
  11. end
  12. always @(posedge clk or negedge rst) begin
  13.     if(!rst)begin
  14.         key_scan1 <= 4'b1111;
  15.         key_scan2 <= 4'b1111;
  16.     end else if(cnt_wait == MAX_CNT)begin
  17.         key_scan1 <= key_in;
  18.         key_scan2 <= key_scan1;
  19.     end else begin
  20.         key_scan2 <= key_scan1;
  21.     end
  22. end
复制代码
3. 仿真波形


4. 源代码

  1. module key(
  2.     input                               clk                        ,
  3.     input                               rst                        ,
  4.     input              [   3:0]         key_in                     ,
  5.     output             [   3:0]         key_out_down               ,           
  6.     output             [   3:0]         key_out_up                     
  7. );
  8. wire                                    key_tmp = &key_in          ;
  9. reg                    key_in_r2                  ;
  10. reg                    key_in_r1                  ;
  11. always @(posedge clk or negedge rst)begin
  12.     if(!rst)begin
  13.         key_in_r1 <= 1'b1;
  14.         key_in_r2 <= 1'b1;
  15.     end else begin
  16.         key_in_r1 <= key_tmp;
  17.         key_in_r2 <= key_in_r1;
  18.     end
  19. end
  20. wire                                    flag_nege = key_in_r2 & !key_in_r1;//
  21. wire                                    flag_pose = !key_in_r2 & key_in_r1;//
  22. reg                    [  25:0]         cnt_wait                   ;
  23. // localparam  MAX_CNT = 50_000_000/50;
  24. localparam                              MAX_CNT = 1_000_000 - 1    ;
  25. always @(posedge clk or negedge rst) begin
  26.     if(!rst)begin
  27.         cnt_wait <= 26'd0;
  28.     end else if(flag_nege || flag_pose)begin
  29.         cnt_wait <= 26'd1;
  30.     end else if(cnt_wait == MAX_CNT) begin
  31.         cnt_wait <= 26'd0;
  32.     end else if(cnt_wait > 26'd0 && cnt_wait < MAX_CNT)begin
  33.         cnt_wait <= cnt_wait + 26'd1;
  34.     end
  35. end
  36. reg                    [   3:0]         key_scan1                  ;
  37. reg                    [   3:0]         key_scan2                  ;
  38. always @(posedge clk or negedge rst) begin
  39.     if(!rst)begin
  40.         key_scan1 <= 4'b1111;
  41.         key_scan2 <= 4'b1111;
  42.     end else if(cnt_wait == MAX_CNT)begin
  43.         key_scan1 <= key_in;
  44.         key_scan2 <= key_scan1;
  45.     end else begin
  46.         key_scan2 <= key_scan1;
  47.     end
  48. end
  49. // wire                   [   3:0]         kay_val = !key_scan1 & key_scan2;  !不行   !的优先级低
  50. wire                   [   3:0]         kay_val_down = ~key_scan1 & key_scan2;//
  51. wire                   [   3:0]         kay_val_up = key_scan1 & ~key_scan2;//
  52. assign key_out_down = kay_val_down;
  53. assign key_out_up = kay_val_up;
  54. endmodule
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

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

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

盛世宏图

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表