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