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

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

FPGA按鍵去抖程序

作者:大鵬   來源:大鵬   點擊數:  更新時間:2014年07月13日   【字體:

  代碼是特權同學的,我將其理解后加上了注釋。去抖的原理和單片機是一樣的,即通過延時來過濾掉按鍵抖動產生的毛刺信號。不同的是判斷按鍵按下的條件不同,單片機通常是已知按鍵不按時IO口的電平(如高電平),當IO口電平發生改變時(如低電平),則開啟定時器進行延時,延時20ms后再次讀取IO口的電平,若仍為低電平,則說明有按鍵按下;若為高電平,則說明是按鍵抖動,沒有按鍵按下。FPGA的采樣頻率很高,它可以在每個時鐘周期的上升沿到來時對IO口的電平進行一次讀取。通過讀取相鄰2個時鐘周期內IO口的電平值并進行比較,若電平值發生改變(此代碼中是判斷電平從0變為1),則計數器清零,若持續20ms后電平值沒有發生改變,則讀取按鍵的鍵值,同時將這一鍵值存儲起來,當下一個20ms后再次讀取鍵值,將2次鍵值進行比較,若鍵值發生改變,則說明按鍵有動作(要么按下,要么松手)。此代碼中是判斷鍵值從0變為1,即松手檢測。

 
 
// 按鍵去抖
// 實現一個簡單的三個按鍵分別控制三個發光二極管亮或暗的控制。
// 例如,按鍵1控制發光二極管1。上電初始發光二極管1不亮,
// 當檢測到按鍵1被按下后,發光二極管1則點亮,
// 按鍵1再次被按下時,發光二極管1則不亮,如此反復。
// 該實驗需要把握好按鍵消抖檢測的設計技巧。
 
// 注:此代碼的按鍵操作是包括松手檢測的,
// 即按鍵按下后要等到松手才算一次按鍵操作
 
module key_debounce(
  clk,rst_n,
  key1_n,key2_n,key3_n,
  led1_n,led2_n,led3_n
  );
 
input clk;
input rst_n;
input key1_n,key2_n,key3_n;
output led1_n,led2_n,led3_n;
 
reg [2:0] key_rst;
 
always @(posedge clk or negedge rst_n)
begin
 if(!rst_n)
  key_rst <= 3'b111;
 else
  key_rst <= {key3_n,key2_n,key1_n}; // 讀取當前時刻的按鍵值
end
 
reg [2:0] key_rst_r;
 
always @(posedge clk or negedge rst_n)
begin
 if(!rst_n)
  key_rst_r <= 3'b111;
 else
  key_rst_r <= key_rst;  // 將上一時刻的按鍵值進行存儲
end
 
wire [2:0]key_an = key_rst_r & (~key_rst); // 當鍵值從0到1時key_an改變
//wire [2:0]key_an = key_rst_r ^ key_rst;  // 注:也可以這樣寫
 
reg [19:0] cnt;  // 延時用計數器
 
always @(posedge clk or negedge rst_n)
begin
 if(!rst_n)
  cnt <= 20'd0;
 else if(key_an)
   cnt <= 20'd0;
  else
   cnt <= cnt + 20'd1;
end
 
reg [2:0] key_value;
 
always @(posedge clk or negedge rst_n)
begin
 if(!rst_n)
  key_value <= 3'b111;
 else if(cnt == 20'hfffff) // 2^20*1/(50MHZ)=20ms
   key_value <= {key3_n,key2_n,key1_n}; // 去抖20ms后讀取當前時刻的按鍵值
end
 
reg [2:0] key_value_r;
 
always @(posedge clk or negedge rst_n)
begin
 if(!rst_n)
  key_value_r <= 3'b111;
 else
  key_value_r <= key_value; // 將去抖前一時刻的按鍵值進行存儲
end
 
wire [2:0] key_ctrl = key_value_r & (~key_value); // 當鍵值從0到1時key_ctrl改變
 
reg d1;
reg d2;
reg d3;
 
always @(posedge  clk or negedge rst_n)
begin
 if(!rst_n)
 begin  // 一個if內有多條語句時不要忘了begin end
  d1 <= 0; 
  d2 <= 0;
  d3 <= 0;
 end
 else
 begin
  if(key_ctrl[0]) d1 <= ~d1;
  if(key_ctrl[1]) d2 <= ~d2;
  if(key_ctrl[2]) d3 <= ~d3;
 end
end
 
assign led1_n = d1? 1'b1:1'b0; // 此處只是為了將LED輸出進行翻轉,RTL級與下面注釋代碼無差別
assign led2_n = d2? 1'b1:1'b0;
assign led3_n = d3? 1'b1:1'b0;
 
endmodule
關閉窗口

相關文章

51Hei缂傚倸鍊风欢锟犲窗濡ゅ懎纾块柟鎯版缁犲湱鎲搁弮鍫㈠祦闁圭儤顨呮儫闂侀潧枪閸庢娊藝閿燂拷
主站蜘蛛池模板: 日韩精品中文字幕在线观看 | 久草精品视频 | 九月丁香婷婷 | 日本性网站 | 瑟瑟视频在线观看 | 亚洲狠狠干 | 国产在线小视频 | 亚洲成人免费 | 一区二区三区不卡视频 | 四虎永久网址 | www.欧美在线 | 久久天堂网 | 一区二区三区四区精品 | 激情av网 | 午夜影片| 日韩av专区| 天天干天天曰 | 日韩精品久久久久久久 | 小日子的在线观看免费第8集 | 老女人性生活视频 | 中文字幕网址在线 | 长河落日| 福利视频1000 | 国产精品看片 | 亚洲精品一区二三区不卡 | 欧美色图在线视频 | 黄色免费网站视频 | 日本黄色免费网站 | 日韩一区二区在线观看视频 | 深夜福利网址 | 日韩二三区 | 看黄色大片 | 日韩福利在线观看 | 久久久久久久国产精品 | 青草久久久 | 亚洲视频精品 | 特级丰满少妇一级aaaa爱毛片 | 日韩精品一级毛片在线播放 | 欧美精品亚洲精品 | 日韩福利视频 | 91蝌蚪少妇偷拍 |