全体像
- ラフに構造の絵を描くことから詳細を整理します[1]。整理後にはラフな仕様書が出来上がります。予めステージ数が2としましたが、実際は詳細を整理すると出てくる数字[2]です。
- パイプラインを系統分けすると分かりやすいと思います。単純に、制御系統、符号系統、指数系統、仮数系統の4つです。ここからそれぞれの系統が相互に干渉しそうな項目を挙げていきます。
- 制御系統:
本体はバッファ型を参照してください。ここから、それぞれの系統のステージにあるFFのCE(Chipi Enable)だけに影響することが分かります。
- 符号系統:
乗算器は簡単です。正と負を掛ければ負と言うようにオペランドの符号どうしの排他的論理和を取るだけです。最初のステージだけで答えが出せそうです。他の系統に何等影響はありません。一方加算器は大変です。注釈[3]とサンプルコードを参考に読み解いて頂ければと思います。
- 指数系統:
2nと2mの乗算は指数nとmの足し算です。問題は仮数部の桁上がりです。逆に言うと、指数系統が他の系統に何等かの影響はありません。
- 仮数系統:
仮数部自体、11ビットの仮数どうしの22ビットの乗算結果のみが反映します。上記の系統が仮数部に影響を及ぼすことはありません。問題はまるめ[4]と正規化です。先ずまるめですが、22ビットの結果を11ビットにするため11ビットを捨てなくてはなりません。
ところで、正規化されたオペランドのMSBは1なので、演算結果のMSBかその1つ下のビットは必ず1になります。
- 次にそれぞれの系統のステージ分けを行います。仮数系統意外は論理が軽いので、使用するFFが少なくなるように前段でその系統の処理を終えておきます。重い仮数系統は、仮数どうしの掛け算を前段に、まるめと仮数部の桁上がり処理を後段に分けます。桁上がり処理は指数系統の後段でも処理します。
考えのまとめ
- パイプラインの系統とフローが決まれば、ある程度の詳細ブロック図が出来上がります。これを見て問題ないかチェック[5]します。
- 次に例外事項そ検討します。オペランドが0だと、指数も仮数の演算結果も想定外の0になってます。ここから例外事項を全体像に当てて行きます。
- NaNやInfinityは想定から除外していますが、これらの入力があった場合どういう動作になるかもチェックします。今回は単純なパイプラインなのでいいのですが、データを制御にフィードバックするようなモジュールで生じるハングアップだけは避けねばなりません。
- C言語等を用いて実際の処理の正確さや精度を事前に確かめることがあります。少なくとも算術演算では期待値生成が必要なので準備は必要です。
- 以上から作成したのが下図です。
- 制御系統:それぞれのステージのCE(Chip Enable)を発生します。
- 符号系統:掛け算なので、前段の符号の排他的論理和だけが論理になります。
- 指数系統:前段でオペランドAとB足しBias(1.0の桁を示す0xf)引きます。後段で仮数計算結果の桁上がり分を足します。
- 仮数系統:前段でオペランドAとBを掛けます。後段でまるめと桁上がりを考慮してMSBが1になるように揃えます。
回路デザイン > 設計例 [浮動小数点] > 加算・乗算について 次のページ(コーディング) このページのTOP ▲