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