誰か代わりにアブスト書いてくれ!!
現実逃避中です.すいぼうです.

今回はFPGAで何故任意の回路を作ることが出来るのかという点について,簡単に説明しようと思います.
使ってる用語は情報工学科2年で聞くものがほとんどだと思います.
詳しくは末尾に参考サイトとしてリンクを貼って置きますので,そちらの方へどうぞ.

FPGAには内部RAMやI/Oなどユーザが任意のICを作成する上で使う機能が予め備わっています.
これらの機能をどのように接続してどのようなタイミングで動作させるのか,ユーザはこれを指定してあげることで任意の回路を作り出すわけです.

例えば,4ビットの入力に対応した16進数表示を7セグメントディスプレイ(以下7セグ)で行いましょう.
小数点部分は使わないので,表示パターンは以下の16通りですね.

7seg

この7セグは7つのLEDで構成されているので,ユーザは入力に対して計7本の出力を切り替えるような論理回路を組む必要があります.
FPGAのどのピンから入力するのか,どのピンから出力するのかも定義しなくてはなりません.
出力が1の時に対応したLEDは点灯し,0の時に消灯するように7セグとFPGAが接続されていることにします.
中央の横棒に注目しましょう.
0,1,7,cの時は0,それ以外では1を出力する必要があります.
対応した入力は0000, 0001, 0111, 1100ですね.
[]内の数字が小さいほうがLSB(least significant bit:最下位ビット)側として書くと,

中央の横棒 = ~((~input[3] & ~input[2] & ~input[1] & ~input[0]) |
                        (~input[3] & ~input[2] & ~input[1] & input[0]) |
                        (~input[3] & input[2] & input[1] & input[0]) |
                        (input[3] & input[2] & ~input[1] & ~input[0]));

となります.
これを人間ならカルノー図,コンピュータならクワイン・マクラスキー法なんかを使って簡単化します.
(~input[3] & ~input[2] & ~input[1] & ~input[0]) | (~input[3] & ~input[2] & ~input[1] & input[0])

~input[3] & ~input[2] & ~input[1]
みたいな感じです.
ツールがやってくれるんで,そこまで気にしなくても大丈夫ですけどね.

FPGAにはフリップフロップとLUT(ルックアップテーブル)をいくつか含んだセルがたくさん入っています.
XilinxならSlice,AlteraならALMというように呼び方は異なりますが.
このLUTはSRAMで構成されています.
今回の場合,このSRAMのアドレス線にFPGA外からの入力信号を,SRAMのデータを先程の論理式(もどき)に対応した値にします.
もしかしたら,16-1のマルチプレクサと同じ動きというように説明した方が分かりやすいかもしれません.
図にするとこんな感じです.

srammulti
↑黄色の部分をユーザが定義する.0,1,7,cの時に出力が0になる.

このSRAMからの出力を,FPGAの出力する部分に繋げればいいわけです.
こんな感じで残る6つを設定すれば,7セグの表示が出来そうですね.

先程も述べたようにFPGAにはセルがたくさん入っているので,この組み合わせによって様々な論理回路を構成できるようになります.

とまぁ,今回はここまで.
何故任意の回路を作れるのか,少しは疑問が解決できたでしょうか?
全く知らずに触れるよりは……と一番疑問となりそうな部分を説明してみました.
これより詳しくは触れないつもりですので,気になる人は調べてみてください.
面白いですよ(そしてハマりました).

次回は,早速Xilinxでの開発環境(PlanAhead)を入れてみたいと思います.
バックアップとってアンインストールして……と少し手間なので,遅くなるかも?

訂正や要望,質問等はコメントにどうぞ.

<< vol.0                vol.2 >>


参考サイト
半導体技術解説:いまさら聞けない FPGA入門 (2/3) - MONOist(モノイスト)
http://monoist.atmarkit.co.jp/mn/articles/0609/20/news118.html