|
|
FPGA 基礎知識
|
|
|
============
|
|
|
|
|
|
FPGA (Field Programmable Gate Array) は、**プログラム可能** (programmable) な LSI の一種です。
|
|
|
|
|
|
## FPGA の構成
|
|
|
|
|
|
FPGA は、論理回路を実現する**論理ブロック**が二次元的に敷き詰められており、それらの間は**スイッチブロック**や**コネクションブロック**を介して配線で接続されています。チップ外周には入力スイッチや出力LED とつながった **IOブロック**があります。その他、**メモリブロック**、**乗算器ブロック**なども含まれます。
|
|
|
|
|
|
論理ブロックの構成方法は複数ありますが、主流である LUT を用いた FPGA について説明します(今回の実験で用いる FPGA も LUT を用いて構成されています)。
|
|
|
|
|
|
|
|
|
|
|
|
### 論理ブロック
|
|
|
|
|
|
一つの論理ブロックには、**LUT**、**全加算器**、**フリップ・フロップ**などが含まれており、様々な回路を実現することができます。
|
|
|
|
|
|
一つの論理ブロックに収まらないような回路は、複数の論理ブロックを配線で接続して実現します。
|
|
|
|
|
|
#### LUT
|
|
|
|
|
|
LUT とは、Look-Up Table の略です。組み合わせ回路を実現するために AND ゲートや OR ゲートをつなげるのではなく、真理値表をそのまま実装したものになっています。実験で用いる FPGA では、6入力の LUT が実装されており、任意の6入力論理関数が実現できます(6入力論理関数は$`2^{2^6}=18446744073709551616`$通りもありますが、そのすべてが実現できるのです!)。具体的には、$`2^6=64`$bitの情報を格納したメモリがあり、トーナメント上に並んだセレクタにつながっています。論理関数の入力はセレクタのセレクタ信号はにつながっており、テーブル内にある64個のうちのどれを読み出すかを決定します。このようにして、任意の6入力論理関数を実現しています。
|
|
|
|
|
|
以下の図は、3入力 LUT がどのように構成されているかの図解です。
|
|
|
|
|
|
![pex3LUT](uploads/b9293ee99a8a6b229ebe2c5263924144/pex3LUT.png)
|
|
|
|
|
|
#### 全加算器
|
|
|
|
|
|
論理ブロックの中には、全加算器も含まれていることが多いです。全加算器を LUT によって実現することは可能ですが、専用回路を実装した方が遅延が小さくなるうえ、面積を浪費しないため、採用されています。
|
|
|
|
|
|
#### フリップ・フロップ
|
|
|
|
|
|
信号の値を記憶し、順序回路を作るために必要なプリミティブです。
|
|
|
|
|
|
### スイッチブロック
|
|
|
|
|
|
FPGA の全体には、配線が格子状に張り巡らされています。その格子点では配線が交わりますが、どの配線とどの配線をつなぐかを切り替えることで、任意の配線を実現します。
|
|
|
|
|
|
### コネクションブロック
|
|
|
|
|
|
FPGA の全体に張り巡らされているどの配線と、論理ブロックにつながるどの配線とをつなげるかを切り替えることのできるブロックです。
|
|
|
|
|
|
## コンフィギュレーション
|
|
|
|
|
|
FPGA では、主に LUT の内容とスイッチブロック・コネクションブロックの接続具合を変更することによって所望の回路を実現することができます。
|
|
|
|
|
|
各 LUT の内容や各スイッチブロック・コネクションブロックの接続具合を表すデータは**コンフィギュレーションデータ**と呼ばれ、FPGA 内の**コンフィギュレーションメモリ**に格納されます(一塊のメモリがあるわけではありません)。
|
|
|
|
|
|
**SRAM 方式**と呼ばれる FPGA では、コンフィギュレーションメモリは SRAM で構成されています。SRAM は何度でも書き換える(**リコンフィギュレーションする**)ことができますが、電源を切るとその情報が失われてしまうという特性があります。
|
|
|
|
|
|
実験で使う FPGA は SRAM 方式です。何度でもリコンフィギュレーションすることができるため、バグを恐れずに何度も試してみることができます。
|
|
|
|
|
|
ちなみに、コンフィギュレーションメモリの実現方法としては、以下のような方法もあります。
|
|
|
|
|
|
### フラッシュメモリ方式
|
|
|
|
|
|
電源を切っても情報が揮発しない、フラッシュメモリに書き込む方法です。不揮発であり、電源投入即動作可能な点は優れていますが、欠点としては書き込みが遅いこと、CMOSの最先端プロセスが使えないこと(フラッシュメモリは微細化が困難です)、書き込み回数に制限があること(ゲート絶縁膜が劣化するため、数百回程度で寿命を迎えます)などが挙げられます。
|
|
|
|
|
|
### アンチフューズ方式
|
|
|
|
|
|
フューズは大電流が流れたときに焼き切れる、つまり通常導通しており、大電流により絶縁させることが可能な素子です。
|
|
|
アンチフューズはそれとは逆に、通常絶縁状態であり、大電流を流そうとすると焼きつながって導通状態になる素子です。
|
|
|
物理的に導通しているため高速動作が可能なこと、不揮発であること、さらにリバースエンジニアリングが実質不可能であるなどの利点が挙げられます。
|
|
|
しかし、アンチフューズを焼きつなげるのは不可逆な動作であるため、リコンフィギュレーションは不可能です。
|
|
|
そのため、既にデバッグの終わった回路を、カスタムチップを作るまでではないものの、多く作るときに用いられます。
|
|
|
|
|
|
## 分散RAM
|
|
|
|
|
|
LUT を実現するためのメモリは、小規模な RAM として活用することができます(Distributed memory architecture for a configurable logic array and method for using distributed memory (US5343406) と呼ばれる Xilinx 社の特許でした)。
|
|
|
|
|
|
RAM (ランダムアクセスメモリ、要するに配列です。同時に読み出す個数が限られている点が信号線の束と異なります)をフリップ・フロップと組み合わせ回路で実現しようとすると膨大な回路規模になってしまいますが、分散RAM を用いるとそのような問題を回避できます。
|
|
|
|
|
|
FPGA にはブロックRAM と呼ばれる大規模な RAM も実装されていますが、分散RAM は非同期アクセスが可能であるという特徴があります。つまり、どのメモリを読み出すかを決めたのと同じクロックサイクルの中で、読み出した値を使用することが可能です。
|
|
|
|
|
|
もちろん、分散RAM で大規模なメモリを構築してしまうと、肝心の論理回路を作成するための LUT が枯渇してしまうので、小規模なメモリを実現することだけに使うのがよいでしょう(ただし、これは一般論であり、実際に実験に使う FPGA には LUT が十分に搭載されているので、必要な全てのメモリを分散RAM で実装しても足りるようです)。
|
|
|
|
|
|
## 参考文献
|
|
|
|
|
|
1. 「FPGA の原理と構成」、天野英晴、オーム社、2016 |
|
|
\ No newline at end of file |