我在verilog中设计一个16位进位超前加法器时遇到了一些问题。我在这里有代码:
module fulladder(a, b, c, s, cout);
input a, b, c;
output s, cout;
xor #0
g1(w1, a, b),
g2(s, w1, c);
and #0
g3(w2, c, b),
g4(w3, c, a),
g5(w4, a, b);
or #0
g6(cout, w2, w3, w4);
endmodule
我了解端口的工作原理,但是我使用矢量吗?
P.S。它在结构上的verilog。请不要给我完整的代码。只需要一些了解。感谢
答案 0 :(得分:3)
我们的朋友Wikipedia has a bit about Carry Look-Ahead。这些通常以4位阶段组合在一起。 4个具有额外逻辑的fulladders来计算进位。
假设问题中指定了一个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的逻辑,wikipedia article应该告诉你需要什么。这段代码中的C1,C2,C3和C4是携带[1],携带[2],携带[3]和cout。
要创建一个16位加法器,您可以使用这4个部分中的4个。