在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何設計一個實用的按鍵模塊

FPGA之家 ? 來源:FPGA之家 ? 作者:FPGA之家 ? 2022-09-05 09:19 ? 次閱讀

一.簡介

這是FPGA之旅的第二個設計實例了,按鍵在項目中的作用是非常大的,使用的很頻繁,本例將帶大家設計一個實用的按鍵模塊。

二. 按鍵電路

按鍵為輸入設備,通過電路圖可以知道,當按鍵按下的時候,FPGA會檢測到低電平,按鍵沒有按下的時候,FPGA檢測到的是高電平。

e32b1824-2cad-11ed-ba43-dac502259ad0.png

三. Verilog代碼編寫

直接來一段最簡單的按鍵檢測的代碼編寫,都不用仿真

按鍵按下,LED燈狀態取反。

module KEY(  input    clk,    input    rst_n,    input    key,    output  reg  led);    always@(posedge clk or negedge rst_n)    begin        if(rst_n == 1'b0)             led <= 1'b0;        else if(key == 1'b0)            led <= ~led;        else            led <= led;    endendmodule 

當按鍵按下后,LED的狀態取反,這個在仿真的時候是可以看到變化的,但是實際上板測試的話,是沒有效果的,因為clk的時鐘周期一般為20ns,每次按鍵按下的持續時間可以達到ms以上,所以LED會多次取反,所以這么簡單粗暴是不可以的,需要我們做一些額外處理。此外在按鍵按下的瞬間,電平會出現不穩定的情況,也需要進行處理。解決這些問題,正是這個例程的重點。

四. 解決方案設計

按鍵按下的時候,一共有兩個問題

電平不穩定

短時間內重復檢測

第一個問題可以通過按鍵消抖來解決,第二個問題,可以在按鍵消抖的基礎上,增加一些判斷來解決,于是就有了以下三種模式

模式一,按下生效,釋放,算一次

模式二,按下,釋放生效,算一次

模式三,按下,一段時間算一次

這里通過狀態機的方式來實現,第一步就是要分析一共有幾個狀態。

空閑態:按鍵沒有按下時,所處的狀態。

消抖態: 按鍵按下后,進入消抖態,在此期間,如果按鍵釋放了的話,回到空閑態,否則進入延時態。

延時態:延時,直到按鍵釋放。

釋放態:按鍵釋放,回歸到空閑態。

模式一,可以在消抖態完成后,生效。

模式二,可以在釋放態,生效。

模式三,可以在延時態,生效。

完美,這不就全部都解決了嘛! 代碼如下。

//按鍵消抖module btn_dis_shake(        input      clk,  input      rst_n,    input      ikey,        //按鍵輸入outputokey//按鍵輸出);//模式//0   按下生效,抬起,算一次//1   按下抬起,算一次//2  按下后,一段時間算一次parameter      mode = 2;
localparam      S_IDLE    =    'd0;localparam      S_DIS_SHAKE =       'd1;localparam      S_DEALY    =    'd2;localparam      S_UP    =    'd3;
localparam      DIS_SHAKE  =  'd6000;    //消抖延時localparam      DELAY    =  'd50000;  //模式2中,一段時間
reg[3:0] state  ,  next_state;
wire neg_key,pos_key;  //按鍵下降沿上升沿reg   key0,key1;      //按鍵狀態儲存
reg[30:0]  delay_cnt;
assign    neg_key =  key1 & (~key0);    //判斷按鍵信號的下降沿assignpos_key=(~key1)&key0;//判斷按鍵信號的上升沿//根據模式來判斷按鍵輸出assignokey=(mode==0&&state==S_DIS_SHAKE&&delay_cnt==DIS_SHAKE)?1'b1:(mode==1&&state==S_UP)?1'b1:(mode==2&&state==S_DEALY&&delay_cnt==DELAY)?1'b1:1'b0;always@(posedge clk or negedge rst_n)begin  if(rst_n  == 1'b0)  begin      key0 <= 1'b1;      key1 <= 1'b1;  end  else  begin    key0 <= ikey;    key1 <= key0;  endendalways@(posedge clk or negedge rst_n)begin  if(rst_n == 1'b0)    state <= S_IDLE;  else    state <= next_state;end
always@(*)begin  case(state)    S_IDLE:      if(neg_key  ==  1'b1)        next_state <= S_DIS_SHAKE;      else        next_state <= S_IDLE;    S_DIS_SHAKE:      //按下消抖        if(delay_cnt == DIS_SHAKE)          next_state <= S_DEALY;        else if(pos_key == 1'b1)          next_state <= S_IDLE;        else          next_state <= S_DIS_SHAKE;    S_DEALY:      //延時      if(delay_cnt == DELAY  && pos_key == 1'b1)        next_state <= S_UP;      else if( pos_key == 1'b1)        next_state <= S_UP;      else        next_state <= S_DEALY;    S_UP:      next_state <= S_IDLE;    default:  next_state <= S_IDLE;  endcaseend
//延時計數always@(posedge clk or negedge rst_n)begin  if(rst_n == 1'b0)    delay_cnt <= 'd0;  else if(state != next_state)    delay_cnt  <= 'd0;  else if(state == S_DIS_SHAKE)    delay_cnt <= delay_cnt + 1'b1;  else if(state == S_DEALY && delay_cnt == DELAY)    delay_cnt <= 'd0;  else if(state == S_DEALY)    delay_cnt <= delay_cnt + 1'b1;  else    delay_cnt <= 'd0;end
endmodule 

代碼是寫完了,對不對呢 ? 上仿真!!!仿真的時候別忘記了將DIS_SHAKE這個參數調小一點了,可以設置為2就可以了,否則,你可以試試哦,就只對模式一進行仿真,其他的模式,也可以自行嘗試喔!

`timescale  1ns/1psmodule testbeach();
    reg clk;    reg rst_n;    reg ikey;    wire okey;      always#50clk<=?~clk;?????initial?begin       clk = 1'b0;       rst_n = 1'b1;       ikey = 1'b1;                #100        rst_n = 1'b0;        #100        rst_n = 1'b1;                ikey = 1'b0;  //按下        #400        ikey = 1'b1;  //釋放        #200        ikey = 1'b0;  //按下        #600????????ikey?=?1'b1;??//釋放    end
btn_dis_shake #(.mode(0))btn_dis_shakeHP(          .clk    (clk),    .rst_n  (rst_n),      .ikey    (ikey),        //按鍵輸入    .okey  (okey)      //按鍵輸出);    endmodule

當當當當!!!完美對應起來,測試通過!

e335a618-2cad-11ed-ba43-dac502259ad0.png 

審核編輯:彭靜
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • FPGA
    +關注

    關注

    1629

    文章

    21748

    瀏覽量

    603956
  • 模塊
    +關注

    關注

    7

    文章

    2716

    瀏覽量

    47536
  • led燈
    +關注

    關注

    22

    文章

    1592

    瀏覽量

    108072
  • 代碼
    +關注

    關注

    30

    文章

    4791

    瀏覽量

    68699

原文標題:FPGA實現按鍵模塊

文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    如何設計按鍵信號進行計數的計數器?

    detect_module模塊用于檢測按鍵信號的下降沿,當檢測到下降沿后,輸出時鐘周期的高電平。
    的頭像 發表于 10-10 14:27 ?1770次閱讀
    如何設計<b class='flag-5'>一</b><b class='flag-5'>個</b>對<b class='flag-5'>按鍵</b>信號進行計數的計數器?

    按鍵控制另一個按鍵

    大家好,我想問問題,我想用按鍵和另一個按鍵
    發表于 03-04 00:58

    介紹事件驅動型按鍵驅動模塊MultiButton

    MultiButton MultiButton,小巧簡單易用的事件驅動型按鍵驅動模塊,作者 0x1abin,目前收獲 222 star
    發表于 01-10 07:28

    如何制作單片機獨立按鍵掃描的模塊

    如何制作單片機獨立按鍵掃描的模塊
    發表于 02-17 06:38

    【BPI-Pico-RP2040 開發板】+GPIO口的使用

    觀察效果,這里為引腳13接上一個外掛的LED模塊,并通過導線將引腳2接地來模擬按鍵按下的效果。經程序的下載,其運行效果如圖2所示,若斷開引腳2的連線,則LED燈熄滅,說明程序設計正確。圖2 點亮LED
    發表于 03-20 11:00

    標記的用法,用按鍵控制1LED燈的亮滅,按鍵去抖

    標記的用法,用按鍵控制1LED燈的亮滅,按鍵去抖 這課,我們學習怎么用
    發表于 08-09 10:39 ?2.4w次閱讀
    標記的用法,用<b class='flag-5'>一</b><b class='flag-5'>個</b><b class='flag-5'>按鍵</b>控制1<b class='flag-5'>個</b>LED燈的亮滅,<b class='flag-5'>按鍵</b>去抖

    使用51單片機和nRF24L01無線模塊用4不同的按鍵控制點亮4不同的燈

    哈哈,窮吊死,自己做的超簡單的板還沒有電源提供,只得借助我的大開發板啦。其實這2模塊
    發表于 06-06 17:51 ?5次下載
    使用51單片機和nRF24L01無線<b class='flag-5'>模塊</b>用4<b class='flag-5'>個</b>不同的<b class='flag-5'>按鍵</b>控制點亮4<b class='flag-5'>個</b>不同的燈

    微雪電子8獨立按鍵模塊按鈕簡介

    8獨立按鍵模塊 8位按鍵 可用作輸入 或進行I/O測試 提供測試程序(AVR、STM8、STM32) 型號 8 Push Buttons
    的頭像 發表于 12-30 09:13 ?2469次閱讀
    微雪電子8<b class='flag-5'>個</b>獨立<b class='flag-5'>按鍵</b><b class='flag-5'>模塊</b>按鈕簡介

    微雪電子5 IO 按鍵模塊 小鍵盤介紹

    5 IO 按鍵模塊 - 10按鍵 1搖桿 10按鍵
    的頭像 發表于 12-30 09:12 ?1310次閱讀
    微雪電子5 IO <b class='flag-5'>按鍵</b><b class='flag-5'>模塊</b> 小鍵盤介紹

    微雪電子AD按鍵模塊簡介

    AD按鍵模塊 16按鍵 僅占用1AD口 檢測接口(被接入方需具備AD檢測功能)提供測試程序(STM32) 型號 AD Key
    的頭像 發表于 12-30 09:28 ?1865次閱讀
    微雪電子AD<b class='flag-5'>按鍵</b><b class='flag-5'>模塊</b>簡介

    微雪電子電容觸摸 按鍵模塊簡介

    電容按鍵模塊 I2C 或 I/O接口 8按鍵 1滑條 取代傳統按鈕 電容式觸摸按鍵
    的頭像 發表于 12-30 09:36 ?2281次閱讀
    微雪電子電容觸摸 <b class='flag-5'>按鍵</b><b class='flag-5'>模塊</b>簡介

    dfrobotADkey 按鍵模塊介紹

    ADKey 鍵盤模塊讓你使用1路模擬口即可讀取5按鍵的狀態,為Arduino節約IO口。
    的頭像 發表于 11-29 16:40 ?3470次閱讀
    dfrobotADkey <b class='flag-5'>按鍵</b><b class='flag-5'>模塊</b>介紹

    單片機獨立按鍵模塊(含短按,長按,連發功能)

    最近看了很多按鍵掃描的文章,發現各有長處,后來自己花了點時間做了單片機獨立按鍵掃描的模塊
    發表于 12-22 19:46 ?23次下載
    單片機獨立<b class='flag-5'>按鍵</b><b class='flag-5'>模塊</b>(含短按,長按,連發功能)

    stm32單片機如何實現按鍵切換兩程序?

    ,非常實用。下面,我們將詳細介紹如何在STM32單片機上實現按鍵切換兩程序。 、 STM32單片機
    的頭像 發表于 09-14 14:22 ?6177次閱讀

    應用于單片機的按鍵處理模塊

    應用于單片機的按鍵處理模塊
    的頭像 發表于 10-24 16:28 ?743次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>個</b>應用于單片機的<b class='flag-5'>按鍵</b>處理<b class='flag-5'>模塊</b>!
    主站蜘蛛池模板: 日本xxxxbbbb| 日本xxxxx69hd日本| freesexvideo性2| 丁香婷婷成人| 11111日本网站| 天天搞一搞| 免费网站黄成人影院| 国产午夜影院| 欧美黑人性xxx猛交| 亚洲一二三四| 办公室桌震娇喘视频大全在线| 最近的中文字幕免费动漫视频| 怡红院网址| 四虎欧美在线观看免费| 欧美性色视频| 黄色一级毛片看一级毛片| cum4k在线| 色456| 国产午夜精品久久理论片小说| 啪啪免费视频| se94se欧美| 欧美肥胖女人bbwbbw视频| 国产美女作爱| 午夜视频高清在线aaa| 人人干人人做| 欧美性妇| xxx性xxx乱| 色88888久久久久久影院| 久久亚洲成人| 亚洲午夜在线视频| 久久精品大全| 亚洲天堂视频一区| 亚洲va国产va天堂va久久| 欧美一卡二三卡四卡不卡| 国产嫩草影院在线观看| 天天插天天插| 免费视频h| 伊人9999| 免费人成在线观看网站品爱网日本| 成年男人永久免费看片| 久久久久久久国产|