锆石科技社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 384|回复: 5

关于教程中按键消抖代码的模块调用

[复制链接]

1

主题

8

帖子

25

积分

新手上路

Rank: 1

积分
25
发表于 2017-3-30 09:39:57 | 显示全部楼层 |阅读模式
我只是想调用消抖后的按键不知道为什么不行。。,下面是我的顶层调用,coin是顶层未消抖的按键,key_o是消抖后付给的按键,底层模块后面我加了句assign key_out_n = key_out; 。我现在就是不清楚怎么调用这个给的消抖按键
A4_Key2
(
        //输入端口
        .CLK_50M(clk),.RST_N(rst),.KEY(coin),
        //输出端口
        .key_out_n(key_o)
);

  1. //---------------------------------------------------------------------------
  2. //--        文件名                :        A4_Ked2.v
  3. //--        作者                :        ZIRCON
  4. //--        描述                :        按键消抖
  5. //--        修订历史        :        2014-1-1
  6. //---------------------------------------------------------------------------
  7. module A4_Key2
  8. (
  9.         //输入端口
  10.         CLK_50M,RST_N,KEY,
  11.         //输出端口
  12.         LED
  13. );  

  14. //---------------------------------------------------------------------------
  15. //--        外部端口声明
  16. //---------------------------------------------------------------------------
  17. input                                        CLK_50M;                                //时钟的端口,开发板用的50MHz晶振
  18. input                                        RST_N;                                //复位的端口,低电平复位
  19. input                [ 7:0]        KEY;                                        //对应开发板上的KEY
  20. output        [ 7:0]        LED;                                        //对应开发板上的LED

  21. //---------------------------------------------------------------------------
  22. //--        内部端口声明
  23. //---------------------------------------------------------------------------
  24. reg                [20:0]        time_cnt;                        //用来计数按键延迟的定时计数器
  25. reg                [20:0]        time_cnt_n;                        //time_cnt的下一个状态
  26. reg                [ 7:0]        key_in_r;                        //用来接收按键信号的寄存器
  27. reg                [ 7:0]        key_out;                                //消抖完成输出按键
  28. reg                [ 7:0]         key_out_n;                        //key_out的下一个状态
  29. wire                                        key_press;                        //检测按键有没有变化

  30. //设置定时器的时间为20ms,计算方法为  (20*10^3)us / (1/50)us  50MHz为开发板晶振
  31. parameter SET_TIME_20MS = 21'd1_000_000;       

  32. //---------------------------------------------------------------------------
  33. //--        逻辑功能实现       
  34. //---------------------------------------------------------------------------
  35. //时序电路,用来key_in_r寄存器赋值
  36. always @ (posedge CLK_50M, negedge RST_N)
  37. begin
  38.         if(!RST_N)                                                                //判断复位
  39.                 key_in_r <= 8'h00;                                //初始化key_in_r值
  40.         else
  41.                 key_in_r <= KEY;                                        //将按键的值赋值给key_in_r
  42. end

  43. assign key_press = key_in_r ^ KEY;        //检测按键有没有变化

  44. //时序电路,用来给time_cnt寄存器赋值
  45. always @ (posedge CLK_50M, negedge RST_N)
  46. begin
  47.         if(!RST_N)                                                                //判断复位
  48.                 time_cnt <= 21'h0;                                //初始化time_cnt值
  49.         else
  50.                 time_cnt <= time_cnt_n;                        //用来给time_cnt赋值
  51. end

  52. //组合电路,实现20ms的定时计数器
  53. always @ (*)
  54. begin
  55.         if(time_cnt == SET_TIME_20MS || key_press) //判断按键有没有变化、时间有没有到
  56.                 time_cnt_n = 21'h0;                                //如果到达20ms或者按键有了变化,那么定时计数器将会被清零
  57.         else
  58.                 time_cnt_n = time_cnt + 1'b1; //如果未到20ms或者按键没有变化,那么定时计数器将会继续累加
  59. end

  60. //时序电路,用来key_out寄存器赋值
  61. always @ (posedge CLK_50M, negedge RST_N)
  62. begin
  63.         if(!RST_N)                                                                //判断复位
  64.                 key_out <= 8'h00;                                        //初始化key_out值
  65.         else
  66.                 key_out <= key_out_n;                        //用来给key_out赋值
  67. end

  68. //组合电路,每20ms接收一次按键的值
  69. always @ (*)
  70. begin
  71.         if(time_cnt == SET_TIME_20MS)                //判断20ms时间
  72.                 key_out_n = key_in_r;                        //如果到达20ms,接收一次按键的值
  73.         else
  74.                 key_out_n = key_out;                                //如果未到20ms,保持原状态不变
  75. end

  76. //assign LED = key_out;                                        //将消抖的按键值赋值给LED
  77. assign key_out_n = key_out;
  78. endmodule
复制代码
回复

使用道具 举报

1

主题

8

帖子

25

积分

新手上路

Rank: 1

积分
25
 楼主| 发表于 2017-3-30 09:45:37 | 显示全部楼层
有人能解决吗?
回复 支持 反对

使用道具 举报

1

主题

8

帖子

25

积分

新手上路

Rank: 1

积分
25
 楼主| 发表于 2017-3-30 09:46:08 | 显示全部楼层
有人能解决吗?
回复 支持 反对

使用道具 举报

发表于 2017-3-30 10:45:10 | 显示全部楼层
关于消抖按键的调用,你可以参考一下数字时钟的工程,里面就有调用按键消抖,关于模块使用,你可以看下硬件语法篇,里面也有详细的讲解。
回复 支持 反对

使用道具 举报

1

主题

8

帖子

25

积分

新手上路

Rank: 1

积分
25
 楼主| 发表于 2017-3-30 11:27:35 | 显示全部楼层
好的,谢谢
回复

使用道具 举报

1

主题

61

帖子

78

积分

注册会员

Rank: 2

积分
78
发表于 2017-5-30 13:23:05 | 显示全部楼层
学习学习.00.00
回复 支持 反对

使用道具 举报

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

本版积分规则

手机版|小黑屋|锆石科技社区 ( 苏ICP备15059756号  

GMT+8, 2019-5-27 11:30 , Processed in 0.150284 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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