Field Programmable Gate Array (FPGA) は、設計者のニーズに合わせて再構成可能な集積回路です。FPGAチップにはプログラム可能な論理ブロックが多数含まれており、その柔軟性、ハードウェアタイミングによる速度と信頼性、並列性によってチップが広く採用されています。
またプロセッサと異なり、FPGAは並列性を備えているため、異なる処理操作が同じリソースを巡って競合することもありません。個々の処理タスクはチップ上の専用セクションに割り当てられ、他の論理ブロックからの影響を受けずに機能します。そのため、アプリケーションの各部は処理を追加しても影響されずに実行することができます。
図1: FPGAがプロセッサベースシステムよりも優れている点の1つは、アプリケーションロジックがオペレーティングシステム、ドライバ、アプリケーションソフトウェア上で実行されるのではなく、ハードウェア回路で実装されることです。
各FPGAチップは、再構成可能なデジタル回路を実装するためのプログラム可能な相互接続端子と、回路から外部にアクセスできるようにするためのI/Oブロックを備えた、有限数の定義済みリソースで構成されています。
図2: FPGAの各部
FPGAリソースの仕様には通常、構成可能ロジックブロックの数、乗算器などの固定機能ロジックブロックの数、組み込みブロックRAMなどのメモリリソースのサイズが含まれます。FPGAには多くの仕様がありますが、アプリケーション開発用途でFPGAを選定および比較する際は、一般にこれらの仕様が最も重要となります。
構成可能論理ブロック (CLB) は、FPGAの基本論理ユニットです。スライスやロジックセルとも呼ばれるCLBは、フリップフロップとルックアップテーブル (LUT) という2つの基本コンポーネントから構成されています。さまざまなFPGAファミリごとにフリップフロップとLUTのパッケージ構成の方法が異なるため、フリップフロップとLUTを理解することが重要です。
フリップフロップとは、FPGA回路内でロジックを同期し、クロックサイクル間の論理状態を保存するために使用されるバイナリシフトレジスタです。各クロックエッジにおいて、フリップフロップは入力の1または0 (TRUE/FALSE) の値を受け取り、次のクロックエッジまでその値を一定に維持します。
図3: フリップフロップ記号
フリップフロップとは、FPGA回路内でロジックを同期し、クロックサイクル間の論理状態を保存するために使用されるバイナリシフトレジスタです。各クロックエッジにおいて、フリップフロップは入力の1または0 (TRUE/FALSE) の値を受け取り、次のクロックエッジまでその値を一定に維持します。
図4: 4入力LUT
CLB内のロジックの多くは、LUTという形で非常に少数のRAMを使用して実装されます。FPGA内のシステムゲートの数が、特定のチップ内のNANDゲートとNORゲートの数を表していることは容易に推測できます。しかし実際には、すべての組み合わせロジック (AND、OR、NAND、XORなど) はLUTメモリ内に真理値表として実装されます。真理値表とは、入力の各組み合わせに対する出力リストです。
ここでデジタルロジックの簡単な復習です。
例として、ブールAND演算を図5に示します。
図5: NI LabVIEWブールAND演算
AND演算の2つの入力に対応する真理値表を表1に示します。
入力1 | 入力 2 | 出力 |
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
表1: ブールAND演算の真理値表
図6: NI LabVIEW乗算関数
2つの数を乗算するという一見シンプルなタスクも、デジタル回路で実装すると極めて負荷の大きい複雑な演算となることがあります。大まかな例として、図6は組み合わせロジックを使って4ビット×4ビットの乗算器を実装する1つの方法を表す回路図を示しています。
図7: 4ビット×4ビット乗算器の回路図
ここで2つの32ビット数を乗算するとします。すると1つの乗算に2000以上の演算が必要になります。これではリソースがすぐに足りなくなるので、FPGAは数式演算/信号処理アプリケーションでのLUTおよびフリップフロップの使用を節約するため、乗算回路をあらかじめ搭載しています。
多くの信号処理アルゴリズムでは、乗算された数値の累積値を保持する必要があり、そのためXilinx Virtex-5 FPGAのような高性能FPGAには乗累算回路があらかじめ搭載されています。これらの構築済み処理ブロックは、DSP48スライスとも呼ばれ、25ビット×18ビットの乗算器と加算器回路を搭載しています
FPGAを選ぶ際に検討すべきもう1つの主要仕様として、メモリリソースがあります。FPGAチップに組み込まれているユーザ定義のRAMは、データセットを保存したり並列タスク間で値を渡したりするのに便利です。FPGAの種類によっては、オンボードRAMを16または36 kbのブロックに構成できます。また、フリップフロップを使ってデータセットを配列として実装することもできますが、配列が大きくなるとFPGAロジックリソースにとって負荷が大きくなります。32ビット数の100要素配列はVirtex-II 1000 FPGAのフリップフロップの30パーセント以上を消費することもあります。組み込みブロックRAMなら1パーセント未満です。デジタル信号処理アルゴリズムはデータブロック全体または複雑な方程式の係数をトラッキングすることが必要になることが多く、オンボードメモリがなければ、多くの処理関数はFPGAチップの構成可能なロジックに収まりません。
FPGAは本質的に並列実行方式をとるため、別々のクロックで独立したハードウェアロジックを駆動することができます。異なるループレートで実行しているロジック間でデータをやり取りするのは厄介なタスクであり、FIFO (first-in-first-out:先入れ先出し) メモリバッファによる転送を効率化するのに、オンボードメモリがしばしば使用されます。
FPGAには、速度、信頼性、柔軟性など、多くの利点がありますが、トレードオフもあります。FPGAには、マイクロプロセッサアーキテクチャやオペレーティングシステムのようなドライバエコシステムやコード/IPベースはありません。さらに、マイクロプロセッサとオペレーティングシステムを組み合わせると、ディスクへのデータロギングなどの多くの、多くの場合不可欠なタスクに使用されるファイル構造および周辺機器との通信の基盤となります。
その結果、この10年間で、マイクロプロセッサとFPGAをペアにしてI/Oに接続するハイブリッドアーキテクチャ(異種アーキテクチャ)が登場しました。最近のFPGAでは、演算性能を向上させるために、ロジックゲートとプロセッサをSystem on Chip (SoC) と呼ばれる1つのチップに統合することが多くなっています。このアプローチは、これらのターゲットの両方の利点を活用します。
ナショナルインスツルメンツでは、この強力なマイクロプロセッサとFPGAアーキテクチャをFPGA対応デバイスに実装しています。これらのデバイスは、いずれも同じアーキテクチャをベースにしながら、堅牢なシステムから高性能システムまで、さまざまなフォームファクタに対応します。
NI FPGA対応ハードウェアには、以下のテクノロジが含まれています。
FPGAチップの構成要素がわかったところで、「実行に必要なロジックを構築するために、これらの数百万のコンポーネントをどのように構成すればよいでしょうか?」と疑問に思うかもしれません。
デジタル演算タスクをソフトウェアで開発し、コンポーネント間の配線に関する情報を記述する構成ファイルまたはビットストリームとしてコンパイルします。FPGAテクノロジのこれまでの課題は、下位FPGA設計ツールはデジタルハードウェア設計に精通したエンジニアのみが使用できることでした。しかし、LabVIEWのような高レベルシンセシス(HLS)設計ツールの登場により、FPGAプログラミングの法則が変わり、グラフィカル形式のブロックダイアグラムをデジタルハードウェア回路に変換する新しい技術が生まれています。
FPGA開発の最初の20年間を通じて、VHDLやVerilogなどのハードウェア記述言語(HDL)はFPGAチップ上で実行するアルゴリズムを設計するための主要な言語へと進化しました。これらの下位言語は、FPGA上で回路を設計するという意識のもと、他のテキスト言語が提供する利点の一部を統合しています。結果として得られるハイブリッド構文では、外部I/Oポートから内部信号にマッピングまたは接続する必要があります。内部信号は、最終的にアルゴリズムを格納する関数に配線されます。これらの関数は順次実行され、FPGA内の他の関数を参照できます。しかし、FPGAでのタスク実行の真の並列性は、連続した1行ごとのフローで視覚化することは困難です。HDLは、他のテキスト言語の属性の一部を反映していますが、I/Oが信号を介して一連の関数ブロックに接続されているデータフローモデルに基づいているため、大幅に異なります。
FPGAプログラマが作成したロジックを検証するには、HDLでテストベンチを作成し、入力をアサートして出力を検証することでFPGA設計をラップアラウンドおよび実行します。テストベンチとFPGAコードは、FPGAチップのハードウェアタイミング動作をモデル化し、テスト検証のためにすべての入力および出力信号を設計者に表示するシミュレーション環境で実行されます。HDLテストベンチを作成してシミュレーションを実行するプロセスは、元のFPGA HDL設計自体を作成するプロセスよりも時間がかかることがよくあります。
HDLを使用してFPGA設計を作成し、検証したら、それをテキストベースの論理を取り込み、いくつかの複雑な手順を経てHDLをコンポーネント間の配線方法に関する情報を含む構成ファイルまたはビットストリームに合成するコンパイルツールに渡す必要があります。この複数ステップの手動プロセスでは、使用しているFPGAチップのピンへの信号名のマッピングを指定する必要があることがよくあります。
図8: VHDLでの簡単なカウンタFPGA設計
最終的に、この設計フローにおける課題は、従来型HDLのプログラミングに必要な専門知識があまり普及していないことです。その結果、大多数のエンジニアや科学者がFPGA技術にアクセスできていません。
LabVIEWなどのグラフィカルなHLS設計ツールの登場により、従来型のHDL設計プロセスにおける主な障害のいくつかが取り除かれました。並列処理とデータフローが明確に示されるLabVIEWプログラミング環境は、FPGAプログラミングに特に適しているため、従来型のFPGA設計プロセスの経験の有無にかかわらず、どのようなユーザもFPGAテクノロジーを活用できます。また、過去の知的財産 (IP) が失われないように、LabVIEWを使用して既存のVHDLをLabVIEW FPGA設計に統合することもできます。LabVIEW FPGAはハードウェアと高度に統合されているため、多くのHLSコードジェネレータのように、タイミングやリソースの制約を満たすためにVHDLでコードを書き直す必要はありません。
図9: 左側はLabVIEWです。LabVIEWはFPGAの高レベル設計ツールです。これは、VHDL設計を作成およびスケールする際によく発生する低レベルの複雑さを抽象化します。
FPGAロジックの動作をシミュレーションおよび検証するための機能を、LabVIEWは開発環境に直接提供します。低レベルHDL言語の知識がなくても、テストベンチを作成して設計のロジックを動作させることができます。さらに、LabVIEW環境の柔軟性により、Xilinx ISimなどのサイクルアキュレートシミュレータに設計をエクスポートできるため、上級ユーザが設計のタイミングやロジックをモデル化するのに役立ちます。
LabVIEW FPGA Compilation Toolでコンパイルプロセスを自動化すれば、ボタンをクリックするだけでプロセスを開始でき、コンパイル段階の完了時にレポートやエラーがあれば表示できます。FPGA設計が原因でタイミングエラーが発生した場合、LabVIEWでは以下のようなクリティカルパスが視覚的に強調されるため、デバッグプロセスが迅速化します。
LabVIEWなどの上位レベルのツールがFPGAをよりアクセスしやすくなっているため、FPGAテクノロジーの採用は増え続けています。その一方でFPGAの仕組みを理解し、ブロックダイアグラムがコンパイルされチップが実行される際に内部で起こっていることを知って、フリップフロップ、LUT、乗算器、ブロックRAMに基づいてハードウェアターゲットを選択する方法が、アプリケーションに最適なFPGAチップを選択するのに最も良い方法です。リソースの使用について理解していると、開発時の、特にサイズと速度の最適化といった段階で非常に役に立ちます。このホワイトペーパーは、すべてのFPGA基本構成要素を網羅するものではありません。FPGAおよびデジタルハードウェア設計の詳細については、以下のリソースを参照してください。