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