基于FPGA的雙緩沖模式PCI Express總線設(shè)計方案
引言 近年來軟件無線電(SDR)得到了飛速的發(fā)展,在很多領(lǐng)域已顯示出其優(yōu)越性。本文的項目背景是通過軟件無線電方式實現(xiàn)數(shù)字音頻廣播(DAB)的基帶信號處理,這要求軟件無線電平臺具有高速實時數(shù)字信號處理與傳輸能力。高速可編程邏輯器件(FPGA)和豐富的IP核提供了能高效實現(xiàn)軟件無線電技術(shù)的理想平臺。 1 PCIE總線方案論證 PCIE是第3代I/O總線互聯(lián)技術(shù),如今已成為個人電腦和工業(yè)設(shè)備中主要的標準互聯(lián)總線。與傳統(tǒng)的并行PCI總線相比,PCIE采用串行總線點對點連接,具有更高的傳輸速率和可擴展性。例如本文采用的8通道1代PCIE 2.0硬核的理論傳輸速率是4 GB/s[1],其總線位寬亦可根據(jù)需求選擇×1、×2、×4和×8通道。與其他的串行接口(如RapidIO和Hypertransport)相比,PCIE具有更好的性能和更高的靈活性[2]. 1.1 PCIE總線實現(xiàn)方式 目前,PCI Express總線的實現(xiàn)方式主要有兩種:基于專用接口芯片ASIC和基于IP核的可編程邏輯器件FPGA方案。前者通常采用ASIC+FPGA/DSP的組合方式,專用PCIE接口芯片(如PEX8311)避免用戶過多地接觸PCIE協(xié)議,降低了開發(fā)難度;但其硬件電路設(shè)計復雜,功能固定,靈活性和可擴展性較差。后者使用IP核實現(xiàn)PCIE協(xié)議,用戶可以開發(fā)其所需的功能和驅(qū)動,具有可編程性和可重配置能力;另外,單片F(xiàn)PGA降低了成本和電路復雜程度,更符合片上系統(tǒng)(SoC)的設(shè)計思想。本文采用Xilinx公司Virtex6 FPGA和PCIE集成塊,實現(xiàn)雙緩沖模式的高速PCIE接口設(shè)計。 1.2 雙緩沖與單緩沖比較 以寫操作(數(shù)據(jù)從FPGA到內(nèi)存)為例,雙緩沖PCIE系統(tǒng)框圖如圖1所示。為描述方便,將該FPGA片上系統(tǒng)命名為SRSE(Software Radio System with PCI Express)。 圖1 雙緩沖PCIE系統(tǒng)框圖 PC端的驅(qū)動程序在系統(tǒng)內(nèi)存上為SRSE分配了兩個緩沖區(qū)(WR_BUF1/2)用于數(shù)據(jù)存儲,這兩個緩沖區(qū)的地址信息分別存儲在FPGA端的DMA寄存器(DAM_Reg1/2)中。Root Complex連接CPU、內(nèi)存和PCIE器件,它代表CPU產(chǎn)生傳輸請求[3];PCIE核是Xilinx公司提供的集成塊程序,實現(xiàn)PCIE協(xié)議的處理;DMA(直接存儲器訪問)引擎用于實現(xiàn)DSP核和PCIE器件間的高速數(shù)據(jù)存儲與交換;DSP(數(shù)字信號處理)核是用戶設(shè)計的算法或應(yīng)用程序。以圖1為例,DSP核將產(chǎn)生的數(shù)據(jù)寫入TX_FIFO,DMA引擎將數(shù)據(jù)以傳輸層數(shù)據(jù)包(TLP)的形式發(fā)送至PCIE核,其中數(shù)據(jù)包的頭信息來自寄存器DMA_Reg1.當SRSE將數(shù)據(jù)寫入緩沖區(qū)WR_BUF1時,驅(qū)動分配另外一塊緩沖區(qū)WR_BUF2并將該緩沖區(qū)的地址信息寫入寄存器DMA_Reg2中;當DMA引擎發(fā)出WR_BUF1的寫操作消息中斷(MSI)后,DMA控制器將數(shù)據(jù)包的頭信息切換至DMA_Reg2,驅(qū)動將緩沖區(qū)切換至WR_BUF2,繼續(xù)傳輸數(shù)據(jù)。 圖2 PCIE總線中斷延遲測量 與雙緩沖相對應(yīng)的是單緩沖模式。以寫操作為例,驅(qū)動程序每次在內(nèi)存上分配一個緩沖區(qū)WR_BUF,該緩沖區(qū)的地址信息存儲在DMA寄存器DMA_Reg中。當寫滿緩沖區(qū)WR_BUF時,DMA引擎會產(chǎn)生MSI中斷,并通過PCIE核通知驅(qū)動程序。驅(qū)動分配新的緩沖區(qū),并將該緩沖區(qū)地址通過PCIE總線寫入DMA寄存器DMA_Reg中。中斷的傳輸和DMA寄存器的更新會產(chǎn)生一定延時,這需要較大的TX_FIFO來存取延時期間DSP核產(chǎn)生的數(shù)據(jù)。 為精確測量中斷延時時間,搭建了基于DELL T3400型PC和ML605開發(fā)套件的平臺,通過ChipScope觀察的波形結(jié)果如圖2所示。DMA中斷發(fā)生在時刻0(mwr_done:0博1);然后PCIE核向驅(qū)動發(fā)出MSI中斷,驅(qū)動程序查詢中斷寄存器發(fā)生在時刻2241(irq_wr_accessed:1博0);驅(qū)動程序分配新的內(nèi)存緩沖區(qū),然后更新DMA寄存器發(fā)生在時刻2802(wr_dma_buff0_rdy:0博1)。在這2802個時鐘周期內(nèi),PCIE器件無法將數(shù)據(jù)寫入內(nèi)存。PCIE的時鐘頻率為250 MHz,所以中斷延時T=2802×(1/250 MHz)=11.2 μs.假定DSP核產(chǎn)生數(shù)據(jù)的速率為200 MB/s,中斷延時期間將產(chǎn)生11.2 μs×200 MB/s=2241 B大小的數(shù)據(jù)。考慮到其他不可預(yù)測因素,如中斷堵塞等,為了不丟失數(shù)據(jù),TX_FIFO至少需要幾KB的空間。這對于FPGA內(nèi)寶貴的硬件資源(如Block RAM)來說是嚴峻的挑戰(zhàn)。 與單緩沖模式相比,雙緩沖模式優(yōu)點歸納如下: ① 更新緩沖區(qū)不會引入中斷延時,這意味著較小的FIFO即可滿足需求,節(jié)約了硬件資源。 ?、?雙緩沖模式延長了驅(qū)動程序處理中斷的時間,也使緩沖區(qū)數(shù)據(jù)的處理更加容易,丟包率大大減小。 ③ 數(shù)據(jù)的傳輸和內(nèi)存緩沖區(qū)的數(shù)據(jù)處理可以并行處理,系統(tǒng)的實時性得到保證。 ?、?雙緩沖更適合Scatter/Gather DMA,取代block DMA,從而提高內(nèi)存效率。 2 軟件無線電平臺設(shè)計 軟件無線電基于可編程、可重構(gòu)的通用硬件平臺,通過加載不同的軟件實現(xiàn)不同的無線電功能,廣泛應(yīng)用于軍用和民用領(lǐng)域。為了能夠?qū)崿F(xiàn)復雜的算法,其平臺需要具備高速數(shù)據(jù)交換和實時信號處理的能力。該設(shè)計參考Xilinx ML605開發(fā)套件,基于Xilinx Virtex6 LX240T FPGA芯片,通過增加相應(yīng)的模塊搭建通用的軟件無線電平臺。 軟件無線電原理框圖如圖3所示。信號獲取模塊采用兩片ADC和DAC以實現(xiàn)IQ兩路信號的數(shù)模轉(zhuǎn)換;通信模塊由以太網(wǎng)和USBRS232接口組成;擴展卡可以是射頻發(fā)射機或接收機,通過擴展卡接口與母板相連;JTAG接口提供在線編程和內(nèi)部測試功能;存儲器件包括512 MB DDR3內(nèi)存和128 MB平臺Flash,分別用于動態(tài)數(shù)據(jù)存儲和配置FPGA;人機接口由LED/LCD、按鍵和開關(guān)等元件組成,實現(xiàn)人機對話;200 MHz有源晶振和SMA時鐘接口組成時鐘輸入模塊,向FPGA提供時鐘基準;8通道PCIE接口和IP核實現(xiàn)平臺與PC間高速數(shù)據(jù)交換。 圖3 軟件無線電原理框圖 3 雙緩沖模式PCIE總線設(shè)計 3.1 PCIE驅(qū)動設(shè)計 PC端基于Linux(Ubuntu 10.10)操作系統(tǒng)。該操作系統(tǒng)免費開源,安全穩(wěn)定靈活,適合低成本軟件開發(fā)。驅(qū)動程序包含數(shù)據(jù)流接口和控制接口。數(shù)據(jù)流接口用于Linux用戶空間和SRSE平臺間高速的數(shù)據(jù)交換;控制接口使用戶可以觀察和配置SRSE平臺寄存器,例如通過控制接口,用戶可以在PC端改變SRSE平臺的調(diào)諧頻率等參數(shù)。數(shù)據(jù)流接口是雙向獨立的,支持雙/單工,即可以同時讀和寫數(shù)據(jù)。以數(shù)據(jù)發(fā)送(從PC到SRSE)為例,用戶空間調(diào)用write()函數(shù)將任意數(shù)量的數(shù)據(jù)發(fā)送至驅(qū)動,驅(qū)動整理數(shù)據(jù)碎片以滿足PCIE對數(shù)據(jù)對齊和傳輸塊數(shù)據(jù)量的要求。當數(shù)據(jù)滿足4096字節(jié),驅(qū)動將數(shù)據(jù)塊發(fā)送至Root Complex并保留已發(fā)送數(shù)據(jù)的列表,等待接收來自SRSE平臺的寫操作中斷。PCIE驅(qū)動數(shù)據(jù)接收的原理如圖4所示。當用戶空間調(diào)用read()函數(shù)或者驅(qū)動接收到來自PCIE設(shè)備的數(shù)據(jù)時,驅(qū)動初始化讀操作。驅(qū)動程序?qū)⒈3肿枞╞locking),直到用戶空間調(diào)用read()函數(shù),并且已接收到足夠的數(shù)據(jù)包,從而能夠填滿read()請求的數(shù)據(jù)量。碎片整理模塊對已接收的數(shù)據(jù)進行整理,然后將數(shù)據(jù)塊返回至用戶空間,并通知其解除驅(qū)動阻止。
評論