Verilog HDL實(shí)現(xiàn)智能藥盒—主文件中使用的按鍵消抖模塊
給各位推薦可以去CSDN或者GITHUB上查找自己想要的項(xiàng)目代碼,里面比較全,也有講解和注釋
// ********************************************************************
// >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<
// ********************************************************************
// File name? ? : debounce.v
// Module name? : debounce
// Author? ? ? ?: STEP
// Description? :?
// Web? ? ? ? ? : www.stepfpga.com
//?
// --------------------------------------------------------------------
// Code Revision History :?
// --------------------------------------------------------------------
// Version: |Mod. Date:? ?|Changes Made:
// V1.0? ? ?|2017/03/02? ?|Initial ver
// --------------------------------------------------------------------
// Module Function:按鍵消抖
?
module debounce_button (clk,rst,key,key_pulse);
?
? ? ? ? parameter? ? ? ?N? =? 1;? ? ? ? ? ? ? ? ? ? ? //要消除的按鍵的數(shù)量
?
input? ? ? ? ? ? ?clk;
? ? ? ? input? ? ? ? ? ? ?rst;
? ? ? ? input [N-1:0]? ?key;? ? ? ? ? ? ? ? ? ? ? ? //輸入的按鍵
output? [N-1:0]? ?key_pulse;? ? ? ? ? ? ? ? ? //按鍵動(dòng)作產(chǎn)生的脈沖
?
? ? ? ? reg? ? ?[N-1:0]? ?key_rst_pre;? ? ? ? ? ? ? ? //定義一個(gè)寄存器型變量存儲(chǔ)上一個(gè)觸發(fā)時(shí)的按鍵值
? ? ? ? reg? ? ?[N-1:0]? ?key_rst;? ? ? ? ? ? ? ? ? ? //定義一個(gè)寄存器變量?jī)?chǔ)存儲(chǔ)當(dāng)前時(shí)刻觸發(fā)的按鍵值
?
? ? ? ? wire? ? [N-1:0]? ?key_edge;? ? ? ? ? ? ? ? ? ?//檢測(cè)到按鍵由高到低變化是產(chǎn)生一個(gè)高脈沖
?
? ? ? ? //利用非阻塞賦值特點(diǎn),將兩個(gè)時(shí)鐘觸發(fā)時(shí)按鍵狀態(tài)存儲(chǔ)在兩個(gè)寄存器變量中
? ? ? ? always @(posedge clk? or? negedge rst)
? ? ? ? ? begin
? ? ? ? ? ? ?if (!rst) begin
? ? ? ? ? ? ? ? ?key_rst <= {N{1'b1}};? ? ? ? ? ? ? ? //初始化時(shí)給key_rst賦值全為1,{}中表示N個(gè)1
? ? ? ? ? ? ? ? ?key_rst_pre <= {N{1'b1}};
? ? ? ? ? ? ?end
? ? ? ? ? ? ?else begin
? ? ? ? ? ? ? ? ?key_rst <= key;? ? ? ? ? ? ? ? ? ? ?//第一個(gè)時(shí)鐘上升沿觸發(fā)之后key的值賦給key_rst,同時(shí)key_rst的值賦給key_rst_pre
? ? ? ? ? ? ? ? ?key_rst_pre <= key_rst;? ? ? ? ? ? ?//非阻塞賦值。相當(dāng)于經(jīng)過(guò)兩個(gè)時(shí)鐘觸發(fā),key_rst存儲(chǔ)的是當(dāng)前時(shí)刻key的值,key_rst_pre存儲(chǔ)的是前一個(gè)時(shí)鐘的key的值
? ? ? ? ? ? ?end? ??
? ? ? ? ? ?end
?
? ? ? ? assign? key_edge = key_rst_pre & (~key_rst);//脈沖邊沿檢測(cè)。當(dāng)key檢測(cè)到下降沿時(shí),key_edge產(chǎn)生一個(gè)時(shí)鐘周期的高電平
?
? ? ? ? reg [17:0] ? cnt;? ? ? ? ? ? ? ? ? ? ? ?//產(chǎn)生延時(shí)所用的計(jì)數(shù)器,系統(tǒng)時(shí)鐘12MHz,要延時(shí)20ms左右時(shí)間,至少需要18位計(jì)數(shù)器? ? ?
?
? ? ? ? //產(chǎn)生20ms延時(shí),當(dāng)檢測(cè)到key_edge有效是計(jì)數(shù)器清零開(kāi)始計(jì)數(shù)
? ? ? ? always @(posedge clk or negedge rst)
? ? ? ? ? ?begin
? ? ? ? ? ? ?if(!rst)
? ? ? ? ? ? ? ? cnt <= 18'h0;
? ? ? ? ? ? ?else if(key_edge)
? ? ? ? ? ? ? ? cnt <= 18'h0;
? ? ? ? ? ? ?else
? ? ? ? ? ? ? ? cnt <= cnt + 1'h1;
? ? ? ? ? ? ?end??
?
? ? ? ? reg? ? ?[N-1:0]? ?key_sec_pre;? ? ? ? ? ? ? ? //延時(shí)后檢測(cè)電平寄存器變量
? ? ? ? reg? ? ?[N-1:0]? ?key_sec;? ? ? ? ? ? ? ? ? ??
?
?
? ? ? ? //延時(shí)后檢測(cè)key,如果按鍵狀態(tài)變低產(chǎn)生一個(gè)時(shí)鐘的高脈沖。如果按鍵狀態(tài)是高的話說(shuō)明按鍵無(wú)效
? ? ? ? always @(posedge clk? or? negedge rst)
? ? ? ? ? begin
? ? ? ? ? ? ?if (!rst)?
? ? ? ? ? ? ? ? ?key_sec <= {N{1'b1}};? ? ? ? ? ? ? ??
? ? ? ? ? ? ?else if (cnt==18'h3ffff)
? ? ? ? ? ? ? ? ?key_sec <= key;??
? ? ? ? ? end
? ? ? ?always @(posedge clk? or? negedge rst)
? ? ? ? ? begin
? ? ? ? ? ? ?if (!rst)
? ? ? ? ? ? ? ? ?key_sec_pre <= {N{1'b1}};
? ? ? ? ? ? ?else? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ?key_sec_pre <= key_sec;? ? ? ? ? ? ?
? ? ? ? ?end? ? ??
? ? ? ?assign? key_pulse = key_sec_pre & (~key_sec);? ? ?
?
endmodule
————————————————
本文代碼編輯部分因UP比較初級(jí),不太會(huì)敲,我是初學(xué)者,所以有的借鑒了這位博主的,敲得一模一樣,所以我不要版權(quán)!
原文鏈接:https://blog.csdn.net/m0_54218263/article/details/121726857
版權(quán)聲明:本文為CSDN博主「hhh江月」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。注釋:本文部分轉(zhuǎn)載自博主,轉(zhuǎn)載會(huì)附作者版權(quán)聲明!感謝作者讓我這個(gè)JAVA卡拉米體會(huì)到編程的神奇!