数字电路设计之有符号乘法的两种实现

第一种实现:使用选择器再移位。

module signed_multi(a,b,result);//in this module,you can find that you can initial the value of wire
	input   [7:0]  a,b;
	output  [15:0] result;
	wire    [7:0]  a,b;
	wire    [15:0] result;
	wire    [7:0]  ab0 = a[0]?b:8'b0;
	wire    [7:0]  ab1 = a[1]?b:8'b0;
	wire    [7:0]  ab2 = a[2]?b:8'b0;
	wire    [7:0]  ab3 = a[3]?b:8'b0;
	wire    [7:0]  ab4 = a[4]?b:8'b0;
	wire    [7:0]  ab5 = a[5]?b:8'b0;
	wire    [7:0]  ab6 = a[6]?b:8'b0;
	wire    [7:0]  ab7 = a[7]?b:8'b0;
	assign      result = {8'b1,~ab0[7],ab0[6:0]}     + {7'b0,~ab1[7],ab1[6:0],1'b0} + {6'b0,~ab2[7],ab2[6:0],2'b0} + {5'b0,~ab3[7],ab3[6:0],3'b0}
	                   + {4'b0,~ab4[7],ab4[6:0],4'b0}+ {3'b0,~ab5[7],ab5[6:0],5'b0} + {2'b0,~ab6[7],ab6[6:0],6'b0} + {1'b1,~ab7[7],ab7[6:0],7'b0};
endmodule

数字电路设计之有符号乘法的两种实现_第1张图片

          我们发现这是一个顺序执行的,效率低下。我们在assign那里每一个加一个括号,适当使用括号可以是顺序执行变成并行。

module signed_multi(a,b,result);//in this module,you can find that you can initial the value of wire
	input   [7:0]  a,b;
	output  [15:0] result;
	wire    [7:0]  a,b;
	wire    [15:0] result;
	wire    [7:0]  ab0 = a[0]?b:8'b0;
	wire    [7:0]  ab1 = a[1]?b:8'b0;
	wire    [7:0]  ab2 = a[2]?b:8'b0;
	wire    [7:0]  ab3 = a[3]?b:8'b0;
	wire    [7:0]  ab4 = a[4]?b:8'b0;
	wire    [7:0]  ab5 = a[5]?b:8'b0;
	wire    [7:0]  ab6 = a[6]?b:8'b0;
	wire    [7:0]  ab7 = a[7]?b:8'b0;
	assign      result = (((({8'b1,~ab0[7],ab0[6:0]}     + {7'b0,~ab1[7],ab1[6:0],1'b0}) + ({6'b0,~ab2[7],ab2[6:0],2'b0}  +  {5'b0,~ab3[7],ab3[6:0],3'b0}))
	                   +  (({4'b0,~ab4[7],ab4[6:0],4'b0} + {3'b0,~ab5[7],ab5[6:0],5'b0}) + ({2'b0,~ab6[7],ab6[6:0],6'b0} + {1'b1,~ab7[7],ab7[6:0],7'b0}))));
endmodule

综合结果:我们可以看到加法器还是7个,资源几乎没变,但是performance提高了。所以括号运用得好就可以是顺序边并行。
数字电路设计之有符号乘法的两种实现_第2张图片

第二种方法:

module signed_multi2(a,b,result);
	input   [7:0]  a,b;
	output  [15:0] result;
	wire    [7:0]  a,b;
	wire    [15:0] result;
	reg     [7:0]  ab[7:0];
	integer i,j;
	always @(*) begin
		for(i = 0;i < 7;i = i + 1)
			for(j = 0;j < 7;j = j + 1)
				ab[i][j] = a[i]&b[j];
		for(i = 0;i < 6;i = i + 1)
				ab[7][i] = ~ab[7][i];
		for(j = 0;j < 6;j = j + 1)
				ab[j][7] = ~ab[j][7];
	end
	assign result = (((({8'b1,ab[0]}      + {7'b0,ab[1],1'b0}) + ({6'b0,ab[2],2'b0}  +  {5'b0,ab[3],3'b0}))
	                 +(({4'b0,ab[4],4'b0} + {3'b0,ab[5],5'b0}) + ({2'b0,ab[6],6'b0}  +  {1'b1,ab[7],7'b0}))));
endmodule
综合出来后:(用了循环综合出来的就是神逻辑了,用的资源也多了很多)

数字电路设计之有符号乘法的两种实现_第3张图片


你可能感兴趣的:(Digital,Chip,Design)