3

我在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

我了解端口的工作原理,但我是否使用向量?

ps它在结构verilog中。请不要给我完整的代码。只是需要一些了解。谢谢

4

1 回答 1

3

我们的朋友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 个。

于 2012-11-22T22:25:18.463 回答