賈毅婷1,, 張東來3, 李鐵才, 王子才1, 張 斌
(1.哈爾濱工業大學 航天學院,黑龍江 哈爾濱 150001; 2.深圳航天科技創新研究院,廣東 深圳 518057;3.哈爾濱工業大學(深圳),廣東 深圳 518055)
目前復雜系統測試主要采用設備分為數字示波器和數據存儲記錄儀兩類。數字存儲示波器[1-3]主要提供單板測量和以合適的視覺顯示效果為目的生成顯示波形,因此采樣率高但分辨率低,存儲深度固定且可供回放的數據量少。數據存儲記錄儀[4-7]主要記錄原始數據,并傳給PC機做處理和分析。以NI的采集卡為例,其一般配備PCIe/PCI/USB等數據高速傳輸接口,可以在PC機上用演示軟件以固定格式將數據存儲到電腦。對于多路高速采樣和大容量存儲[8-10],USB和PCI接口不適用,而PCIe接口直連PC機較為不便。對于需要改變數據格式以便于解析的客戶,數據存儲需要用戶在演示代碼基礎上進行修改,需要用戶做二次開發,對于希望即拿即用的客戶來說,其并不適用。日置(HIOKI)公司的存儲記錄儀一般兼顧記錄儀和數據示波功能,以高端存儲記錄儀886x系列為例,具備LAN/USB/PC卡槽等各種接口,配備80 GB存儲硬盤,能以20 MS/s采樣速率和12-bit分辨率采集信號,能做到長期監控和瞬時記錄同時進行,但REC高速存儲記錄僅在設定好時間軸范圍內的采樣數據中取出并保存峰峰值,MEM實時記錄以10 MS/s采樣速率及12-bit分辨率最多僅存儲1.6 s時間長度的數據。國外廠家的數據存儲記錄儀不僅性能并不適用于復雜系統測試或老化試驗,而且售價昂貴。為解決上述問題,本文設計了基于PCIe總線架構的高精度數據采集及大容量數據存儲系統,并針對硬件設計和軟件開發過程中的關鍵問題,給出了完善的解決方案。
大容量數據采集存儲系統的數據存儲方式如圖1所示,硬件組成架構圖2所示,由采樣端、控制端和存儲介質組成,其中采樣和控制端位于采集存儲系統內部,PCIe接口硬盤同樣位于系統內部, USB2.0總線進行U盤存儲、千兆以太網接口將數據傳輸至PC端進行存儲,板載EMMC總線方式的可插拔SD卡存儲方便用戶數據隨時可取。當采集存儲設備的采樣前端為高速多通道方式時,以6通道每通道采樣率20 MS/s,16位精度為例,每秒將產生240 MB數據量,使得前述USB數據傳輸、以太網數據傳輸和EMMC數據傳輸方式都不適用,此時采用理論速率可達2 GB/s速率的PCIe 2.0×4總線方式配備PCIe AHCI硬盤進行大容量數據存儲。

圖1 數據存儲方式示意圖
該大容量數據采集存儲系統以Altera Cyclone V SX系列SoC作為主控,其不僅包含傳統FPGA架構,且集成了基于ARM Cortex A9的硬核處理器系統(Hard Processor System,HPS),如圖2所示,以及高速收發器PCIe硬核IP子系統,主頻可達800 MHz。該系統硬件架構總體可分為控制器單元、數據采集單元、數據采集硬件校準單元、數據存儲單元、人機接口單元和上位機通信單元等,各單元模塊之間協調工作,完成多通道隔離量測記錄和顯示,同一個時鐘源和觸發保證了各通道之間同步采樣。由前所述,多通道高速采樣后的數據根據使用情況可選擇存至PCIe AHCI接口硬盤、U盤、SD卡或通過千兆以太網傳至PC機,本文重點描述多通道高速采樣后的大容量數據存儲方式和數據流。
PCIe總線的物理鏈路如圖3所示,端到端的數據傳送以及差分數據傳輸方式,使得總線抗干擾能力強,且有效抑制電磁干擾(EMI)。PCIe總線采用雙向的傳輸方式且可運行全雙工模式,雙單工連接能提供更高的傳輸速率和質量。雙單工是指PCIe總線的物理層由雙單工信道(Dual-Simplex Channel)組成,由發送對和接收對實現雙向數據傳輸。PCIe總線上每個設備都有自己的專用連接,不需要向總線請求帶寬,與傳統PCI總線在單一時間周期內只能實現單向傳輸不同,PCIe的雙單工連接能提供更高的傳輸速率和質量,二者之間的差異跟半雙工與全雙工類似。

圖2 采集存儲系統硬件組成架構

圖3 PCIe總線的物理鏈路
主控SoC FPGA側集成PCIe硬核IP,HPS側可通過H2F橋和LwH2F橋來訪問該IP核資源,數據存儲控制模塊框架如圖4所示,PCIe IP通過Txs、控制寄存器訪問(Control Register Access,Cra)、RP_master接口實現與HPS的互聯訪問。Cra端口可訪問PCIe IP內部控制和狀態寄存器,Txs端口控制數據輸出,RP_master端口控制數據接收和MSI信號發送。FPGA與ARM協同工作進行數據存儲,FPGA與ARM之間通過AXI總線進行數據傳輸,FPGA可操作ARM外掛的RAM存儲器并可直接操作PCIe IP核,ARM可通過PCIe IP核讀寫硬盤數據。通過優化數據采集、傳輸、存儲和讀取動作,避免讀寫數據之間的帶寬搶占,保證數據連續不丟失。

圖4 數據存儲控制模塊框架圖
為實現系統各部分間的通信,設計了FPGA與ARM之間,以及操作RAM和硬盤的通信協議。
HPS發送“開始記錄”指令后,FPGA控制采集單元的FPGA對各通道ADC數據進行采集,采樣頻率為20 MS/s,每個通道分配128 MB的數據緩存區,各通道每往內存寫入32 MB的數據,就發送一個中斷給HPS,當128 MB寫滿時,再從頭開始寫入。其中命令和數據交互格式如表1所示,包含開始/停止采樣的控制指令、指示燈控制指令、測試指令以及必要的采樣通道配置指令等。
表1命令和數據交互格式

數據包類型(1字節)數據(N字節)說明0x10測試0x3141Byte:控制量選擇2Byte:控制量數值1Byte:通道選擇0x3321Byte:采樣耦合方式選擇1Byte:通道選擇0x3421Byte:校準開啟/關閉1Byte:通道選擇0x3521Byte:高壓衰減比例選擇1Byte:通道選擇0x36測試0x373控制指示燈0x11開始采樣0x12停止采樣
(1) FPGA與HPS的數據緩沖區。
需要在系統中分配多塊緩沖區給FPGA寫入采樣數據,對應多個獨立的數據采集通道,以兩通道為例,如表2所示,每個通道對應一個緩存區,各通道128 MB的緩沖區空間分為4個大小相同的部分,每部分32 MB,FPGA每寫32 MB的數據后向HPS發送一個中斷,當寫滿128 MB的空間后再從起始地址開始寫后,如此循環。

表2 數據緩沖區地址和大小分配
(2) 指令同步。
HPS發送指令給FPGA時,直接發送到相應地址即可,FPGA給HPS發送數據時,先將數據寫到內存,再發送一個中斷。
① HPS發送指令給FPGA的地址:0xC0000000 + 0x2000000;
② FPGA發送指令給HPS的地址:0xC0000000 + 0x2000000;
③ FPGA發送指令給HPS的中斷號為6,地址為90~9F。
(3) FPGA寫入采樣數據到緩沖區。
每個通道采集的數據對應一個128 MB的數據緩沖區,每個通道采集的數據只能寫入對應的緩沖區,每個通道每采集32 MB數據后將起始地址和結束地址寫入內存,再發送一個中斷,然后接著上一個32 MB的結束地址繼續向內存寫下一個32 MB的數據,每個通道的緩沖區循環寫入(循環隊列的形式)。FPGA發送的中斷號為7,地址為A0~AF。
HPS啟動時在啟動參數中設置預留內存空間大小為512 MB,這樣可以把HPS使用的SDRAM高地址的512 MB空間預留出來,這512 MB空間不能作為Linux系統和Linux程序運行使用的空間,但這部分空間在Linux系統中使用mmap映射后依然可以訪問,而FPGA可以通過FPGA to SDRAM總線來訪問掛載在HPS上的SDRAM,這樣就建立了與FPGA傳輸大量數據的通道。FPGA采集的數據通過FPGA to SDRAM總線寫入到HPS的SDRAM,從每個通道的起始地址開始寫入,各通道每寫滿32 MB的數據時,FPGA發送一個中斷來通知HPS讀取數據,然后繼續寫下一個32 MB的空間,當128 MB的空間寫滿后,FPGA再從通道的起始地址開始寫入,如此循環。HPS通過驅動程序來接收FPGA的中斷,當接收到一個中斷后,驅動程序會把中斷的中斷號發送給應用程序,應用程序用線程阻塞讀的方式接收驅動程序的數據,每接收到一個數據,先寫到隊列中,這樣做防止突發的訪問導致接收的數據丟失,寫數據線程中若讀取到隊列有數據,根據隊列中數據的信息,將相應地址的數據寫入到磁盤。
Cyclone V器件FPGA內部集成了PCIE硬核IP模塊,HPS可以通過H2F Bridge和LwH2F來訪問該IP模塊,在HPS中加載PCIE AHCI驅動后,HPS會掃描該IP模塊上接入的磁盤,識別成功后會在Linux根目錄的dev下生成一個設備文件,將磁盤交給Linux文件系統管理。這時就可以使用Linux C庫函數接口中的Open、Write、Read等函數在磁盤中創建文件,讀寫文件。 FPGA每發送一個中斷,HPS就會讀取相應的數據在磁盤中寫一個二進制的文件,二進制文件與文本文件相比,同樣的數據量體積是文本文件的1/3,讀寫速度更快,而且讀寫更加方便。
在寫每個二進制數據文件時,會先在二進制文件的開頭寫入一個36 B的數據頭,數據頭記錄了這個文件中數據的信息,如下所示。
//文件數據頭
typedef struct
{
time_t time; //4字節 時間
unsigned int data_len; //4字節 數據的長度(Byte)
unsigned int sample_multiple; //4字節 采樣數據抽點倍率(存數據時的抽點比例)
unsigned int sampling_gear; //4字節 采樣的頻率擋位(0~11檔)
unsigned int sampling_freq; //4字節 采樣頻率(Hz)
unsigned short int Gear; //4字節 擋位(電壓擋位)
float Software_Multiple; //4字節 軟件倍數(用于計算實際電壓值)
short int excursion; //4字節 偏移(用于計算實際電壓值)
float Capacity; //4字節 最大量程(在當前電壓擋位下的量程)
}Data_Head_Info;
在36 B的數據頭之后,每兩個字節表示一個采樣值,高地址放高位字節,低地址放低位字節,圖5所示為磁盤文件信息排布示意圖,至此完成了將FPGA采集的數據寫入到磁盤的全過程。

圖5 磁盤文件信息排布示意圖
該系統大容量數據存儲時的數據流與總線速度如圖6所示,由SoC FPGA部分的BLVDS總線采集ADC數據,為優化FPGA資源,采用32-bit BLVDS總線,包含16對差分BLVDS數據且采用DDR方式收發數據,理論速率可達3.2 GB/s。FPGA和HPS外擴DDR3存儲器的理論速率可達6.25 GB/s,受外部存儲器接口性能限制,實際速率可達1.17~1.56 GB/s。FPGA的PCIe硬核操作SSD理論速率可達2 GB/s。按PCIe總線負荷最大不超過50%設計,同時為保證同步時鐘質量,FPGA BLVDS總線負荷按1/4設計,可配備20路20 MS/s采樣速率的ADC,數據流實時性良好,優于目前同類裝置,達到設計預期。
圖7為顯示界面程序流程圖,在初始化界面時創建與FPGA通信線程、寫文件線程及主線程等,阻塞讀取底層來自FPGA的數據,并將讀取的數據寫入到隊列,而寫文件線程讀到隊列有數據,即將數據解析并寫入磁盤。主線程監控按鍵、定時器及觸發信號等事件,只要事件發生,就執行與事件綁定的函數。應用層顯示界面如圖8所示,可對設置采樣參數啟動采樣,查看設定時間范圍內的數據波形,導出該段數據、波形截圖,設定網絡連接將數據直接傳至上位機,啟動校準模式等。

圖6 大容量存儲的數據流與總線速度

圖7 顯示界面程序流程圖
所設計的基于PCIe總線架構的大容量數據存儲系統,實現了系統的總體框架設計和存儲架構硬件設計,完成了系統通信協議以及數據存儲流程設計。界面顯示和測試結果表明,整個系統運行穩定,可以實現上述的功能。與現有數字示波器和數據存儲記錄儀相比,在相同的采樣速率和分辨率下能存儲記錄的數據量更多,對于需要老化測試、對歷史數據進行回顧的復雜系統而言其更為適用,目前該系統已應用于多種產品的環境試驗和老化測試中,全程記錄產品關鍵節點全過程變化趨勢,為產品質量考核和問題分析提供完整數據支撐。

圖8 應用層顯示界面