FPGAのおはなし

f:id:fgoto:20200307185742j:plain

こんにちは!Nefrockでハードウェアエンジニアをやっている ごとぅー です。

今回初めてブロクを書かせていただきます。

先月Nefrockでは Tsukuba Mini Maker Faire 2020 (TMMF2020) に参加して、 前の日記 でもお話した Suika-Board と KUROFUNE の2つを出展してきました。

自分たちのプロダクトにどのような反応があるのか結構不安でしたが、 多くの方々に好評をいただきまして、改めて僕たちのやる気もみなぎってきました!

その一方でKUROFUNEの技術的特徴であるFPGAに関してやはり認知度が低かったので、 今回はそのFPGAについてのお話をします。

目次

  1. FPGAのなかみ
  2. 出番がないFPGA
  3. FPGAどこにいるの?
  4. ハードルが多いFPGA
  5. FPGAの可能性
  6. おわりに

FPGAのなかみ

半導体デバイスには大きく分けて2種類あります。

  • ディクスリート
  • 集積回路 (IC)


さらに集積回路には以下のような種類があります。

  • 汎用ロジックIC
  • ASIC
  • CPU (MPU)
  • FPGA


汎用ロジックICは、論理回路の構成素子(論理素子)を機能ごとにパッケージ化した小規模なICで、 AND・OR・フリップフロップ・マルチプレクサーなど多くの種類があります。

歴史はとても古いですが、論理回路の構成要素なので単体でもまだまだ現役で様々な電子回路に使われています。


ASICは、アプリケーションごとに専用にカスタマイズされたICのことで、ある決まった処理や演算を高速かつ低消費電力で行うなどに特化しています。

ただ現在はASICといっても非常に多くの種類があり汎用性が高いものが数多くあります。


CPUは、ユーザーが命令を与えることで汎用的な制御や演算ができるICで、命令を組み合わせることで様々な処理を行うことができます。

ソフトウェアも最終的にはCPUの命令に変換され、CPUがその命令に従って動作することでその機能を実現しています。


そしてFPGAは、ASICやCPUとは違い固定されたシステムアーキテクチャーを持っておらず、データバス・命令・レジスタマップなどは存在しません。

その代わりに、たくさんの論理素子・汎用的な計算回路・Static-RAMとそれらを自由に接続できる配線で構成されたICになっています。

そしてFPGAの容量内であれば、ほぼすべてのデジタル論理回路を作ることができます。

例えばANDやORなどの論理素子やMP3エンコーダーやJEPGデコーダー、64bit-CPUでさえもFPGAの中に作ることができます。

出番がないFPGA

前の説明から汎用性(何にでも使える)の順番は下記のようになっていると思います。

汎用ロジックIC = FPGA > CPU > ASIC

汎用性が高いほど単純な機能になっていきますので、複雑な機能を作るためには多くの数や種類が必要となります。

ですので同じ目的を達成するのに汎用ロジックICを使った場合とASICを使った場合を比べると、機能が複雑であればあるほどASICを使った方が簡単になります。

もちろん目的にあったASICが必要にはなりますが、近頃は汎用性の高い様々なASICがあるのでだいたい見つかります。

そしてASICを制御するCPUがあれば、後はソフトウェアで対応可能となります。(もちろんCPUのソフトウェア開発や通信するのにパソコンも必要にはなります。)

信号処理などはハードウェアよりもソフトウェアで行ったほうが、柔軟な設計もできるし開発時間もコスト抑えられることが多いです。

汎用ロジックICのみで作ろうとしたら、まず論理設計が大変で、次にたくさんの種類と数のICを用意して、とどめに複雑で膨大な配線作業が待ち構えています。

そんなわけで多くの目的でASICとCPUがあればことが済んでしまうのです。

FPGAどこにいるの?

ではFPGAが実際どのように使われているのでしょうか。

僕が今まで見たことのある例を挙げたいと思います。


ASIC開発をする場合

新しいASICを開発する場合、まずFPGAで同等の回路を構成して検証を行い、そのあと本番の半導体での設計になります。


ASICの代わりとして使う場合

ASICの開発には数千万~数億円かつ半年~1年以上の時間も必要になることもあるので、利益になる販売数量が見込めなかったり設計期間を短縮したい場合などは、機能を入れたFPGAをそのまま使用したり販売したりすることがあります。

また小型のFPGA (PLD)を汎用ロジックICの代わりに使うこともあります。


目的にあったASICがない場合

特に研究開発などでは所望のASICが存在しないことも多く、そのような場合にはFPGAが使われることがあります。

新規デバイスの駆動信号生成や、大量のASICの同時制御・データ取得など、動作時間や精度、I/O数の制約などでCPUやASICでは実現が難しい場合でも、大量のGPIOを同時かつ正確に制御することができるFPGAであれば実現可能です。

またFPGAは書き換え可能なことも研究開発の用途として向いています。

ハードルが多いFPGA

FPGAはデジタル論理回路的に何でもできるポテンシャルを持っていますが、中身は汎用ロジックICの集合体なのでできることは結局のところ中身を設計する人の技術力で決まります。

そして技術力以外にもFPGAを使うためには数々のハードルを越える必要があります。


HDL問題

FPGAの開発は、汎用ロジックICとは異なり論理素子を選んだり配線したりする物理的な作業はなく、ハードウェア記述言語(HDL)と呼ばれるプログラミング言語に似たものを使って回路を記述するのが主流です。

HDLの文法などは比較的簡単ではありますがハードウェアを意識した設計を行う必要があるので回路的な知識も必要となります。

またレジスターやワイヤー、クロックなどのHDL特有の概念や同時並行的な動作記述は一般的なプログラミング言語にはあまりありません。


ツール使いにくい問題

HDL記述されたコードは、開発ツールを用いてコンパイル(FPGAの場合は論理合成・配置配線と呼ばれる変換)を行い回路情報に置き換わります。

配置配線に関してはFPGAのデバイス構造が分からないとできませんので、FPGAメーカーが出している開発ツールを使う必要があります。

開発ツールは高機能で論理合成・配置配線の機能以外にシミュレーター、タイミング解析、消費電力解析、IPコア管理など様々なツールも統合されていて使いこなすのが難しく、ツール自体の容量も大きい上にインストールするマシンの要求スペックも高く動作も結構重くなっています。

さらにHDLのシミュレーションやコンパイル(特に配置配線)にかかる時間は一般的なプログラミング言語のコンパイルと比較すると非常に長く数分~数時間かかる場合もあります。


Lチカ後問題

そして 前の日記 でもありましたが、LEDを点滅させた後に何をして良いのか分からない問題がここでも出てきます。

とくにFPGAは汎用性が非常に高いのでこの問題はすぐに発生し、FPGAボードがタンスの肥やしになりやすいです。

さらに上述したように CPU + ASIC でやりたいことの多くができてしまうので、わざわざFPGAを大変な思いをしてまで使うのが微妙になってしまうことも多くあります。

FPGAの可能性

以上のことからFPGAは企業や研究機関などで大規模かつハイレベルな使い方をされるケースが多く、ちょっとした興味や趣味として個人で使うにはなかなか大変なデバイスになっています。

しかしながら、決まったアーキテクチャを持たないFPGAはユーザーがハードウェアレベルで柔軟に回路を設計することができるので、CPUやGPUなどが持っているハードウェア的なボトルネックを回避し、目的に合った最適な設計が可能になります。

さらに近年では主流であったHDLでの設計がC言語やC++などの高級言語でも設計できる高位合成(HLS)と呼ばれる技術も一般化しつつあったり、CPUとFPGAを一つのパッケージにしたICなども出てきました。

このような動向により従来FPGAを使っていたハードウェアエンジニアだけではなく、ソフトウェアエンジニアなどからも注目されています。

ですので今後ますますFPGAがさまざまなところで活用されていくと思います。

おわりに

このようにFPGAは、使うのが難しいけどすごい可能性を秘めているという、なんともエンジニア魂をくすぐってくるデバイスです。

つまりNefrockが使わないわけがありません!

そしてKUROFUNEがこのFPGAの可能性を活用するプロダクトとなっています。

ですので今後もぜひ注目してもらえるとうれしいです。

どうもありがとうございました。