前回までで加算回路(減算回路)の設計方法については説明終了しました.今回は乗算回路です.
簡単な乗算回路(割り算回路)はつぎのようなbit shiftで実現できます.
wire [8:0] y = {x[7:0],1'b0}; // 2倍する
wire [7:0] z = y[8:1]; // 1/2する
wire [15:0] M256 = {x[7:0],8'b0}; // 256倍する
このように、bit shiftならば2のべき乗のかけ算割り算が簡単にできますので、ノイズ除去のために平均化するような処理をする場合は、加算回数を256回にして、8bit shiftで1/256にする、のような簡便な回路で済むように設計するのが吉となります.そういうことはよくやります.
つぎに符号付き2進数で整数・小数の桁を考慮してbit shiftを考えてみます.原理は同じです.
例1) x(1.7.8)を入力し、4倍し、y(1.9.8)を出力する
wire [17:0] y = {x[15:0],2'b0}; // (1.9.8)
例2) x(1.7.8)を入力し、1/4倍し、y(1.5.8)を出力する
wire [13:0] y = x[15:2]; // (1.5.8)
例3) x(1.7.8)を入力し、8倍し、y(1.10.1)を出力する
wire [18:0] tmp = {x[15:0],3'b0}; // (1.10.8)
wire [11:0] y = tmp[18:7] // (1.10.1)
例4) x(1.7.8)を入力し、1/8倍し、y(1.4.11)を出力する
wire [15:0] y = x[15:0]; // (1.4.11)
この例を見て考えて法則性を理解できますでしょうか? ①とりあえず小数桁は無視して倍数ぶんのbit shiftを行う、②小数桁を考慮して出力bitを切り詰める、そんなかんじの操作をします.
例4は謎のbit shiftせずで面食らってませんか? 例4は1/8したけど入出力のbit幅が同じなので、回路的にはなにもしません.でも変わるのは、おなじ16bit数値を、(1.7.8)と区分するか、(1.4.11)と区分するかの差違でしかありません.設計者であるアナタの心の目で小数点位置を変更した気持ちになるだけなのです.固定小数点演算のえもいわれぬかったるいところです.
ここまでは、2のべき乗の乗算割り算回路でしたが、13倍とか721倍とかはどうするんでしょうか? それは「乗算器」という回路を使って実現します.乗算器の回路規模は大きく、速度も遅いです.リッチな回路です.
乗算器の設計については、次回で説明します.今回はこのへんでおしまい.
つぎへ 前へ
人気ブログランキングへ
わっふるわっふる
返信削除わっふるわっふる
返信削除