作者:Adam Taylor,貿(mào)澤電子專稿
現(xiàn)場可編程門陣列(FPGA)是實現(xiàn)圖像處理系統(tǒng)的絕佳選擇。它具有高度并行的邏輯架構,可實現(xiàn)高分辨率、高幀率的圖像處理算法,因而非常適合用于從自動駕駛到機器人等諸多應用。通常,圖像處理解決方案是在異構片上系統(tǒng)(SoC)中實現(xiàn)的,這樣的系統(tǒng)能夠結合可編程邏輯與Arm?硬處理器內(nèi)核。然而,在某些應用中,這些處理器并不能得到充分利用,上電后也只能進行進行初步的IP核配置。在這種情況下,使用傳統(tǒng)FPGA搭配IP核配置狀態(tài)機或使用軟處理器內(nèi)核會是更好的選擇。
本項目中,我們將使用AMD AC701評估板,在AMD Artix? 7 FPGA上創(chuàng)建圖像處理管道。該電路板將使用FMC互連來連接MIPI攝像頭,并通過HDMI顯示輸出視頻。
本項目的材料清單包括以下內(nèi)容:
- Vivado? 2022.1
- Vitis? 2022.1(分步安裝教程:《How to Install Vitis》)
- Matlab和Simulink – R2021b
基本硬件設計
首先,我們要建立一個能夠實現(xiàn)標準圖像透傳的系統(tǒng),其間需要在FPGA中正確配置攝像頭和IP模塊,以便接收圖像并通過HDMI傳輸?shù)教幚礞?。這些設備的用途非常廣泛,因而可以配置為所需的輸出格式。Pcam 5C攝像頭模塊和HDMI芯片均通過相同的I2C鏈路進行配置。
為了配置攝像頭、HDMI芯片和內(nèi)部IP核,我們需要實現(xiàn)AMD MicroBlaze?軟處理器內(nèi)核。
以下是透傳功能所需的IP塊:
- MicroBlaze,配置為同時提供指令AXI接口和數(shù)據(jù)AXI接口
- MicroBlaze調(diào)試模塊
- AMD AXI中斷控制器,連接至MicroBlaze中斷端口
- AXI IIC,與外部I2C總線連接,用于攝像頭和HDMI配置,并與AXI中斷控制器連接,以實現(xiàn)中斷驅動方法
- AMD MIPI CSI2 RX子系統(tǒng),配置為接收來自攝像頭的MIPI數(shù)據(jù)流
- AMD LogiCORE? IP傳感器去馬賽克內(nèi)核,可將攝像頭捕獲的原始圖像轉換為RGB像素表示形式
- 視頻幀緩沖寫入,將圖像幀存儲到DDR3內(nèi)存中
- 視頻幀緩沖讀取,從DDR3內(nèi)存中讀出圖像幀
- 視頻時序控制器,生成所需輸出時序的時序波形(本例中為1080p、60FPs)。
- 視頻處理子系統(tǒng),執(zhí)行從RGB到YUV色彩空間的轉換
- AXI Stream轉視頻輸出,可將AXI Stream內(nèi)部視頻轉換為并行視頻,并為HDMI芯片提供適當?shù)耐叫盘?/li>
- 時鐘向導,用于生成FPGA內(nèi)部時鐘(MIPI和MIG基準時鐘為200MHz,視頻管道為150MHz。MicroBlaze在內(nèi)部使用較慢的MIG生成時鐘)
- UART Lite,用于與用戶進行處理通信
這些模塊通過AXI Stream和AXI4接口連接。通過AMD Vivado? ML版Tcl窗口(圖1)中的框圖腳本,可以重建最終的模塊設計。
圖1:Tcl命令窗口(圖源:作者)
通過該窗口,可開始在Vivado中重建項目,如圖2所示。此過程可能需要幾分鐘才能完成。
圖2:重建項目(圖源:作者)
重建完成后,就可以探索項目設計了(圖3)。
圖3:完整的設計(圖源:作者)
新建一個頂層HDL包裝器,如圖4所示。
圖4:新建HDL包裝器(圖源:作者)
添加定義引腳的XDC約束。選擇“添加源”并選擇約束(圖5)。
圖5:添加約束條件(圖源:作者)
選擇IO.xdc文件(圖6)。
圖6:選擇IO.xdc文件作為約束條件(圖源:作者)
現(xiàn)在,我們就可以構建項目并生成位流。獲取到位流后,就可以將其導出為Xilinx支持存檔(XSA)文件,以便在Vitis中開發(fā)軟件(圖7)。
圖7:將硬件導出到Vitis(圖源:作者)
打開Vitis,并為工作區(qū)選擇工作目錄(圖8)。所有文件和應用程序都將存儲在這個位置。
圖8:選擇工作區(qū)(圖源:作者)
在Vitis中新建應用程序項目,將剛才導出的XSA作為目標,然后選擇“Hello World”應用程序(圖9 – 13)。
圖9:選擇應用程序項目(圖源:作者)
圖10:選擇剛才導出的XSA文件(圖源:作者)
圖11:選擇目標處理器(圖源:作者)
圖12:選擇域(圖源:作者)
圖13:選擇“Hello World”應用程序(圖源:作者)
打開圖8中新建的工作區(qū)src文件夾,將其中的文件替換為圖14所示的文件。
圖14:將文件復制到工作區(qū)(圖源:作者)
這些文件將出現(xiàn)在項目源文件下(圖15)。
圖15:確保文件已導入(圖源:作者)
構建應用程序(圖16)。
圖16:構建應用程序(圖源:作者)
新建調(diào)試應用程序,并通過JTAG下載到AC701評估板。將FMC Pcam適配器和Pcam模塊組裝到電路板上(圖17 – 19)。
圖17:設置硬件(圖源:作者)
圖18:配置調(diào)試應用程序(圖源:作者)
圖19:查看調(diào)試應用程序設置(圖源:作者)
連接到HDMI目標機后,該目標機將下載調(diào)試應用程序并運行,實現(xiàn)圖像顯示和透傳。如果您想了解軟件設計,請查看AMD Vitis?統(tǒng)一軟件平臺中的軟件應用程序。請注意,必須配置多個I2C開關,才能同時與攝像頭和HDMI芯片通信(圖20)。
圖20:簡單的RGB圖像透傳(圖源:作者)
為了創(chuàng)建執(zhí)行邊緣檢測的IP核,我們將使用Matlab和Simulink建立能夠放入圖像處理鏈中的IP塊。
邊緣檢測算法
在Matlab中新建一個Simulink圖表,并添加以下元素:
- 從多媒體文件:允許使用測試工作臺中的AVI文件或MPEG文件
- 從幀到像素:將輸出視頻轉換為像素流
- 從像素到幀:將像素流轉換為幀
- 兩個視頻查看器
新建一個子模塊,并添加以下內(nèi)容:
- 索貝爾濾波器:其輸出為1或0,取決于是否存在邊緣
- 常量blocjs:設置為0和255
- 開關
- 像素流校準器
- 新建另一個子模塊
圖像合并子模塊
- 兩個增益塊:一個用于1-Alpha,另一個用于Alpha
- 延遲元件
- 求和
最終的圖表應與圖21 – 23一致。
圖21:上層設計(圖源:作者)
圖22:HDL過濾器模塊(圖源:作者)
圖23:圖像疊加(圖源:作者)
有了這些模塊,我們就可以運行仿真,并將輸入圖像的結果與輸出圖像進行比較。
在輸出視頻中,請注意Sobel的結果疊加到輸入視頻上時邊緣是如何增強的(圖24)。
圖24:Simulink仿真(圖源:作者)
要生成HDL,我們可以使用HDL工作流程助手和SoC Blockset來生成具有AXI Stream接口和AXI4 Lite配置寄存器的IP模塊。
IP創(chuàng)建的關鍵要素是將像素流和控制端口映射到生成的IP塊上的AXI Stream接口,這樣就可以輕松地將IP塊集成到我們的Vivado設計中(圖25和26)。
圖25:選擇AXI接口(圖源:作者)
圖26:生成HDL(圖源:作者)
生成后,我們可以將此IP核添加回Vivado項目。在Vivado中新建一個IP資源庫,并添加我們剛剛創(chuàng)建的IP(圖27)。
圖27:更新后的Vivado圖表(圖源:作者)
將IP塊添加到Vivado設計中。我們可以將其添加到VPSS和AXIS-to-Video Out塊之間。該IP塊處理的是灰度圖像,而在VPSS的YUV444輸出中,Y通道是亮度通道,因而我們在兩個塊之間添加一個AXI子集轉換器,并且只提取TData數(shù)據(jù)流的低8位,因為這就是我們需要的信息。在IP塊的輸出端,添加另一個AXIS子集轉換器(將8位TData轉換為24位),將UV元素設置為0x80,將Y元素設置為IP塊的輸出。
然后,我們就可以重建該設計并生成位流。獲取到位流后,就可以導出XSA文件并在Vitis中更新XSA文件,從而為FPGA設計提供新的位文件,其中就包括IP塊。默認情況下,您無需自行更改或啟用軟件中的任何功能,因此應用程序應該能夠立即開始運行。請注意,HDMI顯示屏上的輸出顯示的是灰度圖像(圖28)。
圖28:生成的輸出圖像(圖源:作者)
總結
該項目表明,創(chuàng)建運行在AMD FPGA上的圖像處理系統(tǒng)并不是一件難事。
AMD、AMD箭頭標識、Artix、MicroBlaze、LogiCORE、Vivado和Vitis以及上述標識的組合均為Advanced Micro Devices, Inc.的商標。本文中使用的其他產(chǎn)品名稱僅用于識別目的,它們可能是其各自所有者的商標。
作者簡介
Adam Taylor是嵌入式系統(tǒng)教授、工程負責人,也是FPGA/片上系統(tǒng)和電子設計領域的知名專家。