孫欣欣,李 娟,田粉仙,楊 軍
(云南大學(xué) 信息學(xué)院,云南 昆明650500)
隨著現(xiàn)場信號采集速率、鏈路速度和處理器性能的不斷提升,高速數(shù)據(jù)采集系統(tǒng)需要越來越高的數(shù)據(jù)傳輸速率將現(xiàn)場數(shù)據(jù)傳輸?shù)接嬎銠C[1],因此設(shè)計高總線傳輸速率的數(shù)據(jù)采集系統(tǒng)至關(guān)重要.高速串行計算機擴展總線標準(Peripheral Component Interconnect Express,PCIE)作為目前使用最頻繁的高速總線,優(yōu)勝于以太網(wǎng)、USB、PCI,具有傳輸速率快、兼容性和擴展性好的特點,廣泛用于PC端和外部設(shè)備之間的通信,如何利用PCIE總線對大規(guī)模數(shù)據(jù)進行高效傳輸已成為研究熱點[2].
目前商業(yè)上直接存儲器訪問(Direct Memory Access,DMA)解 決 方 案 如Hitechglobal,PLDA,CAST和Northwest Logic等均使用分散聚集式DMA引擎的設(shè)計方法[3],DMA引擎可通過多個DMA進程并行運行,且每個進程通過PCIE接口進行連接.DMA引擎是實現(xiàn)DMA工作方式的功能部件,它負責(zé)在主機與網(wǎng)卡之間交互數(shù)據(jù),并產(chǎn)生數(shù)據(jù)接收和發(fā)送中斷,分散聚集DMA則從分布在內(nèi)存非連續(xù)部分的緩沖區(qū)鏈表中收集數(shù)據(jù).因現(xiàn)有DMA只能從連續(xù)物理內(nèi)存的單個緩沖區(qū)中收集數(shù)據(jù),所以本文以分散聚集DMA方式進行傳輸以取得更大的緩沖區(qū),減少DMA數(shù)據(jù)傳輸?shù)拇螖?shù)、現(xiàn)場可編程邏輯門陣列(Field Programmable Gate Array,F(xiàn)PGA)邏輯資源的使用,提高數(shù)據(jù)傳輸系統(tǒng)的整體性能.
本文對于高速網(wǎng)卡的通信需求,設(shè)計了基于描述符機制的DMA引擎,為提高數(shù)據(jù)吞吐量,采用DMA引擎控制操作系統(tǒng)CPU調(diào)度帶來的限制.商業(yè)上可用的高性能DMA組件沒有提供完全可配置的硬件控制傳輸數(shù)據(jù)流,并且通常僅限于單一的FPGA設(shè)備,文獻[4-5]中出現(xiàn)的解決方案無法滿足本文應(yīng)用程序吞吐量的需求.針對以上問題,本文提出高性能的DMA引擎架構(gòu),該架構(gòu)與Xilinx FPGA 6系列和7系列完全兼容,在此基礎(chǔ)上設(shè)計出DMA雙核引擎架構(gòu),并根據(jù)DMA引擎設(shè)計的Linux驅(qū)動程序,實現(xiàn)了FPGA板卡于PC之間的通信,滿足高速實時采集、處理和傳輸數(shù)據(jù)的要求.經(jīng)實驗測試結(jié)果表明,本設(shè)計占用CPU資源小,且傳輸數(shù)據(jù)穩(wěn)定可靠,可滿足高速數(shù)據(jù)傳輸需求.
1.1 PCI ExpressPCIE使用高速差分總線,并采用端到端的連接方式[6].PCIE總線以數(shù)據(jù)包形式傳遞信息,數(shù)據(jù)報文在接收和發(fā)送過程中,需要通過多個層次,包括事務(wù)層(TL)、數(shù)據(jù)鏈路層(DL)和物理層(PHY)[7].事務(wù)層主要功能是傳輸和接收事務(wù)層數(shù)據(jù)包(TLPs),根據(jù)PCIE接口對事務(wù)層數(shù)據(jù)包進行組裝和拆解以及配置數(shù)據(jù)包信息.數(shù)據(jù)鏈路層主要職責(zé)是為TLPs的交換提供可靠的機制.物理層用于鏈路數(shù)據(jù)交換,負責(zé)幀、去幀、置亂、解壓縮、8B/10B編碼和TLPs和DLLPs的編碼.完整的PCIE數(shù)據(jù)包結(jié)構(gòu)如圖1所示,要求PCIE實現(xiàn)集成到任何特定的系統(tǒng)設(shè)計中,底層DL和PHY層的實現(xiàn)至關(guān)重要.
圖1 PCIE總線數(shù)據(jù)包結(jié)構(gòu)Fig.1 The structureof thedata packet of the PCIE bus
PCIEGen1以每條單通道2.5 Gb/s速度進行數(shù)據(jù)傳輸,PCIE Gen2將增加到5.0 Gb/s[8].由于PCIE Gen1和PCIEGen2使用8B/10B編碼,所以每個通道的帶寬分別降低到2 Gb/s和4 Gb/s[9].DL和TRN層中引入了額外的數(shù)據(jù)包開銷,并使用8B/10B編碼,則PCIEGen1以每條2.5 Gb/s速率傳輸?shù)淖止?jié)數(shù)為250 Mbps,PCIE Gen2吞吐量的峰值V可用公式(1)計算.
其中,Pa表示最大有效載荷大小,Hpice表示協(xié)議報頭,N用作通道數(shù),M表示每通道傳輸字節(jié)數(shù).
1.2 分散聚集DMA原理在現(xiàn)有分散集聚DMA的傳輸過程中,如圖2所示,DMA控制器首先從驅(qū)動讀取描述符鏈表中的一個描述符并存到描述符引擎中,DMA控制器根據(jù)描述符引擎中的信息完成對應(yīng)內(nèi)存的數(shù)據(jù)傳輸后,描述符更新引擎將此描述符的更新信息傳到描述符鏈表中,然后描述符引擎通過指向下一個描述符的指針向驅(qū)動獲取下一個描述符的信息,由此進行下一個描述符對應(yīng)內(nèi)存的數(shù)據(jù)傳輸[10].此方式在傳輸完成一個描述符對應(yīng)內(nèi)存的數(shù)據(jù)后,需要等待描述符更新引擎、信息和描述符引擎讀取下一個描述符的信息,降低了數(shù)據(jù)傳輸?shù)某掷m(xù)性.
圖2 傳統(tǒng)分散聚集DMA結(jié)構(gòu)圖Fig.2 The structure of traditional scatter-gather DMA
2.1 DMA引擎設(shè)計在上位機驅(qū)動中對描述符鏈表作了提取處理,且每個鏈表項控制著一個數(shù)據(jù)塊的傳輸,將這個數(shù)據(jù)塊傳輸完畢后,選擇并裝載另一個鏈表項繼續(xù)DMA操作或停止DMA流.本設(shè)計直接選取上位機內(nèi)存地址位和數(shù)據(jù)長度位發(fā)送至DMA控制器[10],當(dāng)DMA控制器初始化以后,描述符引擎將直接進行提取描述符鏈表,不需與驅(qū)動進行握手操作,而驅(qū)動也將描述符系統(tǒng)的地址位和數(shù)據(jù)位發(fā)送至描述符引擎,因此取消了描述符更新引擎.改進后分散聚集DMA結(jié)構(gòu)如圖3所示.
圖3 改進后分散聚集DMA結(jié)構(gòu)圖Fig.3 The structure diagram of improved scatter-gather DMA
根據(jù)改進后的DMA分散聚集的傳輸模式,提出了一種DMA引擎新架構(gòu),該構(gòu)架的描述符鏈表存儲于FPGA內(nèi)存中,DMA引擎在寫操作時自動加載內(nèi)存塊的物理地址,然后驅(qū)動程序編寫描述符,列出初始化視圖.DMA引擎的完整架構(gòu)如圖4所示,TX 引擎和RX引擎通過地址表和基址寄存器進行配置,配置后的寄存器通過PCIE接口進行DMA傳輸,TX FIFO和RX FIFO對傳輸數(shù)據(jù)進行存儲.TX/RX引擎與用戶之間的接口邏輯類似于128 bit的FIFO接口,該接口根據(jù)PCIE IP核的輸入/輸出設(shè)置數(shù)據(jù)寬度.
圖4 DMA引擎構(gòu)架Fig.4 Theenginearchitecture of DMA
由于預(yù)期數(shù)據(jù)的大小超過操作系統(tǒng)可分配的最大內(nèi)存,因此驅(qū)動程序在用戶內(nèi)存中使用了一個有限大小的環(huán)形緩沖區(qū),輸入數(shù)據(jù)包被放置在環(huán)形緩沖區(qū)中的下一個可用緩沖區(qū).驅(qū)動程序?qū)⑤斎霐?shù)據(jù)包傳給內(nèi)核的其它部分處理,并在環(huán)形緩沖區(qū)中放置一個新的DMA緩沖區(qū),減少在FPGA內(nèi)存描述符所需的內(nèi)存數(shù)量.在FPGA和驅(qū)動之間運行DMA引擎時,DMA引擎將數(shù)據(jù)寫入環(huán)形緩沖區(qū),同時驅(qū)動程序?qū)?shù)據(jù)移動到更大的應(yīng)用程序內(nèi)存空間,以便進行快速實時細化、防止數(shù)據(jù)丟失和吞吐量降低.
內(nèi)存寫入握手序列使用兩個不同的指針WR和RD,分別為寫入和讀取的數(shù)據(jù).WR指針存儲在外部內(nèi)存中,由DMA引擎更新,并指向包含最后寫入的4 KB內(nèi)存頁地址的描述符.RD指針存儲在FPGA內(nèi)部,由Linux驅(qū)動程序更新,并指向驅(qū)動程序讀取的最后一個4 KB內(nèi)存頁的地址.完整的工作流程如圖5所示,具體描述如下.DMA引擎加載一個描述符(1)并將數(shù)據(jù)從FPGA移動到環(huán)形緩沖區(qū)(2),驅(qū)動程序讀取更新后的WR指針(4),并且在將數(shù)據(jù)移動到GPU(5)之后,用最后讀取的地址(6)更新FPGA中的RD指針,DMA引擎從內(nèi)部列表加載一個新的描述符,為了避免覆蓋循環(huán)緩沖區(qū)中的數(shù)據(jù),它將這個地址與RD指針(7)進行比較,如果驅(qū)動程序比DMA寫入數(shù)據(jù)慢,寫入過程暫停,直到RD更新.當(dāng)所有數(shù)據(jù)從FPGA移動到PC時,DMA用最后一個描述符更新WR指針,并通知驅(qū)動程序在最后4 KB頁面中寫入的確切數(shù)據(jù)量,中斷產(chǎn)生并通知中央處理器傳輸結(jié)束.
圖5 握手序列流程圖Fig.5 The flowchart of Handshake sequence
2.2 雙核DMA引擎設(shè)計在2.1 節(jié)DMA引擎架構(gòu)的基礎(chǔ)上設(shè)計出雙核DMA引擎,如圖6所示.本文雙核DMA引擎設(shè)計方案中選擇主從架構(gòu),地址表設(shè)置在DMA Master和DMA Slave之間,DMA Master和DMA Slave通過M2S_START和S2M_DONE進行數(shù)據(jù)傳輸,之后通過PCIE Gen2 x8 IP核并行運行,連接到外部的x16 PCIe橋接器,通過x16通道將數(shù)據(jù)傳輸?shù)絇C機.本設(shè)計FPGA卡板連接到一個x16 PCIE插槽,并通過雙核DMA引擎方式,使每個Xilinx PCIEIP核達到最大通道數(shù)量,以確保PCIEIP核數(shù)據(jù)的一致性,占用FPGA最小化區(qū)域.
圖6 雙核DMA引擎架構(gòu)Fig.6 The engine architecture of dual-core DMA
圖7 雙核DMA引擎時序圖Fig.7 The engine timing diagram of dual-core DMA
雙核架構(gòu)的時序圖如圖7所示,DMA引擎使用兩個控制信號同步傳輸.在系統(tǒng)初始化和握手過程中,Linux驅(qū)動程序只需要與DMA主引擎交換控制命令,從引擎以空閑狀態(tài)等待,當(dāng)主引擎從表中加載一個新地址時,M2S_START啟動,表示內(nèi)存寫操作開始.在此階段,主從引擎以交錯模式工作,將數(shù)據(jù)寫入4 KB同一頁面的不同部分,其中TLP大小和地址之間的對應(yīng)偏移量由負載值的大小決定.雙核架構(gòu)的握手序列步驟如下:當(dāng)主引擎寫入2 KB,等待S2M_DONE的斷言,取消對M2S_START的斷言;當(dāng)從引擎寫入2 KB時,斷言S2M_DONE標志并等待M2S_START被斷言.完成上述序列后,主引擎從地址表加載一個新地址,傳輸繼續(xù),此時主從引擎之間存在速度不對稱,也能保持正確的數(shù)據(jù)順序.
雙核DMA引擎框架對DMA寫數(shù)據(jù)的步驟如下:DMA寫數(shù)據(jù)被加載到工作頻率為250 MHz的256 bit FIFO中,之后DMA寫數(shù)據(jù)的數(shù)據(jù)流被分成和最大有效負載大小相等的數(shù)據(jù)包,交替發(fā)送到位于DMA引擎之前的FIFO中,此時兩個引擎并行運行,無需Linux驅(qū)動程序進行任何進一步處理,也可以按照正確的順序?qū)?shù)據(jù)寫入環(huán)形緩沖區(qū).其中,F(xiàn)IFO用于將數(shù)據(jù)位的寬度256 bit轉(zhuǎn)換為128 bit,根據(jù)環(huán)形緩沖區(qū)中頁面的大小選擇FIFO的深度,以確保每個4 KB頁面正確填充.
3.1 實驗環(huán)境基于FPGA芯片的高速并行處理能力、Xilinx的Virtex-6 XC6VLX240T主控芯片和Xilinx ISE14.7 作為開發(fā)工具的實驗開發(fā)平臺[11],該實驗平臺支持PCIE 2.0 x8模式的PCIE鏈路,使用Verilog HDL語言完成FPGA硬件設(shè)計.FPGA卡板通過PCIE接口連接到主機,主機CPU為Intel i7-4770 3.4 GHz處理器和Intel X58芯片組,操作系統(tǒng)為Linux.
按照本文DMA引擎設(shè)計,通過ISE綜合、映射與布局布線后,由表1可知本設(shè)計的DMA單核引擎占用資源為Slices 2110、LUTs 2600和BlockRAM/FIFO 12,DMA雙核引擎占用資源為Slices 2530、LUTs 4102和Block RAM/FIFO 36.DMA雙核引擎的硬件邏輯資源占用雖比文獻[3]的Block RAM/FIFO占用資源多,但均比文獻[3,5]的Slices、LUTs的邏輯資源消耗少.同樣,DMA單核引擎的硬件邏輯資源均比文獻[3,5]的消耗少.由此可知,本設(shè)計節(jié)約了FPGA硬件資源.
表1 FPGA邏輯資源占用表Tab.1 The logic resourceoccupation table of FPGA
3.2 性能測試本文對Xilinx PCIE Gen2進行DMA引擎性能測試,因Virtex-6 FPGA連接套件將配套提供專門針對Virtex-6精心優(yōu)化的Northwest Logic DMA引擎評估版,則本文安裝帶有Gen l x8的Virtex-6 XC6VLX240T-1FFG1156I設(shè)備的Xilinx ML605板以及用Virtex-6 LX240T-2FFG1759C設(shè)備的HTG-V6HXT-X16 PCIE板進行單核DMA引擎測試;同時用Virtex-6 GTH(HX380T FF 1923)設(shè)備的HTG-V6HXT-X16 PCIE板測試雙核DMA引擎的性能,并將PLX技術(shù)的PEX8632芯片作為外部系統(tǒng)和Linux驅(qū)動程序的橋梁,安裝在主板上,最后將Virtex-6開發(fā)板插在PC機的PCIE插槽中.
實驗針對高速數(shù)據(jù)傳輸系統(tǒng)下的DMA單核引擎和DMA雙核引擎下的吞吐量進行了測試驗證對比.為驗證DMA引擎的吞吐量,在測試中,本文直接在環(huán)形緩沖區(qū)上執(zhí)行數(shù)據(jù)一致性檢查.在單核情況下,數(shù)據(jù)從環(huán)形緩沖區(qū)復(fù)制到用戶應(yīng)用程序空間;雙核解決方案中,使用4通道內(nèi)存控制器的硬件設(shè)備處理數(shù)據(jù),因使用帶有2通道內(nèi)存控制器的硬件設(shè)備性能最大可達5 400 MB/s.在這兩種情況下,數(shù)據(jù)吞吐量為DMA寫數(shù)據(jù)的平均值,代表可實現(xiàn)的寫入速度,本文使用512 KB的環(huán)形緩沖區(qū)連續(xù)讀取DMA吞吐量與DMA傳輸數(shù)據(jù)量大小的關(guān)系如圖8~9所示.
圖8 DMA吞吐量的設(shè)計值與理論值Fig.8 The design value and theoretical value of DMA throughput
圖9 256Byte-單雙核DMA吞吐量變化曲線Fig.9 The throughput change curve of 256Byte-single and dual core DMA
圖8表示在不同DMA傳輸數(shù)據(jù)量大小下,單、雙核DMA引擎數(shù)據(jù)吞吐量的測試結(jié)果.DMA吞吐量隨傳輸數(shù)據(jù)量的增加而增加,當(dāng)傳輸數(shù)據(jù)從32 KB增加到512 KB時,吞吐量的值呈直線式增長,DMA傳輸?shù)臄?shù)據(jù)量達到某個特定值時,將緩慢呈現(xiàn)平行于橫坐標趨勢.當(dāng)PCIE的有效載荷為128B時,DMA傳輸數(shù)據(jù)量大于1MB時,Gen2 x8 DMA引擎的最大吞吐量為3 721 MB/s,Gen2 x16 DMA引擎的最大吞吐量為6925 MB/s,均達到理論值吞吐量的90%.同時,對比Gen1 x8-128B,本設(shè)計的Gen2 x8-128B和Gen 2x16B-128B的DMA吞吐量有較大的提升.
如圖9所示,與圖8相比當(dāng)PCIE的有效載荷為256B時,與預(yù)期一樣,傳輸較小數(shù)據(jù)時,系統(tǒng)的吞吐量會減少,與Gen2 x8 DMA引擎情況下相比,雙核引擎將更接近PCIE理論的可用吞吐量,即Gen2 x16 DMA引擎約增加了一倍,超過了6 925 MB/s,達到了理論值的91%以上.經(jīng)實驗結(jié)果可知本設(shè)計的DMA引擎吞吐量介于DMA理論吞吐量的90%到95%之間,能滿足各種高速數(shù)據(jù)傳輸.
由文獻[12]給出的公式可知,接口通路的數(shù)據(jù)吞吐量,在協(xié)議開銷、有效載荷等基本一致的情況下,與物理通道的數(shù)量成正比[13].因此,在相同工作模式下,比較Gen2 x8通道的傳輸速度即能得到Gen2 x16物理通道傳輸性能的優(yōu)劣.
本設(shè)計DMA引擎的Gen2 x8通道相比文獻[14]和文獻[15]中給出的測試結(jié)果,傳輸速度提高近17%.圖10為3個設(shè)計方案的接口通路傳輸速度測試結(jié)果對比.文獻[14]給出了8通道在4-lane PCIE高速接口時的傳輸速度,與該條件比較,本設(shè)計傳輸速度提高近20%;與文獻[15]給出測試結(jié)果的最高傳輸速率數(shù)據(jù)相比,本設(shè)計有著15%左右的提升;與文獻[14-15]相比DMA 引擎在Gen2 x8通道時,本設(shè)計有較好的傳輸速度,同樣在Gen x16通道時,依然有著較好的傳輸速度.
圖10 3個設(shè)計方案的接口通路傳輸速度對比Fig.10 The interface path transmission speed comparison of three design schemes
本文基于FPGA技術(shù)實現(xiàn)了一種兼容Xilinx Virtex-6和Virtex-7 PCIe Gen2內(nèi)核的高吞吐量DMA引擎.本設(shè)計的DMA單核引擎達到了理論吞吐量的92%,DMA吞吐量最高可達3 721 MB/s,提高了PCIE有效利用率;為了滿足應(yīng)用程序的需求,設(shè)計并實現(xiàn)了DMA雙核引擎架構(gòu),該雙核構(gòu)架DMA吞吐量增加為6925 MB/s,不僅節(jié)約了硬件資源,還提高了數(shù)據(jù)傳輸速度,經(jīng)測試,達到設(shè)計要求.本設(shè)計為高速數(shù)據(jù)采集接口提供通用方案,具有一定的應(yīng)用價值和實際意義,可被廣泛應(yīng)用于各種類型的高速數(shù)據(jù)傳輸?shù)南到y(tǒng)中.