熱搜關鍵詞: PCIe高速數據采集卡RFSOC高速數據采集軟件無線電平臺VPX高速數據采集卡高速信號采集卡PCIe數據采集數字信號處理
一、概述
具備多次觸發的連續數據流模式
可長時間進行雷達信號仿真和模擬
高SNR(>90dB)與SFDR(>105dB)
高SNR(>90dB)與SFDR(>105dB)
PCIe
|
是新的總線和接口標準,PCIe屬于高速串行點對點雙通道高帶寬傳輸,所連接的設備分配獨享通道帶寬,不共享總線帶寬,主要支持主動電源管理,錯誤報告,端對端的可靠性傳輸,熱插拔以及服務質量(QOS)等功能。PCIe交由PCI-SIG(PCI特殊興趣組織)認證發布后才改名為“PCI-Express”,簡稱“PCI-E”。 |
DMA
|
(Direct Memory Access,直接內存存取) 是所有現代電腦的重要特色,它允許不同速度的硬件裝置來溝通,而不需要依于 CPU 的大量中斷負載。 |
ADC
|
模擬到數字式轉換器 |
CreateFile
|
是一個多功能的函數,可打開或創建以下對象,并返回可訪問的句柄:控制臺,通信資源,目錄(只讀打開),磁盤驅動器,文件,郵槽,管道。
|
ReadFile
|
從文件指針指向的位置開始將數據讀出到一個文件中,且支持同步和異步操作如果文件打開方式沒有指明FILE_FLAG_OVERLAPPED的話,當程序調用成功時,它將實際讀出文件的字節數保存到lpNumberOfBytesRead指明的地址空間中。 |
WriteFile
|
WriteFile函數將數據寫入一個文件。該函數比fwrite函數要靈活的多。也可將這個函數應用于對通信設備、管道、套接字以及郵槽的處理 |
fwrite
|
fwrite是C語言函數,指向文件寫入一個數據塊。 |
nQTStoreInit
|
輸入參數為板卡信息塊,通過調用此接口申請好 Ping-Pang buffer。
|
nQTStoreData
|
根據用戶指定的文件名創建好文件,并且開始采集存儲。
|
nQTStoreStop
|
停止采集和存儲。 |
nQTFreeMemory
|
釋放 Ping-Pang buffer 的內存。 |
微星X99A SLI PLUS主板
Intel i7-5820k 處理器
金士頓 8GB DDR4 內存x4
Spectrum M2i.4912:8通道,16bit,10MS/s采樣率AD采集卡
±200mV到±10V軟件可調增益設置
PCIe2.0 x1接口
NVIDIA GeForce GTX 980
支持CUDA 并行處理
4TB RAID0磁盤陣列
磁盤陣列由4塊1TB三星固態硬盤組成,每個固態硬盤支持大500MS/s(實測)的寫入速度,組成RAID0陣列后支持大1.2GB/s(實測)的寫入速度。RAID0磁盤沒有奇偶數目的要求,數據被平均分割存儲到多個磁盤上,總的讀寫速度就是磁盤數量乘以單個磁盤的讀寫速度,缺點在于一塊磁盤損壞,則整個磁盤陣列即壞,數據無法被修復。
Control Center:Control center是spectrum公司的專有的控制采集卡校準、license激活、底層kernel控制的軟件。啟動control center有Kernel Register Settings,可以設置底層kernel開辟的物理連續地址空間,用于DMA大數據量存儲使用。
當使用虛擬的內存來進行DMA傳輸數據的時候,這個過程是非常復雜的。
因為,DMA傳輸數據是直接通過物理地址傳遞的,這樣DMA傳輸就得通過每個獨立的4kByte的頁來進行傳輸,這樣每次DMA傳輸的數據都是在不同物理地址4kByte頁上切換到降低DMA傳輸的效率。
Spectrum kernel driver:Spectrum公司通過自己底層驅動,可以通過軟件向底層申請開辟一段物理地址連續的地址空間,申請完,需要重啟電腦,重啟電腦,在PC機boot的過程中,需要多花費平時的80%的啟動時間。
恰好達到PCIe接口的極限速度。采集到的信號在寫入磁盤時總的數據量為:
限制文件存儲速度的終瓶頸還是磁盤的固有特性,我們所能做到只是改善軟件的實現去逼近硬盤的極限讀寫速度。一般windows系統粘貼拷貝文件的時候,影響存儲速度地方就在于它利用了windows文件緩存機制,當你拷貝一個大文件時,windows會根據你要拷貝的文件大小緩存很大一部分到系統緩存,這時候你會看到系統緩存瞬間飆漲,機器性能大大降低,所以我們要避免使用windows緩存機制,并且盡量讀寫連續的文件塊。
一般來說,我們操作一個windows I/O句柄用的是windows文件讀寫系列API:CreateFile, ReadFile, WriteFile等,這些API不僅可以讀寫文件句柄,所有的I/O設備句柄都能通過這些API來操作。比如socket描述符, 串口描述符,管道描述符等。通過設置他們的參數,我們可以選擇以不同的方式操作IO。
1. 文件的存取開頭的字節偏移量必須是扇區尺寸的整倍數。
2. 文件存取的字節數必須是扇區尺寸的整倍數。例如,如果扇區尺寸是512字節。程序就可以讀或者寫512,1024或者2048字節,但不能夠是335,981或者7171字節。
3. 進行讀和寫操作的地址必須在扇區的對齊位置,在內存中對齊的地址是扇區。尺寸的整倍數。一個將緩沖區與扇區尺寸對齊的途徑是使用VirtualAlloc函數。
Buf0和Buf1收發數據為ping-pang原理,Buf0和Buf1的狀態為empty和full,當數據通過TX DMA讀出后,Buf的狀態置為empty,當數據通過RX DMA寫入后,Buf的狀態置為full。RX DMA和TX DMA的狀態分別有WrBuf0,WrBuf1,RdBuf0,RdBuf1,OpCmpt,NotStart,TXHungry0,TXHungry1幾種狀態。
對于ADC接收數據方向,RX DMA寫buf0產生完成中斷后,首先開始寫buf1操作,然后建立寫buf0的DMA接收鏈表。同樣當RX DMA寫buf1產生完成中斷后,首先開始寫buf0操作,然后建立寫buf1的DMA接收鏈表。
下圖為寫入1GB數據時使用WriteFile進行寫數據操作時實測的速度:
cudaMalloc(): 與C語言中的malloc函數一樣,用戶函數分配線性內存空間。
cudaMemcpy():與C語言中的memcpy函數一樣,只是此函數可以在主機內存和GPU內存之間互相拷貝數據。
cudaFree(): 與C語言中的free函數一樣,只是此函數釋放的是
cudaMalloc: 分配的內存,主要用于釋放線性內存空間。
對GPU FFT運算之后的結果,10M個實部real和10M個虛部imag,用MATLAB進行仿真,如下圖: