如何在verilog中设计一个16位进位前瞻加法器

时间:2012-11-21 20:58:56

标签: verilog

我在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。请不要给我完整的代码。只需要一些了解。感谢

1 个答案:

答案 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个。