標題: 基于FPGA的按鍵消抖源代碼 [打印本頁]
作者: wt254720282 時間: 2017-6-11 14:52
標題: 基于FPGA的按鍵消抖源代碼
完整代碼下載:
正確程序段.docx
(31.06 KB, 下載次數: 14)
2017-6-11 14:50 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
在FPGA
中,基于下面的程序,理解如下:在這個程序里檢測按鍵是否按下的方法是脈沖邊沿檢法。第一次檢測到后,啟動20ms計數器,時間到后再檢測。這里的檢測方法跟脈沖邊沿檢測法有異曲同工之處,FPGA過20ms檢測按鍵是否按下,存儲檢測到的值,并且按位取反與前一個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_rst由1變為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)/*always塊 clk時鐘的上升沿
和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
中20‘hfffff=’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_sw由1變為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
歡迎光臨 (http://m.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
日韩黄色在线观看
|
国产精品福利一区
|
久久精品一区二区三区不卡牛牛
|
欧美黄色三级视频
|
www亚洲精品
|
四虎四虎
|
在线观看视频国产
|
亚洲精品黄色
|
欧美xxx视频
|
激情高潮到大叫狂喷水
|
欧美日韩成人一区二区三区
|
久久国内视频
|
超碰在线观看免费
|
久久av红桃一区二区小说
|
免费看黄色aaaaaa 片
|
丝袜美腿一区二区三区
|
成人aaa
|
欧美一级在线视频
|
伊人久久精品
|
天天操夜夜摸
|
欧美在线观看一区二区三区
|
黄色片在线看
|
999精品在线
|
中文字幕av一区二区三区谷原希美
|
亚洲小视频在线观看
|
免费视频国产
|
经典三级av
|
国产一级大片
|
精品欧美一区二区精品久久
|
黄色录像一级片
|
黄色片网站免费
|
欧美成人激情
|
免费一区二区
|
黄色一级视频网站
|
四虎色播
|
五月婷婷丁香
|
久久一区
|
黄色片视频|
性做久久久久久久免费看
|
国产在线黄色
|
黑人精品一区二区
|