二进制乘法器

二进制乘法器

关注我的公众号c137Lab获取更多相关内容

在这里插入图片描述

“手动计算乘法”

两个 N N N 位二进制数 X X X A = ∑ k = 0 N − 1 a k 2 k A=\sum^{N-1}_{k=0}a_k2^k A=k=0N1ak2k 的乘法可以用如下的方式计算:
P = A X = ∑ k = 0 N − 1 a k 2 k X P=AX=\sum^{N-1}_{k=0}a_k2^kX P=AX=k=0N1ak2kX
不难看出, A A A 中非零元素的多少决定了运算量(这也是为什么在介绍最佳CSD编码时提到其可以降低乘法运算量)。而上式中的计算可以看成是对 X X X 的移位相加。

实现手动计算乘法的Verilog代码如下:

module bitMul(
	input clk,
	input rst_n,
	
	input [7:0] x,
	input [7:0] a,
	
	output reg [15:0] y
    );

reg [3:0] count;
reg [15:0] p, t;

localparam INIT = 0;
localparam MUL = 1;
localparam FINISH = 2;

reg [1:0] state;

always@(posedge clk or negedge rst_n)
begin
	if(rst_n == 1'b0)
	begin
		state <= INIT;
	end
	else 
	case(state)
	
		INIT:
		begin
			p <= 0;
			count <= 0;
			t <= x;
			state <= MUL;
		end
		
		MUL:
		begin
			if(count == 3'd7)
			begin
				state <= FINISH;
				y <= p;
			end
			
			else
			if(a[count] == 1'b1)
			begin
				p <= p + t;
			end
			t <= t * 2'd2;
			count <= count + 1'b1;
			state <= MUL;
		end
		
		FINISH:
		begin
			state <= INIT;
		end
		
	endcase
end

endmodule

该方式实现的乘法器第一个操作数(X)是并行形式的,第二个操作数(A)是串行形式的,所以被称为串行/并行乘法器。如果两个操作数都是串行形式的,则构成了串行/串行乘法器。串行/串行乘法器只需要一个全加器,但是其状态机需要 N 2 N^2 N2 个周期,等待时间为高阶无穷大 O ( N 2 ) O(N^2) O(N2)

阵列乘法器

阵列乘法器(并行/并行乘法器)通过增加复杂性来换取速度,下图是一个四位阵列乘法器:

![img1][img1]

对于现代FPGA,进位计算执行的速度比计算和的速度快,因此这一方法并不可行。

下面介绍一种效率更高的方法,相当于手动计算方法的阵列形式:

![img2][img2]

这种方法被称作二叉树乘法器,其流水线级数为 l o g 2 ( N ) log_2(N) log2(N)

通常应用在 ASIC 中的其他乘法器体系有 Booth 乘法器和 Wallace 树乘法器,但很少用在 FPGA 相关领域中。

乘法器模块

2 N × 2 N 2N\times2N 2N×2N 乘法器可以由 N × N N\times N N×N 乘法器模块组成,具体方法如下式。

这种方案消耗更多时间来换取更小的资源占用,可以用于使用存储器(LUT)实现乘法器的情形。

半分方形乘法器(HSM)

降低基于 LUT 乘法器对存储器要求的另一个方法是减少输入域中的位。输入域每减少一位, LUT 字的数量就减少二分之一。 N N N 位字的平方运算的 LUT 只需要 2 N × 2 N 2^N\times2^N 2N×2N的规模(对比 N N N 位字直接实现LUT的 2 2 N × 2 N 2^{2N}\times2N 22N×2N)。

Additive Half-Square Multiplier(AHSM)

Differential Half-Square Multiplier(DHSM)

这一方法需要在 X 和 Y 均为奇数时进行校正。如果是有符号数使用 D1 编码还能继续减小规模,下图给出使用 D1 编码的 AHSM 设计。

![img3][img3]

在同样的设计中,如果使用 DHSM 方法,可以减少一个 D1 编码器的使用:

img4

四分之一平方乘法器(QSM)

QSM 的运算方法如下:
X Y = ( X + Y ) 2 4 − ( X − Y ) 2 4 XY=\frac{(X+Y)^2}4-\frac{(X-Y)^2}4 XY=4(X+Y)24(XY)2
可以看到 QSM 不需要进行校正,除以 4 的误差在相减后被抵消。实现 QSM 需要 N + 1 N+1 N+1 位输入的 LUT .

img5

基于 LUT 的乘法器降低了 LE 的数量但并没有提高 Registered Performance。

参考文献:Digital Signal Processing with Field Programmable Gate Arrays --U.Meyer-Baese

猜你喜欢

转载自blog.csdn.net/verse_monger/article/details/109290318