数字电路之乘法器(三)

目录

常数乘法

大整数乘法-分治法


常数乘法

众所周知,乘法器面积和功耗都比较大,在芯片设计中,我们应尽量减小乘法器的使用。

如果我们计算R*C,其中C是一个常数,能不能省掉一个乘法器呢?答案是可以。

假如C=113,将113变形成 7*16+1 = (2*3+1)*16+1 = (2*(2+1)+1)*16+1后。我们惊喜的发现,用移位和加法可以替代乘法器。

可喜的是,RTL coding过程中,我们不需要这么拆分。综合器会帮我们处理好。我们只需写113*R就可以。

 

大整数乘法-分治法

分治法(divide and conquer)

经典面试题:如果计算机只有8位,如何计算16位乘法?

答:由于计算机硬件的限制,不能直接进行相乘得到想要的结果。可以将一个大的整数乘法分而治之,将大问题变成小问题,变成简单的小数乘法再进行合并,从而解决上述问题

wire [7:0] a, b;
wire [3:0] ah,al, bh,bl;
wire [7:0] p0,p1,p2,p3;
assign ah = a[7:4];
assign al = a[3:0];
assign bh = b[7:4];
assign bl = b[3:0];
// a*b = (ah*16+al)*(bh*16+bl)
//        = ah*bh*256 + ah*bl*16 + al*bh*16 + al*bl
assign {p3,p2,p1,p0} = ah*bh<<8 +  ah*bl<<4 +  al*bh<<4 +  al*bl;
//仅示意

Guess you like

Origin blog.csdn.net/zhong_ethan/article/details/121734592