昨天花了整天才完全搞懂怎麼在 FPGA (Xilinx Zynq 系列) 上,從 PS 端 (ARM) 發動 DMA ( Direct Memory Access ) 把待處理的資料從記憶體 (Double Data Rate, DDR) 送進 PL 端 ( FPGA ) 我們自己設計的數位邏輯電路 IP ( Intellectual Property) 進行影像處理,然後同樣用 DMA 把處理後的資料送回去記憶體。
以上動作說來簡單,但中間要透過好幾次匯流排轉接,在 PS 端就要熟悉 ARM 的 AMBA ( Advanced Micro-controller Bus Architecture ) 的使用方式與場合,例如在搬移數位影像這種資料型態時,我們就會採用 AXI4-Stream 的方式處理。
幸好 Xilinx 有提供 DMA 的硬體 IP,否則光這個部份就不知道要處理多久。
當我們把整個框架及驗證流程建立起來後,才能夠比較專心地去設計數位影像處理的硬體 IP,同時在某些比較複雜的機器視覺演算法中,則要先分析哪些部份適合在硬體處理,哪些部份比較適合在軟體處理,然後再分別進行設計。
這陣子接觸 FPGA 下來,真心覺得這個領域的進展好快,跟早期只是把 FPGA 當成高速傳輸介面或積體電路 IC 下線 ( Tape-out ) 前的驗證工具有很大的差別。
現在的 FPGA 是真的可以獨立視為一個新型態的處理系統看待,因為它也進化成系統單晶片 ( System on Chip, SoC ) ,這件事或許早就已經發生,但我近幾年才知道,有點落伍了。
每次當我學習到新的架構或新的開發流程時,都會無比興奮,就像二十年前當學生時,為了要建立動態連結檔 (Dynamic-Link Library, DLL) ,也是找遍相關資訊,最後才學會建立自己的 DLL 給不同的程式語言使用。
接著,在碰到演算法運算量過大,過度消耗時間的情況,又跑去學 SIMD ( Single Instruction Multiple Data ) 的加速指令集,再把能平行處理跟非平行處理的演算法整合在一起,並封裝成可以給人呼叫的應用程式介面 (Application Programming Interface, API)。
以前我找遍資料,很努力才學會的技術或開發技巧,現在回頭看其實都不難,目前也都在一個學期內就都教授給學生了;有了以上的學習經驗,讓我對於自己熟悉並掌握「軟硬體協同設計」更有信心,畢竟在演算法開發的層面上,它跟我以前用 SIMD 的開發流程非常相似,差別在於硬體加速的部份可以自己設計客製化。
FPGA 的設計概念跟軟體設計不太一樣,一個是資料流通過自定義的邏輯電路得到結果,另一個則是用標準的處理器指令集,通過不斷地搬移資料讓指令集處理來組合出想要的結果;這代表一個是直接把演算法生成邏輯電路,另一個是透過資料搬移與標準指令的組合來實現演算法。
期待以後能把自己辛苦學習的這些內容,用更簡單的方式讓學生吸收,說不定未來我回頭看這些東西,也會有「理所當然就這樣」的感覺,讓自己掌握更多的工具,有更多的選擇,才能針對不同的應用去設計適合的架構,而不是從頭到尾都只會一種開發工具硬幹。
當然,這也不是技術上的一廂情願,從商業的角度來看,「嵌入式視覺系統」在未來十年的成長率,會遠超過當前既有的系統架構,而身為嵌入式視覺的關鍵技術 → FPGA 不學實在說不過去。
沒有留言:
張貼留言