利用半加器设计一个16位全加器。
16位全加器由四个4位全加器构成,4位全加器由四个1位全加器构成,1位全加器由2个半加器和1个与门构成。
在顶层设计中,采用4个4位全加器构成。
在设计4位全加器时,采用4个1位全加器构成。
在设计1位全加器时,采用2个半加器和1个与门构成。
首先设计顶层模块:例化了4个4位的全加器。
module adder16(
input wire [15:0] a,
input wire [15:0] b,
input wire cin,
output wire [15:0] sum,
output wire cout
);
wire c1; //第1个4位全加器的进位输出,需要把这个值给下一个4位全加器的输入
wire c2; //第2个4位全加器的进位输出,需要把这个值给下一个4位全加器的输入
wire c3; //第3个4位全加器的进位输出,需要把这个值给下一个4位全加器的输入
adder4 adder4_inst1(
.a (a[3:0]),
.b (b[3:0]),
.cin (cin),
.sum (sum[3:0]),
.cout (c1)
);
adder4 adder4_inst2(
.a (a[7:4]),
.b (b[7:4]),
.cin (c1),
.sum (sum[7:4]),
.cout (c2)
);
adder4 adder4_inst3(
.a (a[11:8]),
.b (b[11:8]),
.cin (c2),
.sum (sum[11:8]),
.cout (c3)
);
adder4 adder4_inst4(
.a (a[15:12]),
.b (b[15:12]),
.cin (c3),
.sum (sum[15:12]),
.cout (cout)
);
endmodule
设计4位全加器模块,例化4个1位全加器:
module adder4(
input wire [3:0] a,
input wire [3:0] b,
input wire cin,
output wire [3:0] sum,
output wire cout
);
wire c1;
wire c2;
wire c3;
adder1 adder1_inst1(
.a(a[0]),
.b(b[0]),
.c(cin),
.sum(sum[0]),
.cout(c1)
);
adder1 adder1_inst2(
.a(a[1]),
.b(b[1]),
.c(c1),
.sum(sum[1]),
.cout(c2)
);
adder1 adder1_inst3(
.a(a[2]),
.b(b[2]),
.c(c2),
.sum(sum[2]),
.cout(c3)
);
adder1 adder1_inst4(
.a(a[3]),
.b(b[3]),
.c(c3),
.sum(sum[3]),
.cout(cout)
);
endmodule
接下来是设计1位全加器模块(由于这里采用半加器构成16位加法器,所以1位全加器在这里需要由半加器构成,而不是直接使 用),例化2个半加器和1个与门:
module adder1(
input wire a,
input wire b,
input wire c,
output wire sum,
output wire cout
);
wire temp;
wire c1, c2;
adder_half adder_half_inst1(
.a(a),
.b(b),
.sum(temp),
.cout(c1)
);
adder_half adder_half_inst2(
.a(temp),
.b(c),
.sum(sum),
.cout(c2)
);
or_gate or_gate_inst(
.a(c1),
.b(c2),
.y(cout)
);
endmodule
编写半加器模块和与门模块:
//半加器模块
module adder_half(
input wire a,
input wire b,
output reg sum,
output reg cout
);
always @(*)
begin
sum = a ^ b;
cout = a & b;
end
endmodule
//与门模块
module or_gate(
input wire a,
input wire b,
output reg y
);
always @(*)
y = a | b;
endmodule
大家如果需要下载上述代码,可点击链接https://download.csdn.net/download/qq_31799983/10566852进行下载,供大家参考学习使用。