FPGA

プログラマブルな論理回路FPGA

FPGA (Field Programmable Gate Array)は、設計者が自由に論理回路の構成をプログラムできるデバイスです。製造後は回路構成を変更できないLSIに対し、プログラムにより回路構成を変更可能であることからこのように呼ばれます。近年はADコンバータやマイコンを内蔵したFPGAもありますが、基本的には論理回路で構成されます。デバイスの見た目はLSIと何ら変わりなく、製造プロセスも同じですが、デバイス内部の論理回路を設計者が変更できる点が異なります。

FPGAを使用するメリット

FPGAはよく特定用途向けのICであるASICやASSPと比較されます。これらは組み込みシステムで使用されます。

ASIC(Application Specific Integrated Circuit):アプリケーション固有のIC、つまり用途や使用する最終製品に特化した専用のカスタムICのことです。回路の論理だけでなくレイアウト・パターン設計を行って、マスクと呼ばれる版画の版に相当するものを制作するため、設計期間、設計コスト、製造期間が非常に大きく、大量生産しないと元が取れません。

ASSP(Application Specific Standard Product):特定用途向けの標準的なICで、例えばテレビの画像処理用ICとか、無線LAN用ICというように、各社の最終製品に特定用途で使用されることを目的に設計されたものです。設計方法はASICと同じでマスクが必要になるので期間、コスト共に大きいですが、各社で採用されれば数量は多くなるため、ASICよりも安定して設計コストを回収、収益を上げることができます。

FPGAはプログラムして機能を変えることで、各社の様々な用途の最終製品に使用することができるため、究極の汎用性を持ったICと考えることができます。また、マスクを制作する必要がありませんので、設計期間、設計コストは比較的短く、製造コストはかかりません。製造後はもちろん、基板に実装した後、最終製品を出荷した後でもプログラムを書き換えることができます。汎用的なペリフェラルの搭載されたFPGA評価ボードが1枚あれば、内部のロジックを書き換えることで、様々な用途に利用することができます。

ASIC、ASSPと比較すると、FPGAはチップ単価、実装面積、消費電力が大きくなりがちで、出荷台数が1000万個を超えるようなバッテリー駆動のモバイルデバイスにはFPGAは向いていません。その一方、通信規格が変更になると処理内容を追加・変更する必要のある携帯電話の基地局や、数量のあまり多くない業務用の機器などはFPGAに適した分野です。

また、最近は比較対象として、汎用コンピューティングに利用されるCPUやGPUが取り上げられるようにもなってきました。これは並列度を高度に高めることができるFPGAをアクセラレータとして使用することで、演算の高速化、低レイテンシ化を狙ったもので、普及が広がっています。この例としては、超高速証券取引(HFT/High Frequency Trade)の自動売買システムや、Deep Learning(深層学習)を使用したインターネットの検索エンジン用サーバーなどがあります。FPGAはCPUやGPUと比較すると、ある程度のフレキシビリティ(プログラマブルであるという観点での柔軟性)を持ちながらも、演算性能が非常に高く、かつ消費電力性能も高い(消費電力が低い)点が採用の理由です。

FPGAの仕組み

FPGAが処理内容を変更できるのは、メモリーによってLookup Table(LUT)の処理内容を変更できるからです。LUTとはいわゆる参照表のようなもので、入力値に対する出力値を定義して任意の演算を行うことができます。

例えばAND回路を構成したいときはLUTの構成を下表のようにし、

入力1 入力2 出力
0 0 0
0 1 0
1 0 0
1 1 1

表1. 論理演算ANDのLUT

OR回路を構成したい場合はLUTの構成を下表のようにします。

入力1 入力2 出力
0 0 0
0 1 1
1 0 1
1 1 1

表2. 論理演算ORのLUT

このようにメモリーの技術を使用してLUTの構成を変更し、演算内容を変更できるのがFPGAのプログラマブルである基本原理です。LUTに加えて、マルチプレクサ(複数信号を切り替える回路)、レジスタ(信号の状態を保持する回路)を1つの回路単位として、Intel社ではロジックエレメント、Xilinx社ではロジックセルと呼びます。マルチプレクサは他のLUTの出力信号との切り替えに使用され、レジスタ(Flip Flop)はLUTの出力をクロックに同期させるために使用されます。

図1. FPGA内のロジックエレメントの構成

レジスタにはRS型、JK型、D型、T型など様々な種類がありますが、通常FPGAではD型が使用されます。D型のレジスタの真理値表は下表となっており、クロックエッジが入力されるとD端子の入力が出力に反映され、それ以外では値を保持する仕組みとなっています。

D Clock Q
0 0
1 1
X 前の状態を保持
図2. Dフリップフロップのシンボルと真理値表

現在FPGA設計においては、殆どの場合このD型のレジスタを使用して同期を取りながら信号を伝搬させていく同期回路方式で設計されます。この同期回路方式では、回路や配線長によって遅延が異なることで出力されるタイミングがばらばらになる信号が、レジスタの出力できちんと揃うことになりタイミング設計を容易に行うことができるようになります。

FPGA内部の構成

FPGA内部は基本要素であるロジックエレメント(ロジックセル)の他に、I/O部、内部配線、クロック専用配線、乗算器(DSPブロック)、ブロックRAM、PLLなどで構成されています。これらの基本要素があらゆる回路パターンでも配置・配線しやすいよう、網の目状に整理整頓されて並んでいます。FPGA開発ツールでVHDL/Verilogコードをコンパイル(論理合成、マッピング、配置配線)して出来たプログラム用ファイルをダウンロードすると、これらの基本要素の有効無効を含めた設定と配線(コンフィギュレーション)が行われ、設計したとおりの動作をするようになります。

最近はFPGAの中に、外部デバイスや機器と通信を行うための高速シリアルインターフェースを内蔵していたり、ARM社のCortexシリーズなどのプロセッサコアをハードウェアとして内蔵していたりするものもあります。

図3. FPGAの内部構造

FPGAの活用と歴史

かつて、論理回路を設計する場合は、TI社またはそのセカンドソース(互換品)の74シリーズのICを組み合わせて使っていました。74シリーズというのは、AND、OR、NAND、NOTなど論理回路が複数個、1つのパッケージに入ったICで、7400であればNAND回路、7402であればNOR回路、7404であればNOT回路といったようにシリーズ化されていました。これらを基板上に並べて配線すれば、任意の論理回路が構築できますが、完全な手作業となり、基板の面積も大きくなるので、回路規模の増大と共に問題が生じてきました。そこで複数の74シリーズを1つのパッケージに収めて、配線を変えられるPLD(Programmable Logic Device)が1975年に登場します。そしてこれを大規模化したCPLD(Complex Programmable Logic Device)が1980年代に登場し、さらには1985年、Xilinx社がXC2064というFPGAを初めて製品化しました。当時は回路規模も小さく、価格も高かったため、ASICの試作、検証や研究用途に限られていました。70年代後半~80年代というと、ウォークマン、ワープロ、ファミリーコンピュータ、パソコン、CDなど、エレクトロニクス機器が飛躍的に進化した時代ですが、その背景にはASICの集積化・大規模化がありました。90年代に入ると通信ネットワークやインターネットの普及がFPGAを後押しします。ASICよりも短期間で開発でき、新しい技術に対しても柔軟に対応できるFPGAが通信インフラの最終製品に搭載されるようになり、飛躍的にFPGAの売り上げは伸びます。その後はプラズマ・液晶テレビ、デジタルカメラ、DVD、スマートホンなどデジタル機器の普及が一気に進み、低価格なFPGAが私たちの普段使用する機器にも使用されるようになりました。ホビーユースでFPGAを使う人も沢山います。ロボットコンテストで使うロボットに内蔵されている例や、FPGA評価ボードを使って昔のホビーユースのパソコンMSXやファミコンのエミュレータを作った例などがあります。珍しいところでは、火星探査機やF1マシンの中でもFPGAは使われています。

その他のプログラマブルな論理回路

プログラマブルな論理回路の方式は様々ですが、大別して不揮発性、揮発性のものがあります。これは電源を切った時にプログラムした状態を保持しているかどうかを表すものです。プログラマブルロジックデバイスではメモリーの技術を使用しているため、不揮発性のフラッシュメモリー、揮発性のDRAM、SRAMがあるように、プログラマブルロジックデバイスにも不揮発性のものと揮発性のものがあります。不揮発性のものは電源投入後すぐに使用できますが、揮発性のものはプログラムしてからでないと使用できないという違いがあります。

  • PLD(Programmable Logic Device):広義にはFPGA、CPLDなどプログラマブルな論理回路の総称として使われるが、狭義にはPAL(Programmable Array Logic)とGAL(Generic Array Logic)の総称。アレイ状に並べたANDとORのゲートの組み合わせで任意の論理回路を実現する構造を取る。プログラマブルな素子は不揮発性のEEPROM。
  • CPLD(Complex Programmable Logic Device):PLDを複数集積した大規模なPLD。素子はEEPROMまたはフラッシュメモリー。
  • SRAM方式FPGA:もっとも一般的なFPGAでは素子にSRAMを使用しています。SRAMは電源を切るとメモリーの内容は失われるため、揮発性FPGAとも呼ばれます。
  • フラッシュ方式FPGA:不揮発性のFPGAにするために、素子がフラッシュ方式のデバイスと、素子はSRAMですが内部にプログラムメモリ用のフラッシュメモリーを備えたデバイスの2種類があります。後者は電源投入時にここからプログラムをダウンロードすることで不揮発性FPGAとして使用できるようになっています。いずれのタイプでも再書き込みが可能です。
  • アンチヒューズFPGA:書き込み電圧を与えると接続状態になるヒューズの逆特性の素子を使用したFPGAです。書き込みは一度しか行えません。
  • SoC FPGA:プロセッサコアとFPGAを1チップに混載したデバイス。プロセッサの柔軟性とFPGAの高速演算処理を兼ね備えたデバイスです。プロセッサにはARMのCortex-M/R/Aなどが使われています。

主要なFPGAメーカーと製品ラインナップ

FPGAマーケットは2015年現在、Intel社とXilinx社が金額ベースで8割以上のシェアを占める寡占状態となっています。その一方、Lattice Semiconductor社はモバイルデバイスでの利用も可能な小規模かつ低価格帯ラインナップを拡充させていますし、Microsemi社はフラッシュ方式やアンチヒューズ方式で耐放射線性を高めて宇宙や原子力発電所での利用を前提にした製品ラインナップとなっています。

  • Xilinx:SRAM方式FPGA、CPLD、SoC。
  • Intel:SRAM方式FPGA、フラッシュ方式FPGA、CPLD、SoCの他にFPGAのデザインをそのまま移行して設計できるASICも販売している。
  • Lattice Semiconductor:比較的小規模、低消費電力、低価格のFPGA、CPLD、フラッシュ方式FPGA。
  • Microsemi(旧Actel):アンチヒューズFPGA、フラッシュ方式FPGA、SoC
  • Achronix:SRAM方式FPGA

各社とその3rd Partyは、信号処理、通信、モータ制御、画像処理など様々な用途に適したFPGA評価ボードを販売しています。価格は数千円から数百万円まで、性能によって様々です。

従来のFPGA開発フロー

一般的にASICやFPGAを設計するにはVerilog HDLまたはVHDLというハードウェア記述言語を用います。VHDLとVerilogの文法では、ビヘイビア、RTL(Register Transferred Level)、ゲートなど様々な抽象度で記述することができますが、FPGA設計用ではほとんどの場合RTLが使用されます。FPGA評価ボードで動作させるためには、FPGAのどのピンから何の信号を入出力するかというピンアサインも行う必要があり、これもテキストやツール上のエディタで行います。RTLで書かれたVHDL/Verilogのコードは、専用ツールを使用して自動的にゲートレベルの論理回路(ネットリスト)へと変換されます。いわゆる論理合成です。次にFPGAはデバイスごとに回路の構成やリソース数が異なりますので、ネットリストはターゲットデバイスとして設定したFPGAデバイスの回路リソースに適切に割り付け(マッピング)が行われます。さらに、割り付けられた論理回路をどの位置に配置して、どのように配線するかを決める配置配線を行います。この時には静的なタイミング解析が行われ、信号が入ってから出ていくまでの、回路と配線遅延がタイミング要求を満たしているかを確認します。ソフトウェアを開発する際のC言語のコンパイルに比べるとずいぶん沢山のプロセスがありますが、ハードウェアを設計するにはそれだけ沢山のことを考慮する必要があり、作業量も難易度も高いことが伺えます。全ての変換作業が終わると、FPGAを書き込むためのファイルが生成されますので、それを使用してコンフィギュレーションを行うとFPGAは所望の動作をします。SRAM方式のFPGAの場合、電源を切るとSRAMに記憶されている情報は失われますので、再度コンフィギュレーションし直す必要があります。

図4. 従来型FPGA設計フロー

FPGA用開発ソフトウェア

FPGAを開発するには、図4に示したような一連の作業(論理合成、マッピング、配置配線、ダウンロード)を行うための開発ソフトウェアが必要です。これには自社デバイスを開発するためにFPGAベンダが提供するものと、Synopsys社やMentor Graphics社などのEDAベンダが提供しているものがあります。FPGAベンダが提供しているものは、比較的安価で、初心者でも使えるようにとターゲットデバイスに制限はありますがフリー版も用意されています。EDAベンダは論理合成を行う開発ソフトウェアを提供しており、価格も高い分、最適化機能が優れていたり良好な論理合成結果が得られたりするようです。

FPGAベンダが提供する開発ソフトウェア

  • Quartus®II/Prime(Intel社)
  • ISE(Xilinx社)現在は更新しておらず、次世代ツールVivadoに移行した。
  • Vivado® Design Suite(Xilinx社)
  • Lattice Diamond、iCE cube2、ispLEVER Classic(Lattice Semiconductor社はターゲットデバイスに応じて別の開発環境を提供しています。)
  • Libero(Microsemi社)
  • Achronix CAD Environment(ACE)(Achronix社)論理合成はSynplify-Proを用いて行い、それ以降の作業をACEで行う。

EDAベンダが提供する開発(論理合成)ソフトウェア

  • Synplify-Pro/Premier(Synopsys社)
  • Precision RTL/RTL Plus/Physical(Mentor Graphics社)
  • LeonardoSpectrum(Mentor Graphics社)

FPGAの高位設計フロー

RTLのVHDL/Verilogを記述して設計するいわゆるRTLでの回路設計は煩雑で設計効率が悪いことから、近年はC言語からVHDL/Verilogコードを生成するツールやブロック線図などのエディタを使用して設計するツールが増加しています。

C言語からVHDL/Verilogを生成するツールは以下のように乱立状態ですが、まだまだハードウェア処理を意識したC言語を記述する必要があります。

  • Vivado HLS、SDSoC、SDAccel(Xilinx社)
  • CyberWorkBench(NEC社)
  • Catapult(Calypto社)
  • Cynthesizser(Cadence社、前Forte社。2014年にCadence社はForte社を買収した。)
  • C-to-Silicon Compiler(Cadence社)
  • Synphony C Compiler(Synopsys社)
  • eXCite(Y Explorations社、日本では(株)ソリトンシステムズが輸入代理店)

C言語よりもさらに抽象度の高いMATLAB言語やブロック線図シミュレータSimulinkモデルからVHDL/Verilogを生成して回路設計するツールも各社から提供されています。これらツールでは、IPまたはテストベンチとして使用できる信号処理、通信、画像処理、制御用の機能ブロックと可視化・解析機能が充実しているため、アルゴリズム開発を行う場合にメリットあります。また、HDL言語を習得する必要が無いため、これからFPGA入門する人にとっても障壁が低いようです。MATLAB/Simulinkをベースにしたツールとその外観を示します。

  • HDL Coder(MathWorks)
  • DSP Builder(Intel社)
  • System Generator for DSP(Xilinx社)
  • Synphony Model Compiler(Synopsys社)
図5. フィルタとFFT処理を行うSimulinkモデル

その他にはSystem Verilogを拡張した独自言語で回路設計する

  • Bluespec(Bluespec社)

があります。

モデルベースデザインを用いたFPGA開発

MathWorksのMALTAB/Simulink環境をベースにした開発はモデルベースデザインと呼ばれています。モデリング、モデル化とは、対象を数式や統計データなどで一般化して表現することです。設計・開発対象とそれに影響を及ぼす制御対象や周辺環境をモデリングすることで、仕様が明確になり、FPGA評価ボードに実装する前段階でシミュレーションによりシステムレベルでの動作確認が可能となります。これはモータ制御、電源制御、通信システム、画像・信号処理システムなどのFPGA/LSI開発で利用されており、VHDL/Verilogを記述して開発する場合と比較して、以下のような多くの恩恵があります。

  • システム設計者とハードウェア設計者間のコミュニケーションギャップにより生じるハードウェアの設計ミスの解消

  • 沢山のプログラミング言語やツールが不要になるというワークフローの改善

  • リファレンスや機能ライブラリの充実による高度なアルゴリズムの実現

  • シミュレーションによる早期検証の実現と実機を使った検証時間の短縮

  • システム全体のシミュレーションを行うことで、評価ボードや試作レスで開発を進められる

    • 通信システム:送受を1つのモデルで実行
    • 画像処理システム:画像・映像データを入出力データとして使用できる
    • 制御システム:電源回路、アクチュエータなどの制御対象を含めたシミュレーション

手書きHDLと比較したコード生成ツールの性能

コードを自動で生成するというと、熟練したハードウェア設計者が書いたVHDL/Verilogコードよりも性能面で劣るのではないか?というのが一般的な認識です。確かにC言語による高位合成ツールは抽象度が上がった分、効率性や詳細設計能力で分が悪いようですが、MATLAB/Simulinkの設計抽象度はVHDL/Verilogで記述するのと同じRTL:Register Transfer Levelとなっていますので、手書きのHDLコードと同等ないしは良い結果が出ています。その理由としては、シミュレーションや静的解析により固定小数点設計の最適化が行えることや、HDLコード生成をMATLABプログラムで自動化できるため、様々なパイプライン段数や回路アーキテクチャで繰り返し生成してスウィートスポットを探索することが出来ることがあります。



FPGA関連製品情報

参考 : HDL Coder, SimulinkからのZynq-7000プラットフォーム向けIPコア生成 (英語), AXI4-Streamインターフェース生成のためのモデル設計 (英語), Intel SoCプラットフォームのハードウェア・ソフトウェア協調設計 (英語)