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