FPGAのリソース使用量または処理速度を最適化する方法はありますか?

更新しました Nov 16, 2023

使用製品

ソフトウェア

  • LabVIEW FPGA Module

問題

FPGAコードをコンパイルすると、オーバーマッピングのためにコンパイルが失敗したり、タイミングの要件を満たしていない、または希望のループレートで実行できません。FPGAコードを最適化してこれらの問題を解決するには、どのような手順が必要ですか?

解決策

ゲート使用数を減らして処理速度を上げる: 

  • 大規模なVIを避ける 
    コンパイル後、コンパイルされたVIの速度とサイズに関する情報を提供するレポートが生成されます。Device Utilization Summaryセクションでは、使用されるスライス数に関する情報が提供されます。この測量は、ハードウェア上でコンパイルされたプログラムのサイズの最も重要な尺度です。設計プロセスは、反復プロセスでなければなりません。プロセス中に、プログラムが大きくなると使用されるスライスが増加して、スペースが不足していることを識別できます。
     
  • Single Cycle Timed While Loop (SCTL)を使用してコードを最適化する
    SCTLに組み込まれたLabVIEW FPGAコードは、パフォーマンスを最適化し、データフローを強化するすべてのロジックが排除されます。したがって、コードの一部をSCTLに入れ、停止条件(1回だけ実行)に配線するだけで、最適化されたコードが作成され、FPGAの使用数が削減され、コードのクロックソースを指定できるようになります。
     
  • 適切なアービトレーションを使用する
    再入実行可能なサブVIの共有リソースは、競合状態や同時アクセスを防止するための仲裁につながります。アービトレーションは大量のFPGAリソースを消費し、コードの一部がリソースが解放されるまで処理を続行できないため、並列実行を妨げる可能性があります。


 

ゲート使用数のみを減らす:

  • フロントパネルで配列の使用を避ける
    フロントパネル上の配列は、FPGA上でダブルバッファリングが必要とされるため、チップ上に特別なスペースを占有します。フロントパネルの配列制御器と表示器は、DMA FIFO、ブロックメモリのインスタンシエーション、ルックアップテーブル、またはブロックダイアグラム定数で置き換えることができます。
     
  • フロントパネル要素を最小化する
    FPGAメインVIのフロントパネルの各要素は、ホストがFPGAと通信してインタフェースできるようにレジスタを作成します。このプロセスでは、FPGA上の余分なゲートを使用して通信を容易にします。ホストと通信するために値を使用する必要がない場合は、それらの端末を定数またはグローバル変数に置き換えます。
     
  • 数値演算関数を二値論理演算に置き換える
    商と余り大きい?、および範囲と強制などの関数パレットのサブVIは、場合によってはバイナリ演算に単純化することができます。これにより、FPGAのゲート使用数が大幅に削減される可能性がありますが、作成にはより多くの開発時間が必要になる可能性があります。
     
  • メモリ項目とFIFOの作成時にブロックメモリを使用する
    FPGAターゲット用にメモリ項目とFIFOを作成する場合、ハードウェア上で項目をインスタンス化するために使用できるいくつかの実装方法があります。フリップフロップやルックアップテーブルの実装など、FPGA VIの他の部分に必要なFPGAリソースが使用されます。ブロックメモリの実装を使用するようにこれらを切り替えると、コードの他の部分で使用するためにそれらのリソースが解放されます。ブロックダイアグラムの大きな配列もこれらのリソースを使い果たす可能性があるので、大きな値の配列を格納する必要がある場合はメモリ項目の使用を検討します。
     
  • ホストにアウトソーシングする
    FPGAに実装される必要のない機能を実装していることがあります。したがって、ホストが実行してからDMAまたはI/Oノード通信を介して結果を戻すことができるプログラムの一部が存在する可能性があります。
     
  • FPGAコードを項目ごとに分ける
    FPGAコードは、同時に実行するハードウェア上にある必要はない複数の部分が存在する場合があります。たとえば、特定のテストには4つの異なるテストケースがあります。1つのFPGAプログラムにすべてのケースをチップ上に置くのではなく、4つの各FPGAプログラムを作成して、必要に応じてホストからダウンロードして実行することができます。
     
  • 再入実行可能なサブVIを使用する
    デフォルトでは、すべてのLabVIEW FPGA VIが再入実行可能であるため、使用するサブVIのインスタンスごとに新しいリソース割り当てが行われます。特定のサブVIを非再入実行に切り替えることにより、これらのサブVIのインスタンスはすべて同じハードウェアインスタンスを参照します。
 

 

処理速度のみを上げる:

  • 並列実行を使用する
    FPGAプログラミングの主な利点の1つは、複数のデータセットまたはイテレーションを処理する際に並列実装を容易に作成できることです。コードの一部の並列インスタンスを作成することで、処理を実行するのに必要な全体的な時間を短縮できます。FPGA VIはデフォルトで再入実行なため、これは並列実行されるサブVIの複数インスタンスと同じくらい簡単です。
     
  • パイプライン処理を使用する 
    パイプライン処理では、コードの複数の部分を、順次プロセスを並列実行できる個別のステップに分割することで、同時に実行することができます。このようにしてデータの異なる部分を処理することにより、コードを実行できる全体の速度が向上します。シフトレジスタまたはフィードバックノードを使用して、ロジックを並列に実行し、同時に複数の反復を処理できるようにします。

詳細は、NI LabVIEW for CompactRIO開発者ガイドを参照してください。上級ユーザは、NI LabVIEWハイパフォーマンスFPGA開発ガイドも参照してください。