久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3964|回復: 0
打印 上一主題 下一主題
收起左側

基于FPGA的按鍵消抖源代碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:210107 發表于 2017-6-11 14:52 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
完整代碼下載:
正確程序段.docx (31.06 KB, 下載次數: 14)

FPGA中,基于下面的程序,理解如下:在這個程序里檢測按鍵是否按下的方法是脈沖邊沿檢法。第一次檢測到后,啟動20ms計數器,時間到后再檢測。這里的檢測方法跟脈沖邊沿檢測法有異曲同工之處,FPGA20ms檢測按鍵是否按下,存儲檢測到的值,并且按位取反與前一個20ms檢測的值相與,得到一個值,如果為1,則判斷按鍵按下,否則則無按下。           
                          FPGA按鍵的理解示意圖
    其中key_an寄存器的功能是檢測第一次的“按下”,是cnt的啟動標志位。通過也能濾除干擾信號。led_ctrl是確實有按鍵按下的信號,維持一個時鐘周期


`timescale 1ns/1ns
module sw_xiaodou(
    clk,  
    rst_n,
    sw1_n,
    sw2_n,
sw3_n,
sw4_n,
    //output
    led_d1,
led_d2,
led_d3
    led_d4
    );
  input   clk;  //主時鐘信號50MHz
  input   rst_n; //復位信號低有效。可將其綁為開關開關撥下有效。
  input   sw1_n,sw2_n,sw3_n,Sw4_n; //三個獨立按鍵低表示按下
  output  led_d1,led_d2,led_d3,led_d4; //發光二極管分別由按鍵控制

// ----------------------------------------------------------------

reg[3:0] key_rst;  

always @(posedge clk  or negedge rst_n)

    if (!rst_n) key_rst <= 4'b1111;

else key_rst <= {sw4_n,sw3_n,sw2_n,sw1_n};

reg[3:0] key_rst_r;       //每個時鐘周期的上升沿將low_sw信號鎖存到low_sw_r

always @ ( posedge clk  or negedge rst_n )

    if (!rst_n) key_rst_r <= 4'b1111;

    else key_rst_r <= key_rst;


//當寄存器key_rst1變為0時,key_an的值變為高,維持一個時鐘周期

wire[3:0] key_an = key_rst_r & ( ~key_rst); //檢測到按下的第一次(cnt的啟動信號)


  reg [19:0]  cnt; //計數寄存器
  always @ (posedge clk  or negedge rst_n)/*alwaysclk時鐘的上升沿
                                     rst_n復位信號的下降沿觸發執行*/
    if (!rst_n)   /*異步復位rst_n為低電平即rst_n為高電平時。*/
      cnt <= 20'd0;/*cnt付初值為0*/
else
  if(key_an) cnt <=20'd0;
    else  
      cnt <= cnt + 1'b1;/*cnt計數器自加1*/

  reg  [3:0] low_sw;
always @(posedge clk  or negedge rst_n)/*同上一個always*/
    if (!rst_n)
      low_sw <= 4'b1111;/*賦初值為1111*/
    else if (cnt == 20'hfffff) /*滿20ms將按鍵值鎖存到寄存器low_sw
                         20hfffff=d1048575  t=1/48000000*1048575=0.021s*/
      low_sw <= {sw4_n,sw3_n,sw2_n,sw1_n};/*將按鍵sw3_n.sw2_n,sw1_n,用位拼
                                 接符{   }拼接為一個三位的數傳給low_sw*/

  // ---------------------------------------------------------------------------

  reg  [3:0] low_sw_r;  /*每個時鐘周期的上升沿將low_sw信號鎖存到low_sw_r*/
  always @ ( posedge clk  or negedge rst_n )
    if (!rst_n)
      low_sw_r <= 4'b1111;/*初值為1111*/
else
      low_sw_r <= low_sw;

   /*當寄存器low_sw1變為0時led_ctrl的值變為高維持一個時鐘周期 */
  wire [3:0] led_ctrl = low_sw_r[3:0] & ( ~low_sw[3:0]);/*找出變化的鍵存到led_ctrl*/

  reg d1;
  reg d2;
  reg d3;
  reg d4;
always @ (posedge clk or negedge rst_n)
    if (!rst_n)
      begin
        d1 <= 1'b0;
        d2 <= 1'b0;
        d3 <= 1'b0;
        d4 <= 1'b0;
      end
    else  
      begin  //某個按鍵值變化時LED將做亮滅翻轉
        if ( led_ctrl[0] ) d1 <= ~d1;  
        if ( led_ctrl[1] ) d2 <= ~d2;
        if ( led_ctrl[2] ) d3 <= ~d3;
        if ( led_ctrl[3] ) d4<= ~d4;
      end

  assign led_d4 = d1 ? 1'b1 : 1'b0;  //LED翻轉輸出
  assign led_d3 = d2 ? 1'b1 : 1'b0;
  assign led_d2 = d3 ? 1'b1 : 1'b0;
  assign led_d1 = d4 ? 1'b1 : 1'b0;
endmodule


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲 欧美 综合 | 天天操天天干天天曰 | 国产免费一区二区 | 国产精品免费一区二区三区四区 | 国产精品久久久久久久久久久久冷 | 成人午夜激情 | 国产精品久久一区 | 中文字幕 国产精品 | 国产91黄色 | 日韩欧美一区二区三区四区 | 99re66在线观看精品热 | 成人精品免费 | 国产高清免费 | 亚洲欧美激情精品一区二区 | www久久99| 国产免费观看久久黄av片涩av | 亚洲成人精 | 中文字幕在线国产 | 激情五月婷婷 | 天天综合久久 | 91精品久久久 | 国产激情视频 | 五月花丁香婷婷 | 亚洲成人中文字幕 | 久久精品国产清自在天天线 | 国产成人免费网站 | 中文字幕乱码亚洲精品一区 | 亚洲一区二区三区四区五区中文 | 精品国产一区二区在线 | 久久成人免费视频 | 毛片国产 | 国产精品久久久久久久午夜片 | 二区高清 | 久久久久久国产精品mv | 欧洲成人午夜免费大片 | 嫩草黄色影院 | 久久国产精品72免费观看 | 成人精品视频 | 国产1区 | 亚洲 中文 欧美 日韩 在线观看 | 亚洲三区在线 |