0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于fpga的圖像處理

CHANBAEK ? 來(lái)源:小小研究生 ? 作者:xxyjs2020 ? 2023-06-23 16:53 ? 次閱讀

設(shè)計(jì)規(guī)劃

開(kāi)發(fā)板上使用的機(jī)械按鍵在閉合及斷開(kāi)的瞬間均伴隨有一連串的抖動(dòng),按鍵抖動(dòng)會(huì)引起一次按鍵被誤讀多次,需要進(jìn)行消抖處理:在按鍵閉合穩(wěn)定時(shí)讀取按鍵的狀態(tài),并且必須判別到按鍵釋放穩(wěn)定后再作處理 。

如果按鍵個(gè)數(shù)少,可以用硬件消抖,按鍵多時(shí)需要用軟件消抖:檢測(cè)出按鍵閉合后執(zhí)行一個(gè) 20ms的延時(shí)程序 (抖動(dòng)的時(shí)間為5ms~10ms)再一次檢測(cè)鍵的狀態(tài),如果仍保持閉合狀態(tài)電平,則確認(rèn)為真正有鍵按下。硬件消抖需要有額外的電路,軟件消抖沒(méi)有這種顧慮。

先用波形圖模擬出按鍵被按下和釋放時(shí)抖動(dòng)的毛刺狀態(tài):

圖片

計(jì)數(shù)器一節(jié)中已經(jīng)介紹過(guò)計(jì)數(shù)的實(shí)現(xiàn)方法,這里20ms的延遲需要一個(gè)20ms的計(jì)數(shù)器cnt_20ms。系統(tǒng)檢測(cè)到按鍵輸入為低電平就開(kāi)始計(jì)數(shù),如果20ms(50MHz的晶振需要計(jì)數(shù)個(gè)數(shù)為999_999)內(nèi)檢測(cè)出高電平說(shuō)明是一個(gè)抖動(dòng),計(jì)數(shù)器清零。計(jì)數(shù)器計(jì)滿999_999之后,key_flag拉高,一個(gè)時(shí)鐘周期后變低,因此key_flag是脈沖信號(hào)。計(jì)數(shù)器計(jì)滿后的狀態(tài)至關(guān)重要,如果清零,當(dāng)輸入是低電平的時(shí)間過(guò)長(zhǎng)就會(huì)造成一次按鍵卻有多個(gè)key_flag脈沖的情況。

圖片

如果計(jì)滿后不清零,到kin_in為高電平時(shí)再清零也會(huì)有新的問(wèn)題,就是key_flag維持高電平時(shí)間太長(zhǎng),不再是一個(gè)脈沖信號(hào)。

圖片

此時(shí)如果令計(jì)數(shù)器記到999_998,就可以達(dá)到預(yù)期的效果。

圖片

編寫(xiě)代碼

module key_filter
#(
parameter CNT_MAX = 20'd999_999 
)
(
input wire sys_clk ,
input wire sys_rst_n , 
input wire key_in , 
output reg key_flag //key_flag為1時(shí)表示消抖后檢測(cè)到按鍵被按下
//key_flag為0時(shí)表示沒(méi)有檢測(cè)到按鍵被按下
);


//reg define
reg [19:0] cnt_20ms ; //計(jì)數(shù)器


//cnt_20ms:如果時(shí)鐘的上升沿檢測(cè)到外部按鍵輸入的值為低電平時(shí),計(jì)數(shù)器開(kāi)始計(jì)數(shù)
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
cnt_20ms <= 20'b0;
else if(key_in == 1'b1)
cnt_20ms <= 20'b0;
else if(cnt_20ms == CNT_MAX && key_in == 1'b0)
cnt_20ms <= cnt_20ms;
else
cnt_20ms <= cnt_20ms + 1'b1;


always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
key_flag <= 1'b0;
else if(cnt_20ms == CNT_MAX - 1'b1)
key_flag <= 1'b1;
else
key_flag <= 1'b0;
endmodule

首先定義了參數(shù)CNT_MAX是計(jì)數(shù)器的最大值,然后定義了輸入輸出和計(jì)數(shù)器。2^19<999999<2^20,因此需要20位的計(jì)數(shù)器。然后,還是要分析兩個(gè)信號(hào)的變化,一個(gè)是計(jì)數(shù)器的狀態(tài),一個(gè)是標(biāo)志位的狀態(tài)。他們變化的條件都是時(shí)鐘上升沿和復(fù)位有效(下降沿)。

cnt_20ms的變化是,如果復(fù)位有效就清零;如果檢測(cè)到輸入為高電平就清零;如果計(jì)滿且輸入為低電平就保持;如果沒(méi)計(jì)滿就+1。

圖片

key_flag的變化是,復(fù)位有效就清零,計(jì)數(shù)到999999-1就拉高,其他時(shí)候都為0。

圖片

編寫(xiě)testbench

`timescale 1ns/1ns
module tb_key_filter();
 parameter CNT_1MS = 20'd19 ,
 CNT_11MS = 21'd69 ,
 CNT_41MS = 22'd149 ,
 CNT_51MS = 22'd199 ,
 CNT_60MS = 22'd249 ;


 wire key_flag ; 
 reg sys_clk ; 
 reg sys_rst_n ; 
 reg key_in ; 
 reg [21:0] tb_cnt ; 


 initial begin
 sys_clk = 1'b1;
 sys_rst_n <= 1'b0;
 key_in <= 1'b0;
 #20
 sys_rst_n <= 1'b1;
 end


 //sys_clk:模擬系統(tǒng)時(shí)鐘,每10ns電平翻轉(zhuǎn)一次,周期為20ns,頻率為50MHz
 always #10 sys_clk = ~sys_clk;


 //tb_cnt:按鍵過(guò)程計(jì)數(shù)器,通過(guò)該計(jì)數(shù)器的計(jì)數(shù)時(shí)間來(lái)模擬按鍵的抖動(dòng)過(guò)程
 always@(posedge sys_clk or negedge sys_rst_n)
 if(sys_rst_n == 1'b0)
 tb_cnt <= 22'b0;
 else if(tb_cnt == CNT_60MS)
 tb_cnt <= 22'b0;
 else
 tb_cnt <= tb_cnt + 1'b1;


 //key_in:產(chǎn)生輸入隨機(jī)數(shù),模擬按鍵的輸入情況
 always@(posedge sys_clk or negedge sys_rst_n)
 if(sys_rst_n == 1'b0)
 key_in <= 1'b1; //按鍵未按下時(shí)的狀態(tài)為為高電平
 else if((tb_cnt >= CNT_1MS && tb_cnt <= CNT_11MS)
||(tb_cnt >= CNT_41MS && tb_cnt <= CNT_51MS))
 key_in <= {$random} % 2;  //隨機(jī)數(shù)模擬抖動(dòng)
 else if(tb_cnt >= CNT_11MS && tb_cnt <= CNT_41MS)
 key_in <= 1'b0;
 else
 key_in <= 1'b1;


 //------------------------key_filter_inst------------------------
 key_filter
 #(
 .CNT_MAX (20'd24 )
 )
 key_filter_inst
 (
 .sys_clk (sys_clk ), //input sys_clk
 .sys_rst_n (sys_rst_n ), //input sys_rst_n
 .key_in (key_in ), //input key_in
 .key_flag (key_flag ) //output key_flag
 );


 endmodule

1、定義參數(shù),這里和上一節(jié)一樣,為了縮短仿真時(shí)間,將參數(shù)值設(shè)置得小一些。

2、定義幾個(gè)信號(hào):時(shí)鐘、復(fù)位、輸入、計(jì)數(shù)、輸出

3、初始化:時(shí)鐘信號(hào)為高,復(fù)位為低,輸入為低,延遲20ns后,復(fù)位為高

4、定義時(shí)鐘:每10ns翻轉(zhuǎn)一次,周期為20ns,頻率為50MHz

5、定義計(jì)數(shù)器:計(jì)數(shù)器計(jì)數(shù)到CNT_60MS,計(jì)數(shù)0-249。復(fù)位變?yōu)?,計(jì)滿變?yōu)?.否則+1。

6、定義輸入:輸入在前后10ms內(nèi)抖動(dòng),因此輸入數(shù)在CNT_1MS-11MS和41MS-51MS內(nèi)取0或1的隨機(jī)數(shù)來(lái)模擬抖動(dòng)。在11MS-41MS內(nèi)為低電平,持續(xù)時(shí)間要超過(guò)CNT-MAX(80>24)。0MS-1MS和41MS以上都為高電平。

7、實(shí)例化:這里定義了CNT_MAX,要小于11MS-41MS,否則會(huì)一直抖動(dòng)。

對(duì)比波形

整體波形圖,達(dá)到了預(yù)期效果:key_in低電平開(kāi)始計(jì)數(shù)到CNT_MAX-1時(shí)一旦檢測(cè)到輸入高電平就清零,但是沒(méi)有檢測(cè)到輸入信號(hào)為高電平,那么key_flag拉高成為一個(gè)脈沖信號(hào)。

圖片

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1630

    文章

    21796

    瀏覽量

    605438
  • 計(jì)數(shù)器
    +關(guān)注

    關(guān)注

    32

    文章

    2261

    瀏覽量

    94906
  • 時(shí)鐘
    +關(guān)注

    關(guān)注

    11

    文章

    1746

    瀏覽量

    131719
  • 開(kāi)發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    5121

    瀏覽量

    98036
  • 按鍵消抖
    +關(guān)注

    關(guān)注

    2

    文章

    27

    瀏覽量

    10484
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    FPGA圖像處理之CLAHE算法

    FPGA圖像處理--CLAHE算法(一)中介紹了為啥要用CLAHE算法來(lái)做圖像增強(qiáng)。
    的頭像 發(fā)表于 01-04 12:23 ?2680次閱讀
    <b class='flag-5'>FPGA</b><b class='flag-5'>圖像</b><b class='flag-5'>處理</b>之CLAHE算法

    #FPGA #圖像處理 圖像處理(概論)

    fpga圖像處理
    奔跑的小鑫
    發(fā)布于 :2023年07月27日 10:15:04

    FPGA圖像處理初學(xué)者的迷茫

    哪位大神現(xiàn)在在從事基于FPGA圖像處理的相關(guān)工作,我現(xiàn)在在學(xué)習(xí),導(dǎo)師給選的方向,自己前一段時(shí)間用FPGA實(shí)現(xiàn)了中值濾波,sobel邊緣檢測(cè),然后就是一些書(shū)本上面簡(jiǎn)單算法的實(shí)現(xiàn) ,感覺(jué)高
    發(fā)表于 06-29 20:38

    FPGA圖像處理論文大全

    本帖最后由 lorlin000 于 2015-3-15 22:53 編輯 FPGA圖像處理論文大全
    發(fā)表于 03-15 22:46

    FPGA圖像處理IP核

    有誰(shuí)知道現(xiàn)在國(guó)內(nèi)外有哪些公司賣FPGA圖像處理相關(guān)的IP核?
    發(fā)表于 04-28 21:34

    FPGA圖像處理技術(shù),你知道多少?

    最近一段時(shí)間一直在研究基于FPGA圖像處理,乘著這個(gè)機(jī)會(huì)和大家交流一下,自己也順便總結(jié)一下。主要是為了大家對(duì)用FPGA圖像
    發(fā)表于 04-21 14:25

    FPGA圖像處理必備!

    圖像細(xì)節(jié)。FPGA 圖像處理方法1、圖像增強(qiáng)兩大方法:空間域方法和時(shí)間域方法(以后再詳述)2、圖像
    發(fā)表于 12-26 15:57

    FPGA圖像處理基板的邏輯功能

    1.FPGA功能設(shè)計(jì)上圖所示的是FPGA圖像處理基板的邏輯功能框圖,圖中左側(cè)是背板接頭,FPGA與背板接頭相連的信號(hào)主要包括8路3.125G
    發(fā)表于 11-10 08:06

    FPGA圖像處理

    FPGA圖像處理
    發(fā)表于 12-14 22:29 ?19次下載

    基于FPGA圖像處理及自動(dòng)調(diào)控電路的設(shè)計(jì)

    設(shè)計(jì)了一種基于現(xiàn)場(chǎng)可編程門(mén)陣列(FPGA)EP3C25F25617 的圖像處理及自動(dòng)調(diào)控電路。該電路主要完成可見(jiàn)光圖像的直方圖均衡、中值濾波、十字叉疊加、快速自動(dòng)調(diào)焦等
    發(fā)表于 11-06 15:36 ?9次下載
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>圖像</b><b class='flag-5'>處理</b>及自動(dòng)調(diào)控電路的設(shè)計(jì)

    略談FPGA圖像處理

    FPGA圖像處理之路,從此開(kāi)始,接下來(lái),讓我們把時(shí)間交給“圖像處理”。一休哥在動(dòng)筆之前,一直在猶豫,反復(fù)思考著一個(gè)問(wèn)題,這個(gè)問(wèn)題一直困擾著我
    發(fā)表于 05-09 17:05 ?4198次閱讀

    FPGA圖像處理方法

    圖像細(xì)節(jié)。 FPGA圖像處理方法 1、圖像增強(qiáng) 兩大方法:空間域方法和時(shí)間域方法(以后再詳述) 2、圖像
    的頭像 發(fā)表于 12-25 14:15 ?3476次閱讀
    <b class='flag-5'>FPGA</b><b class='flag-5'>圖像</b><b class='flag-5'>處理</b>方法

    FPGA圖像處理應(yīng)用詳細(xì)介紹

    FPGA圖像處理應(yīng)用詳細(xì)介紹
    發(fā)表于 02-28 10:29 ?50次下載

    FPGA圖像處理算法有哪些

    早之前的朋友知道我發(fā)過(guò)一個(gè)用chatgpt分析出來(lái)的 FPGA圖像處理的知識(shí)樹(shù),里面包含了從色域,鏡頭,接口和算法。然后我就發(fā)現(xiàn)這個(gè)算法部分chatgpt 給我整理的比較亂,查詢了一番,確實(shí)發(fā)現(xiàn)
    的頭像 發(fā)表于 09-12 09:59 ?1114次閱讀
    <b class='flag-5'>FPGA</b><b class='flag-5'>圖像</b><b class='flag-5'>處理</b>算法有哪些

    FPGA圖像處理方法

    圖像細(xì)節(jié)。 FPGA 圖像處理方法 1、圖像增強(qiáng) 兩大方法:空間域方法和時(shí)間域方法(以后再詳述) 2、
    的頭像 發(fā)表于 12-02 13:15 ?1169次閱讀