1

これは使用されているリップル キャリー加算器ですが、sub = 1 A = 4 B = 3 の場合、プログラムはオーバーフローを返さず、合計は 0110 ではなく 1100 になります。

module fullAdder(A, B, Cin, sum, Cout);
    input A, B, Cin;
    output sum, Cout;
    assign sum = A^B^Cin;
    assign Cout = (Cin&A) | (Cin&B) |(A&B);
endmodule


module RCA4bit(A, B, C0, sum, C1, overflow);
    input [3:0] A;
    input [3:0] B;
    output [3:0] sum;
    input C0;
    output C1;
    output overflow;
     wire [2:0] carry;
     fullAdder RCA1(A[0], B[0], C0, sum[0], carry[0]);
     fullAdder RCA2(A[1], B[1], carry[0], sum[1], carry[1]);
     fullAdder RCA3(A[2], B[2], carry[1], sum[2], carry[2]);
     fullAdder RCA4(A[3], B[3], carry[2], sum[3], C1);
     assign overflow = C1 ^ carry[2];
endmodule

module RCA4bit2cmp(A, B, sub, sum, C1, overflow);
   input [3:0] A;
   input [3:0] B;
   output [3:0] sum;
   input sub;
   output C1;
   output overflow;

    wire [3:0]invB;
    assign invB = sub?~B:B;

    RCL4bit RC4(A, invB, sub, sum, C1, overflow);

endmodule
4

1 に答える 1

1

あなたのオーバーフローという用語は私には意味がありません。

それ以外は何も間違っていないと思いますが、それが出力として 1100 を与える方法がわかりません。また、答えが 0110 (6) であると期待する理由もわかりません。

A が 0100 で、b が 0011 の場合、invB は 1100 で、さらに Cin を追加すると、B は次のようになります。

  0100   (A)
  1100   (invB)
+ 0001   (Cin)
_________
 10001  

オーバーフローは 1 で、結果は 0001 (4-3 = 1) です。

波形を介して調査して、結果がこれからどこから逸脱しているかを確認してみましたか?

于 2013-05-06T03:25:57.110 に答える