- 締切済み
マイクロコンピュータ 乗算演算について
マイクロコンピュータで、8ビット演算回路の乗算演算を行ったのですが、その際、乗数の0、1パターンに応じて被乗数を左シフトさせ加算していくロジックで演算をするというアルゴリズムを組み立てて実行しました。 乗算演算をより高速化させるには、この他にどのような手段が考えられるのか教えていただけないでしょうか? お願いいたします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- Tacosan
- ベストアンサー率23% (3656/15482)
ソフトウェアでやるんだと, ほとんどどうしようもないですね. ハードウェアでやるんだったら.... やりそうなのは部分積 (64個) を全部 AND ゲートで作っておいてあとは Carry Save Adder で Wallace木組むかなぁ? Z80 でメモリから読み込む, というのであれば IO空間に置いておいて IN (C), A が常套手段? 1回の読み込みでは 16ビット取り出せないので 2回に分けて読み込んで ADD HL, DE を駆使するということで.
- bloomers_daisuki
- ベストアンサー率14% (40/267)
#1,2の回答の通り、乗数と被乗数でアドレスを生成して、そのアドレスから16ビットのデータ(積)を読み込めば、非常に高速です。8ビットマイコンの話しで言えば、メモリの読み出しと等価な速度になります。ただし、256*256*2バイトのアドレスが必要になるので、レトロなZ80では実現しにくいでしょう。 もうひとつは、質問者さんの案を、全てワイヤードロジックで組むことです。 必要なロジックは、 1. シフトレジスタ 桁取りのためのシフト 2. データセレクタ 乗数のパターンで被乗数か0を出力 3. 16ビット加算器 データセレクタから出力されたデータを「一気に」加算する。 でしょうか。実際には8+2ビットの加算器が8個必要になります。 結果は、クロック無しのデータフローで出力されます。 同様に、除算回路も作成可能です。
- rinkun
- ベストアンサー率44% (706/1571)
ハードウェアでやるのかソフトウェアでやるのかでも変わってきますけど、どっちかな。 8ビットだとテーブルを用意してしまって参照することも可能だね。8ビット×8ビットで64Kエントリを用意する必要があるけど。 あとは、nビット乗算はn/2ビット乗算を3回と加減算で計算できるので、これを使って再帰的に1ビットまで展開する手法もある。ただ8ビットくらいだとかえって遅くなるかもしれない。
- DIGAMMA
- ベストアンサー率44% (620/1404)
こんにちは、 「九九の表」を暗記してれば、掛け算は早いですよね。コンピュータの世界は2進法ですから「二二の表」と言うことになります。 さて、人間が「九九の表」ではなく「0から99」あるいは「0から999」までの掛け算の表を暗記していたら、計算が素早くなるのと同様にコンピュータも「二二の表」ではなく、「256*256」の表をROMとかに記憶しておけば、理論上、8倍早くなります。 ハードウエアで実現するなら、ありとあらゆる掛け算の結果を、予めメモリに書き込んでおくという方法をとれば、(あたりまえですが)瞬時に回答が求まります。 ハードウエアを変えずに、ソフトのみで対処したいのならば、0から255までの掛け算の結果を、256掛ける256(=65536)の配列に予め定数値としてセットしたあと、1ビットづつ左シフトするのではなく、8ビットづつ左シフトするプログラムをくんでみてください。すごく早くなりますヨ。 具体的なソースコードは自分で考えてね。 ご参考まで。勉学がんばってください。