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

私たちの友人のウィキペディアには、キャリールックアヘッドについて少し書かれています。これらは通常、4ビットの段階でまとめられます。キャリーを計算するための追加ロジックを備えた4つのフルアダー。

質問で指定されている全加算器を想定し、生成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;

キャリールックアヘッドを実装するロジックは引き続き必要です。ウィキペディアの記事で、何が必要かを説明する必要があります。これらは、このコードではC1、C2、C3、およびC4であり、carry [1]、carry [2]、carry [3]、およびcoutになります。

16ビット加算器を作成するには、これらの4ビットセクションのうち4つを使用できます。

于 2012-11-22T22:25:18.463 に答える