在進行圖像處理算法中,往往需要生成圖像像素矩陣,這對於C語言來說可以直接用數組表示,但是對於verilog來說便不是那么容易了,硬件描述語言不比軟件,它的核心不再算法,而是在於設計思想,加速硬件。在進行圖像的濾波算法時,需要生成3x3矩陣,而altera的IP shift_ram 簡直就是為矩陣運算而生的。下面便進行shift_ram的學習。
手冊還是盡量看英文原版的比較好,剛開始是會比較痛苦,看習慣了就會發現,就是那么一些熟悉的單詞,句子也很好理解,比較手冊又不是文章。

這段話的意思是,這個IP支持一個時鍾周期移位一個或多個bit的數據,位寬是可以設置的。
下面這個圖是shift_ram的移位示意圖,開始我一直以為是這個IP每存儲三個數據就會進行移位到下一行,如果這樣想當一行圖像數據傳過來的時候,顯然如果是均值濾波的話,這是將第一行的數據進行了取中值操作,這樣顯然是不符合濾波的原理的。那么從這個圖上所表達的貌似就是這個意思,為什么會出現這種矛盾。這也是一直困惑我的地方,還是手冊沒有好好看,手冊上說的很清楚,圖下一幅圖所示。


看Note所表明的,這里設置的行數是4行,每行的distance是3,所以便出現了這樣的移位寄存,所以手冊還是要仔細閱讀的,我剛開始就是因為閑手冊太麻煩便草草了事,后來實踐證明,還是等弄清楚原理在下手操作,磨刀不誤砍柴工。
當然手冊中也給了仿真例程

數據輸入輸出寬度為8bit,設置4行,選擇每行寬度為3,添加使能和復位






如上圖順序可以容易看出,shift_ram的工作方式是移位存儲,后一個數據將前一個數據往前推,當填滿一行的時候,跳到下一行再繼續移位存儲,相應的第一行的數據填滿之后,會填上矩陣的第一行的數據,濾波是同時的,如果進行均值濾波的話顯然這樣目標像素會是0,以此類推,第二行移位存儲完成,剛開始第一行的每一個像素點是目標像素,但是第三行還沒有數據,所以第一行的目標像素濾波后顯然是不准確的,等到把第三行數據填滿后,進行原本第二行的濾波,這時目標像素周圍均有數據,所以均值濾波會使圖像的邊緣不清楚。
這是將每一行的寬度設置成3,如果將寬度設置為640,800等分辨率的寬度,那么生成3x3矩陣豈不是十分方便。同樣的還可以生成5x5、7x7等矩陣用於圖像處理的算法研究。
Xilinx Vivado也有自己的Shift_RAM IP Core,不過這里只能緩存出來一行數據,我們這里需要兩個Shift_RAM IP Core和正在輸入的一行數據共同組成3行數據。這里調用兩個Shift_RAM IP Core將這兩個IP級聯起來就行了。
對於硬件進行圖像處理的算法研究只能進行一些簡單的算法處理,對於更加復雜的算法處理,還是要在軟件上實現。最近了解到卷積神經網絡(CNN),在人工智能領域異常火爆,基於大數據的機器學習,深度學習,FPGA最擅長的就是高速處理數據,在后大數據時代,我相信一定會有FPGA的一個重要地位。

轉載請注明出處:NingHeChuan(寧河川)
個人微信訂閱號:NingHeChuan
如果你想及時收到個人撰寫的博文推送,可以掃描左邊二維碼(或者長按識別二維碼)關注個人微信訂閱號
知乎ID:NingHeChuan
微博ID:NingHeChuan
