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