(西安工業(yè)大學(xué) 光電工程學(xué)院,西安710021)
隨著系統(tǒng)性能、功能和帶寬的提高,高速數(shù)據(jù)采集與記錄以及其他數(shù)據(jù)處理的數(shù)據(jù)吞吐量都日益增長(zhǎng)。因此通過(guò)研究發(fā)展新的高速接口技術(shù)來(lái)解決帶寬限制和高速傳輸這些關(guān)鍵問(wèn)題是一種必然趨勢(shì)和迫切的需求。FPGA 已發(fā)展成為實(shí)現(xiàn)數(shù)字系統(tǒng)的主流平臺(tái)之一,廣泛應(yīng)用于信號(hào)處理及通信等各個(gè)領(lǐng)域。FPGA 在信號(hào)處理時(shí)可并行運(yùn)行,處理速度快,但不適合實(shí)現(xiàn)高精度復(fù)雜的運(yùn)算處理[1]。而PC計(jì)算機(jī)具備相當(dāng)強(qiáng)大的計(jì)算和數(shù)據(jù)處理能力,所以通常情況下會(huì)將需要進(jìn)行高精度復(fù)雜的計(jì)算交由計(jì)算機(jī)負(fù)責(zé)處理。這就涉及到FPGA 與PC 間進(jìn)行大量數(shù)據(jù)的傳輸問(wèn)題,因此構(gòu)建PC 機(jī)與FPGA 的高速數(shù)據(jù)傳輸系統(tǒng)成為當(dāng)前的研究趨勢(shì)。本文根據(jù)當(dāng)前研究趨勢(shì)和實(shí)際科研項(xiàng)目要求,對(duì)PCIE 高速數(shù)據(jù)傳輸進(jìn)行了深入研究,并設(shè)計(jì)了基于RIFFA架構(gòu)下的PCIE 高速數(shù)據(jù)傳輸系統(tǒng)來(lái)實(shí)現(xiàn)FPGA 與PC機(jī)之間的數(shù)據(jù)通信[2-4]。
傳統(tǒng)使用狀態(tài)機(jī)設(shè)計(jì)PCIE 接口,結(jié)構(gòu)復(fù)雜,容易丟包錯(cuò)包,使用Block DMA 的方式發(fā)送數(shù)據(jù),但不能使用連續(xù)的地址發(fā)送數(shù)據(jù),必須要多次打包數(shù)據(jù)再發(fā)送,這就限制了DMA 的性能。而基于RIFFA架構(gòu)下的PCIE 高速數(shù)據(jù)傳輸采用的是SGDMA 方式進(jìn)行數(shù)據(jù)的傳輸,板卡順次執(zhí)行鏈表的DMA 指定的信息,在完成最后一個(gè)描述符后通過(guò)一次中斷或查詢(xún)作為操作的結(jié)束,這樣大大提高了數(shù)據(jù)存取的效率[5-6]。充分滿(mǎn)足了數(shù)據(jù)量大、速度快的要求,使得設(shè)計(jì)更加靈活方便,具有很好的移植性和應(yīng)用價(jià)值。
PCIE 規(guī)范對(duì)于設(shè)備的設(shè)計(jì)采用分層的結(jié)構(gòu),由事務(wù)層、數(shù)據(jù)鏈路層和物理層組成,各層都有發(fā)送和接收兩功能塊,PCIE 總線(xiàn)結(jié)構(gòu)如圖1所示。
圖1 PCIE 總線(xiàn)結(jié)構(gòu)Fig.1 PCIE bus structure
在設(shè)備的發(fā)送部分,首先根據(jù)來(lái)自設(shè)備核和應(yīng)用程序的信息,在事務(wù)層形成事務(wù)層包(TLP),儲(chǔ)存在發(fā)送緩沖器里,等待推向下層;在數(shù)據(jù)鏈路層,在TLP 包上再串接一些附加信息,這些信息是對(duì)方接收TLP 包時(shí)進(jìn)行錯(cuò)誤檢查要用到的;在物理層,對(duì)TLP 包進(jìn)行編碼,占用鏈路中的可用通道,從查封發(fā)送器發(fā)送出去。事務(wù)層包(TLP),數(shù)據(jù)鏈路層包(DLLP),物理層(PLP)產(chǎn)生于各自所在層,最后通過(guò)電或光等介質(zhì)和另一方通訊。這其中數(shù)據(jù)鏈路層包(DLLP),物理層(PLP)的包不需要關(guān)心,在IP 核中已封裝好。在FPGA 上做PCIE 的功能,就變成完成事務(wù)層包(TLP)的處理。
用FPGA 實(shí)現(xiàn)PCIE 功能,簡(jiǎn)單的說(shuō)是在完成TLP的處理。TLP 由幀頭、數(shù)據(jù)、摘要(或者稱(chēng)ECRC)三部分組成。TLP 頭標(biāo)長(zhǎng)3 或者4個(gè)DW,格式和內(nèi)容隨事物類(lèi)型變化;數(shù)據(jù)端為T(mén)LP 幀頭定義下的數(shù)據(jù)段,如果該TLP 不攜帶數(shù)據(jù),那該段為空。Digest 段(Optional)是基于頭標(biāo)、數(shù)據(jù)字段計(jì)算出來(lái)的CRC,成為ECRC,一般Digest 段有IP 核填充。所以PCIE的處理在用戶(hù)層表現(xiàn)為處理TLP 中頭標(biāo)和數(shù)據(jù)段。圖2所示為T(mén)LP 包的數(shù)據(jù)格式。
圖2 TLP 包數(shù)據(jù)格式Fig.2 TLP packet data format
PCIE 通訊是靠發(fā)送TLP 包來(lái)實(shí)現(xiàn)的,而TLP包里包含地址信息。如果板卡向PC 發(fā)送TLP 包,地址信息就是PC 的物理地址,如果是讀TLP 包,那PC 收到后回復(fù)一個(gè)完成包,板卡從完成包分析出數(shù)據(jù)即得到讀取地址數(shù)據(jù),PC 向板卡寫(xiě)數(shù)據(jù)通過(guò)BIOS 探測(cè)所有的外設(shè),對(duì)PCIE 設(shè)備來(lái)說(shuō),BIOS 檢測(cè)到板卡多少個(gè)BAR空間,每個(gè)空間有多大,然后對(duì)應(yīng)為這些BAR空間分配地址。對(duì)PC 設(shè)備來(lái)說(shuō),能看到PCIE 板卡空間只有BAR空間,能訪(fǎng)問(wèn)也就是BAR空間。而FPGA中,BAR空間的設(shè)置是根據(jù)用戶(hù)邏輯設(shè)計(jì)的需求來(lái)定義大小[7]。
本文所設(shè)計(jì)的總體方案是由主機(jī)上的PCIE 驅(qū)動(dòng)程序控制數(shù)據(jù)流的流向,主要分為讀操作(數(shù)據(jù)從主機(jī)到FPGA)和寫(xiě)操作(數(shù)據(jù)從FPGA 到主機(jī)),是通過(guò)軟硬件協(xié)同來(lái)實(shí)現(xiàn)的。其中軟件部分主要是在Windows7系統(tǒng)下的PCIE 驅(qū)動(dòng)程序開(kāi)發(fā),硬件部分采用的是模塊化設(shè)計(jì),包括PCIE IP 核的配置,TLP 包數(shù)據(jù)解析模塊,多通道數(shù)據(jù)收發(fā)模塊,每個(gè)子模塊都能夠靈活使用綜合和實(shí)現(xiàn)工具獨(dú)立優(yōu)化[8],從而保證整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。系統(tǒng)框圖如圖3所示。
本設(shè)計(jì)中PCIE 驅(qū)動(dòng)采用的是RIFFA架構(gòu)提供的驅(qū)動(dòng),RIFFA 驅(qū)動(dòng)主要負(fù)責(zé)內(nèi)存以及PCIE 接口的管理,RIFFA 庫(kù)可以被用戶(hù)空間程序調(diào)用來(lái)實(shí)現(xiàn)對(duì)底層RIFFA 的驅(qū)動(dòng),并最終實(shí)現(xiàn)PCIE 的數(shù)據(jù)通訊??纱蟠蠛?jiǎn)化硬件驅(qū)動(dòng)程序開(kāi)發(fā)的工作量,具有很強(qiáng)的平臺(tái)移植性。利用RIFFA架構(gòu)實(shí)現(xiàn)設(shè)備驅(qū)動(dòng)程序的開(kāi)發(fā),不需要熟悉操作系統(tǒng)內(nèi)核,RIFFA 內(nèi)核已經(jīng)提供好了用戶(hù)接口API 函數(shù),只需調(diào)用API函數(shù)來(lái)編寫(xiě)相應(yīng)的用戶(hù)程序就可以實(shí)現(xiàn)PC 與FPGA 板卡之間數(shù)據(jù)的通訊。
2.3.1 FPGA 內(nèi)部模塊
FPGA 硬件部分主要分為PCIE IP 配置部分和TLP 包數(shù)據(jù)解析模塊,如圖4所示。使用TX、RX 引擎,通過(guò)RIFFA 模塊經(jīng)過(guò)通道仲裁映射到最多12個(gè)TX、RX 通道上,結(jié)構(gòu)與PIO、BMD的結(jié)構(gòu)類(lèi)似,增加了通道擴(kuò)展的功能,用戶(hù)只需要在讀寫(xiě)通道上對(duì)發(fā)送和接收的數(shù)據(jù)進(jìn)行處理即可,方便靈活。
圖4 模塊整體框圖Fig.4 Overall block diagram of the module
2.3.2 PCIE IP 核配置
本次PCI 設(shè)計(jì)使用的是Xilinx 公司提供的7 Series Integrated Block for PCI Express IP 核,其主要配置參數(shù)如表1所示[9-10]。
表1 PCIE IP 核主要配置參數(shù)Tab.1 Main configuration parameters of PCIE IP core
2.3.3 TLP 包數(shù)據(jù)解析模塊
整個(gè)TLP 包數(shù)據(jù)的解析是在RIFFA 模塊內(nèi)完成的,經(jīng)過(guò)通道仲裁可以映射最多到12個(gè)RX、TX通道上,用戶(hù)通過(guò)操作每一個(gè)通道上RX 和TX 接口來(lái)實(shí)現(xiàn)數(shù)據(jù)的讀寫(xiě)。相比傳統(tǒng)的通過(guò)狀態(tài)機(jī)來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)的解析的方式而言,增加了多通道數(shù)據(jù)操作的功能,對(duì)數(shù)據(jù)的操作更加靈活方便,并且數(shù)據(jù)傳輸?shù)男矢摺?/p>
驗(yàn)證使用的平臺(tái)是Xilinx 公司的Kintex-7 系列KC705 開(kāi)發(fā)板,使用verilog 語(yǔ)言編寫(xiě)代碼,在VIVADO 2018.3 開(kāi)發(fā)環(huán)境中完成綜合、布局布線(xiàn),使用VIVADO 內(nèi)部自帶的在線(xiàn)調(diào)試工具ILA 對(duì)上位機(jī)傳輸?shù)臄?shù)據(jù)進(jìn)行解析和分析,也對(duì)多通道數(shù)據(jù)讀寫(xiě)速率進(jìn)行測(cè)試。主機(jī)使用的是Windows 7 64 操作系統(tǒng),在VS2010 開(kāi)發(fā)環(huán)境中編寫(xiě)PCIE 用戶(hù)接口程序,通過(guò)上位機(jī)控制不同通道測(cè)試數(shù)據(jù)傳輸?shù)恼_性和數(shù)據(jù)傳輸?shù)乃俾省1?所示為上位機(jī)傳輸不同數(shù)據(jù)包時(shí)的傳輸速率。
表2 不同數(shù)據(jù)包的傳輸速率Tab.2 Transmission rates of different packets
本文中的PCIE 版本為Gen2 采用的是x8 通道,理論上最大傳輸速率為4 GB/s,圖5所示為多模式下傳輸數(shù)據(jù)速率測(cè)試統(tǒng)計(jì)圖。
圖5 多模式數(shù)據(jù)速率測(cè)試統(tǒng)計(jì)圖Fig.5 Statistics of data rate test in multi-mode
本文對(duì)PCIE 總線(xiàn)進(jìn)行了簡(jiǎn)單的介紹,提出了一種基于RIFFA架構(gòu)下PCIE多通道高速數(shù)據(jù)傳輸系統(tǒng),經(jīng)過(guò)在Xilinx KC705 開(kāi)發(fā)板上實(shí)際進(jìn)行測(cè)試,可以在Windows系統(tǒng)中的驅(qū)動(dòng)程序下穩(wěn)定工作,數(shù)據(jù)傳輸無(wú)誤,傳輸速度較快,并且為用戶(hù)提供了多通道數(shù)據(jù)讀寫(xiě)接口,方便用戶(hù)操作,充分滿(mǎn)足實(shí)際工程中的應(yīng)用。