2016-04-11 16 views
0

8-bitlik bir Ripple Carry Adder'ın işlevselliğini her bir kombinasyonu deneyen bir test tezgahıyla test ediyorum. Bazı nedenlerden dolayı, A ve B değerlerinin toplamı bir sonraki saat döngüsünde hesaplanır. Bunun neden olduğundan emin değilim.İlk olarak, gecikmeler yüzünden olduğunu farz ettim, ancak gecikmeleri değiştirdiğimde hata hala oluşuyor. İşteTam Toplayıcıyla Toplam Kapalı Bir Saat Döngüsü

//one_adder.v 

module One_adder(a,b,cin,sum,carry); 
    output carry,sum; 
    input a,b,cin; 
    wire w0,w1,w2; 

     xor(sum,a,b,cin); 
     and(w0,a,b); 
     and(w1,a,cin); 
     and(w2,cin,b); 
     or(carry,w0,w1,w2); 

endmodule; 


//Eight_adder.v 

module Eight_adder(A,B,S,Carry); 
    output [7:0]S, Carry; 
    input [7:0]A, B; 
    //wire [7:0]w; 
    wire overflow; 

    One_adder add0(.carry(Carry[0]), .sum(S[0]), .a(A[0]), .b(B[0]), .cin(Carry[0])); 
    One_adder add1(.carry(Carry[1]), .sum(S[1]), .a(A[1]), .b(B[1]), .cin(Carry[1])); 
    One_adder add2(.carry(Carry[2]), .sum(S[2]), .a(A[2]), .b(B[2]), .cin(Carry[2])); 
    One_adder add3(.carry(Carry[3]), .sum(S[3]), .a(A[3]), .b(B[3]), .cin(Carry[3])); 
    One_adder add4(.carry(Carry[4]), .sum(S[4]), .a(A[4]), .b(B[4]), .cin(Carry[4])); 
    One_adder add5(.carry(Carry[5]), .sum(S[5]), .a(A[5]), .b(B[5]), .cin(Carry[5])); 
    One_adder add6(.carry(Carry[6]), .sum(S[6]), .a(A[6]), .b(B[6]), .cin(Carry[6])); 
    One_adder add7(.carry(Carry[7]), .sum(S[7]), .a(A[7]), .b(B[7]), .cin(Carry[7])); 
    assign overflow= (A[7]&B[7]&~Carry[7]) | (~A[7]&~B[7]&Carry[7]); 

endmodule 


//tBench.v 
//`timescale 1 ns/ 1 ns 

module tBench; 
    wire [7:0]sum; 
    wire cin, co; 
    reg[7:0] A, B;  // the different combinations 
//module Eight_adder(A,B,Cin,S,Cout); 
Eight_adder FA(A,B,sum,co); 

initial begin 
    for(A =0; A<255; A=A+1) 
    begin 
     #10 // the period in ModelSim: 10ns 
     for(B=0; B<255; B=B+1) 
     begin 
      $display("A=%b,, B=%b,, Sum=%b,,", A,B,{co,sum}); 
     #10 
      if({co,sum} != (A+B)) 
       $display("Error: A=%b b=%b sum=%b cout=%b\n", A, B, sum, co); 
     end 
    end 
    $finish; 
end 
endmodule 

örnek bir çıktısı olan: İşte benim kodudur

enter image description here

+0

Bir derleme uyarısı alıyorum: 'Aşağıdaki 1 bitlik ifade," Eight_adder "modülünün" Aktarım "modülünün" Aktarım "bölümüne bağlanmıştır. – toolic

+0

Neden tüm geçişi FA'nızı gerçekleştirir mi? Hem cin hem de cout için neden aynı taşıma değerini kullanıyorsunuz? Neden hem "hem de (w1, b, cin)," ve "ve (w2, cin, b) 'yi yapıyorsun? – wilcroft

+0

@wilcroft 1Q), Neden bunu yaptığımı bilmiyorum. 2Q) Çünkü 8-bitlik bir toplayıcı yapmak için seri halinde olan tek bitli toplayıcılar için taşıma işlemi devam ediyor. 3Q) 've (w1, a, cin), 've' ve (w2, b, cin) olmalıydı; Kodu düzenledim –

cevap

1

Doğru döngüsünde toplamını hesaplama, ancak farklı bir zamanda bunu görüntüleniyor. izleyen bir $monitor olarak $display taşı:

initial begin 
    $monitor("A=%b,, B=%b,, Sum=%b,,", A,B,{co,sum}); 
    for(A =0; A<255; A=A+1) 
    begin 
     #10 // the period in ModelSim: 10ns 
     for(B=0; B<255; B=B+1) 
     begin 
     #10 
      if({co,sum} != (A+B)) 
       $display("Error: A=%b b=%b sum=%b cout=%b\n", A, B, sum, co); 
     end 
    end 
    $finish; 
end 
1

ben size toplamı çıkışı için sadece x'ler almıyorsanız şaşırdım. Aynı toplayıcının taşınmasına geri taşınan bit geri bildirimi var. Bir dengeleyici olması gerekir, böylece bir toplayıcının taşınması başka toplayıcının taşınmasıdır. Görünen mesajın gelince

One_adder add0(.carry(Carry[0]), .sum(S[0]), .a(A[0]), .b(B[0]), .cin(1'b0)); 
... 
One_adder add7(.carry(carryout), .sum(S[7]), .a(A[7]), .b(B[7]), .cin(Carry[7])); 

, senin {co,sum} A ve B aynı zaman damgasını içinde güncellenmektedir. Verilog zamanlayıcısı, herhangi bir şey hesaplama fırsatı olmadan önce $display'u değerlendiriyor. $display'dan önce bir hata ekleyebilir (hata denetlemenizde yaptığınız gibi), $display'u $strobe ile değiştirin veya döngüden önce $monitor'u kullanın. ( display vs strobe vs monitor in verilog? okumak isteyebilirsiniz)

İlgili konular