在進行圖像處理算法中,每每須要生成圖像像素矩陣,這對於C語言來講能夠直接用數組表示,可是對於verilog來講便不是那麼容易了,硬件描述語言不比軟件,它的核心再也不算法,而是在於設計思想,加速硬件。在進行圖像的濾波算法時,須要生成3x3矩陣,而altera的IP shift_ram 簡直就是爲矩陣運算而生的。下面便進行shift_ram的學習。html
手冊仍是儘可能看英文原版的比較好,剛開始是會比較痛苦,看習慣了就會發現,就是那麼一些熟悉的單詞,句子也很好理解,比較手冊又不是文章。算法
這段話的意思是,這個IP支持一個時鐘週期移位一個或多個bit的數據,位寬是能夠設置的。數組
下面這個圖是shift_ram的移位示意圖,開始我一直覺得是這個IP每存儲三個數據就會進行移位到下一行,若是這樣想當一行圖像數據傳過來的時候,顯然若是是均值濾波的話,這是將第一行的數據進行了取中值操做,這樣顯然是不符合濾波的原理的。那麼從這個圖上所表達的貌似就是這個意思,爲何會出現這種矛盾。這也是一直困惑個人地方,仍是手冊沒有好好看,手冊上說的很清楚,圖下一幅圖所示。緩存
看Note所代表的,這裏設置的行數是4行,每行的distance是3,因此便出現了這樣的移位寄存,因此手冊仍是要仔細閱讀的,我剛開始就是由於閒手冊太麻煩便草草了事,後來實踐證實,仍是等弄清楚原理在下手操做,磨刀不誤砍柴工。微信
固然手冊中也給了仿真例程網絡
數據輸入輸出寬度爲8bit,設置4行,選擇每行寬度爲3,添加使能和復位機器學習
如上圖順序能夠容易看出,shift_ram的工做方式是移位存儲,後一個數據將前一個數據往前推,當填滿一行的時候,跳到下一行再繼續移位存儲,相應的第一行的數據填滿以後,會填上矩陣的第一行的數據,濾波是同時的,若是進行均值濾波的話顯然這樣目標像素會是0,以此類推,第二行移位存儲完成,剛開始第一行的每個像素點是目標像素,可是第三行尚未數據,因此第一行的目標像素濾波後顯然是不許確的,等到把第三行數據填滿後,進行本來第二行的濾波,這時目標像素周圍均有數據,因此均值濾波會使圖像的邊緣不清楚。學習
這是將每一行的寬度設置成3,若是將寬度設置爲640,800等分辨率的寬度,那麼生成3x3矩陣豈不是十分方便。一樣的還能夠生成5x五、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