我们的朋友Wikipedia 有一点关于 Carry Look-Ahead 的内容。这些通常以 4 位阶段组合在一起。4 个全加法器,带有额外的逻辑来计算进位。
假设问题中指定了一个 fulladder,加上生成g
和传播p
输出,一个 4 位块可能看起来像:
module four_bit_carry_lookahead (
input [3:0] a,
input [3:0] b,
input c, //Carry in
output [3:0] s, //Sum
output cout //Carry
);
wire [3:1] carry; // 3:1 to align numbers with wikipedia article
wire [3:0] p;
wire [3:0] g;
fulladder add0(.a(a[0]), .b(b[0]), .c(c), .s(s[0]), .cout() .g(g[0]), .p([0]) );
fulladder add1(.a(a[1]), .b(b[1]), .c(carry[1]), .s(s[1]), .cout() .g(g[1]), .p([1]) );
fulladder add2(.a(a[2]), .b(b[2]), .c(carry[2]), .s(s[2]), .cout() .g(g[2]), .p([2]) );
fulladder add3(.a(a[3]), .b(b[3]), .c(carry[3]), .s(s[3]), .cout() .g(g[3]), .p([3]) );
carry_lookahead(
.p (p ), //input [3:0]
.g (g ), //input [3:0]
.c (carry), //output [3:1]
.cout (cout ) //output
);
endmodule
所需的附加输出是g = a & b;
p = a | b;
.
仍然需要实现 carry_lookahead 的逻辑,维基百科文章应该告诉你需要什么。在这段代码中,它们是 C1、C2、C3 和 C4,分别是进位 [1]、进位 [2]、进位 [3] 和 cout。
要创建 16 位加法器,您可以使用这 4 位部分中的 4 个。