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

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

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

3天內(nèi)不再提示

如何設(shè)計一個實用的按鍵模塊

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

一.簡介

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

二. 按鍵電路

按鍵為輸入設(shè)備,通過電路圖可以知道,當(dāng)按鍵按下的時候,F(xiàn)PGA會檢測到低電平,按鍵沒有按下的時候,F(xiàn)PGA檢測到的是高電平。

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

三. Verilog代碼編寫

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

按鍵按下,LED燈狀態(tài)取反。

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 

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

四. 解決方案設(shè)計

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

電平不穩(wěn)定

短時間內(nèi)重復(fù)檢測

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

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

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

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

這里通過狀態(tài)機的方式來實現(xiàn),第一步就是要分析一共有幾個狀態(tài)。

空閑態(tài):按鍵沒有按下時,所處的狀態(tài)。

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

延時態(tài):延時,直到按鍵釋放。

釋放態(tài):按鍵釋放,回歸到空閑態(tài)。

模式一,可以在消抖態(tài)完成后,生效。

模式二,可以在釋放態(tài),生效。

模式三,可以在延時態(tài),生效。

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

//按鍵消抖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;      //按鍵狀態(tài)儲存
reg[30:0]  delay_cnt;
assign    neg_key =  key1 & (~key0);    //判斷按鍵信號的下降沿assignpos_key=(~key1)&key0;//判斷按鍵信號的上升沿//根據(jù)模式來判斷按鍵輸出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
//延時計數(shù)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這個參數(shù)調(diào)小一點了,可以設(shè)置為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

當(dāng)當(dāng)當(dāng)當(dāng)!!!完美對應(yīng)起來,測試通過!

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

審核編輯:彭靜
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1642

    文章

    21920

    瀏覽量

    612006
  • 模塊
    +關(guān)注

    關(guān)注

    7

    文章

    2771

    瀏覽量

    49053
  • led燈
    +關(guān)注

    關(guān)注

    22

    文章

    1593

    瀏覽量

    109172
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4880

    瀏覽量

    70000

原文標題:FPGA實現(xiàn)按鍵模塊

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

收藏 人收藏

    評論

    相關(guān)推薦

    如何設(shè)計按鍵信號進行計數(shù)的計數(shù)器?

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

    按鍵控制另一個按鍵

    大家好,我想問問題,我想用按鍵和另一個按鍵結(jié)
    發(fā)表于 03-04 00:58

    介紹事件驅(qū)動型按鍵驅(qū)動模塊MultiButton

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

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

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

    【BPI-Pico-RP2040 開發(fā)板】+GPIO口的使用

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

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

    標記的用法,用按鍵控制1LED燈的亮滅,按鍵去抖 這課,我們學(xué)習(xí)怎么用
    發(fā)表于 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不同的燈

    哈哈,窮吊死,自己做的超簡單的板還沒有電源提供,只得借助我的大開發(fā)板啦。其實這2模塊
    發(fā)表于 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
    的頭像 發(fā)表于 12-30 09:13 ?2662次閱讀
    微雪電子8<b class='flag-5'>個</b>獨立<b class='flag-5'>按鍵</b><b class='flag-5'>模塊</b>按鈕簡介

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

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

    微雪電子AD按鍵模塊簡介

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

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

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

    dfrobotADkey 按鍵模塊介紹

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

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

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

    stm32單片機如何實現(xiàn)按鍵切換兩程序?

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

    應(yīng)用于單片機的按鍵處理模塊

    應(yīng)用于單片機的按鍵處理模塊
    的頭像 發(fā)表于 10-24 16:28 ?933次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>個</b>應(yīng)用于單片機的<b class='flag-5'>按鍵</b>處理<b class='flag-5'>模塊</b>!
    主站蜘蛛池模板: 伊人久久大香线蕉综合亚洲 | 永久免费mv网站入口 | 国产激爽大片在线播放 | 精品亚洲综合在线第一区 | 日本在线不卡免费 | 狠狠噜天天噜日日噜 | 欧美日韩国产一区二区三区不卡 | 五月天婷婷在线视频 | 国模私拍福利一区二区 | 最近免费 | 欧美夜夜夜 | 男女www视频在线看网站 | 国产热| 国产精品四虎 | 网站在线观看你懂的 | 亚洲午夜一区二区三区 | 国产二区三区毛片 | 美女禁处| 五月婷六月丁香 | 最近2018中文字幕免费看在线 | 国产拍拍拍免费视频网站 | 亚洲一级视频在线观看 | 天天爽夜爽免费精品视频 | 四虎网址最新 | 在线播放你懂得 | 免费男女| 国产三级网 | 天天拍天天干 | 日韩免费精品视频 | 国产一区美女视频 | 天天添天天干 | 日本xxxx色视频在线观看 | 欧美黄色免费网址 | 日本天天射 | 欧美性白人极品1819hd | 成人看片免费无限观看视频 | 国模娜娜扒开嫩木耳 | 天天操2023| 亚洲国产成人久久99精品 | 日本免费黄色网 | 国产三片理论电影在线 |