按鍵邊沿檢測
邊沿檢測經(jīng)常用于按鍵輸入檢測電路中,按鍵按下時(shí)輸入信號 key 變?yōu)榈碗娖剑存I抬起變?yōu)楦唠娖健.?dāng)輸入的信號為理想的高低電平時(shí)(不考慮毛刺和抖動(dòng)),邊沿檢測就發(fā)揮了很重要的作用。
由于輸入的信號為一個(gè)連續(xù)值,我們需要通過時(shí)鐘進(jìn)行采樣。根據(jù)采樣定理,采樣時(shí)鐘的頻率需要至少為被采信號頻率的 2 倍。
設(shè)計(jì)的邊沿檢測電路的功能為:檢測到 1 個(gè)下降沿或上升沿時(shí),對應(yīng)的下降沿輸出信號 edge_pos、edge_neg 分別輸出 1 個(gè)脈沖(即一個(gè)時(shí)鐘周期的高電平)。下面以下降沿進(jìn)行分析。
分析:在邊沿檢測的過程中,通過 1 個(gè)寄存器來寄存上一個(gè)時(shí)鐘沿的輸入值 D ,當(dāng)寄存器輸出 Q 與輸入 D 的值分別為1、0時(shí),證明檢測到下降沿。
如上圖所示,在第 2 個(gè)時(shí)鐘周期的低電平期間,D 由高變低,在第 3 個(gè)時(shí)鐘周期的上升沿,Q由高變低。在 D 由高變低的時(shí)刻,Q 為 1 ,D 為 0 ,證明檢測到下降沿。
按鍵邊沿捕獲模塊:
測試驗(yàn)證模塊:
按一次按鍵,對應(yīng)的LED燈就會(huì)亮。LED亮代表檢測到了下降沿。
Signaltap 波形圖:
按鍵硬件消抖電路
友晶科技很多板子的按鍵(都是按下為低電平)其實(shí)是已經(jīng)有硬件消抖電路的, 這樣的板子的按鍵的值 直接input 進(jìn)來后 直接用就可以。
比如DE2-115 DE1-SOC DE10-Standard 等等。這里都用74HC245芯片來消抖:
按鍵Verilog消抖電路
如果沒有硬件上的消抖,我們可以手寫Verilog代碼替代消抖電路。
模板一
模板一的Verilog消抖的原理主要為按鍵按下或松開后延時(shí) 1ms—20ms 采樣(這個(gè)時(shí)間是根據(jù)按鍵的機(jī)械特性自行決定)。
假設(shè)時(shí)鐘是50M,按鍵消抖的思路是檢測到按下時(shí)延時(shí) 50000個(gè)時(shí)鐘周期,再檢測,如果狀態(tài)仍為按下,則確認(rèn)是按下的;如果狀態(tài)為彈起的,則確認(rèn)是干擾,無按鍵按下。
按鍵消抖的Verilog實(shí)現(xiàn)的模板一如下:
module key_debounce //按鍵消抖模塊 ( input clk, //系統(tǒng)時(shí)鐘 input rst_n, //系統(tǒng)復(fù)位 input key[0], //按鍵輸入 output reg key_value, //有效的按鍵值 ); reg [31:0]cnt;//計(jì)數(shù)器 reg value;//中間寄存器 always@(posedge clk or negedge rst_n) begin if(!rst_n) begin cnt <= 0; ? ? ? ? ? ? ? ?//初始狀態(tài)下寄存器清零 ? ? ? ? ? ?key_value <= 0; ? ? ? ?//有效按鍵值清零 ? ? ? ? ? ? ? ? ? ?value <= 0; ? ? ? ? ? ? ? ?//中間寄存器清零 ? ? ? ? ? ? ? ? ? ?end ? ? ? ? ? ?else begin ? ? ? ? ? ?if(cnt == 50000) begin ? ? ? ? ? ? ? ?cnt <= 0;//每隔0.001秒檢測一次 將key的值寄存到value寄存器當(dāng)中(如果系統(tǒng)時(shí)鐘是50MHz) ? ? ? ? ? ? ? ?value <= key[0]; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?if(value == 1 && key[0] == 0) //按鍵按下為0,平時(shí)為1 ? ? ? ? ? ? ? ? ? ?key_value <= 1; ? ? ? ? ? ?end ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?else begin ? ? ? ? ? ? ? ?cnt <= cnt + 1; ? ? ? ? ? ? ? ?key_value <= 0; ? ? ? ? ? ?end ? ? ? ?end ? ? ? ?end ? ? ? ? ? ? ? ? endmodule
模板二
模板二的檢測原理是只有按鍵按下的狀態(tài)持續(xù)50000個(gè)周期(這個(gè)時(shí)間可以自己再定義)以上,才認(rèn)定是按鍵被按下了一次,否則算作是干擾被忽略掉。
模板二實(shí)現(xiàn)的是多個(gè)按鍵的去抖。
按鍵消抖的Verilog實(shí)現(xiàn)的模板二如下:
module debounce ( clk, reset_n, data_in, data_out ); parameter WIDTH = 32; // set to be the width of the bus being debounced parameter POLARITY = "HIGH"; // set to be "HIGH" for active high debounce or "LOW" for active low debounce parameter TIMEOUT = 50000; // number of input clock cycles the input signal needs to be in the active state parameter TIMEOUT_WIDTH = 16; // set to be ceil(log2(TIMEOUT)) input wire clk; input wire reset_n; input wire [WIDTH-1:0] data_in; output wire [WIDTH-1:0] data_out; reg [TIMEOUT_WIDTH-1:0] counter [0:WIDTH-1]; wire counter_reset [0:WIDTH-1]; wire counter_enable [0:WIDTH-1]; // need one counter per input to debounce genvar i; generate for (i = 0; i < WIDTH; i = i+1) ?begin: ?debounce_counter_loop ? ?always @ (posedge clk or negedge reset_n) ? ?begin ? ? ?if (reset_n == 0) ? ? ?begin ? ? ? ?counter[i] <= 0; ? ? ?end ? ? ?else ? ? ?begin ? ? ? ?if (counter_reset[i] == 1) ?// resetting the counter needs to win ? ? ? ?begin ? ? ? ? ?counter[i] <= 0; ? ? ? ?end ? ? ? ?else if (counter_enable[i] == 1) ? ? ? ?begin ? ? ? ? ?counter[i] <= counter[i] + 1'b1; ? ? ? ?end ? ? ?end ? ?end ? ?if (POLARITY == "HIGH") ? ?begin ? ? ?assign counter_reset[i] = (data_in[i] == 0); ? ? ?assign counter_enable[i] = (data_in[i] == 1) & (counter[i] < TIMEOUT); ? ? ?assign data_out[i] = (counter[i] == TIMEOUT) ? 1'b1 : 1'b0; ? ?end ? ?else ? ?begin ? ? ?assign counter_reset[i] = (data_in[i] == 1); ? ? ?assign counter_enable[i] = (data_in[i] == 0) & (counter[i] < TIMEOUT); ? ? ?assign data_out[i] = (counter[i] == TIMEOUT) ? 1'b0 : 1'b1; ? ? ? ?end ? ? ?end ? ?endgenerate ? endmodule
-
寄存器
+關(guān)注
關(guān)注
31文章
5394瀏覽量
122025 -
Verilog
+關(guān)注
關(guān)注
28文章
1357瀏覽量
110939 -
邊沿檢測
+關(guān)注
關(guān)注
0文章
6瀏覽量
7862 -
消抖電路
+關(guān)注
關(guān)注
0文章
7瀏覽量
8635 -
按鍵消抖
+關(guān)注
關(guān)注
2文章
28瀏覽量
10535
原文標(biāo)題:09-SDRAM控制器的設(shè)計(jì)——按鍵的處理(邊沿捕獲電路、硬件消抖、Verilog消抖電路)
文章出處:【微信號:友晶FPGA,微信公眾號:友晶FPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
SDRAM控制器的設(shè)計(jì)——Sdram_Control.v代碼解析(異步FIFO讀寫模塊、讀寫SDRAM過程)

使用Verilog實(shí)現(xiàn)基于FPGA的SDRAM控制器
PDMA在測試SDRAM控制器中的應(yīng)用

SDRAM控制器簡易化設(shè)計(jì)

基于EPM1240的SDRAM控制器的設(shè)計(jì)

DDR SDRAM控制器參考設(shè)計(jì)VHDL代碼
SDRAM控制器的設(shè)計(jì)

FPGA讀寫SDRAM的實(shí)例和SDRAM的相關(guān)文章及一些SDRAM控制器設(shè)計(jì)論文

如何使用FPGA設(shè)計(jì)SDRAM控制器

DDR SDRAM控制器的設(shè)計(jì)與實(shí)現(xiàn)
基于SDRAM控制器軟核的Verilog設(shè)計(jì)

PIC32系列參考手冊之DDR SDRAM控制器

評論