Adder 1

/*
代码中,注意定义的位宽,我们需要实现的是两个16位加法器的实例化来实现一个32位的加法器,
在定义变量的时候注意变量的位宽位16位宽,在连接实例化的16位加法器时,连接的参数应注意区分低16位和高16位进行加法操作

Q&A
输出sum时使用将sum_1和sum_2拼接的方式进行输出?
因为如果直接将sum_1和sum_2相加(如sum_1 + sum_2),这将导致错误的结果。因为sum_1和sum_2分别代表不同位宽的结果,直接相加会丢失高位信息。
假设:
a = 4'b0111(二进制表示的7)
b = 4'b0101(二进制表示的5)
加法过程如下:
  0111
+ 0101
------
  1100
结果是4'b1100(二进制表示的12)。其中有进位的概念也就是将第一个加法器中cout(Carry-Out,进位输出)连接到第二个加法器中cin(Carry-In,进位输入)
实现进位
*/
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 cout_1;

    add16 add16_inst1(
        .a(a[15:0]),
        .b(b[15:0]),
        .cin(0),
        .sum(sum_1),
        .cout(cout_1)
    );
    add16 add16_inst2(
        .a(a[31:16]),
        .b(b[31:16]),
        .cin(cout_1),
        .sum(sum_2),
        .cout()
    );
    assign sum = {sum_2,sum_1};
endmodule