第一种实现:使用选择器再移位。
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
我们发现这是一个顺序执行的,效率低下。我们在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提高了。所以括号运用得好就可以是顺序边并行。
第二种方法:
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
综合出来后:(用了循环综合出来的就是神逻辑了,用的资源也多了很多)