ジャズとエンジニア

ジャズやサイエンスやアニメなどの話を綴ります.

MENU

FPGA超入門 - 仕組みと開発方法

 私はFPGAの専門ではありませんが、数年前から仕事でFPGA開発の依頼を受けるようになりました。周りに経験者もほとんどおらず試行錯誤しながらなんとか幾つかの依頼をこなしてきましたので、超初心者目線でFPGAの仕組みと開発方法に関してまとめてみます。

FPGAとは

 FPGAとはField Plogrammable Gate Arayの略で、現場でプログラム可能な論理回路のことです。
 簡単な論理回路であれば半田ごてと汎用ICを使って開発をすることもできますが、 大規模になると難しくなりますし、 一度作った回路を修正するのはとても面倒です。FPGAであれば何度でも書き換え可能で、ハードウェアを修正する必要もありません。
 

集積回路の中のFPGA

 そもそもFPGAは半導体の一種です。半導体の中にはダイオードやトランジスタといった単体(ディスクリート)と、集積回路(一つのチップに色々な機能を実装したもの、いわゆるIC)があり、FPGAは後者になります。
 ICの中でも色々な種類がありますが、その中のPLD(Programmable Logic Device)と呼ばれるプログラムで機能を記述できるICの一つがFPGAです。
 PLDと対比されるものとしてASIC(Application specific Integrated Circuit、特定用途向け集積IC)があります。こちらは特定の用途(一つの製品等)向けに作られた集積回路で、PLDと比べると実装面積が小さく、省エネ、高速、一度作れば量産コストは安いといったメリットがあります。一方開発コストが最近では数億になることもザラのようです。それに対してFPGAはソフトウェアで設計できることから設計費用が抑えられ、開発期間も短く、修正も容易であるといったメリットがあります。
 

FPGAの仕組み

 FPGAの仕組みは難しく私もあまり理解できているわけではありませんが、簡単に言うと内部に膨大な量のトランジスタと配線があり、プログラムにより内部のスイッチをつなぎかえて、目的の回路を構成するというものです。
 このトランジスタの組み合わせで論理回路を作るわけですが、膨大な数のトランジスタを一つ一つつなぎかえるのは大変です。そこでFPGA内部にはLUT(ルックアップテーブル)とフリップフロップで構成されたロジックセルいう単位のブロック間を配線でつないでいくことで論理回路を構成します。
 ルックアップテーブルは真理値表という論理回路の設計書で定義された動作をその通りに動かす回路のことです。トランジスタ単位で動かすのに比べて、基本セル単位で組み合わせることで配線情報の数も少なく済み、効率的な回路を構成できるようになっています。(詳しくは下記記事等をご参考に)
 

FPGAの開発

 さてさて、色々とFPGAの仕組みに関して述べてきましたが、実際にFPGAを組んで動かすのが習得への近道ですね。
 FPGAの主要メーカーはXilinx(ザイリンクス)とIntel(インテル、旧アルテラ)で、この2社で市場シェアの80%を握っています。私の場合はアルテラしか使ったことがないのですが、特にどちらの方が安いとか、高性能ということもないようですので、周りのエンジニアが使っている方とか、良さげな参考書で紹介されてる方なんかで選んで大丈夫と思います。
 

FPGAの開発環境

 最初はこのような数千円から数万円の評価ボードを購入して色々いじってみるのがよいかと思います。勉強のためにはボードにいくつかの押しボタン、LED、入出力デバイス、7セグメントLED等がついているようなものだとより色々試験をすることができていい感じです。

 (約2000円と安価ですが機能は如何に・・・)

 
 開発環境も色々ありますが、私は無料で機能の充実しているQuartus Ⅱを利用しています(現行はQuartus Primeです)。これは無料でも基本的な機能は十分で、かなりメジャーな環境なのでおすすめです。

FPGA 開発ソフトウェア - インテル® Quartus® Prime 開発ソフトウェア

 
------追記2019/1/5------
 ここで紹介させていただいたFPGAボードはCyclone2という少し古いチップを採用したものです。アルテラがintelに買収される前のQuartusⅡでは対応していますが、現行のQuartusPrimeでは対応していません。
 対応表は以下をご参考にしてください。

https://www.altima.jp/members/p1-literature/1-software/1-altera/2016006_qp_support_device.cfm

 現行のMAX10搭載の安いFPGAボードだとこの辺りが評判よさそうです。

https://www.chip1stop.com/view/dispDetail/DispDetail?partId=ARRD-0000053

 入出力が足りないと私みたいに評価ボードの裏面の変なとこにはんだ付けして信号をとるみたいなことになるのでお気を付けを!
------------------------

論理回路の記述

 FPGAの設計ではまず論理回路を記述します。ここでは通常VHDLやVerilog HDLというハードウェア記述言語を利用して組みます。ハードウェア記述言語(HDL)は通常のプログラミング言語のようにコードで、論理回路の流れを記載していきます。
 
 私の場合はVHDLを使用していますが、このハードウェア記述言語が一番のハードルになると思います。基本的にはライブラリ部、entity部、architecture部の3つで構成され具体的なコードは下記のような感じになります。
 
【ライブラリ部】
 library ライブラリ名;
 use ライブラリ名.パッケージ名.all;
【entity部】
 entity 回路名 is
  port();
 end 回路名;
【architecture部】
 begin
   処理の記述;
 end RTL;
 
 ライブラリ部がその名の通りライブラリの使用宣言、entity部が入出力の定義、architecture部が処理の定義という感じで、一般のプログラミング言語をされている方であれば割と早く入っていけるかと思います。
Lチカ程度であればネットの情報も見ながらサクッと組めると思います。(hello world的な感じ)
 
------追記2019/1/5------
・Verilog…元々は電子回路シミュレータ用の言語でした。Cに似ていて演算子とか条件分岐等はほぼC言語の通りです。記述が簡潔で習得しやすいという評判ですが私は使用したことがありません。
・VHDL…こちらの方が後発で、抽象性の高い記述が可能で大規模回路の記述に向いています。verilogは符号を扱えませんが、こちらでは広範囲なデータ型が扱えます。
 VHDLが出始めた当初はこちらに統合する動きがあったようですが、Verilogのメリットも大きく、結局統合されてませんしどちらか片方使えればとりあえずOK。(たぶん)
------------------------

論理合成、ピン割り付け、配置配線、ダウンロード

 さて先ほど書いたコードや、回路図をFPGAが理解できるように変換することを論理合成といいます。これは通常の高級プログラミング言語で書かれたコードをCPUが理解できる機械語に変換するようなもので、論理合成のことをコンパイルといいます。
 
 さらに論理合成を行った入出力信号を実際にFPGAのどのピンに対応させるか決めます。これをピン割り付けといい、QuartusⅡではPin Plannerという画面でグラフィカルに行うことができます。
 
 実際には論理合成も配置配線も開発環境がすべて行ってくれますので、特に何もしなくても大丈夫だったりしますが、大規模回路で動作を高速化する場合などは最適な回路につなぎ変えを行ったりもします。
 
 そして、最後に開発環境で生成された回路情報をFPGAへダウンロードさせて動作を確認して完了になります。
 
------追記2019/1/5------
 記事では論理合成のことをコンパイルと書いていましたが、正確には論理合成と配置配線を合わせてコンパイルと呼びます。論理合成はコードを論理回路に直し最適化まで行います。そのあとの配置配線でFPGA基板内での配線パターンを確認します。
 そして他のサイトを見ているとコンパイルをしてからダウンロードの前にタイミング検証というステップを入れている記事も多いです。タイミング検証は必須ではありませんが、FPGAは電子回路なので数百MHzにもなると配線遅延の影響やジッターの影響で上手く動かないことがありますので、ダウンロード前の検証が重要になります。
------------------------

おわりに

 FPGAを触ったことのない人、敷居が高そうと思っていた方も何とかなりそうと思われたのではないでしょうか?
 プロの場合は論理合成、配置配線、もカスタマイズしてプログラムを組むようですが、私の場合は上記のような開発環境任せの方法で実際に100万分の1秒で動作するような高速な回路を生成して動かすことができています。
 まずは開発環境をダウンロードして、色々と触ることでなんとなくFPGAの基本が分かって来るのではないでしょうか。
 
 以上、初心者目線でFPGAに関してまとめてみました。
 皆様の参考になりましたら幸いです。