Booth算法乘法器可以看做是一种“加码”乘法运算。这是数学角度的Booth算法。这里的B[-1]是什么意思呢?B的最右边的后面一位就称为B[-1],假设B是2即4’b0010。加上B[-1]位的效果就是4’b0010_0。后边这个0是默认的。实现B[0:-1]时,可以将B对某个变量赋值,例N={B,1’b1},此时的N[1:0]就是B[0:-1]。从数学的角度来看Booth算法是比较麻烦的,需要进行移位相加等操作。当从位操作的角度来看,Booth算法的优势就可以体现出来。这是位操作的Booth算法。设乘数和被乘数都为4位,即n=4。这里要建立一个P空间,容量为2*n+1,还要将p空间初始化,默认为0;第一步:先用补码的形式表现出-1*被乘数,方便一会儿做减法,将p[4:1]填入乘数B,空出来的p[0]相当于前边的N[0],即为了方便使用B[-1];第二步:判断p[1:0],因为已经将乘数B填入到P[4:1],所以p[1:0]即对应的B[0:-1];判断p[1:0]的值于上表对应,进行相应的操作。表中提到的加减被乘数,是要在p[2n:n+1]位进行,这个需要注意。所谓的p空间右移一位,高位需要补充一位。补充的这一位,要由进行加减被乘数以后的p[8](p[2n])决定,p[8]是1补充1,是0补充0;此步骤循环n次,最后结果取p[8:1];相应核心代码(8位)case(i)0:begina=A;s=(~A+1’b1);p={8’d0,B,1’b0};i=i+1’b1;end//a寄存被乘数,s寄存被乘数的补码,对p空间装填乘数B1:If(X==8)beginX=4’d0;i=i+1’b2;endelseif(p[1:0]==2’b01)beginp={p[16:9]+a,p[8:0]};i=i+1’b1;endelseif(p[1:0]==2’b10)beginp={p[16:9]+s,p[8:0]};i=i+1’b1;endelsei=i+1’b1;在八次循环前对p[1:0]进行判断,然后进行相应的操作(加减被乘数)。2:beginp={p[16],p[16:1]};X=X+1’b1;end对加减被乘数以后的p空间进行移位,并在高位进行补位,补位结果因p[16]而定。循环次数加一。3:…………endcase对于八位的乘数和被乘数,位操作需要八个始终周期,而在此例程中,要先操作后移位,会多消耗八个时钟。可以适当改变,使得消耗的时钟缩短,将1,2在一个时钟内完成。即位操作和移位一步完成。P={p[16],p[16:9]+a,p[8:1]},但是由于非阻塞赋值的缘故,此时的p[16]并不是进行位操作以后的p[16],因此要适当的用阻塞赋值;R=p[16:9]+a;p={R[7],R,p[8:1]};这样就可以将1,2在一个时钟内完成,因此这样改进以后的Booth算法乘法器会缩短所消耗的时钟。