2016-04-11 2 views
0

8ビットのリップルキャリー加算器の機能を、すべての組み合わせを試すテストベンチでテストします。何らかの理由で、AとBの現在の値の合計が次のクロックサイクルで計算されます。なぜそれが起こっているのかわかりません。最初は遅延のためだと仮定しましたが、遅延を変更するとエラーが発生します。ここに私のコードは次のとおりです。1つのクロックサイクルで全加算器の合計をオフにする

//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 

ここでの出力例です:

enter image description here

+0

次の1ビット表現は、モジュール "Eight_adder"の8ビットポート "Carry"、インスタンス "FA"に接続しています。 – toolic

+0

なぜあなたはあなたのFAからキャリー全体を渡しますか?なぜあなたはcinとcoutの両方に同じキャリー値を使用していますか?なぜあなたは 'と(w1、b、cin);と'と(w2、cin、b);の両方をしていますか? – wilcroft

+0

@wilcroft 1Q)、なぜ私はそれをやっているのか分かりません。 2ビット)ので、私は8ビットの加算器を作るために直列に持っているときにキャリーアウトは、すべての1ビットの加算器のcarryinになるので。 3Q)それは 'and(w1、a、cin);と' and(w2、b、cin);であったはずです。私はコードを編集しました –

答えて

1

あなたは正しいサイクルで合計を計算されますが、別の時間でそれを表示しています。次のように$monitor$displayを移動:

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

私はあなたが和出力のためにのみXを取得されていません驚いています。同じ加算器のキャリーインをキャリーアウトビットでフィードバックします。 1つの加算器のキャリーアウトが別の加算器のキャリーインであるように、オフセットが存在しなければならない。お使いのディスプレイのメッセージについては

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])); 

、あなたの{co,sum}ABと同じタイムスタンプに更新されています。 Verilogスケジューラは何かを計算する機会がある前に$displayを評価しています。 $displayの前に遅延を追加するか(エラーチェックの場合と同じように)、$display$strobeに置き換えるか、ループの前に$monitorを使用してください。 (display vs strobe vs monitor in verilog?を読んでみてください)

関連する問題