99在线精品免费视频九九视-99在线精品视频-99在线精品视频免费观里-99在线精品视频在线观看-99在线免费播放



官方論壇
官方淘寶
官方博客
微信公眾號(hào)
點(diǎn)擊聯(lián)系吳工 點(diǎn)擊聯(lián)系周老師

【案例】fpga按鍵防抖設(shè)計(jì)

發(fā)布時(shí)間:2021-06-25   作者:admin 瀏覽量:


案例編號(hào):000700000063

1功能概述

按鍵開關(guān)是各種電子設(shè)備不可或缺的人機(jī)接口,如電腦的鍵盤等。實(shí)際應(yīng)用中,按鍵開關(guān)通常為機(jī)械式彈性開關(guān)。當(dāng)機(jī)械點(diǎn)斷開、閉合時(shí),由于機(jī)械觸點(diǎn)的彈性作用,一個(gè)按鍵開關(guān)在閉合時(shí)不會(huì)馬上穩(wěn)定接通,斷開時(shí)也不會(huì)馬上斷開,在閉合和斷開的瞬間均伴隨有一連串的抖動(dòng)。為保證系統(tǒng)及時(shí)正確識(shí)別,必須對(duì)這種情況作出相應(yīng)處理。我們稱之為按鍵消抖。

按鍵消抖可分為硬件消抖和軟件消抖。硬件消抖的原理是在信號(hào)輸入系統(tǒng)之前消除抖動(dòng)干擾,在按鍵較少的情況下比較適宜。如果按鍵較多,則使用軟件消抖。軟件消抖的實(shí)質(zhì)在于降低鍵盤輸入端口的采樣頻率,將高頻抖動(dòng)略去。需要注意的是,軟件消抖需要占據(jù)一定的系統(tǒng)資源。

盡管硬件消抖和軟件消抖能實(shí)現(xiàn)按鍵消抖功能,串行處理的方式都存在一定的局限性,顯得不那么完美。而硬件資源豐富的FPGA系統(tǒng)采用并行處理的模式,利用硬件來減輕軟件工作量,通過硬件加速軟件消抖處理,即可做到軟件消抖并行化,因而在按鍵消抖處理方面具備非常明顯的優(yōu)勢(shì)。

優(yōu)秀的設(shè)計(jì)程序應(yīng)該是用最簡(jiǎn)單的代碼(架構(gòu)、信號(hào))實(shí)現(xiàn)功能。在本例中,我們的只需要用4個(gè)信號(hào)界定,并用很短的代碼即可。下面我們先來看看功能要求:

在系統(tǒng)設(shè)計(jì)中,消除按鍵抖動(dòng)的方法五花八門,無論是硬件電路和軟件設(shè)計(jì)都十分成熟。在本項(xiàng)目中,我們將用Verilog語言給出具體實(shí)現(xiàn)過程,設(shè)計(jì)一個(gè)程序來檢查鍵值,有效濾除按鍵抖動(dòng)區(qū)間20 ms的毛刺脈沖。

 

2 設(shè)計(jì)思路

一般按鍵所用開關(guān)為機(jī)械彈性開關(guān),由于機(jī)械觸點(diǎn)的彈性作用,每個(gè)按鍵開關(guān)在閉合時(shí)不會(huì)馬上穩(wěn)定地接通,在斷開時(shí)也不會(huì)一下子斷開。因而在閉合及斷開的瞬間均伴隨有一連串的抖動(dòng),如下圖。抖動(dòng)時(shí)間的長(zhǎng)短由按鍵的機(jī)械特性決定,一般為5 ms10 ms

 

xx 按鍵抖動(dòng)過程示意

當(dāng)系統(tǒng)檢測(cè)出按鍵閉合后,執(zhí)行一個(gè)延時(shí)程序,產(chǎn)生5ms10ms的延時(shí);前沿抖動(dòng)消失后,再一次檢測(cè)鍵的狀態(tài);如果仍保持閉合狀態(tài)電平,則確認(rèn)為真正有鍵按下。當(dāng)檢測(cè)到按鍵釋放后,也要給5ms10ms的延時(shí),待后沿抖動(dòng)消失后才能轉(zhuǎn)入該鍵的處理程序。本案例我們?cè)O(shè)置經(jīng)過20 ms后的高電平才是真正的按鍵功能。

    根據(jù)上述思路并使用下面列表中的信號(hào)即可進(jìn)行代碼設(shè)計(jì)。

 

信號(hào)列表

頂層模塊信號(hào)列表

信號(hào)名

I/O

位寬

說明

clk

I

1

系統(tǒng)工作時(shí)鐘50MHz。

rst_n

I

1

系統(tǒng)復(fù)位信號(hào),低電平有效。

key_in

I

4

按鍵輸入信號(hào),按下高電平。

key_vld

O

4

按鍵有效信號(hào),高電平有效。


3 程序設(shè)計(jì)

頂層模塊代碼


 1 module key_module(
 2                    clk    ,
 3                    rst_n  ,
 4                    key_in ,
 5                    key_vld
 6     );
 7     parameter                   DATA_W    = 20          ;
 8     parameter                   KEY_W     = 4           ;
 9     parameter                   TIME_20MS = 1_000_000   ;
10     
11     input                       clk                     ;
12     input                       rst_n                   ;
13     input      [KEY_W-1 :0]     key_in                  ;
14     output     [KEY_W-1 :0]     key_vld                 ;
15     reg        [KEY_W-1 :0]     key_vld                 ;
16     reg        [DATA_W-1:0]     cnt                     ;
17     wire                        add_cnt                 ;
18     wire                        end_cnt                 ;
19     reg                         flag                    ;
20     reg        [KEY_W-1 :0]     key_in_ff1              ;
21     reg        [KEY_W-1 :0]     key_in_ff0              ;
22     
23     always  @(posedge clk or negedge rst_n)begin
24         if(rst_n==1'b0)begin
25             cnt <= 20'b0;
26         end
27         else if(add_cnt)begin
28             if(end_cnt)
29                 cnt <= 20'b0;
30             else
31                 cnt <= cnt + 1'b1;
32         end
33         else begin
34             cnt <= 0;
35         end
36     end
37     
38     assign add_cnt = flag==1'b0 && (key_in_ff1!=0);
39     assign end_cnt = add_cnt && cnt == TIME_20MS - 1;
40     
41     always  @(posedge clk or negedge rst_n)begin
42         if(rst_n==1'b0)begin
43             flag <= 1'b0;
44         end
45         else if(end_cnt)begin
46             flag <= 1'b1;
47         end
48         else if(key_in_ff1==0)begin
49             flag <= 1'b0;
50         end
51     end
52     
53     always  @(posedge clk or negedge rst_n)begin
54         if(rst_n==1'b0)begin
55             key_in_ff0 <= 0;
56             key_in_ff1 <= 0;
57         end
58         else begin
59             key_in_ff0 <= key_in    ;
60             key_in_ff1 <= key_in_ff0;
61         end
62     end
63     
64     always  @(posedge clk or negedge rst_n)begin
65         if(rst_n==1'b0)begin
66             key_vld <= 0;
67         end
68         else if(end_cnt)begin
69             key_vld <= key_in_ff1;
70         end
71         else begin
72             key_vld <= 0;
73         end
74     end
75 endmodule
76     
77     
78     


   拓展閱讀
主站蜘蛛池模板: 在线看片h站| 一级黄色录像放| 久久精品操| 亚洲婷婷丁香| 久久国产免费| 高h喷水荡肉爽文np肉色文| 国产一级片子| 亚洲黄网在线观看| 日韩福利在线视频| 手机国产精品一区二区| yy4080一级毛片免费观看| 天天套图| 精品毛片免费看| 免费欧洲毛片a级视频| 久久久久久国产a免费观看黄色大片| 亚洲色图套图超市| 国产精品视频人人做人人爱| 国产高清成人| 午夜伦情电午夜伦情影院| 亚洲好视频| 新香蕉视频| 亚洲精品久中文字幕| 亚洲人体一区| 精品视频一区二区三区| 欧美色欧美亚洲高清在线观看| 欧美特黄特色aaa大片免费看| 亚洲欧美日韩成人| 亚洲国产第一区二区香蕉日日| 国产精品v免费视频| 欧美一区二区三区视频在线观看| 久久 精品 一区二区| 国产亚洲欧美在线视频| 国自产拍在线视频天天更新| 久久久一级| 国产色婷婷亚洲99精品小说| 欧美激情特级黄aa毛片| 一区二区三区免费视频网站| 国产精品日韩欧美一区二区三区 | 亚洲国产精品日韩在线| 久久免费视频播放| 涩涩看片|