一位全加器与其扩展的多位加法器虽然用途广泛,但它最大的缺点是,后一位的运算需等待前一位全加器的cout端输出给该位cin,即各个一位全加器不是同时运行的,所以其计算执行延迟比较长,这个题给了一种新的解决方案: 提前给高位的全加器cin输入,低位的全加器cout连接选择器的sel位,这样高位的运算不存在延时,与低位同时进行运算(但很耗资源hh)
接下来给出代码:
module top_module(
input [31:0] a,
input [31:0] b,
output [31:0] sum
);
reg sel;
reg [15:0] sum1;
reg [15:0] sum2;
add16 add16_inst1(
.a (a[15:0]),
.b (b[15:0]),
.cin (0),
.cout (sel),
.sum (sum[15:0]),
);
add16 add16_inst2(
.a (a[31:16]),
.b (b[31:16]),
.cin (0),
.sum (sum1[15:0]),
);
add16 add16_inst3(
.a (a[31:16]),
.b (b[31:16]),
.cin (1),
.sum (sum2[15:0]),
);
always@(*)
begin
if(sel==0)
sum={sum1[15:0],sum[15:0]};
else
sum={sum2[15:0],sum[15:0]};
end
endmodule