如何優化FPGA資源使用或執行速度?

更新 Nov 16, 2023

產品資訊

軟體

  • LabVIEW FPGA Module

問題敘述

當我編譯FPGA程式時,我的編譯因為發生了overmapping而失敗,無法滿足時序上的要求,或者無法以我期望的速率執行迴圈。我可以採取哪些步驟來優化我的FPGA程式碼並解決這些問題?

解決方案

減少gate的使用並提高速度:

  • 避免使用大型VI
    編譯後,會生成一個報告,提供有關已編譯VI的速度和大小的資訊。Device Utilization Summary部份提供有關所用slices數量的資訊。此度量(metric)標準是硬體上已編譯程式大小的最重要度量。設計過程應該是一個迭代過程。在此過程中,隨著程式變大,使用的slices可能會增加,從而可以確定何時空間不足。
  • 使用Single Cycle Timed Loop (SCTL) 來優化程式碼
    任何放入SCTL的LabVIEW FPGA程式碼都針對性能進行了優化,並且消除了所有額外的邏輯強制數據流。因此,將部份程式碼放入SCTL並簡單地將true連接到停止條件(僅運行一次)將創建優化的程式碼,從而減少FPGA資源使用量並允許您為程式碼指定clock source。
  • 使用適當的仲裁(arbitration)
    Reentrant VI中的共享資源導致仲裁的發生以防止Race Condition與對資源同時訪問。仲裁消耗大量的FPGA資源,並且可能阻礙平行執行,因為程式碼的某些部份無法繼續運作,直到資源再次釋放出來。


只減少gate的使用:

 

  • 消除Front Panel上的陣列
    由於FPGA需要雙緩衝,因此Front Panel上的陣列佔用了大量的空間。Front Panel陣列control和indicator可以用DMA FIFO,Block memory instantiation,Look Up Table (LUT) 或block diagram替換。
  • 最小化Front Panel元素
    FPGA Main VI Front Panel上的每個元件都會創建一個register,以便主機可以與FPGA進行通訊。此過程在FPGA上使用額外的gate來促進通訊。如果您不需要使用某些值與主機通信,請將這些終端(terminals)轉換為常數(constant)或global variables。
  • 用二進制邏輯的計算替換算術面板上的subVI
    對於某些情況,函式面板子VI(例如Quotient and RemainderGreater than?,以及In Range and Coerce可以簡化為二進制操作。這可能會大大減少FPGA上的gate使用,但可能需要更多的開發時間來創建。
  • 創建memory items和FIFO時使用Block Memory
    在為FPGA Target創建memory items和FIFO時,有幾種底層實現選擇可用於實例化硬體上的item。其中一些(例如Flip-Flops或Look-Up Table)使用FPGA資源,這可能是FPGA VI的其他部份所需要的。將這些切換為使用Block Memory實現將釋放這些資源以供程式碼的其他部份使用。Block Diagram上的大型陣列也可能耗盡這些資源,因此在需要存儲大量值時,請考慮使用memory items。
  • 外包給主機
    有時您可能已經在FPGA上實現了不需要在那裡實現的功能。因此,程式的某些部份可以讓主機執行,然後通過DMA或I / O節點通訊送回結果。
  • 將FPGA程式碼分成幾部份
    有時您的FPGA程式碼只是多個部份,而不一定必須在同時運行的硬體上。例如,特定測試有四個單獨的測試例子。您可以創建四個獨立的FPGA程序,以便根據需要從主機下載並運行,而不是將所有情況都放在一個FPGA程式中。
  • 使用non-reentrant subVIs
    預設上,所有LabVIEW FPGA VI都是可重入(reentrant)的,這將為您使用的subVI的每個實例(instance)分配新的資源。透過將某些子VI切換到non-reetrant,這些子VI的實例都引用相同的硬體實例。


只有提高速度:

  • 使用平行操作
    FPGA的一個主要優點是能夠在處理多個數據集合或迭代(iteration)時輕鬆創建平行實現。透過創建程式碼部份的平行實例,可以減少執行處理所需的總時間。由於FPGA VI預設是可重入的,因此可以像平行運行的subVI的多個實例一樣簡單。
  • 使用Pipelining
    透過將順序進程劃分為可並行運行的離散步驟,pipeline技術允許您的程式碼的多個部份同時運行。透過以這種方式處理資料的不同部份,程式碼可以運行的總速度將增加。使用shift register或feedback node允許邏輯平行執行並同時處理多次迭代。


有關詳細資訊,請查看NI LabVIEW for CompactRIO Developer's Guide 。

進階使用者可能希望參考NI LabVIEW High-Performance FPGA Developer's Guide