LabVIEW FPGA程式設計小結

2021-12-30 06:53:27 字數 1838 閱讀 5956

ni pxi-7813r為fpga卡,板卡上引出4個埠,每個埠有40路引腳,共160路dio,使用labview fpga模組進行程式設計控制。當fpga程式複雜度變大或是使用的dio埠數增多時,可能面臨的主要問題包括fpga空間不夠用以及實際迴圈時間過長等。之前編寫的

fpga程式示意圖如下,採集迴圈與輸出迴圈獨立,均採用控制項形式與rt程式通訊,兩塊板卡均使用了近120路dio口。基於7813r板卡程式設計實踐及涉及到的幾個瓶頸問題,簡要做了一下總結:

fpga與rt通訊時,常用的方法是使用讀寫fifo或是使用輸入輸出控制項。這兩者的特點是:

a) 兩者在速度上無明顯差別。這是建立在不使用for迴圈的基礎上的,但實際中fifo通常都要配合for迴圈來使用,for迴圈相當於序列操作,當同類埠較多時,使用for將導致迴圈時間變長,故執行速度上fifo並沒有多少優勢。

b) fifo使用合理時不丟數,而控制項不能保證。

通過配置fpga與rt中讀寫fifo的超時以及fifo大小,讀寫方式等手段,通常可保證fifo傳遞資料不丟數(可能要經過多次嘗試);而使用控制項則可能會有丟數的情況。當不嚴格要求每次while迴圈都不丟數時,可考慮使用控制項,例如對do輸出的配置,使用者可能很久才會去配置一次,而且配置後不會要求馬上生效,稍微晚幾個迴圈週期(us級)再使配置生效也不會有很大影響,這種時候使用讀取控制項值是合理的。

c) fifo可使用的資料型別有限,而控制項幾乎無限制。

就7813r而言,fifo只能傳遞指定的幾種型別的資料,而使用控制項時,可使用包括簇陣列在內的自定義控制項。

所以,還是根據實際需要來選擇吧,雖然這句話跟沒說一樣~

埠較多時,很容易就遇到連續幾個都是要求採集脈寬的,而另外連續幾個要求採集電平即可。這時候很自然想到使用for迴圈對多個埠一起進行操作,例如下圖:

如上面所說,使用for迴圈相當於使埠操作(上圖中所說的操作是指將採集到的布林轉成u32數值)變為序列;另外,要使用for,通常就得配合陣列操作,例如上圖中建立陣列等,這樣就更加導致迴圈時間變長。當發現迴圈時間不滿足使用要求時,這種處理方法可能就不能使用了,每一路單獨處理就省掉了建立陣列及for,節省了迴圈時間,但這樣又使重複**變多,工作量加大。

輸出脈衝時,脈衝的產生可以封裝成乙個子vi,供多路埠進行使用;採集脈寬時,脈寬採集可以封裝成乙個子vi供多路埠進行呼叫。然而,預設情況下,子vi的執行是序列的(因為並沒有設定vi屬性為「可重入執行」),子vi在同一時間內只能被一路埠所占用,可能導致的結果是迴圈時間變長,精度降低。如果設定子vi為可重入執行,又可能導致fpga空間佔用率過高,編譯無法通過。

我想到的一種折中的辦法是:使用幾個程式框圖一樣的子vi(功能完全一樣,將子vi多另存為幾個所生成)來代替原先乙個子vi,替換之後,相當於減少了序列執行的子vi數量,迴圈用時減少明顯。下圖中使用6個子vi a,如果用2個b與2個c替換其中的4個a,迴圈時間可能減少為原來的1/3。

這一點可能只會在fpga空間不夠用時才會被重視,下圖是邏輯片不夠用時導致的fpga編譯失敗錯誤:

因此,當資源有限時,盡量使用能滿足使用要求的最小長度的資料型別來實現,能使用u16滿足要求的堅決不用u32!另一方面,暫時還沒有發現資料型別變長時對fpga迴圈執行時間產生明顯影響。

脈衝輸出及採集均需要根據實際迴圈時間來計算,若參與運算的值不是實際的迴圈時間,輸出或採集的結果自然不會準確。例如可配置脈衝或電平輸出的埠,若輸出電平,其演算法簡單,所需時間較少,而配置為脈衝輸出時,演算法複雜。配置為單路脈衝輸出可能不會有明顯的影響迴圈時間,但當多路脈衝一起輸出時,可能影響到迴圈時間增加1~2us甚至更長。

故實際配置迴圈時間時,需按照可能的最複雜演算法進行執行測試,並依此來設定迴圈時間,以保證迴圈時間的確定性已經演算法運算的正確性。

總而言之,設計時還是應該根據實際需要,綜合考慮資料完整性、fpga板卡資源大小、迴圈時間等因素,已達到滿意效果。

C 程式設計小結

1.c 把資料型別分為基本資料型別 構造資料型別和抽象資料型別。2.c 的基本資料型別包括整數型別 實數型別 字元型別 邏輯型別和空值型別。整數型別包括int,unsigned int,short int,unsigned short int,long int和unsigned long int 實...

C語言程式設計小結精華

二級c語言程式設計模擬試題 1 8 下面程式的功能是統計從命令列上傳遞進來的第乙個引數 現字母個數。請填空完善程式。注 引數個數從0開始記數 include include void main int argcar 填空題答案 1 main函式 2 cos fabs x y sin fabs x f...

VB程式語言重要演算法小結

一 變數值的交換 演算法思想 若交換兩個變數的值,必須引入第三個新的變數進行傳遞。以下 是錯誤的 x 12 y 34 x y y x 正確的 是 x 12 y 23 t x x y y t 二 判斷乙個數是否能被另乙個數整除 演算法思想 可以用整除的定義 餘數為0 或x除以y等於x整除y等表示式進行...