はじめに
FPGAで加算することについて考えます。
通常は、Verilog-HDL が提供する演算子 '+' を使います。
コンパイラは、この記述を加算器回路として実装します。
assign sum = a + b;
大部分の場合では '+' で問題ないのですが、特殊な場合や、高度に最適化したい場合には、「ひと手間」かけることでよりよい加算をすることができます。
例えば、こんな場合にどうしたらよいか、のヒントになれば幸いです。
- 回路面積を極小にしたい場合
- 回路面積はいいから、周波数を最速にしたい場合
- 多入力の加算を一度に実行したい場合
- 長大ビットの加算を実装したい場合
FPGAの基本構成
FPGAは、プログラマブルな組み合わせ回路とフリップフロップがたくさん配置されている半導体デバイスです。
この、「プログラマブルな組み合わせ回路+フリップフロップ」をLogic Element (Logic Cell) と呼びます。
FPGA内部のLogic Element同士の接続もプログラマブルになっているため、設計者が任意の回路を(製造時ではなく)任意のタイミングで書き換えることが可能になっています(とはいえ、書き換えには数十秒~数分かかりますが)。
ここでは、Altera(Intel)社のFPGAを例に、加算器を実装することに注目して Logic Element の内部構造を説明します。
ALM
Altera社のFPGAでは、ALM が異本的な回路要素です。
ALMには、2つの組み合わせ回路用のLUT(ルックアップテーブル)と、4つのフリップフロップで構成されます。
ALMは、以下のいずれかのモードで動作可能です。
- 通常モード
- 拡張LUTモード
- 演算モード
- 共有演算モード
演算モードALM
加算器を構成する場合には、演算モードALMが適しています。
このとき、2つの4入力LUT、専用キャリー信号つき2つの全加算器、4つのフリップフロップでALMは構成されます。
ALM内部に全加算器が存在するので、LUTの消費なしに加算を実装できます。
共有演算モードALM
共有演算モードALMは、演算モードALMと似た構成です。
2つの4入力LUT、2つの全加算器、4つのフリップフロップですが、共有演算入力/出力線があります。
これは、(後で説明しますが) LUTで3to2コンプレッサー(CSA;キャリーセーブアダー)を実装することで、3入力の加算器を1つのALM内部で実装することが可能となります。
参考文献
- Altera Advances Synthesis Cookbook