(長沙理工大學 物理與電子科學學院 湖南 長沙 410114)
隨著信息化時代的到來,人們對視頻畫面的細膩程度要求越來越高,因此實時傳輸高清視頻圖像成為一種趨勢[1]。USB接口作為生活中最普遍的接口,在圖像傳輸中扮演著不可或缺的角色,而傳統基于USB2.0接口的傳輸模塊一般將視頻壓縮后進行傳輸,以犧牲畫面質量完成圖像的傳輸,其傳輸效率已經不能滿足市場的需求。隨著USB3.0協議的發(fā)布,其理論速度達到了5 Gbit/s,以優(yōu)于USB2.0 480 Mbit/s 10倍的速率,成為高清視頻傳輸的新寵。國內市場視頻傳輸系統多采用標準串行接口,而采集DVI 接口的高清視頻,以5 Gbit/s的吞吐量傳輸多種格式高清視頻的產品較少,因此研究一種基于USB3.0的高清視頻傳輸系統具有一定的應用價值。
整個系統至下而上是由DVI接口模塊、FPGA控制模塊、SDRAM、USB3.0模塊和上位機組成,系統框圖如圖1所示。
視頻源通過DVI接口芯片,將視頻轉換為行、場、同步信號和RGB數據傳輸給FPGA,FPGA控制一片SDRAM進行緩存,完成與USB3.0模塊的數據交換,之后CYUSB3014芯片將數據通過USB micro-B接口和USB3.0協議發(fā)送至PC端顯示。
視頻圖像傳輸的基本流程可分為三步:
① 完成一幀視頻圖像數據的采集;
② 完成一幀視頻圖像數據的緩存;
③ 完成一幀視頻圖像數據的發(fā)送。

圖1 系統設計方案框圖
循環(huán)此基本流程即可構成系統的整個工作流程,同樣,基本流程的的吞吐量就是整個系統的數據吞吐量。完成高清視頻傳輸的關鍵是系統數據傳輸吞吐量,能滿足高清視頻的采集速率,也就是系統緩存和發(fā)送吞吐量滿足視頻數據的采集速率。
完成定性分析之后,需要對每個模塊進行一個準確的定量分析。
吞吐量的數學計算公式[2]為
(1)
式中,Total_data為一幀圖像的比特數(bit);Total_lantency為采集或傳輸一幀圖像需要的時間(s)。



顯然,直接傳輸24bit的RGB視頻數據時,TP_USB3_0 高清視頻源經DVI接口模塊采集視頻數據之后傳給FPGA進行視頻編碼,FPGA將編碼后的視頻數據緩存在SDRAM中[3],并使用兩個容量為1024×32-bit的異步FIFO進行視頻數據的跨時鐘域交換,然后通過USB3.0芯片將數據發(fā)送到PC端進行顯示。不同模塊所處的時鐘域如圖2所示。 圖2 各模塊所處時鐘域 FPGA控制邏輯設計包括采集DVI視頻數據時的視頻格式識別和編碼、控制SDRAM進行視頻數據緩存、控制異步FIFO進行跨時鐘域傳輸[4]。 目前主流的視頻格式如表1所示,每一種都有其固定的頻率和像素點,可根據其有效像素頻率分別計數視頻的長度和寬度,通過查表1,可識別目標視頻格式,并產生相對應的編號,插入到幀頭同步碼中。在PC端解出視頻編碼,產生對應的視頻格式緩存區(qū),并顯示。 在SDRAM緩存一幀圖像的前提下,USB3.0模塊要在下一幀圖像到來之前將當前圖像傳輸完。最大分辨率1920像素×1080像素視頻格式一幀的像素點為2200×1125個,頻率為60 Hz,所以實際像素時鐘頻率為f1=2200×1125×60=148.5 MHz,一幀圖像連續(xù)傳輸2200×1125個像素點,每個像素點占24-bit,而實際上每幀有效像素點只有1920×1080個,經過RGB轉YUV后每個像素點只有16-bit,FIFO將兩個16-bit數據合成一個32-bit數據再傳到USB3.0模塊,而且經過FIFO存儲后它們不是幀數據那樣的間斷,而是連續(xù)的,所以一幀的時間內,只傳輸了1920×1080/2個32-bit數據,傳輸一幀的時間T1=1/60,因此f2=(1920×1080)/(2×T1)=62.208 MHz,f2為1920×1080視頻格式的有效像素時鐘頻率,同理,其余的視頻格式的有效像素時鐘頻率也可以計算出來,如表1。 表1 不同視頻格式的幀有效像素時鐘 從表1中可以看出,幀有效像素時鐘頻率最高為62.208 MHz,Slave FIFO接口速度為100 MHz,USB3.0模塊完全滿足傳輸條件。當Slave FIFO運行在100 MHz時,由于使用了8B/10B編碼,USB3.0接口的傳輸速度V=100 MHz×10/8×32=4 Gbit/s,V是FX3這款芯片能達到的最高傳輸吞吐率。 SDRAM可將采集到的不連續(xù)的視頻數據,按幀緩存有效視頻數據,保證視頻數據的完整性和連續(xù)性。選用三星公司的K4S643232H-UC60芯片,容量為64 Mbit,其工作頻率可達到166 MHz,為保證系統穩(wěn)定,將其工作頻率定為150 MHz。FPGA將采集到的RGB 24-bit數據轉為YUV 16-bit后,1080p格式的視頻一幀圖像大小Total_bit=1920×1080×16-bit,而SDRAM有21-bit的行列地址線,存儲空間為221×32-bit,所以一片SDRAM可儲存2.02幀圖像;因為在下一幀圖像到來之前,USB3.0模塊能傳完當前圖像,因此只需一片SDRAM每次緩存一幀圖像即可實現圖像的傳輸[3]。 SDRAM狀態(tài)機控制器總共有4個狀態(tài):WAIT_WR_SDR、WR_SDR、WAIT_RD_SDR和RD_SDR,初始狀態(tài)為WAIT_WR_SDR,如圖3所示。SDRAM使用頁突發(fā)的方式進行讀寫,每次讀寫一整行256個32-bit數據。視頻傳輸的關鍵是在讀和寫操作的同時要檢測同步碼,以保證SDRAM中緩存的為一幀完整的圖像[5]。 WAIT_WR_SDR狀態(tài):當(WR_FIFO_RDY==1 && SDRAM_RD_REQ==0),令WR_EN=1,進入WR_SDR狀態(tài);當(WR_FIFO_RDY==0 && SDRAM_RD_REQ ==1),進入WAIT_RD_SDR狀態(tài)。 圖3 SDRAM讀寫控制狀態(tài)機 WR_SDR狀態(tài):在FPGA寫入圖像數據到SDRAM中任一周期,如果檢測到同步碼,則令WR_EN=0,wr_addr=0,進入到WAIT_RD_SDR狀態(tài);否則,則完成當前寫操作后令WR_EN=0并進入WAIT_RD_SDR狀態(tài)。 WAIT_WR_SDR狀態(tài):當(RD_FIFO_RDY==1 && SDRAM_WR_REQ==0),則RD_EN=1,進入RD_SDR狀態(tài);當(RD_FIFO_RDY==0 && SDRAM_WR_REQ ==1),進入WAIT_WR_SDR狀態(tài)。 RD_SDR狀態(tài):在FPGA從SDRAM中讀出圖像數據的任一周期,如果檢測到同步碼,則令RD_EN=0,rd_addr=0,進入到WAIT_WR_SDR狀態(tài);否則,則完成當前讀操作后令RD_EN=0并進入WAIT_WR_SDR狀態(tài)。 CYUSB3014內集成了運行頻率可達到200 MHz的ARM926EJ-S內核,512 KB的嵌入式SRAM[6]。在Cypress官方SDK中的Eclipse開發(fā)環(huán)境下進行固件開發(fā)。固件程序是指由內核控制和調用芯片資源,接收并處理外部命令的代碼。固件的整體框架如圖5所示[7],主要功能為:實現USB3.0協議、GPIF II接口的時序配置和DMA通道的配置[7]。 圖4 USB3.0模塊連接框圖 圖5 FX3固件框架 GPIF II是一種可編程、位寬為32-bit的接口,由一套可編程的存儲器映射的寄存器定義,運行頻率可達到100 MHz,可連接多種類型外部器件[7]。本系統使用FPGA為控制芯片,并選用Slave FIFO接口模式。 使用Cypress提供的GPIF II designer軟件實現特定的GPIF II接口寄存器配置,經過編譯,生成C頭文件,將包含GPIF II寄存器配置的C頭文件加載到Eclipse下的固件工程中,實現EZ-USB FX3的數據傳輸通[8]。設計流程如圖6所示[7]。 圖6 GPIF II設計流程圖 DMA的配置包含Socket(套接字)、DMA Descriptor(DMA描述符)、DMA Buffer(DMA緩存區(qū))以及GPIF Thread(DMA線程)四個要素。Socket是外設硬件模塊(如GPIF、USB和SPI)與 FX3 RAM之間的連接點;DMA Descriptor是一組位于FX3 RAM的寄存器,存儲了DMA緩沖區(qū)的地址和數據及下一描述符的指針,以構建成DMA描述符鏈;DMA Buffer是RAM的一部分,用來暫時存放通過FX3的數據;GPIF Thread是用來將外部數據引腳連接至Socket的專用數據路徑。例如,將視頻數據流從GPIF II接口傳輸給USB模塊;因為不需要修改數據流中的任何數據,所以配置為自動DMA通道。傳輸視頻數據流使用FX3超高速stream模式,此時需要配置兩個DMA通道,一個是GPIF II端口到USB端口的P2U通道,一個是USB端口到GPIF II端口的U2P通道,通道的傳輸吞吐率由緩沖區(qū)的數量決定,由于FX3硬件資源有限,且主要是實現視頻流從下位機傳輸到上位機的過程,因此將P2U通道定位優(yōu)先通道,配置8個緩存區(qū),U2P通道配置4個緩存區(qū),如圖7所示[8]。 圖7 串流輸入的DMA傳輸設置 使用Cypress官方提供的示例驅動,實現CYUSB3014芯片的枚舉與通信。使用Microsoft Visual Studio 2010軟件編寫應用程序,在Cypress公司提供的USB Control Center工具的基礎上[9],添加了視頻顯示界面,如圖8所示。上位機功能包括檢測并枚舉USB設備、下載固件到USB芯片RAM或Flash中、對下位機傳來的數據進行幀頭檢測、將視頻數據去幀頭后按幀保存并顯示圖像;使用Cypress官方測速工具Streamer測試Stream_IN或Stream_OUT模式時的傳輸速率和丟包現象。上位機是按字節(jié)讀取CYUSB3014中的數據,每次1 B,每2 B為一個像素點數據,如果是800×600格式的視頻,則將幀頭之后的數據保存到數組RGB_buff[600,1600]中,此時數組中保存的為一幀圖像的數據。 系統測試分為兩個階段,首先是分模塊進行測試,使用Xilinx的Chipsocpe工具和示波器調試每個模塊,確保硬件電路的正常,然后進行FPGA時序仿真,編寫邏輯代碼,進行系統聯調。 視頻圖像在傳輸過程中不能丟失數據,否則在PC端顯示時,畫面會產生抖動、錯位等很明顯的問題。因此先用FPGA產生DVI格式的自加數據給上位機顯示,以便于觀察圖像數據的完整性和正確性,如圖9所示,圖像正確顯示且無丟數、錯位現象。 圖9 DVI測試數據 用帶DVI接口的臺式機主機播放高清視頻模擬視頻源,測試視頻格式分辨率為1920×1080@60Hz,用示波器觀察TFP401A的時鐘、行和場同步信號頻率輸出,經測試TFP401A正常工作,如圖10所示。 圖10 1920×1080@60Hz的行同步信號和像素時鐘 啟動傳輸,如圖11所示,圖像正常顯示,無丟數、錯位現象。 圖12為Chipscope在線邏輯分析儀抓取FPGA讀出SDRAM中同步碼的時刻,意味著一幀視頻圖像數據傳輸完成,此時對SDRAM讀地址復位清零;同步碼為0xF08421、0xAA5580、0x3BE6E6,連續(xù)3個數據是為了不與像素數據重復,其中0xAA5580中的8’h80代表該視頻流格式為1920×1080。使用Cypress官方測速工具Streamer測試Stream_IN模式時的傳輸速率,如圖13所示,V_Stream_IN=330800(KB/s)/1024=323.05 MB/s。 圖12 SDRAM讀出同步碼 圖13 Stream_IN模式時傳輸速率 為解決USB2.0帶寬不夠、速度較慢,其余接口便攜性不好而無法或不適合傳輸高清視頻的問題,設計了基于FPGA的USB3.0的高清視頻傳輸系統,經過實際測試,所設計的傳輸系統,可傳輸8種主流分辨率的視頻格式,靈活便攜,較傳統的USB2.0傳輸系統相比,極大提升了傳輸性能,滿足了項目可靠、高速、便捷的設計要求,且USB3.0模塊采用兩層板設計,減少了成本。同時,因為采用模塊化,預留了DVI輸出接口,可從上位機傳輸高清視頻到顯示器上,功能更加完善。
2 FPGA控制邏輯設計
2.1 視頻格式識別和編碼
2.2 帶寬計算

2.3 SDRAM控制邏輯

3 USB3.0模塊的設計

3.1 CYUSB3014固件程序設計


3.2 GPIF II接口

3.3 DMA通道

4 上位機設計
5 仿真與系統測試
5.1 硬件與FPGA固件調試


5.2 系統測試


6 結束語