FPGA の内部
概要
LabVIEW FPGA モジュールは、デジタルハードウェア設計を専門にしていない技術者や研究者がFPGA(field-programmable gate array)技術を活用できるツールです。しかしながら、使用している言語がグラフィカルでもCでもVHDLでも、裏側で行われている処理は複雑であり、FPGAの仕組みの理解に手こずる技術者も少なくありません。FPGA用に作成されたLabVIEWプログラムを実行する際、チップの内部では何が起こっているのでしょうか?この技術資料では、デジタルハードウェア設計者以外のユーザ向けに、FPGAの基本と“内部”の仕組みについて説明します。 また、高レベル設計ツールを使用する場合にも役立つような内容になっています。FPGAという特殊技術の中身が少しでもわかりやすくなれば幸いです。
目次
FPGA(Field Programmable Gate Array)
全てのFPGAチップは、再構成可能なデジタル回路を実装するための、プログラム可能な相互接続端子を持つリソースにより構成されています。
図1.FPGAの各部
FPGAチップの中身は、構成可能な論理ブロック、乗算器などの固定少数演算ロジック、ブロックRAMなどのメモリリソースに分類できます。FPGAチップにはその他にも多くのパーツがありますが、アプリケーション開発用途でFPGAを比較して選ぶ際には特に、上記の3つが最も重要となる部分です。
最も低レベルの部分であるスライスや論理セルなどの構成可能な論理ブロックは、フリップフロップ回路とルックアップテーブル(LUT)の2つの基本部分からなっています。様々なFPGAは、フリップフロップ回路とLUTの構成方法の違いによって、異なるアーキテクチャを採用しています。例えば、Virtex-II FPGAのスライスにはLUTとフリップフロップが2つずつありますが、Virtex-5 FPGAのスライスは4つずつのLUTとフリップフロップでできています。LUTアーキテクチャ自体も異なる(4入力または6入力)ことがありますが、LUTの詳細については後ほど説明することにします。
表1は、LabVIEW FPGAハードウェアターゲットに使用されているFPGAの仕様です。ゲート数は、FPGAチップとASIC技術を比較するのに従来使用されてきましたが、実際にFPGA内の個々のコンポーネントの数を表したものとは言えません。Xilinx社が新シリーズのVirtex-5製品でゲート数を明示していないのはそのためです。
|
|
Virtex |
Virtex |
Spartan |
Spartan |
Virtex |
Virtex |
Virtex |
Virtex |
|
ゲート数 |
100万 |
300万 |
100万 |
200万 |
----- |
----- |
----- |
----- |
|
フリップ |
10,240 |
28,672 |
15,360 |
40,960 |
19,200 |
28,800 |
51,840 |
69,120 |
|
LUT数 |
10,240 |
28,672 |
15,360 |
40,960 |
19,200 |
28,800 |
51,840 |
69,120 |
|
乗算器数 |
40 |
96 |
24 |
40 |
32 |
48 |
48 |
64 |
|
ブロック |
720 |
1,728 |
432 |
720 |
1,152 |
1,728 |
3,456 |
4,608 |
表1.様々な製品のFPGAリソース仕様
これらの仕様をさらによく理解するには、デジタル回路へのコードの実装方法について考える必要があります。ここで言う実装とは、高レベルのプログラミング言語を真のハードウェアに実装する処理のことです。
グラフィカルまたはテキストのプログラムコードは、論理ブロックの配線方法を記述した回路にマッピングされます。LabVIEW FPGAモジュールが、各ブロックダイアグラムの関数にFPGA特有のロジックを追加し、最終的な回路にコンパイルされます。ブロックダイアグラムの一部を例にとって、対応する回路図がどのようなものか見てみましょう。図2では、ブール関数に5つのブール信号を渡して、1つのバイナリ値をグラフィカルに演算しています。

図2.5つの信号を用いたシンプルな論理演算
通常の条件では(LabVIEWシングルサイクルタイミングループ外)、図2の結果得られる対応の回路図は、図3のようになります。
図3.図2のブールロジックに対応する回路図
見づらいかもしれませんが、2つの並列分岐回路が作成されていることがわかります。上部の黒いワイヤ5本は、各ブール処理の間にフリップフロップ回路を構成します。下部の黒いワイヤ5本が同じ数のフリップフロップ回路を持つ2つ目のロジックに配線され、デジタル回路をデータが通過するのに必要なクロックサイクル数を追跡します。この回路図には、全部で12個のフリップフロップ回路と12個のLUTが組み込まれています。上の分岐回路と各コンポーネントについて、以降のセクションで分析します。
フリップフロップ回路
図4.フリップフロップの記号
フリップフロップとは、ロジックを同期させるのに使用するバイナリシフトレジスタで、クロックサイクル間の論理状態を保存します。各クロックエッジにおいて、フリップフロップは入力の1または0(TRUE/FALSE)の値を受け取り、次のクロックエッジまでその値を一定に維持します。LabVIEW FPGAはフリップフロップを各操作の間に配置して、各操作の実行に十分な時間が割り当てられるようにします。ただし、コードがシングルサイクルタイミングループストラクチャに配置された場合だけは例外で、フリップフロップはループの反復の最初と最後のみに追加し、タイミング条件はプログラマが理解していることが必要です。シングルサイクルタイミングループ内のコードの実装方法については、後のセクションで詳しく説明します。図5は、図3の上の分岐回路を示しています。赤で囲まれているのがフリップフロップです。
図5.フリップフロップを赤で表示した回路図
ルックアップテーブル(LUT)

図6.4入力LUT
図6に示す回路図のその他のロジックは、LUT形式の非常に小さいRAMによって組み込まれています。FPGAのシステムゲート数が特定のチップのNANDゲートとNORゲートの数を示していると簡単に仮定することができますが、現実には、全ての組み合わせロジック(AND、OR、NAND、XORなど)はLUTメモリ内の真理値表として組み込まれています。真理値表とは、入力の各組み合わせに対する出力リストです。
ここでデジタルロジックの簡単なおさらいです。
例として、ブールAND処理を図7に示します。

図7.ブールAND処理
AND処理の2つの入力に対応する真理値表を表2に示します。

|
入力1 |
入力2 |
出力 |
|
0 |
0 |
0 |
|
0 |
1 |
0 |
|
1 |
0 |
0 |
|
1 |
1 |
1 |
表2.ブールAND処理の真理値表
また、表3に示すように、入力を全ての出力の数値指標として考えることもできます。
|
LUT指標 |
出力 |
|
0 (00) |
0 |
|
1 (01) |
0 |
|
2 (10) |
0 |
|
3 (11) |
1 |
表3.ブールAND処理の真理値表をLUTに実装
Virtex-IIとSpartan-3 FPGAには4入力LUTが含まれていて、最大16通りの組み合わせの4入力信号の真理値表を実装することができます。図8は、4入力回路の実装例を示しています。

図8.4つの入力信号をブールロジックで処理する回路
表4は、4入力LUT内で実装できる対応の真理値表を示しています。
|
LUT指標 |
出力 |
|
0 (0000) |
1 |
|
1 (0001) |
1 |
|
2 (0010) |
1 |
|
3 (0011) |
0 |
|
4 (0100) |
0 |
|
5 (0101) |
0 |
|
6 (0110) |
0 |
|
7 (0111) |
1 |
|
8 (1000) |
0 |
|
9 (1001) |
0 |
|
10 (1010) |
0 |
|
11 (1011) |
1 |
|
12 (1100) |
0 |
|
13 (1101) |
0 |
|
14 (1110) |
0 |
|
15 (1111) |
1 |
表4.図8の回路に対応する真理値表
Virtex-5シリーズのFPGAでは、6入力LUTが採用されています。6入力LUTは、6つの異なる入力信号の最大64通りの組み合わせにより真理値表を実装しています。LabVIEW FPGAでシングルサイクルタイミングループを使用する場合、フリップフロップ間の組み合わせロジックが極めて複雑になることがあるため、LUTを使用する実装はより重要になります。次のセクションでは、シングルサイクルタイミングループによってLabVIEWでのFPGAリソースの使用を最適化する方法を説明します。
シングルサイクルタイミングループ
前のセクションで使用したサンプルコードでは、コードはシングルサイクルタイミングループ外に置かれることを想定し、別の回路を統合して同期的にデータフローを実行するようになっていました。シングルサイクルタイミングループはLabVIEW FPGAの特殊な機能で、生成される回路図が最適化され、全ての分岐ロジックが1つのクロックサイクル内で実行することもできます。例えばシングルサイクルタイミングループが40 MHzで実行するよう構成されているとすると、全ての分岐ロジックは25 nsのクロックティック内で実行されます。
図9に示すように、上述の例と同じブールロジックをシングルサイクルタイミングループ内に置いた場合、生成される対応の回路図は図10のようになります。

図9.シングルサイクルタイミングループ内にシンプルなブールロジックを配置

図10.図9のブールロジックに対応する回路図
図3に示した回路図と比較すると、この実装方法ははるかにシンプルです。Virtex-IIまたはSpartan-3 FPGAでは、フリップフロップ間のロジックには少なくとも2つの4入力LUTが必要となります(図11参照)。

図11.図10の回路図を4入力LUTで実装
Virtex-5 FPGAには6入力LUTがあるため、1つのLUT内で全く同じロジックを実装することができます(図12参照)。

図12.図10の回路図を6入力LUTで実装
この例(図9)で使用したシングルサイクルタイミングループは、40 MHzで実行するよう構成されていますので、任意のフリップフロップ間のロジックは25 nsのクロックティック内で実行する必要があります。コードが実行できる最大速度は、回路内の電子の伝播経路に依存します。伝播遅延が最も長い分岐ロジックはクリティカルパスと呼ばれ、それにより回路のその部分の理論上の最大クロック速度が決定します。Virtex-5 FPGAの6入力LUTは、ある特定のロジックを実装するのに必要なLUTの数が減らせるだけでなく、そのロジックにおける電子の伝播遅延を短縮することができます。つまり、Virtex-5ベースのハードウェアターゲットを使用するだけで、同じシングルサイクルタイミングループのクロックレートを高めることができるのです。
Virtex-5 FPGAのメリットに関する詳細は、技術資料『Xilinx Virtex-5 FPGAのメリット』をご覧ください。
乗算器とDSPスライス

図13.乗算関数
2つの数を乗算するという一見シンプルなタスクも、デジタル回路で実装すると極めて負荷の大きい複雑な演算となることがあります。大まかな例として、図14は組み合わせロジックを使って4ビット X 4ビットの乗算器を実装する1つの方法を表す回路図を示しています。

図14.4ビット X 4ビット乗算器の回路図
ここで2つの32ビット数を乗算するとします。すると1つの乗算に2000以上の演算が必要になります。これではリソースがすぐに足りなくなるので、FPGAは数式演算/信号処理アプリケーションでのLUTおよびフリップフロップの使用を節約するため、乗算回路をあらかじめ搭載しています。Virtex-IIとSpartan-3のFPGAには18ビット X 18ビットの乗算器が搭載されていますので、2つの32ビット数を乗算する場合、1つの演算に実際は3つの乗算器が必要です。多くの信号処理アルゴリズムでは乗算処理のクロックレートをできるだけ速く維持することが必要なため、Virtex-5のような高性能FPGAには乗累算回路があらかじめ搭載されています。これらの構築済み処理ブロックは、DSP48スライスとも呼ばれ、25ビット X 18ビットの乗算器と加算器回路を搭載しています。ただし、LabVIEW FPGAでは乗算機能が単独で使用されます。表5は、様々なFPGAの乗算器リソースの一覧です。
図15.乗累算関数の使用例
|
|
Virtex-II 1000 |
Virtex-II 3000 |
Spartan-3 1000 |
Spartan-3 2000 |
Virtex-5 LX30 |
Virtex-5 LX50 |
Virtex-5 LX85 |
Virtex-5 LX110 |
|
乗算器数 |
40 |
96 |
24 |
40 |
32 |
48 |
48 |
64 |
|
種類 |
18x18 |
18x18 |
18x18 |
18x18 |
DSP48 スライス |
DSP48 スライス |
DSP48 スライス |
DSP48 スライス |
表5.様々なFPGAの乗算器リソース
ブロックRAM
FPGAを選ぶ際に検討すべきもう1つの主要仕様として、メモリリソースがあります。FPGAチップに組込まれているユーザ定義のRAMは、データセットを保存したり並列ループ間で値を渡したりするのに便利です。FPGAの種類によっては、オンボードRAMを16または36 kbのブロックに構成できます。また、フリップフロップを使ってデータセットを配列として実装することもできますが、配列が大きくなるとFPGAロジックリソースにとって負荷が大きくなります。32ビット数の100要素配列はVirtex-II 1000 FPGAのフリップフロップの30パーセント以上を消費することもあります。組込ブロックRAMなら1パーセント未満です。DSPアルゴリズムはデータブロック全体または複雑な方程式の係数をトラッキングすることが必要になることも多く、オンボードメモリがなければ、多くの処理関数はFPGAチップの構成可能なロジックに収まりません。図16は、ブロックRAMを使ってメモリへの読み書きを行うグラフィカル関数を示しています。

図16.メモリへの読み書き用ブロックRAM関数
また、周期的な信号波形をボード上で信号生成する場合、1周期を値の表として保存し、表を順番に指標付けしてデータを格納することもできます。出力信号の周波数は、表から値を取り出して出力するレートによって決定します。

図17.FIFOバッファのブロックRAM関数
FPGAは本質的に並列実行方式をとるため、別々のクロックで独立したハードウェアロジックを駆動することができます。異なるループレートで実行しているロジック間でデータをやり取りするのは厄介なタスクであり、FIFO(first-in-first-out)メモリバッファによる転送を効率化するのに、オンボードメモリがしばしば使用されます。図17に示すFIFOバッファは異なるサイズに構成でき、FPGAチップの同期部分の間でデータが失われないようにすることができます。表6は、様々なFPGAに組込まれたユーザ構成可能なブロックRAMの一覧です。
|
|
Virtex-II 3000 |
Virtex-II 1000 |
Spartan-3 1000 |
Spartan-3 2000 |
Virtex-5 LX30 |
Virtex-5 LX50 |
Virtex-5 LX85 |
Virtex-5 LX110 |
|
RAM |
1728 |
720 |
432 |
720 |
1152 |
1728 |
3456 |
4608 |
|
ブロックサイズ |
16 |
16 |
16 |
16 |
36 |
36 |
36 |
36 |
表6.様々なFPGAのメモリリソース
まとめ
高レベルツールが進化し、この文書で解説したような技術が実装されるにしたがって、FPGA技術はさらに普及を続けています。その一方でFPGAの仕組みを理解し、ブロックダイアグラムがコンパイルされチップが実行される際に内部で起こっていることを知って、フリップフロップ、LUT、乗算器、ブロックRAMに基づいてハードウェアターゲットを選択する方法が、アプリケーションに最適なFPGAチップを選択するのに最も良い方法です。リソースの使用について理解していると、開発時の、特にサイズと速度の最適化といった段階で非常に役に立ちます。これらの基本的なビルディングブロックは全てのリソースを網羅したものではなく、この技術資料もすべてのFPGAコンポーネントについて述べているわけではありません。さらに詳しいFPGAおよびデジタルハードウェア設計の情報については、下記の推奨資料をご覧ください。
追加資料
Clive “Max” Maxfield著『The Design Warrior's Guide to FPGAs』、Newnes
法律関連事項
本チュートリアル(以下「チュートリアル」という)は、National Instruments(以下「NI」という)によって作成されたものです。本チュートリアルは、NIにてサポートされていますが、本チュートリアルの内容に関するテストや検査が完全に行われていない可能性があり、チュートリアルの品質について、もしくは、関連製品およびドライバの各改訂版に対するサポート継続については、何らの保証も適用されません。本チュートリアルは、いかなる保証もなく「作成された状態のまま」で提供されており、ni.com/jpの使用条件に特別に規定されている特定の制約事項に従うものとします。 (http://ni.com/legal/termsofuse/japan/ja/)

