情報画像工学実験II

プログラム作成例・解説


課題7

2進数表記した2値に対する筆算による乗算例を図1に示す。

図1. 乗算例

例の場合は、乗数の第3, 2, 0 ビットが 1、第1ビットが 0 であり、被乗数1011 を 3, 2, 0 ビット左シフトして得られる3値の和を取ることにより積を得ることができる。一般に、乗数の各ビットの値を調べ、1となるすべてのビット(第iビットとする)について、被乗数をiビット左シフトして得られる値を求め、それぞれの和を取ることにより、積を得ることができる。

4ビット乗算器の作成例を図2 に示す。

図2. 4ビット乗算器

ここで、ABi (i=0〜3) は B[i] が 1 のときバスAと等しい値、0 のとき全零となるバスであり、図3 に示すようにバスAの各値と B[i] の論理積(AND)演算により得ることができる。

図3. ABi (i=0〜3) を求める回路

積Yは値ABi (i=0〜3) をiビット左シフトして得られる値の総和をとることにより得られる。左シフト操作には特殊な回路を用いる必要はなく、配線を左にずらすことで実現できる。積Yは8ビット値で得られる。一般に積の桁数は、高々、被乗数と乗数の桁数の和である。この場合は被乗数と乗数の桁数は共に高々4桁であり、積の桁数も高々4+4=8桁となる。

図2 に示す乗算器から冗長な箇所(入力が0である箇所等)を削除した4ビット乗算器を図4に示す。一般に乗算を行う場合、被乗数の桁数と同じビット数の加算器(この場合は4ビット加算器)を用意すればよい。

図4. 回路量を減らした4ビット乗算器

図4に基づいて作成した4ビット乗算器を以下に示す。モジュール ADDER4 は課題3 で作成した4ビット加算器である。また、モジュール MULTIPLIER4X1 は図3に示した ABi を求める回路である。

module MULTIPLIER4X4(A, B, Y);
        input [3:0] A, B;
        output [7:0] Y;
        
        wire [3:0] AB3, AB2, AB1, AB0;
        wire [3:0] AB10, AB210;
        wire CO10, CO210;
        
        MULTIPLIER4X1 U0 (.A(A), .B(B[0]), .Y(AB0));
        MULTIPLIER4X1 U1 (.A(A), .B(B[1]), .Y(AB1));
        MULTIPLIER4X1 U2 (.A(A), .B(B[2]), .Y(AB2));
        MULTIPLIER4X1 U3 (.A(A), .B(B[3]), .Y(AB3));
        
        assign Y[0] = AB0[0];
        ADDER4 U4 (.A({   1'b0,  AB0[3],  AB0[2],  AB0[1]}),
                   .B({ AB1[3],  AB1[2],  AB1[1],  AB1[0]}),
                   .S(AB10), .CO(CO10));
        
        assign Y[1] = AB10[0];
        ADDER4 U5 (.A({    CO10,  AB10[3],  AB10[2],  AB10[1]}),        
                   .B({  AB2[3],   AB2[2],   AB2[1],   AB2[0]}),
                   .S(AB210), .CO(CO210));
        
        assign Y[2] = AB210[0];
        ADDER4 U6 (.A({ CO210, AB210[3], AB210[2], AB210[1]}),
                   .B({AB3[3],   AB3[2],   AB3[1],   AB3[0]}),
                   .S({  Y[6],     Y[5],     Y[4],     Y[3]}),
                   .CO(Y[7]));
endmodule

module MULTIPLIER4X1(A, B, Y);        // 図3に示した ABi を求める回路        
        input [3:0] A;
        input B;
        output [3:0] Y;
        
        assign Y[3] = A[3] & B;
        assign Y[2] = A[2] & B;
        assign Y[1] = A[1] & B;
        assign Y[0] = A[0] & B;
endmodule

ここで 1'b0 は 1ビットの信号値(定数値) 0を意味する。一般にn'bxxx...x は、値がxxx...x(2進表記) なるnビットの信号値(定数値)を意味する。なお、単に xxx...x と値を書いたとき、10進表記された値と見なされる

この乗算器は加算器を3個持つ。一般に乗算器は加算器と比べ回路量がとても大きい。フリップフロップ等をうまく用いることにより、回路量を減らす方法もあるが、この場合は演算に時間がかかる。このような事情から、COMET II のように、乗算器、乗算命令を持たないプロセッサもある。

加算は+演算子により記述できる。この場合、設計者がわざわざ加算器の構成を記述しなくとも、論理合成ツールが加算器を作成してくれる。以下に+演算子を用いた乗算器の構成を示す。

module MULTIPLIER4X4(A, B, Y);
        input [3:0] A, B;
        output [7:0] Y;
        
        wire [3:0] AB3, AB2, AB1, AB0;
        wire [4:0] AB10, AB210;
        
        assign AB0 = A & {4{B[0]}};
            /* {4{B[0]}} は {B[0], B[0], B[0], B[0]} なる 4ビットバス */        
        assign AB1 = A & {4{B[1]}};
        assign AB2 = A & {4{B[2]}};
        assign AB3 = A & {4{B[3]}};
        
        assign Y[0] = AB0[0];
        assign AB10 = {1'b0, AB0[3:1]} + AB1;
                /* AB0[3:1] は {AB0[3],  AB0[2],  AB0[1]} なるバス  */        
                /* 4ビットバス同士の加算結果は5ビットバスで得られる */
                /*    最上位ビット(AB10[4]) は桁上げ、              */
                /*    残る4ビット(AB10[3:0]) は和である             */
        
        assign Y[1] = AB10[0];
        assign AB210 = AB10[4:1] + AB2;
        
        assign Y[2] = AB210[0];
        assign Y[7:3] = AB210[4:1] + AB3;
endmodule

加算(+)だけでなく、減算(-)、乗算(*)、除算(/)、バレルシフト(>>, <<) 等の演算子も用いることができる。ただ、これら演算子を用いた回路を論理合成するためには、各演算子用のライブラリを持っている、つまり、論理合成ツールが各演算回路の構成を知っている必要がある。ライブラリを持っていない場合は、論理合成するために、これらの演算子を用いずに回路記述する必要がある。


課題6に戻る
実験II-6トップページに戻る
難波担当実験・演習のページに戻る

難波 一輝 (助教・伊藤・北神・難波研究室)
工学部1号棟4階409号室、内線3255、043-290-3255、namba@ieee.org