FPGAとArduinoとRasberryPIの違いと、FPGAを勉強する理由

はたから見てると、FPGAArduinoとRasberry PIって、なんか小さくてデバイス挿して使ってて似たもののように見えるかもしれません。
そんな中、どこが違うの?って思ってる人もいるかと思ったので、それぞれの違いと、そしてそこから得られる技術者としての知識をまとめてみます。
まあ、得られる知識として「それぞれのデバイスの使い方と周辺環境」ってのはありますが、それは当然として。「それぞれのデバイスの使い方と周辺環境」を得るメリットがわかる比較としてまとめたいと思います。
根底は「なんで最近FPGAをやってるか」っていうことの説明なので、そういうバイアスがあると思ってください。


FPGAというのはチップの種類なので、実際にはDE0などのFPGA評価ボードとの比較ですが。中でもDE0-nanoは大きさや価格を考えると、豪華なArduinoくらいの位置づけとして出してきたようにも見えます。ということで、ここでは主にDE0-nanoとの比較にしたいと思います。

Arduino

これは、デバイス操作に特化したコンピュータですね。マイコンという説明がされてることも多いです。
アナログ入力がついているので、温度センサなどもつなぐだけで制御することができます。
OSは載らないので、タスク管理が必要な用途には向きません。
LAN通信もそのままではできません。もちろんArduino用のLANカードというのも売っているわけですが、これは部品を見る限りLANカード上でかなりArduino用の制御が行われているようで、「ArduinoでLAN接続ができる」というよりは「Arduino用のLAN接続デバイスが売っている」という感じですね。*1


Arduino関連としてデバイス操作の情報が充実しているので、デバイスをつないで動かす勉強になると思います。
また、上記LANカードのように、Arduino用のデバイスも結構揃っているようなので、デバイスを使ってなにかするという場合にはよい選択です。

Raspberry Pi

これは、小さいパソコンです。普通にLinuxが動くしLANで通信もできます。
また、SPIやI2Cといった方式でICを制御することができるので、対応したデバイスを操作することができます。アナログ入力はないようなので、温度センサなどを接続する場合はA/Dコンバータを使って制御する必要があります。
ただ、デバイス操作が主なのであれば、Arduinoのほうがいいんじゃないでしょうか。


恐らく、いままでLinuxを使ったことがある人であれば、そのままRaspberry Piでプログラムを動かすことができるんじゃないでしょうか。
このことはメリットではありますが、そのまま今までの知識が使えるということは逆に言えば得られる特別な技術的知識はない、ということになります。
身につくのは「小さいパソコンがあったら何ができるか」のようなソリューションとしての知識になると思います。
勉強素材ではなくて、道具ですね。

FPGA(DE0-nano)

Arduinoマイコンだし、Raspberry Piはパソコンだったのですけど、DE0-nanoはコンピュータじゃありません。
「コンピュータはソフトがなければただの箱」というけど、DE0-nanoは何もしなければただの箱ですらないわけです。実際には出荷時にサンプルが埋め込まれてるので、チカチカ動く何かではあるのですが。
(ここではコンピュータというのは、ソフトウェアで計算手順を与えて動く電子回路ってことにします)


FPGAは回路をプログラムできるチップです。なので例えば

led = button;

のような記述で回路を組めば、LEDとボタンを配線しただけの単なる高価配線チップになります。
もちろん、ここでCPUの回路を組めば、コンピュータになります。公開されてるARM互換回路やx86互換回路を使えば、ARMやx86のコードが動くコンピュータになります。
そういったCPUを使ってLinuxを動かすこともできます。
Arduinoのような働きをする回路を組めば、Arduino互換機のようなものは比較的簡単にできそうな気もします。
LANコネクタはついてないのですが、LAN信号をICで操作できる電気信号に変換するEthernet PHYさえあれば、あとはMACやIPを処理する回路をHDLで組み込むことでLAN接続もできるようになります。上ででてきたArduino用LANカードではW5100というチップが乗っていて、これはEthernet PHYと、MACやIPを処理する回路をSPI方式で制御できるようにしたもののようです。この処理部分をFPGAで実装することも可能です。


ようするにFPGAでは、チップの中身を書くことができるわけです。そういう意味では、FPGAボードというのは「フィジカルコンピューティング」のためのものとは考えないほうがいいと思います。やってることは普通にエレクトリカルです。
いまぼくは、制御回路を書く練習として手軽なのでLED点灯や温度センサの制御を行っているだけで、もし主目的がLED点灯や温度センサ制御などの「フィジカルコンピューティング」なのであれば、上記のArduinoRaspberry Piのほうをおすすめします。

FPGAで勉強できること

まずは、ソフトウェア技術者の一般常識としての電子回路、電子デバイスの動きを把握することができます。FPGAをやる前とあとで、ハードウェアの説明の見え方が変わりました。たとえば、プロセッサを支える技術を読んで、FPGAを勉強する前は「細かいことまでよく書いてあるなーフムフム」と思ってたのですが、FPGAを勉強したら「ざっくりした説明だなー」という感想になりました。「プロセッサを支える技術」の説明をみて、どのあたりのHDLコードを書けばいいか想像できるようになります。


CPUのないところで、ソフトウェアではなく処理を書くことで、CPUのありがたさ、ソフトウェアのありがたさを実感することができます。いままで当たり前のように使っていたCPUやソフトウェアが、非常にありがたいものに見えてきます。そうやって対比することで、CPUとはなにか、ソフトウェアとはなにかということがわかってきます。


逆に、CPUやソフトウェアがまだるっこしくてあいまいということも感じるようになります。たとえば、200μ秒(0.2ミリ秒)ごとにデータ処理をするというコードをソフトウェアで書くのは、非常に気を使います。でも、ハードウェアなら、たとえば50MHzのクロックで動いていても1万クロックあるのでかなりの処理ができます。200μ秒で動かすこと自体は、1万クロック数えればいいだけなのでまったく難しくありません。処理を書くのがソフトウェアより難しいですが。


つまり、CPUにできることとCPUでやらないほうがいいことがあることがわかってきます。CPU上のソフトウェアだけやっていると、そもそも「CPUでやらない」という選択肢の存在も、それが何をあらわすのかもわかりません。でも、上に書いたように、時間制約を満たすというのが難しいということがわかります。また、処理をするにはCPU自体がオーバーヘッドであるということも感じることができます。

モテ期を逃さないためのFPGA

ここからが大事です。
いま、CPUを使った処理に限界が見えるようになってきました。そこでCPUを使わずに処理を書く必要性が出てきています。いまは金融系など限られた範囲ですが、需要が増すこととハードが使いやすくなって実現性が増すこととで、多くの分野で使われていくと思います。
FPGAは、たとえばCからJavaに、JavaからRuby/Scalaにといった転換とはまったく違う、ソフトウェアからハードへという転換が必要になります。ソフトウェア技術間の感覚で必要にせまられたらやればいいという風にはなりません。
一度FPGAを触らないと、どのようなことができるか、できないかがまずつかめません。どのようにやるかという話はまったくできません。


もちろん、実際に使われるころにはそういったことがわからなくても使える製品が広まっていると思いますが、技術者としてのモテ期は実際に使われるようになるまでにあるので、モテ期をのがしてしまいます。
エンジニア人生で3度来るというモテ期、ひとつ前はクラウドでした。その前はWebでした。Webから始めた人の3度目のモテ期、FPGAを逃さないようにするためには、今からやっておくと有利だと思います。

*1:と思ったら、これを組み込んだArduino端末があるのか。品切れ中だけど