Carry select adder
module top_module(
input [31:0] a,
input [31:0] b,
output [31:0] sum
);
wire [15:0] sum_1;
wire [15:0] sum_2;
wire [15:0] sum_3;
wire cout_1;
wire cout_2;
//低16位计算
add16 add16_inst1(
.a(a[15:0]),
.b(b[15:0]),
.cin(0),
.cout(cout_1),
.sum(sum_1)
);
//高16位计算
add16 add16_inst2(
.a(a[31:16]),
.b(b[31:16]),
.cin(0),
.cout(cout_2),
.sum(sum_2)
);
add16 add16_inst3(
.a(a[31:16]),
.b(b[31:16]),
.cin(1),
.cout(),
.sum(sum_3)
);
//2到1多路复用器的两种写法如下,选择一种即可
always @(*) begin
case(cout_1)
1'b0:sum = {sum_2,sum_1};
1'b1:sum = {sum_3,sum_1};
endcase
end
/*
// 使用2-to-1多路复用器选择正确的结果
assign sum = {cout_1 ? sum_3 : sum_2, sum_1};*/
endmodule