尹飛皓,尚建華
(東華大學(xué) 信息科學(xué)與技術(shù)學(xué)院,上海 201620)
隨著機器視覺和電子技術(shù)的發(fā)展,視頻圖像處理技術(shù)得到了迅速的發(fā)展并已廣泛應(yīng)用于各個領(lǐng)域[1-2]。傳統(tǒng)的ARM、單片機技術(shù)由于其主頻較低、計算能力較差,較難實現(xiàn)高速、實時的圖像處理。針對時性要求較高的應(yīng)用環(huán)境[3-4],F(xiàn)PGA憑借其獨特的流水線計算結(jié)構(gòu)[5]、完全可控的Block Ram以及內(nèi)部集成的豐富的DSP資源[6],可較好實現(xiàn)圖像的實時處理;其次,F(xiàn)PGA的可重構(gòu)性使其可以靈活地實現(xiàn)算法升級和更新,具有更好的可維護性,因此,F(xiàn)PGA已逐漸成為當(dāng)前實時圖像處理的首選[7]。
目前,市場上已有的硬件算法驗證平臺普遍以FPGA/ZYNQ為控制手段,主要通過開發(fā)攝像頭實現(xiàn)。然而,這些實現(xiàn)方案存在一定的缺陷,一些圖像處理算法(如白平衡處理)會因不同的實現(xiàn)方式而對不同圖像數(shù)據(jù)產(chǎn)生明顯的差異。而基于攝像頭進行開發(fā),必須選取實際場景以使攝像頭進行數(shù)據(jù)采集并提供給算法端使用。其次,攝像頭采集圖像的幀數(shù)與像素往往在通信協(xié)議配置時被限定,因而無法滿足需要靈活配置圖像幀數(shù)和像素的驗證場景。并且,基于VGA/HDMI圖像輸出的傳統(tǒng)方案也存在一定的局限性。
針對上述問題,該文基于Xilinx公司的ARM+FPGA結(jié)構(gòu)的ZYNQ芯片[8],在ARM端搭建LwIP協(xié)議棧,實現(xiàn)與上位機通信;其次,實現(xiàn)視頻配置的下發(fā)和視頻數(shù)據(jù)的互傳,基于AMBA AXI4協(xié)架構(gòu)自定義多個存儲器直接訪問(Direct Memory Access,DMA)的IP,并靈活地結(jié)合高性能接口和加速器一致性接口(Accelerator Coherency Port,ACP)的使用,實現(xiàn)ARM與FPGA的大數(shù)據(jù)交互和視頻無撕裂顯示;最后,針對顯示環(huán)境的不同需求,設(shè)計了上位機回收視頻和HDMI兼容多分辨率的顯示。
系統(tǒng)的設(shè)計方案如圖1所示。在ZYNQ-7000 SOC的可編程邏輯(Programmable Logic,PL)端實現(xiàn)多個DMA主機模塊和HDMI控制器模塊,DMA主機模塊通過AXI-ACP和AXI-HP接口實現(xiàn)FPGA端和ARM端的數(shù)據(jù)通信,并在DMA讀寫模塊間插入預(yù)讀取模式的異步先入先出對列(FIFO),進而為待驗證算法IP提供接口[9]。在PS端主要實現(xiàn)網(wǎng)絡(luò)通信模塊與DMA從機模塊,網(wǎng)絡(luò)通信模塊采用LwIP的Socket模式實現(xiàn)TCP通信,DMA從機模塊通過GP接口的AXI-LITE模式實現(xiàn)視頻配置數(shù)據(jù)的寄存器地址映射。
圖1 系統(tǒng)總體設(shè)計架構(gòu)
為了高效接收上位機下發(fā)的數(shù)據(jù),并根據(jù)解析到的數(shù)據(jù)進行對應(yīng)的地址分配以及向PL端下發(fā)所需指令,系統(tǒng)在PS端對ARM部署FreeRTOS_10_Xilinx操作系統(tǒng)以實現(xiàn)任務(wù)的調(diào)度,并搭建LwIP協(xié)議棧建立TCP通信。LwIP協(xié)議棧是瑞典計算機科學(xué)院的Adam Dunkels開發(fā)的一個輕量型開源TCP/IP協(xié)議棧,其占用的RAM/ROM極少,但能實現(xiàn)TCP協(xié)議的主要功能[10]。其次,在Vivado SDK中提供了LwIP RAW/Socket API兩種接口。RAW模式具有更好的性能,占用內(nèi)存低,但實現(xiàn)難度較大且不宜移植;Socket模式的內(nèi)存開銷略大,但其易用性和移植性更好。由于ZYNQ-7020芯片的資源較為豐富,因此,在滿足系統(tǒng)網(wǎng)絡(luò)帶寬要求的前提下,該文選用Socket模式進行開發(fā)。
在建立TCP通信后,ARM端接收由上位機下發(fā)的數(shù)據(jù)包。為保證視頻數(shù)據(jù)的高效傳輸和視頻流的數(shù)據(jù)同步,需節(jié)約不必要的數(shù)據(jù)搬運時耗并保證內(nèi)存的一致性。若采用傳統(tǒng)的內(nèi)存拷貝和搬運的方式進行視頻傳輸,將會降低數(shù)據(jù)的傳輸效率,導(dǎo)致視頻卡頓,因此,在收到數(shù)據(jù)后,利用Zero-Copy技術(shù)直接指向數(shù)據(jù)緩沖源地址DDR3 0X2000000進行數(shù)據(jù)緩沖,進而減少了數(shù)據(jù)從LwIP TCP緩沖區(qū)到目標(biāo)緩沖區(qū)的數(shù)據(jù)復(fù)制時間[10]。
在從PL端或PS端訪問DDR時,二者的訪問方式不同。PL端可以直接訪問DDR;PS端訪問DDR時,首先將一批數(shù)據(jù)緩存于Cache中以提高交互效率,因此,當(dāng)Cache中的數(shù)據(jù)發(fā)生變換時,DDR中的數(shù)據(jù)無法立刻隨之改變。當(dāng)PL端修改DDR中的數(shù)據(jù)時,ARM無法獲取DDR中已被修改的數(shù)據(jù)信息,依舊會從Cache中讀取原來未被改變的那部分數(shù)據(jù),此時將出現(xiàn)內(nèi)存不一致的問題。為了保存內(nèi)存的一致性,通常會通過Xil_DCacheDisable關(guān)閉Cache功能,以使ARM繞過Cache而直接訪問DDR,但這又會導(dǎo)致ARM性能的大幅降低。針對上述問題,可以利用Xil_DCacheFlushRange方法將Cache中的緩存圖像數(shù)據(jù)不斷刷新寫入DDR中,在保證ARM性能的同時,有效實現(xiàn)內(nèi)存的一致性。
在Vivado SDK中選擇freertos_tcp_perf_server模板進行網(wǎng)絡(luò)通信模塊的服務(wù)器端開發(fā)。首先在模板頭文件中設(shè)置緩沖區(qū)尺寸和監(jiān)聽端口號并使能數(shù)據(jù)傳輸任務(wù);然后利用模板中的lwip_sendto()和lwip_recvfrom()函數(shù)進行TCP的收發(fā)[11],這組收發(fā)函數(shù)無需建立連接即可使用,在調(diào)用函數(shù)時會自動建立Socket連接,如果建立失敗則會返回錯誤;使能傳輸任務(wù)之后,在傳輸任務(wù)中初始化套接字,當(dāng)ARM端接收到上位機下發(fā)的數(shù)據(jù),內(nèi)存進行處理并根據(jù)包頭判斷下發(fā)數(shù)據(jù)的屬性,判斷數(shù)據(jù)屬于配置數(shù)據(jù)還是屬于圖像數(shù)據(jù),配置包的結(jié)構(gòu)如圖2所示。
如果數(shù)據(jù)為配置數(shù)據(jù),則根據(jù)配置包的內(nèi)容,通過AXI-LITE將圖像尺寸等信息映射到對應(yīng)的寄存器地址中,并發(fā)送640×512圖像尺寸的配置包,再借助集成邏輯分析器(ILA)獲取conf_list模塊的輸出,可以驗證是否得到正確的配置數(shù)據(jù)。
如果是圖像包頭且讀回的上位機標(biāo)志為0,則將數(shù)據(jù)包頭后的圖像數(shù)據(jù)不斷寫入內(nèi)存并做地址偏移處理,并通過EMIO GPIO向DMA讀模塊的中斷發(fā)送初始化脈沖,再依次將DDR中的圖像數(shù)據(jù)讀出;當(dāng)收到兩幀圖像數(shù)據(jù)后,再向上位機發(fā)送8字節(jié)BB以請求新的一幀圖像,同時清空緩沖數(shù)據(jù)。如果讀回的上位機標(biāo)志為1,則將處理后的圖像數(shù)據(jù)回傳到上位機。軟件主體控制流程如圖2所示。
圖2 軟件控制流程
PL側(cè)與PS側(cè)的良好通信是視頻圖像傳輸質(zhì)量和傳輸效率的重要保證。在ZYNQ SOC中,主要通過AXI-HP、AXI-GP和AXI-ACP三種AXI總線接口實現(xiàn)ARM端和FPGA端的數(shù)據(jù)交互[12]。
AXI協(xié)議是ARM公司提出的一種高性能、低延時、穩(wěn)定的片內(nèi)總線協(xié)議。該協(xié)議基于猝發(fā)和信號握手機制進行數(shù)據(jù)傳輸,其擁有讀/寫地址通道、讀/寫數(shù)據(jù)通道、寫響應(yīng)通道五個獨立的傳輸通道。由于視頻數(shù)據(jù)傳輸帶寬寬且需要訪問DDR中的地址,因此,在該系統(tǒng)中,通過HP接口和ACP接口的AXI4-MEMORY-MAP模式完成視頻數(shù)據(jù)的DMA讀寫,結(jié)構(gòu)如圖3所示。首先由AXI-LITE配置的各寄存器獲得每幀圖像的寬和高信息,然后由乘法器計算出一幀圖像的總像素值,并以此控制猝發(fā)傳輸?shù)牡刂贰?/p>
系統(tǒng)中的三次DMA的猝發(fā)長度均設(shè)置為256,AXI總線的位寬設(shè)置為64 bit,AXI時鐘設(shè)為200 MHz,進而獲得較大的數(shù)據(jù)傳輸帶寬。由于ZYNQ中DDR的一位地址可以儲存8 bit數(shù)據(jù),因此,每啟動一次猝發(fā),地址將會增加2 048位。在RGB888格式中,一個像素點為24 bit,且DDR中的三個地址位可儲存一個像元數(shù)據(jù)。因此,完成一幀完整圖像的讀寫,地址位的增量為三倍的像元數(shù)據(jù)量減去一次突發(fā)的地址增量。
圖3所示DMA讀寫模塊中,各模塊的功能如下。
圖3 DMA讀寫模塊
HP0口DMA讀模塊的主要功能是從DDR的0X2000000地址中讀出ARM端從上位機接收到的圖像數(shù)據(jù)。每當(dāng)ARM端接收到一幀圖像數(shù)據(jù),則通過EMIO GPIO向該模塊發(fā)出一次讀啟動脈沖并將該模塊使能。然后,通過異步預(yù)讀取模式的FIFO把讀出的圖像數(shù)據(jù)進行緩存,并提供給DMA寫模塊或圖像算法模塊,其中,F(xiàn)IFO的寫時鐘為AXI時鐘,F(xiàn)IFO的讀時鐘為圖像處理模塊時鐘。
ACP口DMA寫模塊的主要功能是將處理后的圖像數(shù)據(jù)重新寫入DDR中。ACP接口是ZYNQ PS端上的加速器一致性接口,是一個兼容AXI3的64位從機接口,可以與SCU(Snoop Control Unit)連接并為PL側(cè)提供異步緩存能力,實現(xiàn)PL側(cè)直接訪問PS側(cè)。ACP接口與Cache刷新函數(shù)配合使用還可解決Cache一致性的問題,有效保證ARM的性能[13]。
HP2口DMA讀模塊的主要功能是讀取DDR中存儲的處理后的圖像數(shù)據(jù),并通過異步預(yù)讀取模式的FIFO將該圖像數(shù)據(jù)傳輸給HDMI控制模塊,其中,寫FIFO的時鐘為AXI時鐘,讀FIFO的時鐘為HDMI控制模塊的時鐘。為了保證視頻流暢并防止FIFO被寫滿,當(dāng)FIFO中緩存圖像數(shù)據(jù)不足一行且讀通道非忙時,AXI讀數(shù)據(jù)的有效信號設(shè)為高電平;當(dāng)讀數(shù)據(jù)和讀數(shù)據(jù)響應(yīng)同時有效時,寫FIFO的使能信號設(shè)為高電平,且FIFO深度設(shè)置為2 048,以大于一行像素量的最大值。
HDMI控制器的結(jié)構(gòu)如圖4所示,根據(jù)HDMI1.4設(shè)計規(guī)范,通過VGA時序轉(zhuǎn)換可得到三組八位RGB數(shù)據(jù)[14-15],然后借助8b/10b模塊獲得直流平衡性更好、轉(zhuǎn)換電平更密集的10 bit編碼組,并將10 bit并行數(shù)據(jù)串行化處理,最后通過OBUFDS原語將串行數(shù)據(jù)轉(zhuǎn)換為差分信號,實現(xiàn)系統(tǒng)終端的顯示。由主機和從機構(gòu)成的兩個OSERDESE2原語在將10 bit并行數(shù)據(jù)串行化處理時[16],為了避免普通IO口因過高的時鐘頻率而發(fā)生嚴(yán)重的時鐘抖動,OSERDESE2原語選擇雙沿傳輸模式,且串行化時鐘的頻率為并行數(shù)據(jù)時鐘的五倍。
圖4 HDMI控制器結(jié)構(gòu)
較傳統(tǒng)設(shè)計方案而言,該系統(tǒng)實現(xiàn)了HDMI兼容分辨率的無撕裂顯示。根據(jù)配置數(shù)據(jù)包的圖像尺寸,HDMI模塊可實現(xiàn)1 280×1 024分辨率的圖像顯示并向下兼容多種分辨率的顯示。由于系統(tǒng)中的ARM端與FPGA端存在圖像數(shù)據(jù)多次交互的過程,因此,圖像數(shù)據(jù)需同步處理,以保證圖像幀同步,避免出現(xiàn)圖像顯示撕裂的情況。
系統(tǒng)采用如圖5所示的雙幀緩存設(shè)計時序,通過雙幀緩存圖像數(shù)據(jù)的類乒乓操作方式解決圖像撕裂問題。每次進行DMA寫操作時,首先在DDR中緩存兩幀圖像數(shù)據(jù);當(dāng)?shù)诹銕瑪?shù)據(jù)寫入到DDR中時將Frame_Flag拉高,當(dāng)?shù)谝粠瑪?shù)據(jù)寫入DDR時將Frame_Flag拉低;然后,將Frame_Flag信號傳遞到DMA讀模塊,在DMA寫模塊寫第零幀數(shù)據(jù)時讀出第一幀數(shù)據(jù),在DMA寫模塊寫第一幀數(shù)據(jù)時讀出第零幀數(shù)據(jù)。通過上述雙幀緩存操作,可有效避免同時讀寫同一幀圖像數(shù)據(jù)所造成的數(shù)據(jù)不同步問題。
圖5 雙幀緩存時序關(guān)系
自動白平衡算法(Automatic White Balance,AWB)是圖像傳感器預(yù)處理圖像的一種常用圖像色彩處理方法,其目的是通過還原白色目標(biāo)的顏色,進而準(zhǔn)確還原其他物體的色彩[17]。常用的AWB算法有灰度世界法(Gray World Method,GWM)、完美反射法(Perfect Reflector Method,PRM)、灰度世界和完美反射正交組合算法(Quadratic Combining GWM&PRM,QCGP)等。其中,GWM和PRM算法具有較好的實時性且易于硬件實現(xiàn),因而被廣泛應(yīng)用[18];QCGP算法計算量極大,因此實時性受到一定限制;GWM算法是在獲取圖像中RGB三色通道的均值以及所有像素色彩的均值后,通過計算以使三個均值趨于一致;PRM算法則是將圖像中亮度最高的點作為“白色”參考,然后進行白平衡處理。
本次測試中,分別使用GWM和PRM兩個算法對系統(tǒng)性能進行測試。原始圖像如圖6(a)所示,圖像偏綠。經(jīng)過GWM算法矯正后,圖像更符合真實的人眼視覺效果(圖6(b)),而經(jīng)過PRM算法處理后的圖像已經(jīng)失真(圖6(c))。同時,也可利用RTL電路實現(xiàn)GWM和PRM圖像處理算法,處理效果與軟件算法處理的效果相同(圖6(d)(e)),且具有很好的實時性。GWM和PRM兩種算法的用時情況如表1所示。
圖6 系統(tǒng)測試結(jié)果
表1 不同平臺的算法實現(xiàn)速度
經(jīng)過測試,系統(tǒng)平均傳輸速率可達400 Mbps以上,能夠達到實時圖像傳輸和處理的要求。另外,系統(tǒng)硬件邏輯資源占用率低于20%且保留了豐富的BRAM和DPS資源,能夠為后續(xù)復(fù)雜圖像算法IP的驗證提供充足的擴展空間。
針對當(dāng)前硬件圖像算法驗證平臺的缺陷,以ZYNQ為主控芯片設(shè)計了一款靈活高效的圖像算法IP驗證系統(tǒng),并提供了完整的圖像傳輸和顯示方案,通過軟硬協(xié)同的方式充分發(fā)揮了ARM+FPGA架構(gòu)的優(yōu)勢。借助GWM和PRM兩種算法對系統(tǒng)性能進行了測試,測試結(jié)果表明,GWM和PRM算法在FPGA中具有很好的實時性,可以實現(xiàn)400 Mbps以上的視頻傳輸速率,能夠較好地支持圖像算法IP的驗證,有效降低外設(shè)成本。