差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
后一修订版 两侧同时换到之后的修订记录
7._按键消抖 [2017/03/06 01:52]
zhijun
7._按键消抖 [2017/03/31 17:16]
zhijun
行 21: 行 21:
  
 \\ \\
-要消除按键的抖动,我们需要去扫描按键,也就是不断的去采集按键的状态。软件消抖时我们一般只考虑按键按下时的抖动,而放弃对释放时抖动的消除。在FPGA里有两种去抖思路: +要消除按键的抖动,我们需要去扫描按键,也就是不断的去采集按键的状态。软件消抖时我们一般只考虑按键按下时的抖动,而放弃对释放时抖动的消除。用系统时钟(频率较高)去采集按键状态,当检测到按下时用计数器延时20ms,再去检测按键状态,如果这时仍为按下状态,确认是一次按下动作,否侧的话认为无按键按下。如何检测按键状态变化就需要用到脉冲边沿检测的方法
- +
-\\   +
-1)用系统时钟(频率较高)去采集按键状态,当检测到按下时用计数器延时20ms,再去检测按键状态,如果这时仍为按下状态,确认是一次按下动作,否侧的话认为无按键按下。\\ +
-2)把系统时钟分频产生一个周期为20ms时钟,用这个时钟去检测按键状态,如果检测到按下则认为是一次按键按下动作+
  
 \\ \\
行 41: 行 37:
 ====Verilog代码==== ====Verilog代码====
 ------ ------
-模块化设计是用硬件描述语言进行数字电路设计精髓代码可重复利用而且模块化的设计使得程序的结构也很清晰。这里我们首先看看流水灯的模块化设计利用了之前的3-8译码器和分频器你需要把这两个程序也拷贝到一个工+本实验主要通过按键来控制led翻转当按下一次led变亮,再按下一次led变暗。首先我们做个试验,对按键不做处理通过按键来控制led翻转 
 + 
 +<code verilog>​ 
 + 
 +// ******************************************************************** 
 +// >>>>>>>>>>>>>>>>>>>>>>>>>​ COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<​ 
 +// ******************************************************************** 
 +// File name    : top.v 
 +// Module name  : top 
 +// Author ​      : STEP 
 +// Description ​ : control led through the button 
 +// Web          : www.stepfpga.com 
 +//  
 +// -------------------------------------------------------------------- 
 +// Code Revision History :  
 +// -------------------------------------------------------------------- 
 +// Version: |Mod. Date:   ​|Changes Made: 
 +// V1.0     ​|2017/​03/​02 ​  ​|Initial ver 
 +// -------------------------------------------------------------------- 
 +// Module Function:​按键控制led翻转未做消抖 
 + 
 +module top( 
 + key, ​         //​按键输入 
 + rst, ​         //​复位输入 
 + led           //​led输出 
 + ); 
 + 
 + input key,rst; 
 + output reg led; 
 + 
 + always @(key or rst) 
 + if (!rst) ​            //​复位时led熄灭 
 + led = 1; 
 + else if(key == 0)      
 + led = ~led;   //​按键按下时led翻转 
 + else 
 + led = led; 
 +endmodule 
 +</​code>​ 
 +\\ 
 +未经过消抖的程序下载小脚丫上会发现按键有时不能够控制led翻转,这是因为按键的抖动造成了led状态变化不可控,所以我们必须将抖动消除。下面是种延时去抖的序 
 + 
 <code verilog> <code verilog>
  
行 121: 行 159:
              ​else ​                                ​else ​                  
                  ​key_sec_pre <= key_sec; ​                              ​key_sec_pre <= key_sec; ​            
-             ​end ​    +         end      ​
-           end      ​+
        ​assign ​ key_pulse = key_sec_pre & (~key_sec); ​            ​assign ​ key_pulse = key_sec_pre & (~key_sec); ​    
                
行 154: 行 191:
 // Module Function:​进过按键消抖后控制led显示翻转 // Module Function:​进过按键消抖后控制led显示翻转
  
-module ​debounce ​(clk,​rst,​key,​led);​+module ​top (clk,​rst,​key,​led);​
  
         input             clk;         input             clk;
行 196: 行 233:
 ====小结==== ====小结====
 ------ ------
-在本实验学习了如何进行按键的消抖。在很多应用情况下我们必须采取消抖才能更好地控制逻辑。在下一个实验我们将学习计时的显示和控制,在这里我们要用到按键的消抖以及数码管,我们甚至可以用小脚丫做一个计时器甚至电子表。+在本实验学习了如何进行按键的消抖。在很多应用情况下我们必须采取消抖才能更好地控制逻辑。在下一个实验[[8. 计时控制|计时控制]]中我们将学习计时的显示和控制,在这里我们要用到按键的消抖以及数码管,我们甚至可以用小脚丫做一个计时器甚至电子表。