差别
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
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. 计时控制|计时控制]]中我们将学习计时的显示和控制,在这里我们要用到按键的消抖以及数码管,我们甚至可以用小脚丫做一个计时器甚至电子表。 | ||