差别

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

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
7._按键消抖 [2017/03/06 01:54]
zhijun
7._按键消抖 [2022/06/23 13:22]
gongyu 移除
行 1: 行 1:
-=====按键消抖=====+## 按键消抖
 在之前的实验中我们学习了如何用按键作为FPGA的输入控制,在本实验中将学习如何进行按键消抖,用按键完成更多的功能。 在之前的实验中我们学习了如何用按键作为FPGA的输入控制,在本实验中将学习如何进行按键消抖,用按键完成更多的功能。
 \\ \\
-====硬件说明==== + 
--------+### 1. 硬件说明 
 按键是一种常用的电子开关,电子设计中不可缺少的输入设备。当按下时使开关导通,松开时则开关断开,内部结构是靠金属弹片来实现通断。 按键是一种常用的电子开关,电子设计中不可缺少的输入设备。当按下时使开关导通,松开时则开关断开,内部结构是靠金属弹片来实现通断。
 \\  ​ \\  ​
行 21: 行 22:
  
 \\ \\
-要消除按键的抖动,我们需要去扫描按键,也就是不断的去采集按键的状态。软件消抖时我们一般只考虑按键按下时的抖动,而放弃对释放时抖动的消除。在FPGA里有两种去抖思路: +要消除按键的抖动,我们需要去扫描按键,也就是不断的去采集按键的状态。软件消抖时我们一般只考虑按键按下时的抖动,而放弃对释放时抖动的消除。用系统时钟(频率较高)去采集按键状态,当检测到按下时用计数器延时20ms,再去检测按键状态,如果这时仍为按下状态,确认是一次按下动作,否侧的话认为无按键按下。如何检测按键状态变化就需要用到脉冲边沿检测的方法
- +
-\\   +
-1)用系统时钟(频率较高)去采集按键状态,当检测到按下时用计数器延时20ms,再去检测按键状态,如果这时仍为按下状态,确认是一次按下动作,否侧的话认为无按键按下。\\ +
-2)把系统时钟分频产生一个周期为20ms时钟,用这个时钟去检测按键状态,如果检测到按下则认为是一次按键按下动作+
  
 \\ \\
行 39: 行 36:
  
 \\ \\
-====Verilog代码==== + 
------- +### 2. 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: 行 160:
              ​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: 行 192:
 // Module Function:​进过按键消抖后控制led显示翻转 // Module Function:​进过按键消抖后控制led显示翻转
  
-module ​debounce ​(clk,​rst,​key,​led);​+module ​top (clk,​rst,​key,​led);​
  
         input             clk;         input             clk;
行 184: 行 222:
  
 \\ \\
-====引脚分配==== + 
--------+### 3. 引脚分配
 设置好复位键可消抖的按键,编译完成后下载,通过按键就可以翻转LED。你也可以定义多个按键控制多个LED,还可以比较不加按键消抖情况下实际的效果对比如何。 设置好复位键可消抖的按键,编译完成后下载,通过按键就可以翻转LED。你也可以定义多个按键控制多个LED,还可以比较不加按键消抖情况下实际的效果对比如何。
 \\ \\
行 194: 行 232:
 |led             ​|N13 ​             ^ |led             ​|N13 ​             ^
  
-====小结==== +### 4. 小结
-------+
 在本实验学习了如何进行按键的消抖。在很多应用情况下我们必须采取消抖才能更好地控制逻辑。在下一个实验[[8. 计时控制|计时控制]]中我们将学习计时的显示和控制,在这里我们要用到按键的消抖以及数码管,我们甚至可以用小脚丫做一个计时器甚至电子表。 在本实验学习了如何进行按键的消抖。在很多应用情况下我们必须采取消抖才能更好地控制逻辑。在下一个实验[[8. 计时控制|计时控制]]中我们将学习计时的显示和控制,在这里我们要用到按键的消抖以及数码管,我们甚至可以用小脚丫做一个计时器甚至电子表。