张家界企业网站制作,百度员工收入工资表,wordpress更新下固定链接,wordpress全站网易云音乐播放一、Wallace树乘法器
Wallace树乘法器就是将多个部分积进行分组#xff0c;每三个一组#xff0c;最后如果剩下的部分积个数不够三个的不做处理#xff0c;然后将各组的部分积进行相加得到和以及进位信息#xff0c;直到最终只剩下两行部分积#xff0c;相加后得到最终结… 一、Wallace树乘法器
Wallace树乘法器就是将多个部分积进行分组每三个一组最后如果剩下的部分积个数不够三个的不做处理然后将各组的部分积进行相加得到和以及进位信息直到最终只剩下两行部分积相加后得到最终结果。
以下面的例子进行说明
a8hA7b8hD9
①首先列出所有的部分积然后按照三个三个进行分组如图中相同颜色的为一组但是最后黄色的两个由于不够则不进行运算然后对一组内的三行部分积进行运算得到的和留在本位得到的进位填充到前一列的最后一行详见下图2
图1
图2
在上图中我们以红色部分的进行举例三行的运算结果最终为两行第一行为和第二行为进位。
第一行红色背景的最后一列只有1因此本位和为1没有进位因此填充到前一列最后一行的为0 倒数第二列有两个1因此本位和为0进位为1填充到它的前一列的最后一行后面同理详见下图
图3
图中蓝色箭头表示和的填充黄色虚线箭头表示进位的填充需要注意的是在此次计算中新产生的进位不参与运算只填充到对应位置。
②将上述得到的结果再次分组如图5
图4
图5
③再次按照上述步骤计算得到图6再分组得到图7
图6
图7
④计算得到结果然后再分组如图9
图8
图9
⑤得到最后结果只剩两行直接相加得到最终结果
二、Verilog实现
wallace_tree模块如下
module wallace_tree(input [3:0] a,input [3:0] b,input data_valid,output [7:0] sum);reg [7:0]temp[3:0];
reg [7:0]temp_reg[3:0];
integer i;
integer j;
always(*)
beginif(data_valid)for(i0;i3;ii1)begintemp[i]8b0;temp_reg[i]8b0;for(j0;j3;jj1)begintemp[i][j](a[j]b[i]);endendtemp_reg[0]temp[0];temp_reg[1]temp[1]1;temp_reg[2]temp[2]2;temp_reg[3]temp[3]3;
endwire [7:0]cin_1;
wire [7:0]sum_1;
wire [7:0]cin_2;
wire [7:0]sum_2;full_add inst_full_add (.a(temp_reg[0]), .b(temp_reg[1]), .c(temp_reg[2]), .cin(cin_1), .sum(sum_1));full_add inst_full_add1 (.a(sum_1), .b(cin_1), .c(temp_reg[3]), .cin(cin_2), .sum(sum_2));assign sumcin_2sum_2;endmodulefull_add模块如下
module full_add(input [7:0]a,input [7:0]b,input [7:0]c,output [7:0]cin,output [7:0]sum);
reg [7:0]cin0;
reg [7:0]sum0;
integer i;
always(*)
beginfor(i0;i7;ii1)beginsum[i]a[i]^b[i]^c[i];cin[i1](a[i]b[i])|((a[i]|b[i])c[i]);end
endendmodule仿真tb如下
module tb_top();
reg [3:0]a;
reg [3:0]b;
wire [7:0]sum;
reg data_valid;initial begina0;b0;data_valid0;#100a4b0011;b4b1010;data_valid1;#100a0;b0;data_valid0;#100a4b1111;b4b1111;data_valid1;#100a0;b0;data_valid0;#100a4b1100;b4b1100;data_valid1;#100a0;b0;data_valid0;
endwallace_tree inst_multiplication (.a(a), .b(b), .data_valid(data_valid), .sum(sum));endmodule仿真结果如下
综合结果如下