FPGA

FPGA とは?

FPGA とは、Field Programmable Gate Arrayの文字通り、設計者がフィールド(現場)で論理回路の構成をプログラムできるゲート(論理回路)を集積したデバイスです。製造後は回路構成を変更できないLSI(集積回路)に対し、プログラムにより内部の回路構成、つまり処理内容を変更可能であることからこのように呼ばれます。近年はADコンバータやマイコンを内蔵したFPGAもあります。デバイスの見た目はLSIと何ら変わりなく、製造プロセスも同じですが、デバイス内部の処理内容を設計者が変更できる点が異なります。

FPGAとマイコン, DSP, GPU, ASIC, ASSPとの違いは?

FPGAが比較される対象として、ICであるマイコン、DSP、GPU、ASICやASSPなどがあります。これらは同様に組み込み機器で使用されます。

マイコン(マイクロコントローラユニット/MCU、マイクロプロセッサユニット/MPU):自動車、家電製品など、あらゆる電気製品に使用されている最も汎用的な演算用のLSIです。組み込み機器を開発する際に最初に選択する入門用のデバイスです。その性能によって、安価なものから高価なものまであり、機器の制御、センサー信号の処理、通信、画面表示など様々な処理を行います。メモリからプログラムを読み出す、データをロードする、演算するといった処理単位一つ一つを逐次処理するため、沢山の演算を行うには時間がかかります。演算部であるコアを複数持ったマイコンはマルチコアプロセッサと呼ばれ、一度にコア数(2, 4, 8, 12個程度)分の演算を並列で行うことが出来ます。マイコンでの処理内容はC言語などのソフトウェアを開発します。後述のモデルベースデザインでは、このC言語も自動生成することが出来ます。

DSP(Digital Signal Processor):マイコンをデジタル信号処理に特化させたデバイスです。デジタル信号処理で良く行われる積和演算を高速に行うことができるような構成となっています。マイコンではプログラム用とデータ用で同じバス(デバイス内部の各回路がデータをやり取りするための共通の経路)を使うことが多いのに対し、DSPではハーバード・・アーキテクチャなど分離されているため、高速にメモリからデータ転送を行うことができます。演算を行うコアには1個~複数個の乗算器と加算器が搭載されており、1サイクルで積和演算を1回~数回行うことが出来ます。SIMD(Single Instruction Multiple Data)ユニット搭載して、SIMD命令に対応していると謳うDSPがありますが、これはベクターデータの積和演算を1回で行えるようになっているデバイスです。時系列データや画像データを取り扱う信号処理では、ベクターや行列データの積和演算を行うことが多いため、これを高速に行うことができるようになっています。

GPU(Graphics Processing Unit):もともとは3Dグラフィックスなどの画像の描画を行うために作られたデバイスです。点の集まりであるコンピュータグラフィックスを効率的に計算するため、1つの演算コアの構造は単純ですが、その数はマイコンやDSPに比べ非常に多く数百~数千、数万個も備えています。また、コア間のデータを共有するために大量のメモリを備えており、大量のデータに対して並列に単純な積和演算を行う性能に優れています。そのデバイスを利用して汎用計算を行う技術がGPGPU(General-Purpose Computing on GPU)で、近年ディープラーニングなどの処理を行うために活用されています。汎用計算を行うデバイスとして、FPGAと比較される機会も多いGPUですが、価格に対する処理性能の高さや開発のしやすさではGPUに分がある一方、消費電力、低レイテンシや時間の確定性ではFPGAに分があるようです。

ASIC(Application Specific Integrated Circuit):アプリケーション固有のIC、つまり用途や使用する最終製品に特化した専用のカスタムICのことです。ASICの名前は、デバイスの内部構造ではなく、利用用途から由来しています。ASICは利用用途に応じてマイコン、DSP、GPU、メモリ、専用の回路などを内蔵したデバイスとしてカスタマイズすることが出来ます。回路の論理設計だけでなくレイアウト・パターン設計も行って、マスクと呼ばれる版画の版に相当するものを制作するため、設計期間、設計コスト、製造期間が非常に大きく、大量生産しないと元が取れません。FPGAが何度でも回路構成を書き換えられるのに対して、一度設計したASICは変更することが出来ません。

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

FPGAのメリット

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

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

また、最近は比較対象として、汎用コンピューティングに利用されるCPUやGPUが取り上げられるようにもなってきました。これは並列度を高度に高めることができるFPGAをアクセラレータとして使用することで、演算の高速化、低レイテンシ化を狙ったもので、普及が広がっています。この例としては、超高速証券取引(HFT/High Frequency Trade)の自動売買システムや、機械学習ディープラーニングを使用したインターネットの検索エンジン用サーバーなどがあります。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社ではロジックエレメント、AMD®社ではロジックセルと呼びます。マルチプレクサは他のLUTの出力信号との切り替えに使用され、レジスタ(Flip Flop)はLUTの出力をクロックに同期させるために使用されます。

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

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

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

Dフリップフロップのシンボルと真理値表

図2. Dフリップフロップのシンボルと真理値表

D Clock Q
0 0
1 1
X 前の状態を保持

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

FPGA内部の構成

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

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

FPGAの内部構造

図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年、AMD 社がXC2064というFPGAを初めて製品化しました。当時は回路規模も小さく、価格も高かったため、ASICの試作、検証や研究用途に限られていました。

70年代後半~80年代というと、ウォークマン、ワープロ、ファミリーコンピュータ、パソコン、CDなど、エレクトロニクス機器が飛躍的に進化した時代ですが、その背景にはASICの集積化・大規模化がありました。

90年代に入ると通信ネットワークやインターネットの普及がFPGAを後押しします。ASICよりも短期間で開発でき、新しい技術に対しても柔軟に対応できるFPGAが通信インフラの最終製品に搭載されるようになり、飛躍的にFPGAの売り上げは伸びます。その後はプラズマ・液晶テレビ、デジタルカメラ、DVD、スマートホンなどデジタル機器の普及が一気に進み、低価格なFPGAが私たちの普段使用する機器にも使用されるようになりました。

ホビーユースでFPGAを使う人も沢山います。ロボットコンテストで使うロボットに内蔵されている例や、FPGA評価ボードを使って昔のホビーユースのパソコンMSXやファミコンのエミュレータを作った例などがあります。珍しいところでは、火星探査機やF1マシンの中でもFPGAは使われています。

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

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

不揮発性のものは電源投入後すぐに使用できますが、揮発性のものはプログラムしてからでないと使用できないという違いがあります。入門したばかりの方が、どれを使って良いかわからず迷ったときには、まずはSRAM方式のFPGAを選択すれば良いと思います。

  • 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®社とAMD 社が金額ベースで8割以上のシェアを占める寡占状態となっています。その一方、Lattice Semiconductor Corporation®社はモバイルデバイスでの利用も可能な小規模かつ低価格帯ラインナップを拡充させていますし、Microchip®社はフラッシュ方式やアンチヒューズ方式で耐放射線性を高めて宇宙や原子力発電所での利用を前提にした製品ラインナップとなっています。

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

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に記憶されている情報は失われますので、再度コンフィギュレーションし直す必要があります。

従来型FPGA設計フロー

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

FPGA用開発ソフトウェア

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

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

  • Quartus®II/Prime(Intel社)
  • Vivado® Design Suite(AMD 社)
  • Lattice Diamond、iCE cube2、ispLEVER Classic(Lattice Semiconductor社はターゲットデバイスに応じて別の開発環境を提供しています。)
  • Libero SoC/IDE®(Microchip社)

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

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

高位合成によるFPGA設計・開発

RTLのVHDL/Verilogを記述して設計するいわゆるRTLでの回路設計は煩雑で設計効率が悪いことから、近年はC言語からVHDL/Verilogコードを生成するツールやブロック線図などのエディタを使用して設計するツールが増加しています。このような、高抽象度な表現により記述したものからVHDL/Verilogコードを生成することを、高位合成と呼んでいます。

C言語からVHDL/Verilogを生成する高位合成ツールはかつて様々な会社から販売され、乱立状態でした。しかし、2021年時点では、次の4点が主となっています。

  • Vivado HLS、SDSoC、SDAccel(AMD 社)
  • CyberWorkBench(NEC社)
  • Catapult(Calypto社)
  • Stratus High-Level Synthesis(旧名称C-to-Silicon Compiler)(Cadence社)

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

  • HDL Coder™(MathWorks)
  • DSP Builder(Intel社)
  • System Generator for DSP™(AMD 社)
  • Synphony Model Compiler (Synopsys社) ※販売終了
フィルタとFFT処理を行うSimulinkモデル

図5. フィルタとFFT処理を行うSimulinkモデル

その他にはSystemVerilogを拡張した独自言語で回路設計する高位合成ツールBluespec(Bluespec社)がありましたが、現在は販売されていないようです。

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

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

  • 実機が出来る前にシステムシミュレーションを行うことで、早期のバグ出し、機能検証が可能
  • システム設計者とハードウェア設計者間のコミュニケーションギャップにより生じるハードウェアの設計ミスの解消
  • VHDLやVerilogなどの言語を覚える必要が無くなり、ブロック線図で設計できるというワークフローの改
  • リファレンスや機能ライブラリの充実による高度なアルゴリズムの実現
  • Lookup Tableの自動生成や固定小数点設定の最適化など自動化機能のによる開発効率改善
    • 通信システム:送受を1つのモデルで実行することで、システムレベルのシミュレーションが可能
    • 画像処理システム:実際のユースケースを想定した画像・映像データを入出力データとして使用できる
    • 制御システム:電源回路、アクチュエータなどの制御対象を含めたシステムレベル・シミュレーションが可能

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

コードを自動で生成するというと、熟練したハードウェア設計者が書いたVHDL/Verilogコードよりも性能面で劣るのではないか?というのが一般的な認識です。確かにC言語による高位合成ツールは抽象度が上がった分、効率性や詳細設計能力で分が悪いようですが、MATLAB/Simulinkの設計抽象度はVHDL/Verilogで記述するのと同じRTL:Register Transfer Levelとなっていますので、手書きのHDLコードと同等ないしは良い結果が出ています。

その理由としては、シミュレーションや静的解析により固定小数点設計の最適化が行えることや、HDLコード生成をMATLABプログラムで自動化できるため、様々なパイプライン段数や回路アーキテクチャで繰り返し生成してスウィートスポットを探索することが出来ることがあります。


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