booth算法充分的利用到了补码的重要性,使得我们在利用补码进行计算时减少了很多时序。下面的表格是我们假设2 作为乘数所进行的分析。接下来,我将用代码向大家阐述。
1、开始的时候在乘数2的‘负一位’加上一个默认0值 | 00100 |
2、先判断[0:-1],结果是2‘b00,表示’0‘ 即没有操作 | 00100 |
3、判断[1:0] 结果是2’b10,表示‘1’即‘-被乘数’操作 | 00100 |
4、判断【2:1】结果是2‘b10,表示’1‘即’+被乘数‘操作 | 00100 |
5、判断【3:2】 结果是2’b00,表示‘0’即无操作 | 00100 |
本次试验进行两个八位数的乘法运算。
lways@(posedge clk or negedge rst_n)
if(!rst_n )
begin
i<=4'b0;
a<=8'b0;
b<=8'b0;
s<=8'b0;
p<=17'b0;
X<=4'b0;
isDone<=1'b0;
end
else if(Start_sig)
case(i)
0:
begin
a<=A;
s<=(~A+1'b1);
p<={8'd0,B,1'b0};
i<=i+1'b1;
end
1:
if(X==8)
begin
X<=4'd0;
i<=i+4'd2;
end
else if(p[1:0]==2'b01)
begin
p<={p[16:9]+a,p[8:0]};
i<=i+1'b1;
end
else if(p[1:0]==2'b10)
begin
p<={p[16:9]+s,p[8:0]};
i<=i+1'b1;
end
else i<=i+1'b1;
2:
begin
p<={p[16],p[16:1]};
X<=X+1'b1;
i<=i+1'b1;
end
3:
begin
isDone<=1'b1;
i<=i+1'b1;
end
4:
begin
i<=3'b0;
isDone<=1'b0;
end
endcase
以上是核心代码,这里我们将被乘数A放入两个寄存器中,一个存储源数据a,一个存储补码s。将乘数B放入p空间中,进行移位操作。
同时设置移位计数器X,当达到8位时停止执行。否则,我们将对数据的末两位进行判断如果p[1:0]是10,则对p[16:9]+s,低八位保持,如果p[1:0]=01,则进行p[16:9]+a,低八位保持。其余的全部保持。
在下一步中,进行移位操作,首位是什么就补什么,将数据进行右移。我们通过测试文件可以看到结果。