先前我用verilog編寫了一個中值濾波模塊,這種算法處理因為數據量巨大而且還重復存取,所以比較適合放在FPGA前端來處理,DSP就做小數據有技巧的算法吧。當時寫這個模塊的時候可真是折騰啊,呵呵,其實不是中值算法難,也不是用verilog表述出來難,難的就是在工程中搭建這個數據鏈,我們得根據相機的數據流來小心翼翼的存儲和放出這些數據,不能阻塞而且要有效率。
我很驚奇dsp builder,真的是個非常好的工具,它讓我們從全局來構建我們的模塊,而不是掉進了信號的泥潭,這就是我先前用verilog寫中值模塊的苦惱,你得關注每一個相關的信號,相機的、DSP的,這些繁雜的信號都有可能導致你無法實現效果。而且我們還非常不好測試,這點也絕對的成為了問題,我們需要的測試就是我給一幅圖片經過我的模塊,出來效果圖片!這點很難,FPGA無法提供這么大的RAM給你存,而且取出來也是個麻煩,我們需要可視化!
呵呵,DSP builder果真是一把針對DSP的利器!(這里的DSP是數字信號處理,不是處理器,否則TI會不高興了,hoho~)。當然了,我們寫控制邏輯的時候還是自己手寫吧,算法就用dsp builder,如果你用一個純硬件的頭腦在simulink中搭建電路模塊,這也是很好的,你真的可以一句代碼也不寫,呵呵,這真令人驚奇,我是達不到這么胸中有器件,還是行為級的描述描述吧~~
FPGA這個東西,太綜合了,正是因為它像一張白紙,你可以隨意發揮,隨意發揮的結果是你需要太多知識才能發揮,汗~ 你看,你數數這繁多的工具,timequest,signaltap,modelsim,matlab…從工程上說它需要三個方面支持,硬件、算法、軟件。
說偏了,我只是想說這個工具讓我們脫離了泥潭。DSP builder這個組件分兩部分,一個是基礎庫,一個是高級庫。現在Altera把大部分精力放在了高級庫上,而且有有些IP是需要lincese才能用的。
好了,讓我們先來了解一下中值算法,google一下吧。我采用的是快速中值濾波,3x3矩陣。這個算法主要功能是去噪,附帶會產生模糊的效果。算法如下:
圖一
先縱列以箭頭方向從小到大排序,縱列排好后,再橫列以箭頭方向從小到大排,最后取45°角方向斜線的三個數取中值。
了解了算法之后,編寫verilog模塊吧。這里需要注意的就是,務必達成流水線處理,我們可以一個時鍾節拍就處理完一個三值比較,或者多個時鍾完成。一定要注意到相機的數據是流水般過來的,所以我們可以先等幾個或者十幾個時鍾,但是后續必須是流水般出結果。
寫好之后,打開matlab&simulink,開始建模,用HDL inport導進去吧。其實也可以自己用dsp builder的組件來搭建這個算法模塊,因為我這有個以前寫的代碼了,所以就直接用:下面7個大的方形模塊是verilog導入。
圖二
因為我的相機是640*480輸出的灰階圖像,所以對應着3x3矩陣就是三行數據了。這里IncCount組件作用就是模擬相機數據了,線性遞增數據0-63,很簡單,可以初步驗證一下我寫的Compare_3Num模塊的作用。示波器觀察數據看看:
圖三
正好是64個數據循環,所以經過中值應該也是對應的,初步效果可以確認了。其實這樣觀察和Modelsim,SignalTapII觀察就是一個樣,只見樹木不見森林,看着單個單個的值,有點無助~~
體現matlab強大的時候到了,simulink有個兩組件From workspace,To workspace。它能把matlab工作間的內容導進dsp builder模塊之后在觀察框中顯示出來。這為我們提供很好的測試方法,特別是圖像處理。不過我們需要先寫.m腳本,你的去了解幾句matlab語言才行~~
建模如下,這里的subsystem就是用圖二的模塊創建的子系統,From Workspace的simin就是數據入口,從這里把整幅圖片的數據導進,To workspace就是數據出口,復位和使能就直接置1了。
圖四
我們來嘗試導入一幅彩色圖片,經過我的中值濾波模塊之后的效果(第二幅是灰階圖,第三幅是中值濾波后的效果圖):
圖五
經過上面兩種測試方法,特別是第二種方法,我們直觀的得到了整幅圖片的效果,現在進入實戰階段了,導出VHDL代碼,加載到工程里,我們希望得到的就是實時的中值濾波效果!
利用signalcompile組件指定器件---編譯----export….
圖六
軍工級的代碼出現了,呵呵,不包括我寫的那段~~~不要看它產生的文件多,占用的資源卻是很優化的,而且效率也非常高。
這些代碼可以直接用的,我的工程是verilog代碼,引用VHDL模塊直接引用即可,這里的top文件是median6_GN。有了top文件我相信大家都會調用的吧~
我的板級可通過網絡獲取相機的黑白數據,實時顯示。PC客戶端保存的圖片是png格式的,獲取個原圖:
圖七
我們寫個腳本,運用matla本身的中值函數medfilt2來做一下處理,得到下面的效果:此圖是直接在顯示的figure里save as..jpg格式(這個圖片保存了就這么小,我沒縮放過,順便申明這些圖片都被轉成jpg格式,博客園不支持bmp上傳)
圖八
好了,我們把matlab導出的中值VHDL代碼加進工程,編譯出來sof,燒寫FPGA,看PC端的實時顯示結果,截個圖:
圖九
呵呵,感覺還行,相機熱噪點較多,水漬水漬的。和matlab本身的函數處理結果相差不大。這里的圖片有一些小黑點,可能是相機幀行信號沒控制好,導致無效數據進fifo了,看見了吧,實踐中的工程就是還有很多的細節需要完善的!上面的幾幅圖片都有行偏移,這是PC端的采集軟件有點bug,我這里主要是演示圖像處理,沒有理它。
通過這個演示,我們知道了DSP builder能導出可用的硬件代碼。matlab給我們提供系統級建模的平台,無需寫一句代碼也能完成軍工級的任務。
后記:
我現在用的平台是quartusII12.0 & Matlab2010b,
其實quartusII9.1 & Matlab2009b配合的是很好的,后面我用的時候創建文件用dsp builder的signalTapII組件,發現報錯: Matlab Error
Undefined function or method 'eval' for input arguments of type 'double'.
而且沒有彈出signalTapII的觀察框,這真是件糾結的事情,於是我又懷疑是版本問題了,因為畢竟2009b不是“正室”啊,決定卸載。
找缺氧同學要了12.0版本的quartusII及各組件,花了兩個半鍾把quartusII9.1 & modelsim & dspbuilder &matlab卸載,換成12.0的各版本配合…這真是下了大決心,換這種軟件忐忑啊。
其實,那個報錯12.0也會有,而且問題不是軟件版本問題,是我有個組件的參數沒配置好,直接導致signaltap無法彈出觀察框!
就這樣吧,慢慢就會習慣12.0了~
(歡迎轉載-----請注明出處 憤怒de狂奔)