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