楊佳麗
(西安財經(jīng)大學行知學院, 管理學院, 陜西, 西安 710038)
信息技術(shù)的發(fā)展為各類復雜的數(shù)據(jù)采集系統(tǒng)提供了便捷,對于多個領(lǐng)域的各類復雜系統(tǒng)來說,數(shù)據(jù)傳輸?shù)膶崟r性與準確性都至關(guān)重要,是一切統(tǒng)計分析的基礎(chǔ)。FPGA在處理數(shù)據(jù)時由于并行處理具備速度優(yōu)勢,PCI Express總線由于采用串行互聯(lián)技術(shù)以及高帶寬,具備數(shù)據(jù)同步傳輸功能且具有高擴展性、成本低。2種技術(shù)各有優(yōu)勢,為高速有效的數(shù)據(jù)傳輸提供了技術(shù)保障。
PCI Express(PCIe)是第三代互聯(lián)網(wǎng)通信的I/O總線,具有速率高、兼容性高等優(yōu)勢。采用事務處理層、鏈路層、物理層的分層體系:事務處理層接收數(shù)據(jù)請求并將其封裝為數(shù)據(jù)包,轉(zhuǎn)換為總線事務;鏈路層用于數(shù)據(jù)包的正確接收與發(fā)送,確保數(shù)據(jù)可靠與完備;物理層發(fā)送鏈路層的數(shù)據(jù)包以及本身產(chǎn)生的數(shù)據(jù)包,接收另一端發(fā)送設備傳輸過來的數(shù)據(jù)上傳至鏈路層[1]。層次結(jié)構(gòu)如圖1所示。
圖1 PCIe層次結(jié)構(gòu)
FPGA全稱為現(xiàn)場可編程門陣列,已成為高速處理系統(tǒng)的主流平臺,集成以往可編程器件優(yōu)點的同時還解決了門陣列有限及開發(fā)周期過長的問題,在使用過程中需要不停擦寫,基于查找表技術(shù),集成各類硬核管理單元提升性能,常規(guī)芯片結(jié)構(gòu)包括可編程I/O單元、嵌入式RAM、基本可編程邏輯、布線以及時鐘管理。
相對于標準編程的數(shù)據(jù)輸入與輸出傳輸,DMA具有大數(shù)據(jù)傳輸時高吞吐量以及占用CPU更低的優(yōu)勢。因此系統(tǒng)設計時為了提高系統(tǒng)性能選用DMA傳輸。根據(jù)DMA的實現(xiàn)原理,設計控制器邏輯如圖2所示。
圖2 DMA控制器
2.2.1 發(fā)送過程
數(shù)據(jù)的發(fā)送過程主要包括以下步驟。
(1)PC端將寄存器配置好,啟動DMA傳輸之后,在FPGA端數(shù)據(jù)就位后,TX引擎中將trn_tsrc_rdy_n、trn_tsof_n聲明為有效,同時將TLP數(shù)據(jù)包存儲于trn_td[63:0],在IP核將trn_tdst_rdy_n聲明有效之后,將數(shù)據(jù)發(fā)送至緩存進而傳輸至PC內(nèi)存。
(2)在核聲明trn_tdst_rdy_n有效時,若應用程序聲明trn_tsrc_rdy_n、trn_tsof_n有效,則將剩余TLP數(shù)據(jù)包都進行發(fā)送。若64 bit數(shù)據(jù)均有效,則存于trn_td[63:0]發(fā)送并將trn_trem_n[7:0]更新為00h,反之,將剩余32 bit有效數(shù)據(jù)存于trn_td[63:32]進行發(fā)送并將trn_trem_n[7:0]更新為0Fh。
(3)下一時鐘,若應用程序聲明trn_tsrc_rdy_n無效,則結(jié)束傳輸。
2.2.2 接收過程
數(shù)據(jù)的接收過程主要包括以下步驟。
(1)PC端將寄存器配置好,啟動DMA傳輸之后,F(xiàn)PGA端數(shù)據(jù)發(fā)送請求數(shù)據(jù)包之后PC端會發(fā)送應答,應用程序準備好進行接收時聲明trn_rdst_rdy_n有效。
(2)IP核準備好之后聲明trn_rsrc_rdy_n、trn_rsof_n有效,將第一個應答包存于trn_rd[63:0]發(fā)送
(3)接下來的時鐘里,若應用程序聲明trn_rdst_rdy_n有效、IP核聲明trn_rsrc_rdy_n有效trn_rsof_rdy_n無效,則將剩余數(shù)據(jù)包存于trn_rd[63:0]進行發(fā)送。
(4)IP核聲明trn_rsrc_rdy_n、trn_reof_n有效,若64 bit數(shù)據(jù)均有效,則存于trn_rd[63:0]發(fā)送并將trn_rrem_n[7:0]更新為00h,反之,將剩余32 bit有效數(shù)據(jù)存于trn_rd[63:32]進行發(fā)送并將trn_rrem_n[7:0]更新為0Fh。
(5)若IP核緩存中不存在可發(fā)送TLPs,則聲明trn_rsrc_rdy_n無效,結(jié)束數(shù)據(jù)接收[2-3]。
根據(jù)DMA控制器的結(jié)構(gòu),將系統(tǒng)功能模塊劃分為2個部分:FPGA端和PC端。FPGA端基于Xilinx LogiCorePCIe IP Core,實現(xiàn)對數(shù)據(jù)時序的控制以及PCIe事務的處理;PC端利用WinDriver的API函數(shù)設計驅(qū)動以及應用程序。
FPGA端的主要功能模塊包括PCIe IP Core、RX接收引擎、TX發(fā)送引擎、寄存器及存儲讀寫、接收發(fā)送的FIFO控制模塊,邏輯框架如圖3所示。PCIe Endpoint Core為PCIe邏輯核,處理協(xié)議層的各項配置及事務;TX Engine為發(fā)送引擎,實現(xiàn)TLP數(shù)據(jù)包的發(fā)送并管理時序;RX Engine為接收引擎,實現(xiàn)TLP數(shù)據(jù)包的接收并管理時序;寄存器及存儲讀寫模塊為Registers_Access,實現(xiàn)DMA的操作以及寄存器的管控;TX FIFO接收外界數(shù)據(jù)并緩存,提交TX發(fā)送引擎進而傳輸至PC;RX FIFO緩存從PC接收到的數(shù)據(jù)包,等待用戶調(diào)用[4-5]。
圖3 FPGA端總體邏輯
FIFO核在接收與發(fā)送引擎上的位寬有所不同,TX端讀寫同步,位寬均是64位,為避免全滿、全空標志因時序關(guān)系導致丟數(shù),滿標志選擇almost_full,空標志選擇almost_empty。RX端讀寫異步,寫入位寬為64位,讀取位寬為32位,為了避免傳輸時由于寫滿導致丟數(shù),需將讀取時鐘設置為寫入時鐘的2倍。如此一來,需引入PLL(鎖相環(huán))實現(xiàn)倍頻,選擇一個CLKOUT0,反饋源設置為CLKFBOUT without BUFG,由于寫入時鐘的頻率為62.5 MHz,因此調(diào)節(jié)倍頻系統(tǒng)實現(xiàn)輸出頻率為125 MHz。
PCIe IP Core設置系統(tǒng)時鐘為100 MHz,subclass值設置為0X80,設備ID等其他基本信息采用默認值即可?;芳拇嫫鲄?shù)包括6個BAR(Base Assress Redister),由于地址尋址為32位,故選擇BAR0,其分配1 MB空間。性能寄存器的TLPs最大負載Max Payload Size設置為512 Bytes,其他選項保持默認值。生產(chǎn)PCIe核后從工程中移除,將源文件添加至ipcore_dir路徑下對應的文件夾[6-7]。
PC端主要采用WinDriver生成PCIe驅(qū)動,并利用其自帶的API函數(shù)實現(xiàn)數(shù)據(jù)接收與發(fā)送的應用程序設計。WinDriver在診斷硬件及寄存器可正常讀寫之后,只需開發(fā)人員進行簡單的參數(shù)設置即可自動生成驅(qū)動程序的源碼。PC端應用程序調(diào)用的API函數(shù)主要包括如下。
(1) DMAWriteMenAlloc:實現(xiàn)內(nèi)存分配并進行鎖定,避免其他程序占用。包括需分配內(nèi)存塊數(shù)menBlocknum、每塊內(nèi)存大小Block Size 2個參數(shù)。
(2) StartDMATransfer:實現(xiàn)DMA傳輸,包括傳輸方向choice、讀寫文件名fp、數(shù)據(jù)包大小tlp_size、數(shù)據(jù)包個數(shù)tlp_count、傳輸次數(shù)cyclenum 5個參數(shù)。
(3) W_WaitForComplete/R_WaitForComplete:實現(xiàn)多次連續(xù)傳輸,包括數(shù)據(jù)包大小tlp_size、數(shù)據(jù)包個數(shù)tlp_count、傳輸次數(shù)cyclenum 3個參數(shù)[8]。
應用程序首先初始化PCIe函數(shù)庫,然后打開設備分配一段內(nèi)存并鎖定,配置寄存器參數(shù)后開始DMA傳輸,完成后由FPGA向PC端發(fā)送一個中斷,PC判斷中斷類型后對寄存器標志位進行更新,如果是多次傳輸,則進入多次傳輸線程。所有數(shù)據(jù)均完成傳輸之后關(guān)閉PCIe設備,釋放系統(tǒng)資源。處理過程如圖4所示。
圖4 應用程序處理流程
采用Xilinx Virtex-5 ML507開發(fā)板、WinDriver驅(qū)動、Windows 系統(tǒng)、VS開發(fā)環(huán)境。將板卡插入A電腦的PCIe槽后上電。B電腦打開Verilog工程進行UCF文件配置,編譯好燒寫入板卡。A電腦安裝WinDriver工具以及PCIe驅(qū)動,在VS中運行程序進行數(shù)據(jù)傳輸測試[9]。
由FPGA連續(xù)向PC寫入20G遞增數(shù)據(jù),PC接收后利用MATLAB驗證數(shù)據(jù)傳輸準確。同樣地,PC端向FPGA也發(fā)送遞增數(shù)據(jù),利用傳輸?shù)臄?shù)據(jù)總量與耗時的比值計算數(shù)據(jù)傳輸?shù)乃俣龋瑴y試結(jié)果如表1所示。
表1 PCIe傳輸速度測試結(jié)果表
由測試結(jié)果可知,隨著單次傳輸數(shù)據(jù)大小的遞增,讀寫速度并未降低,當單次傳輸8 MB時寫入速度可達202 MB/s,讀取速度可達178 MB/s。而且,因為耗時取的是第一次開始到最后一次結(jié)束的間隔且每次DMA后有中斷處理,相當于每次都進行了4次BAR空間的寫操作,因此得出的時間間隔更長,由此計算出來的傳輸速度比實際的傳輸速度要低,實際傳輸效果更佳[10]。
本研究介紹了DMA的控制邏輯與數(shù)據(jù)時序,采用PCIe總線技術(shù)設計了FPGA與PC間的以太網(wǎng)數(shù)據(jù)傳輸系統(tǒng),經(jīng)過測試數(shù)據(jù)傳輸準確且讀寫性能優(yōu)異。但標準FIFO接口未考慮到多種數(shù)據(jù)格式的轉(zhuǎn)換,PC的配置性能對傳輸性能的影響,作為下一步的研究方向,力求進一步提升傳輸效率。