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