李慶春,李 祺,劉彥君,趙 越
(1.海軍裝備部裝備項目管理中心, 北京 100071; 2.北京機電工程研究所, 北京 100074;3.成都菁匯科技有限公司, 成都 611731; 4.電子科技大學(xué) 自動化學(xué)院, 成都 611731)
圖像的采集與存儲設(shè)備已經(jīng)廣泛應(yīng)用于工業(yè)生產(chǎn)、醫(yī)療衛(wèi)生、航空航天等領(lǐng)域[1],提升圖像數(shù)據(jù)處理速度與降低圖像傳輸延遲對圖像采集終端設(shè)備有著重大的意義。在特定的場景下,如遠(yuǎn)程手術(shù)、航天探測器、無人機電力巡檢等,對圖像遠(yuǎn)程傳輸?shù)膶崟r性和穩(wěn)定性有著很高的要求,而在圖像采集、傳輸及處理過程中需要大量的時間。例如,由模數(shù)轉(zhuǎn)換器轉(zhuǎn)換得到的尺寸為1 728*625的8 bit的數(shù)字化圖像數(shù)據(jù)大小為1.03 MB,當(dāng)傳感器高幀率、連續(xù)的采集圖像時需要具備較高的傳輸帶寬才能保證圖像數(shù)據(jù)的完整性。除此之外,為了有效利用圖像信息還需要對數(shù)據(jù)進(jìn)行處理。傳統(tǒng)的DSP或ARM處理器具有優(yōu)秀的控制能力[2],但是取樣速率較低、指令串行執(zhí)行且系統(tǒng)使用浮點,很難對數(shù)據(jù)量大、像素相關(guān)性大、頻帶較寬的圖像數(shù)據(jù)進(jìn)行直接處理[3]。
目前FPGA器件具有的數(shù)據(jù)并發(fā)處理、流水線技術(shù)、邊接收邊處理、高速接口等特性同圖像數(shù)據(jù)傳輸及處理的需求十分契合,但是在外設(shè)控制能力方面有所不足。為了構(gòu)建一個圖像傳輸延遲低、可遠(yuǎn)程網(wǎng)絡(luò)圖傳、可程控的圖像采集系統(tǒng),本文采用Xilinx公司推出的ZYNQ高性能芯片,ZYNQ芯片內(nèi)部融合了ARM處理器和FPGA,處理器與FPGA之間通過高速的AXI總線互聯(lián),這些特性能夠?qū)崿F(xiàn)處理速度、控制能力、傳輸速率的最大化,同時ARM處理器還能借助Linux系統(tǒng)搭載Gstreamer流媒體應(yīng)用將處理好的圖像數(shù)據(jù)推送到網(wǎng)絡(luò)實現(xiàn)遠(yuǎn)程圖像傳輸。
在本圖像采集系統(tǒng)中,ZYNQ芯片的PS(processing system)端主要完成系統(tǒng)控制,數(shù)據(jù)的存儲和傳輸以及后處理,PL(programmable logic)端則用于對ADC輸入數(shù)據(jù)的前處理和輸出數(shù)據(jù)至DAC。芯片內(nèi)部PS端與PL端之間通過AXI總線進(jìn)行數(shù)據(jù)交互,設(shè)計中用到AXI4和AXI4_Lite總線,其中AXI4總線的數(shù)據(jù)位寬為64 bit,用于傳輸數(shù)據(jù)量大、傳輸延時要求高的圖像數(shù)據(jù);AXI4_Lite總線的數(shù)據(jù)位寬為32 bit,用于控制數(shù)據(jù)的傳輸。
根據(jù)圖像編解碼板的控制及傳輸要求,需要大量的控制接口和低時延的數(shù)據(jù)處理能力,由于PS端IO口數(shù)量有限、ARM處理器串行執(zhí)行的特性無法實現(xiàn)高速的數(shù)據(jù)處理,所以采用PL端豐富的IO進(jìn)行接口擴展,利用PL端的可編程邏輯資源部署并行處理算法完成大量數(shù)據(jù)處理的方式不僅可以降低成本而且易于系統(tǒng)功能實現(xiàn)。在系統(tǒng)接口方面,整個設(shè)計能夠滿足2路GJB1188A B類視頻信號輸入、1路GJB1188A B類的靜態(tài)圖像信號輸出、1路GJB1188A B類的靜態(tài)圖像同步信號輸出。
除此之外,該系統(tǒng)還配備了連接顯示設(shè)備的HDMI接口、可外接鍵盤鼠標(biāo)的USB接口、標(biāo)準(zhǔn)的千兆以太網(wǎng)接口以及可用于工程調(diào)試的串口等。豐富的接口在實現(xiàn)核心功能的基礎(chǔ)上增加了系統(tǒng)的靈活性。圖像采集系統(tǒng)的整體結(jié)構(gòu)如圖1所示。
圖1 系統(tǒng)結(jié)構(gòu)框圖
ZYNQ相對于分立的ARM+FPGA架構(gòu)而言,單一芯片能夠節(jié)省PCB(printed circuit board)面積、減小布局布線難度。除此之外,單芯片融合ARM和FPGA可以利用高效的片內(nèi)通信總線進(jìn)行數(shù)據(jù)傳輸,高帶寬的總線對圖像數(shù)據(jù)傳輸效率有較大的提升。
系統(tǒng)前端輸入的PAL制式的模擬視頻信號經(jīng)過A/D轉(zhuǎn)換為ITU-R BT.656標(biāo)準(zhǔn)的數(shù)字視頻信號,其中包含大量的消隱信號和輔助信號等一些冗余信號,如果不對這些冗余信號進(jìn)行處理而直接傳輸,傳輸?shù)臄?shù)據(jù)量過大導(dǎo)致傳輸效率低,延時比較高,無法滿足圖像處理實時性的要求,并且后端輸出的視頻信號的幀率也無法達(dá)到圖像采集前端每秒25幀的速度,這些冗余信號的消除不會對圖像的質(zhì)量產(chǎn)生影響,因此,需要對視頻信號進(jìn)行分離處理,只保留信號的有效數(shù)據(jù)部分進(jìn)行傳輸,等待傳輸完成,再將視頻信號的有效數(shù)據(jù)和消隱信號、輔助信號進(jìn)行復(fù)合,恢復(fù)原視頻畫面,這種處理方式可以有效地提高數(shù)據(jù)傳輸效率,降低系統(tǒng)延時,提高視頻的顯示幀率。如何提取視頻信號中的有效數(shù)據(jù)以及選擇硬件還是軟件的方式來對BT.656視頻信號進(jìn)行解碼成為了本系統(tǒng)需要解決的難點。
圖像數(shù)據(jù)傳輸?shù)牡脱訒r是圖像采集系統(tǒng)的基本要求之一,圖像處理的速度必須很快,直接使用CPU進(jìn)行圖像處理,雖然處理起來方便靈活,但是由于需要處理相當(dāng)大的數(shù)據(jù)量,會極大地消耗CPU的運算能力,CPU的占用率比較高,而頻繁對DDR存儲器的訪問也會增加數(shù)據(jù)傳輸和解析的時間,不能滿足系統(tǒng)對于圖像數(shù)據(jù)傳輸?shù)蜁r延的需求。FPGA的實時流水線運算可以滿足圖像數(shù)據(jù)高效性處理的要求[4]。為了提高圖像傳輸?shù)膶崟r性,本系統(tǒng)采用硬件解碼的方式,即利用FPGA部署硬件運算電路來完成視頻的解碼工作[5],首先將視頻信號中的Y(亮度值)和Cb、Cr(色度值)準(zhǔn)確地分離出來,然后再將YCbCr4∶2∶2格式轉(zhuǎn)換為YCbCr4∶2∶0進(jìn)行傳輸。經(jīng)過處理器性能、FPGA資源消耗、開發(fā)成本等各方面的評估,決定采用型號為XC7Z020的ZYNQ芯片并圍繞該款芯片設(shè)計外圍電路。
利用性能優(yōu)異的ZYNQ芯片構(gòu)建的系統(tǒng)硬件部分主要劃分為:
1)圖像采集通道:整個采集框架支持2路PAL格式的視頻信號輸入,接入系統(tǒng)的模擬視頻信號經(jīng)過TVP5150AM1芯片解碼輸出ITU-R BT.656格式的數(shù)字視頻數(shù)據(jù)[6]。視頻解碼芯片的工作狀態(tài)由ZYNQ芯片內(nèi)部的FPGA部分中的視頻解碼芯片配置模塊通過I2C總線進(jìn)行配置。
2)圖像處理模塊:ITU-R BT.656格式的數(shù)字視頻數(shù)據(jù)通過解碼芯片外部的LVDS(low-voltage differential signaling)接口傳輸至FPGA,F(xiàn)PGA根據(jù)圖像格式對數(shù)據(jù)進(jìn)行解析和處理。圖像處理模塊包括通道選擇模塊、數(shù)據(jù)解析模塊、數(shù)據(jù)處理模塊和數(shù)據(jù)重組模塊。
通道選擇模塊,受控于處理器指令,選擇一路圖像數(shù)據(jù)輸出至后級模塊處理。
數(shù)據(jù)解析模塊,用于對選擇的一路圖像數(shù)據(jù)解析,根據(jù)ITU-R BT.656格式的構(gòu)成特點解析出圖像數(shù)據(jù)的有效數(shù)據(jù)、消隱信號標(biāo)志、數(shù)據(jù)錯誤標(biāo)志、圖像幀的頭部和尾部信號、行同步信號、場同步信號、復(fù)合同步信號。其中數(shù)據(jù)錯誤標(biāo)志位指示當(dāng)前解析的圖像數(shù)據(jù)是否包含完整的信息,當(dāng)信息不完整時,當(dāng)前圖像幀被丟棄,數(shù)據(jù)解析模塊等待下一幀圖像數(shù)據(jù)輸入。完整無誤的圖像數(shù)據(jù)伴隨著解析出的標(biāo)志信息傳入后級模塊。
數(shù)據(jù)處理模塊,用于剔除圖像數(shù)據(jù)中的無效數(shù)據(jù),只保留有效的Y和Cb、Cr數(shù)據(jù),Y、Cb、Cr的比例為4∶2∶2,因為圖像數(shù)據(jù)中Y分量對圖像的質(zhì)量影響較大,而Cb、Cr分量對圖像數(shù)據(jù)的質(zhì)量影響較小,所以通過進(jìn)一步壓縮Cb、Cr部分的有效數(shù)據(jù)來減少數(shù)據(jù)的傳輸量,提高數(shù)據(jù)的傳輸效率,將處理后的Cb、Cr和Y數(shù)據(jù)利用FIFO(first input first output)緩存后同步輸出至后級模塊處理。
數(shù)據(jù)重組模塊,用于將圖像有效數(shù)據(jù)Y、Cb、Cr重新組合成YCbCr4∶2∶0的數(shù)據(jù)格式。
3)圖像傳輸模塊:利用AXI_DMA IP核將處理完成的圖像數(shù)據(jù)傳輸至DDR3存儲器中。
4)圖像數(shù)據(jù)生成模塊:利用FPGA邏輯資源生成自定義的圖像數(shù)據(jù),圖像數(shù)據(jù)可以上傳至處理器端用作圖像數(shù)據(jù)傳輸鏈路的測試;也可以經(jīng)過編碼芯片可輸出PAL制式的模擬視頻數(shù)據(jù),可以用作視頻源。
5)圖像輸出通道:利用圖像數(shù)據(jù)生成模塊產(chǎn)生的數(shù)字圖像數(shù)據(jù)通過ADV7171視頻編碼芯片轉(zhuǎn)換成對應(yīng)的模擬視頻信號,同時根據(jù)圖像的構(gòu)成格式識別圖像的行、場同步信號并輸出。
該圖像采集系統(tǒng)的前端信號輸入是PAL制式的模擬視頻信號,目前NTSC和PAL屬于全球兩大主要的電視廣播制式[7],NTSC電視標(biāo)準(zhǔn)用于美、日等國家和地區(qū)。而PAL電視標(biāo)準(zhǔn)則廣泛用于中國、歐洲等國家和地區(qū)。PAL制式電視標(biāo)準(zhǔn)每秒25幀畫面,625條電視掃描線,奇場在前,偶場在后,畫面的寬高比為4∶3,標(biāo)準(zhǔn)的數(shù)字化PAL電視標(biāo)準(zhǔn)每一幀有625行,有效數(shù)據(jù)共有576行,每行包含720個像素點,分辨率為720*576,色彩位深為24比特[8]。
為了實現(xiàn)數(shù)字化處理,本系統(tǒng)需要對PAL制式的模擬視頻信號做數(shù)字化處理,通過圖像解碼芯片(TVP5150AM1)進(jìn)行模數(shù)轉(zhuǎn)換[9],其轉(zhuǎn)換后的格式為ITU-R BT.656標(biāo)準(zhǔn)的數(shù)字視頻信號。PL端與圖像解碼芯片(TVP5150AM1)之間采用27 MHz/s串行接口的數(shù)字傳輸接口標(biāo)準(zhǔn)。
ITU-R BT.656標(biāo)準(zhǔn)是將一個視頻序列分成N幀,PAL制式轉(zhuǎn)換后的BT.656標(biāo)準(zhǔn)有625行,底場有效數(shù)據(jù)也是288行,其余行則是為了標(biāo)記和區(qū)分兩種場的垂直消隱信號。采集圖像的時候采用隔行掃描(interlaced scanning),每一幀一般有兩個場(field),一個叫頂場(top field),一個叫底場(bottom field),由于隔行掃描,也可以將頂場和底場稱為偶場和奇場。BT.656標(biāo)準(zhǔn)625列數(shù)據(jù)格式如圖2所示。
圖2 BT.656標(biāo)準(zhǔn)625列數(shù)據(jù)格式示意圖
BT.656標(biāo)準(zhǔn)的每一行主要由以下4個部分組成:行=結(jié)束碼(EAV)+水平消隱(Horizontal Vertical Blanking)+起始碼(SAV)+有效數(shù)據(jù)(Active Video),如圖3所示。
圖3 656格式行數(shù)據(jù)組成
每一行數(shù)據(jù)信號被編碼成8bit的形式,其中包括輔助信號(SAV、EAV)、行消隱信號、有效視頻信號。SAV表示視頻行數(shù)據(jù)的開始,EAV表示視頻行數(shù)據(jù)的結(jié)束,SAV和EAV均由4個字節(jié)構(gòu)成,前3個字節(jié)FF 00 00為固定頭,是SAV和EAV的數(shù)據(jù)標(biāo)志位,第4個字節(jié)“XY”為輔助信號的信息位,其編碼格式如圖4所示。
圖4 輔助信號信息位編碼格式
XY的最高位(bit7)為固定數(shù)據(jù)1;F標(biāo)記場信息,傳輸偶數(shù)場時為0,傳輸奇數(shù)場時為1;V標(biāo)記消隱信息,傳輸消隱數(shù)據(jù)時為1,傳輸有效視頻數(shù)據(jù)時為0;H標(biāo)記EAV還是SAV,EAV為1,SAV為0;P0~P3為保護(hù)位,其值由F、V、H計算得到,計算方法如下:P3=V(XOR)H,P2=F(XOR)H,P1=F(XOR)V,P0=F(XOR)V(XOR)H[10]。每行對應(yīng)不同的EAV、SAV如表1所示。
表1 656列數(shù)據(jù)對應(yīng)的行輔助信號
消隱行數(shù)據(jù)則由80 10組成,共280 byte,本設(shè)計在PL端可根據(jù)輔助信號的變化,剔除消隱行的無用數(shù)據(jù),用以減小一幀有用信號的傳輸時間及軟件處理無用數(shù)據(jù)的時間。對于有效視頻信號(Valid data),其排列順序如圖5所示。
圖5 有效視頻信號數(shù)據(jù)構(gòu)成
其中Y表示明亮度(Luminance或Luma),也就是灰階值;而Cb、Cr則用來表示色度,其中Cb反映了RGB輸入信號藍(lán)色部分與RGB信號亮度值之間的差異[11]。Cr反映的是RGB輸入信號紅色部分與RGB信號亮度值間的差異[12]。Y、Cb、Cr的比例為4∶2∶2,從圖像的像素點上來理解,就是每一個像素點有一個單獨的Y值,而相鄰的兩個像素點的Cb和Cr數(shù)據(jù)是一樣的[13]。
本設(shè)計將625行BT.656標(biāo)準(zhǔn)的數(shù)字視頻信號的一幀數(shù)據(jù)在PL端根據(jù)輔助信號的變化,去除行消隱信號,將有用數(shù)據(jù)重新排列處理后,經(jīng)DMA傳輸至存儲器,軟件將數(shù)據(jù)通過奇偶穿插后播放器就能把圖像正確地顯示出來。
外部的PAL制式電視廣播信號是模擬視頻信號[14],為了實現(xiàn)ZYNQ數(shù)據(jù)處理,還需要進(jìn)行A/D轉(zhuǎn)換,模擬視頻信號經(jīng)過視頻解碼芯片TVP5150AM1后被轉(zhuǎn)換為ITU-R BT.656標(biāo)準(zhǔn)的數(shù)字視頻信號[15],但是此時的視頻信號包含大量的列消隱信號、行消隱信號、輔助信號等一些無用信號,無法直接傳輸至上位機做數(shù)據(jù)處理及圖像顯示。最終的顯示還是需要我們將ITU-R BT.656視頻標(biāo)準(zhǔn)中的行場數(shù)據(jù)重新排列,提取有效行中的灰度及色度信息,即將圖像數(shù)據(jù)中的Y、Cb、Cr準(zhǔn)確地分離出來,并按奇場偶場重新排列,才能供軟件播放使用[16]。因此,視頻解碼工作在本系統(tǒng)中尤為重要,目前可以實現(xiàn)這種視頻解碼的方式主要分為兩種:軟件解碼和硬件解碼。
該設(shè)計起初應(yīng)用軟件解碼,硬件僅負(fù)責(zé)數(shù)據(jù)傳輸功能,在此架構(gòu)下,軟件的大量循環(huán)重復(fù)操作且需要處理的數(shù)據(jù)量巨大,不僅增加了系統(tǒng)功耗及CPU的占用率,頻繁對DDR的訪問也增加了數(shù)據(jù)傳輸和解析的時間。最終只能實現(xiàn)每秒3至5幀的視頻播放,遠(yuǎn)遠(yuǎn)低于圖像采集前端每秒25幀的速度。通過FPGA對圖像預(yù)處理需要將BT.656標(biāo)準(zhǔn)的數(shù)字視頻信號做解析,根據(jù)每行的XY控制字解析出場同步信號(F)、垂直同步信號(V)、水平同步信號(H)。通過提取每幀圖像中的有效數(shù)據(jù),拼成逐行圖像。
相鄰每兩行為一組,從原來“CbYCrY……”順序的數(shù)據(jù)中提取每兩行的所有Y數(shù)據(jù),Cb數(shù)據(jù)、Cr數(shù)據(jù)。按照第一行720字節(jié)Y數(shù)據(jù)(連續(xù)180個100 MHz時鐘周期的dma_tvalid),第二行720字節(jié)Y數(shù)據(jù),360字節(jié)預(yù)處理后的Cb數(shù)據(jù),360字節(jié)預(yù)處理后的Cr數(shù)據(jù)(第二行Y和Cb、Cr一起有連續(xù)360個100 MHz時鐘周期的dma_tvalid)排列,之后就可以這樣為一組,每幀圖像共發(fā)送288組這樣的數(shù)據(jù)通過FIFO緩存后發(fā)送給DMA進(jìn)行傳輸。
為了進(jìn)一步提高數(shù)據(jù)傳輸效率,保證系統(tǒng)的實時性,還需要對數(shù)字視頻數(shù)據(jù)作進(jìn)一步壓縮處理,將YCbCr=4∶2∶2格式轉(zhuǎn)換為YCbCr=4∶2∶0格式。
取樣方式的描述可以通過一條線被掃描時所呈現(xiàn)的亮度值和色度值之間的比率來表示。描述形式為4:X:Y,X和Y表示每兩個色度通道中數(shù)量的相對值。4∶1∶1表示每條掃描線每4個亮度值和1個色度值相對應(yīng),4∶2∶2表示每4個亮度值和2個色度值相對應(yīng),4∶4∶4表示色度值不進(jìn)行二次取樣。4∶2∶0表示每4個亮度值和1個色度值相對應(yīng),但是它的取樣方式不是連續(xù)的,這意味著對于第一個色度元素有兩個取樣值,而對于第二個色度元素則不進(jìn)行取樣,這種取樣方式不能產(chǎn)生完整的彩色圖像。實際工程中,4∶2∶0表示每條掃描線有兩個色度取樣,采用隔行的方式進(jìn)行取樣。
雖然將4∶2∶2轉(zhuǎn)換為4∶2∶0可能減少細(xì)節(jié)處顏色的飽和度,但通常不會減少大個物體內(nèi)的顏色飽和度。具體處理過程為:保留原圖像中的Y數(shù)據(jù),將逐行圖像數(shù)據(jù)中對應(yīng)位置的Cb和Cr相加并除以2,得到新的Cb和Cr,然后就可以將數(shù)據(jù)按兩行為一組,每幀圖像共發(fā)送288組這樣的數(shù)據(jù)通過FIFO緩存后發(fā)送給DMA。這種處理方式將一幀圖像的數(shù)據(jù)量進(jìn)一步壓縮,有效提高了數(shù)據(jù)傳輸效率。
系統(tǒng)軟件分為嵌入式軟件和上位機軟件兩個部分,其中嵌入式軟件運行在Linux操作系統(tǒng)上,首先需要在設(shè)備上移植Linux操作系統(tǒng),嵌入式軟件分為應(yīng)用層、系統(tǒng)層、底層驅(qū)動3個部分[17],應(yīng)用層的視頻服務(wù)應(yīng)用通過操作系統(tǒng)API與系統(tǒng)層交互,系統(tǒng)層通過設(shè)備驅(qū)動程序驅(qū)動FPGA等外設(shè),從而實現(xiàn)對FPGA內(nèi)部信號以及外部設(shè)備的控制。嵌入式軟件結(jié)構(gòu)如圖6所示。
圖6 嵌入式軟件架構(gòu)圖
嵌入式軟件架構(gòu)的應(yīng)用層是整個嵌入式軟件提供給上位機的接口,在應(yīng)用程序下包含程控模塊和Gstreamer流媒體應(yīng)用的服務(wù)器端。程控模塊主要對上位機下發(fā)的指令進(jìn)行解析,根據(jù)指令調(diào)用功能函數(shù)完成對其他模塊的控制,例如調(diào)用AXI4_LITE驅(qū)動實現(xiàn)對FPGA的控制,或者調(diào)用AXI4_DMA驅(qū)動把FPGA處理好的視頻數(shù)據(jù)傳輸?shù)酱鎯ζ髦?。Gstreamer流媒體應(yīng)用則是將存儲器中的視頻數(shù)據(jù)通過管道技術(shù)經(jīng)由千兆網(wǎng)口推送至上位機的Gstreamer客戶端。
系統(tǒng)軟件中的上位機軟件是在Windows XP系統(tǒng)下開發(fā)的,軟件主要包含網(wǎng)絡(luò)連接模塊、人機交互界面、Gstreamer客戶端、視頻顯示窗口。網(wǎng)絡(luò)連接模塊采用TCP/IP通信協(xié)議實現(xiàn)上位機與設(shè)備之間的網(wǎng)絡(luò)連接;人機交互界面支持對遠(yuǎn)程設(shè)備的參數(shù)配置及功能的控制;Gstreamer客戶端通過管道技術(shù)訪問服務(wù)器端的流媒體數(shù)據(jù);視頻顯示窗口呈現(xiàn)遠(yuǎn)程讀取的視頻畫面。
上位機軟件架構(gòu)如圖7所示。
圖7 上位機軟件架構(gòu)圖
設(shè)計中采用了Xilinx 公司的ZYNQ芯片,其芯片內(nèi)部融合了雙核ARM Cortex-A9 處理器和Xilinx 7 系列FPGA,ARM與FPGA通過AXI總線互聯(lián)。視頻數(shù)據(jù)和外設(shè)控制數(shù)據(jù)的交互都經(jīng)由AXI總線,由于視頻數(shù)據(jù)的傳輸速率、傳輸帶寬及傳輸延遲均比控制數(shù)據(jù)要求高,所以對于視頻數(shù)據(jù)采用DMA傳輸?shù)姆绞絒18],而控制信號采用自定義AXI4_Lite總線進(jìn)行傳輸。數(shù)據(jù)傳輸是該采集系統(tǒng)能否實現(xiàn)視頻數(shù)據(jù)穩(wěn)定展示的關(guān)鍵,其中FPGA到存儲器的數(shù)據(jù)傳輸和存儲器到網(wǎng)口的數(shù)據(jù)傳輸主要通過嵌入式軟件完成。
FPGA對于ARM而言是外設(shè),ARM同F(xiàn)PGA完成數(shù)據(jù)交互需要對兩者互聯(lián)的總線進(jìn)行驅(qū)動,對于本系統(tǒng)需要開發(fā)帶DMA功能的AXI總線驅(qū)動和自定義通信協(xié)議的AXI4_Lite總線驅(qū)動。介于嵌入式軟件功能都是在Linux系統(tǒng)上進(jìn)行開發(fā)的,所以這兩種AXI總線的驅(qū)動軟件開發(fā)需要符合Linux驅(qū)動框架。
4.2.1 AXI4_Lite驅(qū)動軟件設(shè)計
AXI4-Lite是簡化版的AXI4接口,用于較少數(shù)據(jù)量的存儲映射通信,該總線為外設(shè)提供單個數(shù)據(jù)傳輸,主要用于訪問一些低速外設(shè)中的寄存器。本設(shè)計中控制數(shù)據(jù)的交互就是通過在ZYNQ芯片內(nèi)提供的通用AXI接口連接具有AXI通信協(xié)議的自定義功能IP核實現(xiàn)的。完成總線互聯(lián)后,總線上掛載的IP核具有一段I/O地址空間,通過對該地址空間進(jìn)行讀寫操作完成對IP核的控制。
AXI4-Lite總線是按照字節(jié)流進(jìn)行讀寫操作,它屬于Linux驅(qū)動中的字符設(shè)備。由于AXI4_Lite總線驅(qū)動需要實現(xiàn)的功能只有簡單的讀寫操作,因此按照字符設(shè)備驅(qū)動框架完善驅(qū)動程序中的open()、write()、read()、release()等函數(shù),通過獲取設(shè)備樹中描述的IP核I/O地址空間完成物理地址到虛擬地址的映射,最后指定驅(qū)動的出口函數(shù)和入口函數(shù)完成AXI4_Lite的驅(qū)動編寫。加載編譯完成的驅(qū)動后,在Linux系統(tǒng)的“/dev”目錄下生成一個相應(yīng)的文件[19],通過對文件的讀寫實現(xiàn)對總線的讀寫。
4.2.2 AXI4_DMA驅(qū)動軟件設(shè)計
設(shè)計中采用Xilinx提供的AXI4_DMA IP核將經(jīng)過FPGA處理完成后的視頻數(shù)據(jù)通過DMA的方式從FPGA傳輸?shù)酱鎯ζ髦?。AXI4_DMA對于Linux系統(tǒng)而言也是字符設(shè)備,相對于AXI4_Lite總線來說驅(qū)動AXI4_DMA更加復(fù)雜,需要處理DMA的開啟、停止、數(shù)據(jù)等待、讀取數(shù)據(jù)空、中斷異常等情況。進(jìn)行數(shù)據(jù)傳輸時,需要對DMA進(jìn)行初始化,訪問DMA控制寄存器,配置目的地址和待傳輸字節(jié)數(shù)。傳輸完成后,DMA狀態(tài)寄存器中的中斷狀態(tài)通知DMA通道當(dāng)前DMA傳輸已完成。連接到ARM處理器的AXI4_DMA IP核主要有3個數(shù)據(jù)通道:1)S_AXI_LITE,AXI4類型接口,用于初始化與配置DMA;2)S_AXIS_S2MM,AXI4-Stream類型接口,DMA通過此端口接收緩存FIFO輸入的流式數(shù)據(jù),并在DMA內(nèi)將流式數(shù)據(jù)轉(zhuǎn)換為存儲映射數(shù)據(jù);3)M_AXI_S2MM,AXI4類型接口,DMA通過此端口將存儲映射數(shù)據(jù)傳輸?shù)酱鎯ζ髦小XI4_DMA的驅(qū)動軟件除了實現(xiàn)基本的讀寫功能外,還需要通過ioctl()函數(shù)實現(xiàn)對DMA通道傳輸?shù)目刂疲x取當(dāng)前可用的DMA通道數(shù)目,把每個通道的通道號、通道類型、通道方向等相關(guān)信息保存到分配的數(shù)組中。AXI4_DMA IP核如圖8所示。
圖8 AXI4_DMA IP核示意圖
在Linux系統(tǒng)中,應(yīng)用層訪問外設(shè)接口是通過系統(tǒng)調(diào)用從用戶空間進(jìn)入系統(tǒng)內(nèi)核,然后通過驅(qū)動程序中的copy_to_user()和copy_from_user()兩個函數(shù)實現(xiàn)數(shù)據(jù)的交互,應(yīng)用程序獲取外設(shè)數(shù)據(jù)需要從驅(qū)動層拷貝。當(dāng)上位機需要顯示視頻數(shù)據(jù)時,應(yīng)用程序還需將數(shù)據(jù)拷貝至Gstreamer流媒體應(yīng)用。在執(zhí)行視頻顯示的功能中,同一份視頻數(shù)據(jù)需要進(jìn)行兩次拷貝,這會降低整個傳輸鏈路的效率,增加CPU的負(fù)荷和傳輸延遲。為了解決多次拷貝的問題,在編寫AXI4_DMA驅(qū)動時直接將DMA傳輸?shù)哪康牡刂匪诘拇鎯臻g通過EXPORT_SYMBOL內(nèi)核模塊函數(shù)導(dǎo)出,該段存儲空間用作共享內(nèi)存使用。
共享內(nèi)存的方式能夠?qū)崿F(xiàn)數(shù)據(jù)的零拷貝傳輸[20],但是多個驅(qū)動模塊并發(fā)的訪問同一段內(nèi)存時會導(dǎo)致讀寫沖突的問題,因此設(shè)計中將該段共享內(nèi)存虛擬成循環(huán)隊列這種數(shù)據(jù)結(jié)構(gòu),并在導(dǎo)出地址空間的同時也導(dǎo)出寫指針,訪問共享內(nèi)存的其他驅(qū)動程序擁有特有的讀指針,通過讀寫指針的位置差異可以判斷共享內(nèi)存空間中是否存在數(shù)據(jù),有效地解決了多個驅(qū)動模塊對共享資源的并發(fā)訪問。共享內(nèi)存如圖9所示。
圖9 共享內(nèi)存示意圖
程控模塊主要包含網(wǎng)絡(luò)服務(wù)器端、指令解析模塊、DMA傳輸控制、Gstreamer流媒體調(diào)用、外設(shè)控制。程控模塊的是整個設(shè)計的調(diào)度中心,整個系統(tǒng)運行時上位機軟件同設(shè)備通過TCP/IP網(wǎng)絡(luò)協(xié)議建立通信,上位機軟件在參數(shù)設(shè)置或者視頻調(diào)用請求時通過網(wǎng)絡(luò)接口發(fā)送指令至程控模塊,程控模塊通過解析指令執(zhí)行相應(yīng)的功能函數(shù),完成系統(tǒng)自檢、輸入通道選擇、視頻數(shù)據(jù)傳輸?shù)紾streamer流媒體應(yīng)用服務(wù)器端等操作。
軟件實現(xiàn)流程如圖10所示。
圖10 嵌入式軟件的總體設(shè)計流程及模塊控制
利用Xilinx公司的Vivado軟件完成FPGA側(cè)的開發(fā)并導(dǎo)出硬件平臺文件。使用Petalinux軟件構(gòu)建與硬件平臺適配的嵌入式Linux系統(tǒng),系統(tǒng)移植完成后將驅(qū)動軟件及應(yīng)用程序?qū)肭度胧絃inux系統(tǒng)中。完成上述操作后對設(shè)備重新加電,進(jìn)入嵌入式系統(tǒng)后加載驅(qū)動程序并運行應(yīng)用程序,首先實現(xiàn)對設(shè)備的各個模塊進(jìn)行初始化操作、開啟網(wǎng)絡(luò)監(jiān)聽,然后等待遠(yuǎn)程客戶端接入。
功能測試:將遠(yuǎn)程監(jiān)視設(shè)備和圖像采集設(shè)備接入同一子網(wǎng)下進(jìn)行網(wǎng)絡(luò)傳輸及視頻展示測試,測試步驟如下:
1)將設(shè)計的圖像采集設(shè)備與計算機通過網(wǎng)線相連,直流電源與采集設(shè)備通過12 V電源線相連,設(shè)置直流電源電流為3 A并輸出;
2)在PC中啟動上位機軟件,設(shè)置圖像采集設(shè)備的IP地址,點擊“打開連接”;
3)將視頻源與圖像采集設(shè)備的輸入通道相連并輸出圖像數(shù)據(jù)。通過上位機軟件配置需要查看的采集通道,并開啟視頻數(shù)據(jù)的傳輸。
上位機軟件自帶視頻顯示窗口,當(dāng)數(shù)據(jù)傳輸關(guān)閉時,顯示窗口默認(rèn)為黑屏狀態(tài),配置菜單欄為不可配置狀態(tài)。軟件狀態(tài)如圖11所示。
圖11 圖像采集系統(tǒng)人機交互界面
當(dāng)上位機軟件與圖像采集設(shè)備建立網(wǎng)絡(luò)連接且采集設(shè)備完成自檢給上位機軟件反饋自檢成功信號后,人機交互界面的其他控制窗口切換到可配置狀態(tài)。配置采集設(shè)備打開通道1,并開啟遠(yuǎn)程采集,實驗結(jié)果如圖12所示。
圖12 圖像采集遠(yuǎn)程顯示效果
顯示窗口左上方顯示采集數(shù)據(jù)的展示時長及圖像展示幀數(shù)的累加,整個視頻采集展示的過程是十分流暢,刷新率每秒25幀,完全與前端ADC采集速率一致。
本設(shè)計通過利用ARM和FPGA融合的ZYNQ芯片在軟硬件方面對圖像的采集流程進(jìn)行了優(yōu)化,通過多次測試驗證,整個圖像采集系統(tǒng)的傳輸延時顯著降低,圖像數(shù)據(jù)的遠(yuǎn)程網(wǎng)絡(luò)傳輸穩(wěn)定高。本設(shè)計能夠應(yīng)用在需要遠(yuǎn)程圖傳且對延時有要求圖像處理系統(tǒng)中。由于本設(shè)計器件選型原因,單使用FPGA內(nèi)部的分布式RAM(random access memory)資源無法緩存大量的原始圖像數(shù)據(jù),因此需要通過運算減少一些對圖像影響較小的圖像數(shù)據(jù)量來滿足傳輸過程中的緩存要求。后期設(shè)計可以在ZYNQ芯片PL側(cè)連接一定容量的DDR3存儲器對整個系統(tǒng)進(jìn)一步優(yōu)化。