(前編) どうしてハードウエアがプログラミングできるのか?

FPGA(field programmable gate array)の面白さは,回路を自由にプログラミングできる点にある。あたかも文字を書いては消せるホワイトボードのように,設計者は白地のキャンバスに思うままに回路を作り込むことができるのだ。つまり,ハードウエアは変更が難しいというそれまでの常識を覆してしまった。こうしたFPGAが,"夢のデバイス"として設計者から迎えられたのもうなずけよう。では,この画期的なデバイスの仕組みは,どのようになっているのだろうか。この連載の第2回目では,FPGAの中をのぞいてみることにする。

 FPGAの中をのぞいてみる前に,回路(ハードウエア)の「プログラミング」について考えてみたい。ハードウエアをプログラミングするということは,つまり設計者が自由に回路を変更できるということだ。

一般に回路は,コンデンサや抵抗といった部品同士を,プリント基板やワイヤを使って配線し構成する。そのため,回路を変更するには,ハンダゴテを使って,部品を基板から外したり,ワイヤを張り替えるといった作業が必要だ。だが,たくさんのトランジスタ素子を集積したLSIの場合は,そう簡単ではない。チップ上には無数の素子が実装されており,しかもそれらの素子はわずか数十nmの幅の配線で接続されているからだ。ハンダゴテを使って修正するのは,まず不可能だ。このためLSIの場合,設計で問題が発覚した場合は,すべて作り直すことになってしまう。つまり,電子回路は「ハードウエア」(ハード=硬い)と呼ばれるように,基本的に柔軟性を備えていないというのが,かつての常識だった。

 実は,FPGAもたくさんの回路を集積したLSIの一種である。それにもかかわらず,前回述べたように自由に回路を構築できると同時に,何回でも回路を変更できる。つまり,プログラミングができるわけだ。いったい,この仕組みはどうなっているのだろうか。 

FPGAの基本原理 
〜 スイッチとゲート回路がプログラミングのカギ

一般にデジタル回路は,"0"または"1"を入力し,"0"または"1"を出力する論理回路で構成されている。この論理回路を構成する基本要素はゲート回路と呼ばれる。つまり,多数のゲート回路が集まってデジタル回路が出来上がっている。

FPGAの場合も,回路を構成する基本要素であるゲート回路が多数集積されている。ただし,このゲート回路は,スイッチを切り替えることによって外部から機能を変更できる。さらに,各ゲート回路は,スイッチでつながれており,ゲート回路の接続も変更可能だ。FPGAでは,この二つの仕組みを利用して,自由に論理回路を実現する,つまり回路のプログラミングができるわけだ。

 この仕組みを,具体例を交えて,もう少し詳しく見てみよう(図1)。

図1.プログラマブルな回路の原理

図1.プログラマブルな回路の原理

 図1の回路は,最も基本的なゲート回路であるANDゲート(すべてが1のとき1を出力する基本的な論理回路)とORゲート(いずれかが1のとき1を出力する基本的な論理回路)の二つで構成されている。この図でのポイントは両ゲートの出力に接続したスイッチだ。スイッチを上に倒せば回路全体としてはANDゲートの出力が得られ,スイッチを下に倒せばORゲートの出力が得られる。つまりスイッチを使うことで,点線で囲んだ部分を,AND回路として見せたり,OR回路として見せることができる。

 ここで,自由に書き換えができる1ビットメモリを用意して,スイッチの切り替え情報をメモリに格納しておいたらどうだろう(図右)。メモリの内容を書き換えるだけで,回路の機能をANDかORかに切り替えることができそうだ。スイッチと切り替え情報を格納するメモリを並べることで,プログラミングできるデバイスが作れることがわかる。これがプログラマブル・ロジックの基本原理だ。

 実際のFPGAの構造では,「機能を設定できる回路ブロック」と「配線による接続のON/OFF」の2種類に分けて考えることができる。まず「機能を設定できる回路ブロック」の実現方法は2種類に大別できる。ひとつは複合ゲートで構成された回路内部にスイッチを多数置いて所望の論理機能(ゲート回路)にする方法、もうひとつはルックアップ・テーブルというメモリのような回路を使う方法である。このどちらかの仕組みを備えた回路ブロックがチップに敷き詰められており,それらの回路ブロック同士をどのように配線(接続)するのかを,あらかじめチップ上で施されている配線上のスイッチのON/OFFで決めることで、全体の機能を決定することができるのだ。

上記の回路ブロックの実現方法のうち,最近のFPGAのほとんどが採用しているのがルックアップ・テーブルという手法である。それではルックアップ・テーブルを用いた論理回路ブロックの最小単位がどのようなものか,その具体的な構成をみていくことにしよう。

論理回路ブロックの仕組み 
〜 ルックアップ・テーブルに回路情報を格納

 ルックアップ・テーブルを用いた論理回路ブロックの呼称はFPGAベンダーにより異なる。例えば米アルテラ社は,「ロジックエレメント(Logic Element)」。米ザイリンクス社は「ロジックセル(Logic Cell)」と呼んでいる。ただし,いずれも基本的な原理は同じである。図2は,一般的なFPGAの論理回路ブロックの基本的な構成だ。ここでは簡略化のために3入力の回路を例に挙げた。

図2.ルックアップテーブルを用いた論理回路ブロックの基本構成

図2.ルックアップテーブルを用いた論理回路ブロックの基本構成

 この論理回路ブロックは,二つのブロックで構成されている。一つは「ルックアップ・テーブル(LUT)」。もうひとつは「レジスタ」である。

 ルックアップ・テーブルは日本語に訳すと「対応表」という意味になる。図2の場合は,入力が3本(A,B,C)で,それぞれに"0"または"1"を入力する。したがって,入力データは8種類あることになる。ルックアップ・テーブルには,8種類の入力のそれぞれに対応したデータが記載されており,入力に応じて,対応したデータをルックアップ・テーブルから読み出して出力する。ルックアップ・テーブルの内容を書き換えることによって,入力と出力の関係を自由に定義できるわけだ。たとえば,入力信号のAとBとCのすべてが1のときに出力1を得たい場合は,表1のような値を,ルックアップ・テーブルに書いておく。これでルックアップ・テーブルは3入力のAND回路(3入力すべてが1のとき1を出力)と同じ動作をすることになる。あるいは表2のような出力値を書いておけば,ルックアップ・テーブルは3入力のOR回路(3入力のいずれかが1のとき1を出力)と同じ動作をすることになる。実は,ルックアップ・テーブルの正体は小容量のメモリである。図2の場合は,3ビットのアドレスを備えた8×1ビット構成の8ビットメモリということになる。

表1.ルックアップ・テーブルの例
(3入力AND相当)
A B C
出力
0 0 0
0
0 0 1
0
0 1 0
0
0 1 1
0
1 0 0
0
1 0 1
0
1 1 0
0
1 1 1
1
表2.ルックアップ・テーブルの例
(3入力OR相当)
A B C
出力
0 0 0
0
0 0 1
1
0 1 0
1
0 1 1
1
1 0 0
1
1 0 1
1
1 1 0
1
1 1 1
1

 ここまで書けばルックアップ・テーブルの仕掛けをなんとなくおわかりいただけたのではないだろうか。入力の組み合わせに対応した出力値をルックアップ・テーブルに記述することで,ANDやORをはじめとするさまざまな論理条件を表現できるという仕組みだ。

 実際のルックアップ・テーブルはSRAMで構成されていて,論理回路ブロックとは別の回路を介して書き換えができるようになっている。つまりFPGAを書き換えて論理を変更するということは,論理ブロック内のルックアップ・テーブルを書き換えることなのである。

 論理回路ブロックを構成するもう一つの要素であるレジスタ(フリップフロップ)は「順序回路」を構成するためのものだ。順序回路とは過去の状態によって次の状態が決まる回路のことである。順序回路でもっとも簡単な例がカウンタだろう。1の次が2,2の次が3,3の次が4,という動作を繰り返すカウンタは,ひとつ前の値を元にして次の値が決まる。このとき,前の状態を保持するのがレジスタの役割だ。

 なお,実際の論理回路ブロックの基本構成はFPGAベンダーやFPGAの品種ごとに少しずつ違う。なるべく少ない回路ブロックで複雑な回路を作れるように,各社ともさまざまな工夫を盛り込んでいる。

 第2回目の後編では,いよいよ実際のFPGAの中をのぞいてみることにする。