まったり音楽・ガジェット日記

ジャズとエンジニア

資格試験、ジャズ、日常の話などを書き連ねます♪

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の設計ではまず論理回路を記述します。ここでは通常VHDLVerilog HDLというハードウェア記述言語を利用して組みます。ハードウェア記述言語(HDL)は通常のプログラミング言語のようにコードで、論理回路の流れを記載していきます。
 
 私の場合はVHDLを使用していますが、このハードウェア記述言語が一番のハードルになると思います。基本的にはライブラリ部、entity部、architecture部の3つで構成され具体的なコードは下記のような感じになります。
 
【ライブラリ部】
 library ライブラリ名;
 use ライブラリ名.パッケージ名.all;
【entity部】
 entity 回路名 is
  port();
 end 回路名;
【architecture部】
 begin
   処理の記述;
 end RTL;
 
 ライブラリ部がその名の通りライブラリの使用宣言、entity部が入出力の定義、architecture部が処理の定義という感じで、一般のプログラミング言語をされている方であれば割と早く入っていけるかと思います。
Lチカ程度であればネットの情報も見ながらサクッと組めると思います。(hello world的な感じ)
 

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

 さて先ほど書いたコードや、回路図をFPGAが理解できるように変換することを論理合成といいます。これは通常の高級プログラミング言語で書かれたコードをCPUが理解できる機械語に変換するようなもので、論理合成のことをコンパイルといいます。
 
 さらに論理合成を行った入出力信号を実際にFPGAのどのピンに対応させるか決めます。これをピン割り付けといい、QuartusⅡではPin Plannerという画面でグラフィカルに行うことができます。
 
 実際には論理合成も配置配線も開発環境がすべて行ってくれますので、特に何もしなくても大丈夫だったりしますが、大規模回路で動作を高速化する場合などは最適な回路につなぎ変えを行ったりもします。
 
 そして、最後に開発環境で生成された回路情報をFPGAへダウンロードさせて動作を確認して完了になります。
 

おわりに

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