32x32Booth乘法器
本设计是一个简单的基于Booth算法的32位有符号数乘法器,Booth算法的原理是先判断P[1:0],然后操作P空间,最后P空间移位,根据P空间的最高位来给移位后的P选择补1 or 补0。
booth乘法器是一种位操作乘法器,与传统乘法器不同的是直接操作位。booth有一个重要的加码运算。
p[0] | p[-1] | 加码结果 |
---|---|---|
0 | 0 | 无操作,右移一位 |
0 | 1 | +被乘数,右移一位 |
1 | 0 | -被乘数,右移一位 |
1 | 1 | 无操作,右移一位 |
module booth(
input [31:0]A,
input [31:0]B,
input clk,
input rst,
input sig,
output [63:0]Booth,
output done,
output [5:0]X
);
reg [5:0]i;
reg [64:0]p;
reg [31:0]a;
reg [31:0]s;
reg [5:0]x;
reg isdone;
always@(posedge clk or negedge rst)
if(!rst)
begin
i<=6'b0;
p<=65'b0;
a<=32'b0;
s<=32'b0;
x<=0;
isdone<=0;
end
else if(sig)
begin
case(i)
0:
begin
a<=A;
s<=~A+1'b1;
p<={32'b0,B,1'b0};
i<=i+1;
isdone<=0;
end
1:
begin
if(x==32)
begin
x<=0;
i<=i+2;
end
else if(p[1:0]==2'b01)
begin
p<={p[64:33]+a,p[32:0]};
i<=i+1;
end
else if(p[1:0]==2'b01)
begin
p<={p[64:33]+s,p[32:0]};
i<=i+1;
end
else
begin
p<=p;
i<=i+1;
end
2:
begin
p<={p[64],p[64:1]};
x<=x+1;
i<=i-1;
3:
begin isdone<=1;i<=i+1;end
4:
begin isdone<=0;i<=0;end
endcase
end
assign done=isdone;
assign Booth=p[64:1];
assign X=x;
endmodule