李明偉,劉 鵬
(大連理工大學(xué) 信息與通信工程學(xué)院,遼寧 大連116024)
高幀頻和高分辨率的圖像采集在高科技研究、工業(yè)、醫(yī)療、交通等眾多領(lǐng)域有著廣泛的應(yīng)用,例如航天和軍工中高速物體運動軌跡的捕捉、3D動漫、視頻定位和測量、高速公路交通監(jiān)控等。然而,連續(xù)的圖像采集將產(chǎn)生巨大的數(shù)據(jù)量,要實時遠程傳輸并存儲這些圖像數(shù)據(jù),就必須解決數(shù)據(jù)量的問題。
光纖通信技術(shù)具有頻帶寬、損耗低、抗干擾能力強等優(yōu)點,廣泛應(yīng)用于大量數(shù)據(jù)的遠程傳輸。與PCI、PCI-X總線相比,PCI Express(以下簡稱 PCI-E)總線采用了串行點對點通信,傳輸速率有了很大提高,PCI-E 1.0單通道的單向速率高達 2.5 Gb/s,且最大支持32位通道[1]。最新發(fā)布的PCI-E 3.0標準將單通道速率提高到了 8 Gb/s,使得PCI-E代替?zhèn)鹘y(tǒng)的PCI總線成為了必然的趨勢。因此,選用光纖通信技術(shù)和PCI-E總線進行傳輸系統(tǒng)設(shè)計,使得高速圖像到計算機端的實時遠程傳輸成為可能,且具有很大的研究和應(yīng)用價值。
系統(tǒng)的整體設(shè)計方案如圖1所示,本文設(shè)計的高速圖像數(shù)據(jù)用于傳輸前端光纖相機采集的圖像數(shù)據(jù)。
在硬件上,采用Spartant-6 FPGA為主控器設(shè)計了PCI-E光纖卡,實現(xiàn)光模塊的數(shù)據(jù)收發(fā)以及整個PCI-E協(xié)議,使得設(shè)計簡潔緊湊且易升級。SFP光模塊完成光電信號的相互轉(zhuǎn)換,BPI Flash用于存儲FPGA的配置數(shù)據(jù)。板上時鐘源有兩個,一個來自主板的125 MHz時鐘,用于PCI-E協(xié)議的實現(xiàn);一個是25 MHz的時鐘晶振,通過PLL芯片5倍頻后用于FPGA內(nèi)GTP收發(fā)器的參考時鐘。在主機端,開發(fā)了Windows XP下的PCI-E驅(qū)動程序和MFC應(yīng)用程序,完成高速圖像的接收、處理、顯示以及存儲等功能。
FPGA作為PCI-E光纖卡的核心控制器,不僅要完成光纖接口的數(shù)據(jù)收發(fā),還要通過PCI-E總線與主機通信。由此可見,FPGA邏輯設(shè)計是系統(tǒng)設(shè)計的重點和難點,圖2給出了FPGA內(nèi)部邏輯框圖。在接收圖像時,SFP光模塊接收到的串行數(shù)據(jù)流先經(jīng)GTP完成串并轉(zhuǎn)換,經(jīng)過必要的處理后送進FIFO。FIFO可編程標志位有效時,DMA控制模塊根據(jù)主機設(shè)置的參數(shù)發(fā)起DMA傳輸,按照事務(wù)層接口時序要求,組裝數(shù)據(jù)包發(fā)送給PCIE硬核,PCI-E硬核通過PCI-E協(xié)議向主機發(fā)送數(shù)據(jù)。主機端向光纖相機發(fā)送命令的過程類似,這里不再贅述。
系統(tǒng)選用的FPGA型號為XC6SLX45TFGG484,它內(nèi)嵌了一個PCI-E硬核模塊,符合 PCI-E Base Specification V1.1標準,支持X1通道,單向鏈路速率可達 2.5 Gb/s[2]。
PCI-E硬核的頂層功能模塊分為事務(wù)層、數(shù)據(jù)鏈路層、物理層和配置管理層四部分。事務(wù)層負責(zé)事務(wù)層數(shù)據(jù)包(TLP)的接收、緩存和發(fā)送,為了提高通信效率,還實現(xiàn)了PCI兼容的事務(wù)排序規(guī)則,并通過基于信用度的流控制協(xié)議來管理TLP緩沖區(qū)。數(shù)據(jù)鏈路層用于保證TLP傳輸?shù)目煽啃裕峁┝隋e誤檢測和恢復(fù)、初始化服務(wù)、DLLP的生成與拆解等服務(wù)。物理層使用GTP高速收發(fā)器實現(xiàn),分為邏輯子層和電氣子層:邏輯子層通過鏈路訓(xùn)練與狀態(tài)指示狀態(tài)機完成鏈路初始化、訓(xùn)練以及維護工作,并且實現(xiàn)了擾碼與解擾碼、8/10 bit編碼與解碼等功能;電氣子層負責(zé)輸入輸出差分信號的接收與發(fā)送。配置管理層實現(xiàn)了PCI配置空間、電源管理以及中斷等功能。
PCI-E硬核模塊提供給用戶四類接口:系統(tǒng)接口是時鐘和復(fù)位接口;鏈路接口用于連接板卡的金手指;事務(wù)層接口用于TLP的發(fā)送和接收;配置接口用于配置空間的訪問以及中斷信號的發(fā)送。在進行DMA控制模塊設(shè)計時,主要使用事務(wù)層接口和配置接口。
PCI-E總線的數(shù)據(jù)傳輸有可編程輸入/輸出 (PIO)和直接內(nèi)存存取(DMA)兩種方式。PIO方式通過CPU執(zhí)行I/O端口命令進行數(shù)據(jù)讀寫,用于傳輸少量的數(shù)據(jù)。DMA方式在無CPU參與的情況下對存儲器進行數(shù)據(jù)讀寫,適合大量的數(shù)據(jù)傳輸[3]。為了接收大量的圖像數(shù)據(jù),實現(xiàn)DMA傳輸控制邏輯,分為接收引擎、發(fā)送引擎、端點內(nèi)存和中斷控制4個模塊。
接收引擎用于解析從PCI-E硬核接收到的TLP,包括存儲器讀請求TLP和存儲器寫請求TLP,圖3給出了接收引擎的控制狀態(tài)機。系統(tǒng)復(fù)位后,狀態(tài)機處于空閑狀態(tài)(DMA_RX_RST),接收到數(shù)據(jù)包后,立即對數(shù)據(jù)包包頭進行解析并判斷TLP類型,然后跳轉(zhuǎn)到相應(yīng)狀態(tài)。通過RX_MEM_RD32_QW1和RX_MEM_RD32_QW2對存儲器讀請求TLP的參數(shù)進行解析并通知發(fā)送模塊進行響應(yīng),在RX_MEM_RD32_WT狀態(tài)等待發(fā)送模塊操作完成并返回空閑狀態(tài)。對存儲器寫請求 TLP的操作通過RX_MEM_WR32_QW1、RX_MEM_WR32_QW2和RX_MEM_WR32_QW3三個狀態(tài)完成,在RX_MEM_WR32_WT狀態(tài)等待TLP完成并返回空閑狀態(tài)。
發(fā)送引擎負責(zé)TLP的封裝,完成對存儲器讀TLP的響應(yīng),并背靠背地進行存儲器寫TLP的發(fā)送。發(fā)送引擎控制狀態(tài)機如圖4所示。復(fù)位后,狀態(tài)機處于空閑狀態(tài)(TX_RST_STATE),根據(jù)條件分別發(fā)送完成TLP和儲存器寫TLP。當(dāng)收到接收引擎發(fā)來的請求信號后,立即發(fā)送完成包的包頭的第一個雙字,并通過TX_CPLD_QW1、TX_CPLD_QW2、TX_CPLD_QW3 三 個 狀態(tài)發(fā)送數(shù)據(jù)包的其他部分。DMA傳輸?shù)倪^程中,當(dāng)FIFO可編程滿標志和DMA寫開始信號均有效時,進入TX_MWR_READY狀態(tài)發(fā)送存儲器寫TLP的包頭,然后通過TX_MWR_QW1和TX_MWR_QW2發(fā)送其他參數(shù),最后在TX_MWR_QWN發(fā)送數(shù)據(jù)負載。每個儲存器寫TLP發(fā)送完畢后重新返回TX_MWR_READY狀態(tài),而每次DMA傳輸完成后進入空閑狀態(tài),等待下次DMA傳輸?shù)拈_始。
使用FPGA內(nèi)RAM塊實現(xiàn)了端點內(nèi)存,大小為1KB,被映射到計算機的存儲器空間,用于實現(xiàn)DMA控制寄存器和存儲主機發(fā)給光纖相機的命令。
中斷控制模塊用來控制PCI-E硬核中斷的發(fā)送和禁止,根據(jù)中斷時序設(shè)計狀態(tài)機實現(xiàn)。PCI-E總線支持消息信號中斷和傳統(tǒng)中斷。由于使用的Windows XP操作系統(tǒng)不支持消息信號中斷,因此只能使用傳統(tǒng)中斷,可以通過PCI-E硬核配置向?qū)нM行設(shè)置。
光纖收發(fā)模塊完成光纖通路上的數(shù)據(jù)收發(fā),包括GTP硬核、PLL、DCM、數(shù)據(jù)接收和數(shù)據(jù)發(fā)送5個子模塊。
GTP硬核模塊是通過ISE IP核生成向?qū)傻?,用來對GTP硬核進行配置。設(shè)計中,GTP主要參數(shù)設(shè)置以及注意到的問題有:(1)參考時鐘REFCLK使用外部提供的125 MHz時鐘,由于GTP對時鐘要求比較嚴格,一般不使用FPGA內(nèi)部DCM或PLL產(chǎn)生的時鐘作為參考時鐘。(2)使用自定義的鏈路協(xié)議,鏈路速率為2.5 Gb/s,使用8/10 bit編碼。(3)comma碼的設(shè)置是鏈路協(xié)議傳輸?shù)年P(guān)鍵,使用K28.5作為comma碼。(4)物理電氣參數(shù)的設(shè)置因外部SFP光模塊的使用而不同,比如TX預(yù)加重、RX均衡、耦合電容、差分電平擺幅等,使用時必須使用Xilinx提供的 IP核 IBERT進行測試[4]。
光纖通路使用自定義的協(xié)議:(1)鏈路空閑時一直發(fā)送comma碼K28.5,工作時發(fā)送需要的數(shù)據(jù)碼。(2)傳輸圖像時,為每幀圖像添加幀頭和幀尾,以定界每幀圖像。發(fā)送模塊負責(zé)向圖像采集卡發(fā)送控制命令,用來設(shè)置圖像傳感器的參數(shù)。接收模塊接收GTP輸出的并行數(shù)據(jù)流,去除comma字符 K28.5和圖像幀頭幀尾,將圖像數(shù)據(jù)流寫入FIFO。
在Windows操作系統(tǒng)中,為了保證系統(tǒng)的安全性、穩(wěn)定性和可移植性,用戶模式的應(yīng)用程序必須通過驅(qū)動程序才能對硬件進行操作[5]。本設(shè)計使用Windows DDK開發(fā)了PCI-E接口的驅(qū)動程序,采用WDM驅(qū)動模式,支持即插即用操作。
圖5為驅(qū)動程序開發(fā)流程。當(dāng)驅(qū)動程序收到應(yīng)用程序啟動DMA傳輸請求后,首先設(shè)置DMA傳輸參數(shù),然后開始DMA傳輸并等待中斷產(chǎn)生。驅(qū)動收到中斷后,如果判斷是PCI-E光纖卡產(chǎn)生的,就立刻轉(zhuǎn)到延遲過程調(diào)用DPC函數(shù),在其中設(shè)置觸發(fā)事件通知應(yīng)用程序,并啟動下一次傳輸。在本驅(qū)動程序中,申請了8塊DMA緩沖區(qū)進行輪流傳輸,這樣既可以提高DMA傳輸?shù)男?,又方便?yīng)用程序?qū)彺鎱^(qū)內(nèi)的圖像數(shù)據(jù)進行操作。
根據(jù)需要,使用VC++6.0開發(fā)了基于MFC的應(yīng)用程序,完成了圖像的處理、顯示、存儲、回放等功能。采用多線程編程,提高了程序的運行效率,在實時顯示視頻圖像的同時,還可以完成圖像存儲工作。圖像顯示使用DirectDraw函數(shù)組,直接將圖像數(shù)據(jù)送入顯存,充分發(fā)揮顯卡性能,消除了圖像閃爍現(xiàn)象。使用固態(tài)硬盤進行圖像數(shù)據(jù)的存儲,克服了普通硬盤讀寫速度慢的問題。在圖像存儲完成之后,可以對存儲的視頻圖像進行慢放,便于對高速運動的物體軌跡進行細致觀察,并且可以調(diào)整回放的幀率。應(yīng)用程序的功能結(jié)構(gòu)及其與驅(qū)動程序的關(guān)系如圖6所示。
FPGA內(nèi)邏輯均采用Verilog HDL實現(xiàn),使用Xilinx ISE Design Suite 12.3完成整個FPGA流程的開發(fā),包括仿真、綜合、布局布線、調(diào)試等。利用 Xilinx的IBERT IP核進行光纖模塊的測試,通過實時地改變GTP的各種參數(shù)來觀察鏈路的狀況。對光纖鏈路進行長時間測試發(fā)現(xiàn),鏈路十分穩(wěn)定,誤碼率比較小,基本在-10數(shù)量級內(nèi)。驅(qū)動開發(fā)前,使用WinDriver進行寄存器讀寫和中斷監(jiān)聽,以驗證PIO操作和中斷發(fā)送的正確性。在安裝了驅(qū)動程序后就可以進行DMA傳輸,傳輸過程中使用ChipScope捕獲波形進行調(diào)試。
本實驗使用的光纖相機最大能以80幀/s的幀率采集1 280×1 024大小的圖像,其數(shù)據(jù)速率約為 563 Mb/s。主機硬件采用Intel i5平臺的組裝機,操作系統(tǒng)為Windows XP SP3。經(jīng)長時間連續(xù)工作測試,可以完成圖像顯示及儲存工作,且系統(tǒng)工作穩(wěn)定可靠。圖7為系統(tǒng)測試時軟件的工作界面。
本設(shè)計中,光纖通路的最高速率可達2.5 Gb/s,所以系統(tǒng)傳輸速率主要取決于PCI-E總線的實際傳輸速率。由于實驗中光纖相機產(chǎn)生的圖像數(shù)據(jù)速率有限,因此在FPGA內(nèi)產(chǎn)生仿真圖像數(shù)據(jù)進行PCI-E最大傳輸速率的測試。經(jīng)過多次測試后發(fā)現(xiàn),本設(shè)計中PCI-E總線DMA傳輸最大速率可達1.2 Gb/s,而理論上PCI-E X1通道的單向傳輸速率為2.5 Gb/s(考慮8/10 bit編碼效率)。經(jīng)詳細分析,限制其傳輸速率的主要因素有:(1)系統(tǒng)采用中斷方式,主機對中斷的響應(yīng)會占用一定時間;(2)PCIE數(shù)據(jù)包有一定的包頭信息,目前使用的數(shù)據(jù)包大小為128 B,要提高速率可以改用512 B數(shù)據(jù)包,但是這需要硬件平臺的支持。
本文利用光纖通信和PCI-E總線實現(xiàn)了一種高速圖像傳輸系統(tǒng),選用Xilinx Spartant-6系列FPGA進行硬件設(shè)計,并開發(fā)了主機端的驅(qū)動程序和應(yīng)用程序,是一套低成本的高速傳輸解決方案。測試表明,系統(tǒng)速率可達1.2 Gb/s,且工作穩(wěn)定,基本能滿足大多數(shù)高清高幀視頻圖像的實時傳輸需求。
[1]BUDRUK R,ANDERSON D,SHANLEY T.PCI express系統(tǒng)體系結(jié)構(gòu)標準教材[M].田玉敏,王崧,張波,譯.北京:電子工業(yè)出版社,2005.
[2]Xilinx,Inc.Spartan-6 FPGA integrated endpoint block for PCI express user guide[Z].2010.
[3]Peng Yu,Li Bo,Liu Datong,et al.A high speed DMA transaction method for PCI express devices[J].Journal of Electronic Science and Technology of China,2009,7(4):380-384.
[4]Xilinx,Inc.Spartan-6 FPGA GTP transceivers advance product specification[Z].2010.
[5]ONEY W.Programming microsoft windows driver model[M].Washington:Microsoft Press,1999.