目录
- 一、原理分析
- 二、Xinlinx中的乘法器结构
- 1.直接相乘
- 2.移位相加乘法器
- 3.加法树加法器
在数字IC中乘法器的结构是什么样的呢?接下来我们以两个4bit数的乘法进行举例,假定有两个4bit数据,分别为X=(X3,X2,X1,X0)和Y=(Y3,Y2,Y1,Y0),输出为8bit数据Z。
一、原理分析
乘法结构示意图1如下:
我们可以发现,整个乘法过程需要进行多次两个数据以及进位的相加,这样的结构很适合利用加法器来实现。我们将其转换为加法器的结构,如下图2所示:
注:上图中全加器之间相连的部分为低位对高位的进位。
根据图中结构,我么可以发现最多有三级加法(因为一共有四行),而每一行中的每个数据的加法可以并行进行,通过多bit的加法器实现。也就是说,最终需要3个4bit位宽的加法器,如果采用四位加法器实现,则最终的结构图如图3:
图中采用了三级的四位加法器,第一级加法器的进位输入CI为0,进位输出CO连接至第二级加法器的进位输入CI,他的进位输出连接至第三级的进位输入。图3与图2对应的结果相同,看可以对应着理解。
二、Xinlinx中的乘法器结构
我们知道,Xinlinx的FPGA中函数的实现是通过查找表的形式,那乘法器在其中的结构是怎样的?
1.直接相乘
我们按照如下的verilog代码综合电路:
module multiplication(
input [3:0] a,
input [3:0] b,
output [7:0] sum
);
assign sum=a*b;
endmodule
得到的综合结果如下图4:
根据综合结果可以发现,Xinlinx FPGA实际上也是将各行的相加通过查找表的形式实现,之后将查找表输出和进位链的S、DI相连,通过进位链CARRY4得到最终的相加结果。关于进位链CARRY4的介绍以及如何通过LUT和进位链实现加法的原理可以参考之前的文章:
Vivado中的加法器电路结构-CSDN博客
但是本次计算和的LUT与之前计算加法的过程略有不同,主要在于本次的计算和次数更多更复杂,在综合过程中进行了一些优化。
上述这种算法计算速度很快,但是我们也可以发现,这其中使用了较多的LUT,资源消耗较大。
2.移位相加乘法器
下面介绍移位相加乘法器,我们将乘法拆解成如下形式:
X 3 X 2 X 1 X 0 ∗ Y 3 Y 2 Y 1 Y 0 = X 3 X 2 X 1 X 0 ∗ Y 0 + X 3 X 2 X 1 X 0 ∗ Y 1 ∗ 2 + X 3 X 2 X 1 X 0 ∗ Y 2 ∗ 4 + X 3 X 2 X 1 X 0 ∗ Y 3 ∗ 8 X_3X_2X_1X_0*Y_3Y_2Y_1Y_0=X_3X_2X_1X_0*Y0+X_3X_2X_1X_0*Y1*2+\\X_3X_2X_1X_0*Y2*4+X_3X_2X_1X_0*Y3*8 X3X2X1X0∗Y3Y2Y1Y0=X3X2X1X0∗Y0+X3X2X1X0∗Y1∗2+X3X2X1X0∗Y2∗4+X3X2X1X0∗Y3∗8
则对应的verilog代码为:
module multiplication(
input [3:0] a,
input [3:0] b,
output [7:0] sum
);
reg [7:0] sum=0;
integer i;
always@(*)
begin
for(i=1;i<=4;i=i+1)
begin
sum=sum+(a[i]==1)?b<<(i-1):0;
end
end
endmodule
RTL电路结构如下:
综合结果为:
可以很明显的发现,使用的资源减少了。这种结构的优点就是占用资源少,但是速度比较慢,一个结果的输出可能需要多个周期,主要在低速信号处理中。
3.加法树加法器
加法数加法器的原理就是将乘法拆分为多个并行的步骤,最后将各部分的结果相加,直白的说就是将移位相加乘法器改成并行结果,之后各部分积两两相加即可得到最终结果。
verilog代码如下:
module multiplication(
input [3:0] a,
input [3:0] b,
output [7:0] sum
);
reg [3:0]tem0;
reg [4:0]tem1;
reg [5:0]tem2;
reg [6:0]tem3;
wire [7:0]sum1;
wire [7:0]sum2;
always@(*)
begin
tem0<=(b[0]==1)?a:0;
tem1<=(b[1]==1)?a<<1:0;
tem2<=(b[2]==1)?a<<2:0;
tem3<=(b[3]==1)?a<<3:0;
end
assign sum1=tem0+tem1;
assign sum2=tem2+tem3;
assign sum=sum1+sum2;
endmodule
RTL电路图如下:
综合结果如下:
这样的结构相比移位相加乘法器的计算速度要提升不少,但是资源消耗量和直接采用乘法相近。