-『ソフトウェア・エンジニアのためのFPGA入門』と題し、近年にわかに注目を集めつつあるFPGAの基本を紹介している当連載。FPGAの仕組みと構造を学ぶ――その前に抑えるべき一般的なRAMの仕組み)を紹介してきたが、今回は、前回触れたRAMの仕組みからLUTおよびFPGA全体の仕組みと構造について解説する。FPGAの仕組みと構造を学ぶ――その前に抑えるべき一般的なRAMの仕組みFPGAの仕組みまず、FPGAには回路を書き換えられるという特長があり、これを実現する方法として図1のような構成にすることが考えられる(実際にはこのような構成にはなっていない)。これは回路を構成する基本素子である、NOT、AND、ORゲートなどを並べて、使用するものをスイッチで切り替える方法である。このときスイッチはパソコンからROMのイメージを書き換えることで行う。この方法ではたとえばNOTゲートを使う場合はANDとORゲートが無駄になる。この方法で複雑な回路を実現するためには、このセットを数百万も並べる必要があり、現実的ではない。回路を書き換える可能にするための仕組みそこで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でさらに複雑な論理回路を実現する場合FPGAの構造LUTを用いても、回路によって未使用領域は発生するが、図1の構成に比べると圧倒的に少ないリソースで複雑な回路を実現できる。順序回路を作るためのフリップ・フロップは、LUTを使って作成することも可能であるが、使用頻度が高いことから、これも予め搭載した方がLUTで作るより効率が良い(LUT1つにつき、フリップ・フロップ1つの割合で搭載されることが多い)。Elementsと呼ぶ)とし、さらにこれを多数格子状に並べている(図6)。基本単位の間はマトリックス・スイッチで接続されており、全てのスイッチはパソコンでプログラム可能となっている。図5の基本単位を多数格子状に配列しているこのようにFPGAはSRAMとフリップ・フロップを規則正しく並べた構造となっており、実際のダイを見ても大部分が綺麗なマトリックス構造であることがわかる(図7)。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が搭載され、その時代のテクノロジーで性能を最大限に発揮するために、それぞれの特徴を活かしたコーディングがますます重要となるだろう。元FPGA-CAFE店長。回路図は読める人のためのHDLガイド」(秀和システム)がある。Corporation。