LabVIEWCompactRIO 開發(fā)指南32 確保無損數(shù)據(jù)傳輸
LabVIEWCompactRIO?開發(fā)指南32
確保無損數(shù)據(jù)傳輸
如果無損數(shù)據(jù)傳輸很重要,或者如果要將數(shù)據(jù)從多個I/O通道傳輸?shù)酵籇MA?FIFO,則必須能夠監(jiān)控DMA機制的狀態(tài)并對發(fā)生的任何故障做出反應。在FPGADMA寫入節(jié)點上,超時通常表示DMA緩沖器已滿。當它變?yōu)檎鏁r,應該監(jiān)視并鎖定它。必須從FPGA端執(zhí)行此操作,因為僅從主機采樣此寄存器不足以捕獲快速轉(zhuǎn)換。檢測到超時事件后,還需要從中恢復。圖5.24提供了檢測和處理DMA?FIFO超時情況的示例。

圖5.24.檢測溢出并從中恢復
在此圖中,DMA?FIFO的超時事件在FPGA?VI上受到監(jiān)控。當發(fā)生超時事件時,超時寄存器設(shè)置為True。一旦超時寄存器設(shè)置為True,它被鎖存,直到主機VI清除緩沖區(qū)并將復位寄存器設(shè)置為True。RT主機VI上的超時情況通過讀取剩余元素來刷新緩沖區(qū)。一旦緩沖器被清除,復位寄存器將設(shè)置為true,F(xiàn)PGA?VI上的采集將恢復。通過使用這種處理DMAFIFO超時事件的方法,可以檢測緩沖區(qū)溢出并從中恢復,從而避免因缺少數(shù)據(jù)點而創(chuàng)建的bug。
避免緩沖區(qū)溢出
如果收到緩沖區(qū)溢出,則需要增加主機上的DMA?FIFO緩沖區(qū)大小、在主機上讀取更大的緩沖區(qū)或在主機上更頻繁地讀取。請記住,許多控制和監(jiān)視應用程序只需要最新的數(shù)據(jù),因此丟失數(shù)據(jù)對于系統(tǒng)來說可能不是問題,只要它在調(diào)用時返回最新的數(shù)據(jù)。
如果遇到緩沖區(qū)溢出,可以使用DMA配置調(diào)用增加主機FIFO緩沖區(qū),如圖5.25所示。對于FPGA到RT的傳輸,經(jīng)常發(fā)生溢出,因為主機FIFO緩沖器(而不是FPGAFIFO緩沖器)不夠大。通過FIFO屬性頁設(shè)置的DMAFIFO的大小僅決定占用FPGA內(nèi)存的FPGAFIFO緩沖區(qū)的大小。默認情況下,主機FIFO緩沖區(qū)大小為10,000個或FPGAFIFO緩沖區(qū)大小的兩倍,以較大者為準。

圖5.25.增加主機上的DMA?FIFO大小
增加緩沖區(qū)的大小有助于減少由偶發(fā)事件(如總線和主機處理器爭用)引起的緩沖區(qū)溢出情況。但是,如果平均傳輸速率高于系統(tǒng)可以承受的速率,則無論緩沖區(qū)的大小如何,數(shù)據(jù)最終都會溢出緩沖區(qū)。使用適當大小的緩沖區(qū)減少緩沖區(qū)溢出情況的一種方法,是嘗試一次讀取大量數(shù)據(jù),這樣可以降低每個數(shù)據(jù)單元的開銷,從而提高整體吞吐量。
CompactRIOWaveform?Reference?Library
如果應用需要使用DMA?FIFO來從FPGA傳輸模擬數(shù)據(jù),可以利用NI開發(fā)的CompactRIO波形參考庫來快速開始應用開發(fā)。該參考應用程序介紹了CompactRIO波形數(shù)據(jù)采集VI和示例源代碼,并支持三角積分和SAR(掃描)模塊。

圖5.26.使用CompactRIOWaveform參考庫API的連續(xù)采集
CompactRIO波形參考庫包含一個類似NI-DAQmx的API,該API在LabVIEW實時中執(zhí)行,并將原始模擬數(shù)據(jù)轉(zhuǎn)換為波形數(shù)據(jù)類型。波形數(shù)據(jù)類型使得向UI顯示多個I/O通道以及與常見的數(shù)據(jù)記錄API接口(如技術(shù)數(shù)據(jù)管理流(TDMS))變得容易。API還會根據(jù)配置的比例將數(shù)據(jù)轉(zhuǎn)換為適當?shù)墓こ虇挝弧?/p>
圖5.27.使用CompactRIO波形參考AP
該庫包括一個FPGA?VI,需要稍微修改該VI,以參考系統(tǒng)中使用的I/O模塊。對于大多數(shù)應用,只需要修改FPGA?VI。此VI旨在在使用DMA?FIFO時提供最佳流性能,包括用于監(jiān)控和處理緩沖區(qū)溢出情況的機制。每當使用DMA?FIFO從一個或多個模擬通道流式傳輸數(shù)據(jù)時,請使用此FPGA?VI模板作為開始。
可以在NI開發(fā)人員專區(qū)白皮書NICompactRIO波形參考庫中找到更多信息包括安裝文件。
DeltaSigmaAcquisition.lvpj和SARAcquisition.lvpj在
安裝庫后可在\Program?Files\National?Instruments\LabVIEW[Version]\user.lib\cRIOWfm\_exampleProjects中找到。
其他參考資料
■?How?DMATransfers?Work
■?BestPractices?for?DMA?Applications
有關(guān)在FPGA目標上使用DMA?FIFO的更多信息,請參閱LabVIEW幫助文檔TransferringData?Using?Direct?Memory?Access。
通過中斷同步FPGA和主機VI
LabVIEW?FPGA具有中斷,允許主機VI等待FPGA引發(fā)指定的中斷,從而同步FPGA和主機VI。FPGA?VI可以阻塞,直到主機確認中斷。這樣就無需持續(xù)檢查FPGA寄存器的狀態(tài)以查看是否已設(shè)置給定標志,并且在未引發(fā)中斷時降低了CPU使用率。在單核主機上,與輪詢和睡眠方法相比,可以實現(xiàn)相對良好的延遲并降低CPU負載。圖5.28中的示例顯示了如何在FPGA上實現(xiàn)中斷。此示例稱為同步中斷方法,可在NI示例查找器中找到。

圖5.28.用于發(fā)送中斷的LabVIEW?FPGA編程結(jié)構(gòu)
中斷提供簡單的代碼和簡單的API,但應該注意以下事項:
■處理主機側(cè)的中斷通常涉及5μs至50μs的開銷。此響應延遲可能是可以接受的,具體取決于應用程序或事件的頻率。
■如果不希望FPGA?VI在中斷被確認之前阻塞,則應添加單獨的FPGAloop來發(fā)送中斷。
■中斷不是多核目標上延遲最低的選項。通過專用于CPU內(nèi)核來持續(xù)監(jiān)控FPGA寄存器(無休眠),可以獲得最快的響應時間。
其他參考資料
■?UsingInterrupts?on?the?FPGA?to?Synchronize?the?FPGA?and?Host
■?SynchronizingFPGA?VIs?and?Host?VIs?Using?Interrupts
需要說明的是,上述的例程和文檔,都是可以下載的,雙擊即可打開,其中壓縮文件是可以采用粘貼復制的方式,拷貝到硬盤上。這不是圖片,各位小伙伴看到后嘗試一下,這個問題就不用加微信咨詢了。有關(guān)LabVIEW編程、LabVIEW開發(fā)等相關(guān)項目,可聯(lián)系們。附件中的資料這里無法上傳,可去公司網(wǎng)站搜索下載。