Adder 2

//这里实例化两个16位加法器实现32位加法器,代码和上一条代码相同
module top_module (
    input [31:0] a,
    input [31:0] b,
    output [31:0] sum
);//
wire [15:0] sum_1;  // 低16位的结果
    wire [15:0] sum_2;  // 高16位的结果
    wire cout_1;         // 低16位加法的进位输出

    // 实例化第一个add16模块,计算低16位
    add16 add16_inst1 (
        .a(a[15:0]),
        .b(b[15:0]),
        .cin(0),         // 假设进位输入为0
        .sum(sum_1),
        .cout(cout_1)
    );

    // 实例化第二个add16模块,计算高16位
    add16 add16_inst2 (
        .a(a[31:16]),
        .b(b[31:16]),
        .cin(cout_1),    // 低16位加法的进位输出作为高16位加法的进位输入
        .sum(sum_2),
        .cout()          // 忽略高16位加法的进位输出
    );

    // 组合低16位和高16位的结果
    assign sum = {sum_2, sum_1};
endmodule

// 动手实际编写一个加法器
/*
解释XOR(异或门):符号为“^”,如果两个值不相同,则异或结果为1;如果两个值相同,则异或结果为0
计算和的例子:假设a = 1,b = 1,cin = 0,计算和:sum=1⊕1⊕0=0,在一位加法器输出的就是0。


计算进位的例子:
进位输出cout表示三个输入位相加是否产生了进位。进位可以通过AND和OR运算来计算。具体来说:
如果a和b都为1,会产生进位。
如果b和cin都为1,会产生进位。
如果a和cin都为1,会产生进位。
假设:
a = 1
b = 1
cin = 0
计算进位:
cout=(1&1)|(1&0)|(1&0)=1

总结:
计算过程如下:
和(Sum):
assign sum = a ^ b ^ cin;
sum = 1 ^ 1 ^ 1 = 1;

进位(Carry-Out):
assign cout = (a & b) | (b & cin) | (a & cin);
cout = (1 & 1) | (1 & 1) | (1 & 1) = 1 | 1 | 1 = 1;
因此,输出为:
sum = 1
cout = 1
*/
module add1 (
    input a,       // 输入a
    input b,       // 输入b
    input cin,     // 进位输入
    output sum,    // 和
    output cout    // 进位输出
);
    // 计算和
    assign sum = a ^ b ^ cin;  // XOR运算用于计算和
    // 计算进位
    assign cout = (a & b) | (b & cin) | (a & cin);  // OR运算用于计算进位

endmodule