關於LabVIEW FPGA Module中的Single-Cycle Timed Loop常見的問題與解答

更新 Nov 6, 2023

產品資訊

軟體

  • LabVIEW FPGA Module

其他

FPGA

問題敘述

我發現LabVIEW FPGA Modules可以使用Single-Cycle Timed Loops (SCTL)。什麼是SCTL,這功能有什麼優勢和限制?

解決方案

什麼是Single-cycle Timed Loop
Single-cycle Timed Loop (SCTL)是一種特殊的LabVIEW定時迴圈結構(Timed Loop Structure)。在FPGA VI中使用的Timed Loop Structure一定要是SCTL。當執行FPGA VI時,所有包含在SCTL裡的功能會在您所設定的FPGA Clock的一個週期(Tick)內執行完。FPGA Clock的默認設定是40 MHz (FPGA global clock) 。除了40MHz以外,SCTL亦可以使用其他的clock,這些clock主要是從40 MHz的clock衍生而來的。當FPGA Target正在運行時,無法動態地調整Timed Loop的定時屬性(timing properties)。

相較一般的Timing Loop,使用SCTL執行的程式速度快多少?
在FPGA VI中使用傳統的While Loop至少需要3個Tick才會執行完一次迴圈。這是因為在編譯FPGA VI時使用的Enable Chain的關係。要解釋Enable Chain的概念的超出了本文件的範疇,大致來說Enable chain可以用來確保FPGA VI被編譯為Bitfile時,同時還存了數據流(data flow)的特性。

此外,儘管在沒有數據相關性(data dependency)的情況下,While Loop內的功能將平行執行,但While Loop內每個功能在至少時執行也至少需要一個tick的時間。使用SCTL,迴圈內的所有功能必須在一個tick內執行完畢。

SCTL的性能優勢會因為FPGA VI內的功能不同而有差異。如果您的程式碼可以在放在SCTL裡並成功編譯,您將會注意到相較於同樣的功能放在一般的While Loop裡,SCTL的性能會顯著提升。

使用SCTL會更節省FPGA的運算資源嗎
沒錯。由於您的運算邏輯是利用硬體組合實現的,因此使用搭配SCTL的程式碼生成的FPGA配置使用的資源更少。 舉個例子:一般的程式碼在執行先加法再乘法的運算邏輯時是進行以下的步驟:運算加法、保存結果、接著再進行乘法、保存最終結果,然而SCTL會在一個Tick中完成所有的加法與乘法的運算,並不需要去保存加法與乘法中間的結果。這節省了FPGA的資源,因為在操作之間不需要正反器(flip-flop)來保存每個先前操作的結果。

可以在SCTL內部使用所有的功能和結構嗎?
不行。執行時間超過一個Tick的功能,例如類比I / O功能或任何等待I/O觸發的功能都無法在SCTL內使用。

循序結構(Sequence Structure)可以放在SCTL中,但會在FPGA上執行前從程式碼中刪除。

Timed Loop (Single-Cycle)這個LabVIEW Help網頁羅列了無法在SCTL中使用的功能。更多關於SCTL支持的功能或VI以及timing information,請參見LabVIEW Help。
  • Analog Period Measurement VI
  • Butterworth Filter VI
  • Discrete Delay VI
  • Divide function
  • FIFO Clear function
  • FPGA I/O Method Node except with some FPGA targets
  • FPGA I/O Property Node except with some FPGA targets
  • Interrupt VI
  • Look-Up Table 1D VI with the Interpolate data checkbox selected
  • Loop Timer VI
  • Multiple FPGA I/O Nodes configured for the same I/O resource if at least one node is inside the loop and at least one node is outside the loop
  • Non-reentrant subVIs if you use multiple instances
  • Notch Filter VI
  • PID VI
  • Quotient & Remainder function
  • Reciprocal function
  • Rotate 1D Array function
  • Sine Wave Generator VI
  • Single-precision floating-point operations
  • Square Root function
  • Timed Loop
  • Wait Express VI
  • Wait on Occurrence function
  • While Loop
我可以使用 pipelining技術在SCTL內部執行更多邏輯運算嗎?
可以。您可以使用移位暫存器(shift registers)或反饋節點(feedback nodes)來允許邏輯平行執行,並將數據傳到下一個SCTL迴圈;因此,整個邏輯鏈在多次SCTL跌代執行。與其他FPGA VI的平行運算一樣,這會使用額外的FPGA資源。

如果我要運行的邏輯無法在SCTL裡的一個Tick內執行,我會收到錯誤消息嗎?
沒錯,雖然在你編譯FPGA VI之前,LabVIEW通常不會拋出與時序相關的錯誤(timing-related errors)。在編譯時通常有兩種情況,您會收到到與SCTL相關的錯誤。首先,當LabVIEW FPGA嘗試將VI編譯為VHDL程式碼 (生成中間文件(Intermediate Files))時,如果在SCTL中使用了任何不受支持的函數(例如,商數或餘數),則會收到錯誤對話框。在編譯時這類錯誤只需要幾秒鐘就會出現(完整的VHDL編譯過程不會開始)。

即使您避免使用不受SCTL支援的功能,如果SCTL包含太多的邏輯使得迴圈無法在單個Tick內執行完,則編譯將因違反時序而失敗。在使用Xilinx tools實際編譯時會發生此類錯誤,此錯誤可能會在編譯開始後幾分鐘(或更長時間)才出現。如果遇到這樣的錯誤,請考慮減少SCTL中的邏輯或用pipelining方法以允許VI成功編譯。

SCTL是一項進階功能嗎?
沒錯。雖然某些任務可以在SCTL中非常簡單地實現,但有些任務可能具有挑戰性。例如,如果使用SCTL,則無法使用等待功能來實現高速數位協議( high-speed digital protocols)。您必須使用state machine,以便迴圈的每次迭代只需要一個Tick。 SCTL為需要它的應用程式提供了速度和效率,但使用起來可能很棘手。在某些情況下,使用傳統的While Loop可能更合適。

我可以使用更快的全局時脈SCTL嗎?
是的,但是在80 MHz或更高頻率下編譯的SCTL中可以執行的功能更少。