2013-05-06 40 views
1

這是正在使用的紋波進位加法器,但是,當sub = 1 A = 4 B = 3時,程序沒有返回溢出,總和是1100而不是0110。我們搞亂了進位行爲嗎?如何在Verilog中創建2的補碼加法器?

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 
+0

爲什麼invB沒有負載? 'sub'是什麼意思?你想從A中減去B嗎? – Tim 2013-05-06 01:59:58

+0

啊,對不起。在原始代碼中,該行是RCL4bit RC4(A,invB,sub,sum,C1,overflow);我會編輯上面的內容。 是的,如果sub = 1,那麼我們將從A中減去B,否則它只是一個加法器。 – user2297372 2013-05-06 02:12:31

回答

1

你的溢出長期沒有意義對我來說,我會覺得溢出也只是在開展,我不知道爲什麼你帶進位[2] XOR運算它。

其他,我沒有看到任何錯誤,我不明白這可能會給1100作爲輸出,我不明白你爲什麼期望答案是0110(6)。

如果A是0100,b爲0011,比INVB是1100,再加上額外的CIN意味着B您已經有了:

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

溢出爲1,其結果是0001(4- 3 = 1)。

你有沒有試過通過波形檢查你的結果與此不同?

+0

溢出可以通過異或最後兩次執行來確定。 – ChiefTwoPencils 2015-05-06 03:17:34