KirIn 落書き帳

素人がプログラミング, FPGA, LSIをお勉強しているメモ書きです。間違いがあればご指導していただけたら幸いです。

Verilogで正数同士の乗算器

FPGAで設計をしていると乗算器などは自分で書くよりもIPに任せた方が早かったりします。(私のコードが悪いだけか?)
そこで正数同士の乗算器の作り方を勉強のためメモしておきます。

4bit同士(a,b)のかけ算は以下のように表せます。

$$ \begin{align} a \times b &= \sum_{k=0}^3 b_k \times a \times 2^k\\
&=2^3 \times b_3 \times (2^3 \times a_3 + 2^2 \times a_2 + 2^1 \times a_1 + a_0)\\ &+ 2^2 \times b_2 \times (2^3 \times a_3 + 2^2 \times a_2 + 2^1 \times a_1 + a_0)\\ &+ 2^1 \times b_1 \times (2^3 \times a_3 + 2^2 \times a_2 + 2^1 \times a_1 + a_0)\\ &+ b_0 \times (2^3 \times a_3 + 2^2 \times a_2 + 2^1 \times a_1 + a_0) \end{align} $$

この式を元にverilogを記述すると以下のようになります。

module mlt_44 (
    z, //積
    a, // 被乗数
    b); //乗数

    input [3:0] a,b;
    input [7:0] z;

    //部分積
    wire [3:0] pp0, pp1, pp2, pp3;

    assign pp0 = {4{b[0]}} & a;
    assign pp1 = {4{b[1]}} & a;
    assign pp2 = {4{b[2]}} & a;
    assign pp3 = {4{b[3]}} & a;

    //部分積の加算
    assign z = (pp0 << 0) + 
               (pp1 << 1) +
               (pp2 << 2) +
               (pp3 << 3);
endmodule