『ソフトウェア・エンジニアのためのFPGA入門』と題し、近年にわかに注目を集めつつあるFPGAの基本を紹介している当連載。ここまで、FPGAの概要と用途(第1回 どうしていまFPGAなのか、そしてFPGAとは何か?)、FPGAを語るうえで抑えておきたい一般的なRAMの仕組み(第2回 FPGAの仕組みと構造を学ぶ――その前に抑えるべき一般的なRAMの仕組み)を紹介してきたが、今回は、前回触れたRAMの仕組みからLUTおよびFPGA全体の仕組みと構造について解説する。

ソフトウェア・エンジニアのためのFPGA入門

第1回 どうしていまFPGAなのか、そしてFPGAとは何か?

第2回 FPGAの仕組みと構造を学ぶ――その前に抑えるべき一般的なRAMの仕組み

FPGAの仕組み

まず、FPGAには回路を書き換えられるという特長があり、これを実現する方法として図1のような構成にすることが考えられる(実際にはこのような構成にはなっていない)。

これは回路を構成する基本素子である、NOT、AND、ORゲートなどを並べて、使用するものをスイッチで切り替える方法である。このときスイッチはパソコンからROMのイメージを書き換えることで行う。しかしこの方法ではたとえばNOTゲートを使う場合はANDとORゲートが無駄になる。さらにこの方法で複雑な回路を実現するためには、このセットを数百万も並べる必要があり、現実的ではない。

  • ソフトウェア・エンジニアのためのFPGA入門_第3回_001

    図1 回路を書き換える可能にするための仕組み

そこでFPGAでは、前回紹介したメモリを用いることで、少ない回路リソースで複雑な論理回路を実現可能にしている。まず図2に示すように、アドレス0~2番地に0を、3番地に1を書き込んでおく。

4番地以降は使用しないので、値は電源投入時の不定のままで良い。このためアドレス入力端子の上位2ビットは0に固定する。書き込み後は読み出ししか行わないため、OEを1、WEを0に固定する。ここで、アドレス入力端子の下位2ビット(A0とA1)を論理回路の入力端子、RAMのデータ入出力端子を論理回路の出力端子とみなせば、ANDゲートと等価となる。同様に、ORゲートを実現したのが図3である。どんなに複雑な組み合わせ回路であっても、4入力1出力であればデータ1bit幅、容量16bitのSRAMで実現できる(図4)。

このようにアドレス入力端子をそのまま論理演算の入力と用いて使用するメモリをLUT(Look-Up Table)という。

  • ソフトウェア・エンジニアのためのFPGA入門_第3回_002

    図2 LUTでANDゲートを実現する場合

  • ソフトウェア・エンジニアのためのFPGA入門_第3回_003

    図3 LUTでORゲートを実現する場合

  • ソフトウェア・エンジニアのためのFPGA入門_第3回_004

    図4 LUTでさらに複雑な論理回路を実現する場合

FPGAの構造

LUTを用いても、回路によって未使用領域は発生するが、図1の構成に比べると圧倒的に少ないリソースで複雑な回路を実現できる。さらに順序回路を作るためのフリップ・フロップは、LUTを使って作成することも可能であるが、使用頻度が高いことから、これも予め搭載した方がLUTで作るより効率が良い(LUT1つにつき、フリップ・フロップ1つの割合で搭載されることが多い)。一般的なFPGAは図5に示すようにLUTとフリップ・フロップ、さらにこれらの接続を切り替えるスイッチを基本単位(Xilinx社の場合はCLB: Configurable Logic Unit、Intel社の場合はLEs: Logic Elementsと呼ぶ)とし、さらにこれを多数格子状に並べている(図6)。基本単位の間はマトリックス・スイッチで接続されており、全てのスイッチはパソコンでプログラム可能となっている。

  • ソフトウェア・エンジニアのためのFPGA入門_第3回_005

    図5 FPGAの基本単位

  • ソフトウェア・エンジニアのためのFPGA入門_第3回_006

    図6 図5の基本単位を多数格子状に配列している

このようにFPGAはSRAMとフリップ・フロップを規則正しく並べた構造となっており、実際のダイを見ても大部分が綺麗なマトリックス構造であることがわかる(図7)。

  • ソフトウェア・エンジニアのためのFPGA入門_第3回_007

    図7 実際のFPGAのダイ写真(Xilinx Spartan-3シリーズ)

まとめ

FPGAは並列度の高いアルゴリズム向けのLSIである。CPUとの比較では、演算器の粒度がより細かいと言える。1サイクルの演算速度はCPUよりも遅いが、演算器の数は多いので、この構造を活かしたコードを記述する必要がある。またFPGAの外部との通信を行うI/OがボトルネックとなるのはCPUと同様である。

FPGAは1万ゲート程度の小規模なものから、数百万ゲートの大規模なものまで約200~400倍近い差がある。小規模なものはカウンタ数十個と簡単な論理演算で、8bitマイコンに代わって、パルスの生成、信号変換、バス・スイッチ、およびグルーロジックと呼ばれる他のLSI間の接続に利用される。このような小規模のものは回路図やHDLで設計する方が効率が良い。一方、CPUのコプロセッサとして、あるいは単独で画像処理や大規模な行列演算などを行うためには中規模以上のFPGAが必要となり、この場合は現状でもC言語などの高級言語による設計で十分に性能を発揮できる。ただし、より性能を突き詰めたい場合は、一部のモジュールをHDLにより設計することが必要となる。

ムーアの法則が崩れてたことで、現在CPUはマルチコア化が進み、さらにGPUを代表とする周辺のコプロセッサとの協調動作へと舵を切っている。このため、今後コンピュータにFPGAが搭載されることは増えるものと考えられる。またSoC化が進むことでモバイル機器や組み込み機器にもCPUとFPGAが搭載され、その時代のテクノロジーで性能を最大限に発揮するために、それぞれの特徴を活かしたコーディングがますます重要となるだろう。

著者プロフィール:すすたわり

株式会社SUSUBOX代表取締役。慶應義塾大学 特任准教授。元FPGA-CAFE店長。主な著書に「回路図で学べるFPGA入門 回路図は読める人のためのHDLガイド」(秀和システム)がある。

[PR]提供:アヴネット