手动乘法过程如下,用乘数的每一个bit分别去乘被乘数,最后将所有的中间结果相加就可以得到结果。
若是M×N-bit乘法,则为N的每个bit去乘M,得到N个M-bit的partial products,将N个partial products累加就是乘法结果。N个数累加可以用Wallace Tree结构运算。
1. Radix-4 Booth乘法器
通过每个bit去乘的这种方法,如果乘数位宽高,就会产生较多个partial products,为了减少Wallace Tree结构的层数,可以通过每2bit去分别乘。
假设被乘数为Y,将1bit编码改变为2bit编码,2bit编码如下。比如b1=1,b0=0时,可以看成2乘Y。
b1 | b0 | partial | partial |
---|---|---|---|
0 | 0 | 0Y | 0Y |
0 | 1 | 1Y | 1Y |
1 | 0 | 2Y | 4Y-2Y |
1 | 1 | 3Y | 4Y-Y |
在电路中1Y容易,2Y就是将Y左移1位,4Y就是将Y左移2位。即4Y={Y,2'b00}
,2Y={1'b0,Y,1'b0}
。-Y也比较好做,-Y就是将Y取反再加1,-2Y就是将2Y取反加1。比如Y=6'b001100
,那么-Y=6'b110100
,2Y=6'b011000
,-2Y=6'b101000
。
将上面partial改写,可将3Y改成4Y-Y,2Y改成4Y-Y。4Y表示权重升高,因为b1b0最多可以表示2’b11,而4Y为100,可以看成对下一组{b3,b2}编码的进位。经过变换之后,本位只留下0Y、1Y、-2Y、-Y部分积,本位部分积从原来的2个变为1个。
{b1,b0}编码的进位b_cin和下一组编码{b3,b2}的编码对应如下,比如b3=1,b2=0,应该为2Y,且b cin为0,没有进位,所以其对应的部分积(partial products)为2Y,写成4Y-2Y;b3=1,b2=0,为2Y,且b cin为1,有进位,所以为3Y,写成4Y-Y。
b3 | b2 | b_cin | partial |
---|---|---|---|
0 | 0 | 0 | 0Y |
0 | 1 | 0 | 1Y |
1 | 0 | 0 | 4Y-2Y |
1 | 1 | 0 | 4Y-Y |
0 | 0 | 1 | 1Y |
0 | 1 | 1 | 2Y |
1 | 0 | 1 | 4Y-Y |
1 | 1 | 1 | 4Y |
通过上述完整的Radix-4编码表可以发现,当b3为1时,出现了4Y,也就是产生了进位,其他情况没有向下一组编码的进位。
比如做16bit乘法,最右侧表示第一次进位固定为0,重叠部分如b1表示有进位产生,所以Radix-4编码后有9个partial,如果1bit分别乘的话就会有16个partial,因此,较少了partial的数量,也就减少了Wallace Tree的向下级数。
假设A×B,B=11(十进制),其二进制为4'b1011
,在其最低位补0,高位补2个符号位,其编码就如下图。
像Wallace Tree这些,在真正实现的时候,直接用*
即可,不论是DC还是Vivado,综合工具都会自动综合为这些结构。
当我们需要更高的频率的时候,由于追求频率,可能会导致一个cycle做不完,即输入后需要等待几个cycle才能出结果,这时候需要带有流水线结构的乘法器IP来做,DC和Vivado中也提供了IP。
我们可以不用研究乘法器IP的结构,直接调用,但是上述这些知识需要知道,这样就能知道大概的delay,心里有个数,很多经验丰富的芯片工程师在设计时都会预估项目工程的delay,以预计可达到的主频,从而做到心里有数。