2016-11-29 22 views
1

私はそれを学んでいる間、私はVerilogでALUを設計しています。私は、次のコードを思い付いた: テストベンチ:私は取得しています出力でそうVerilogで私のALUに苦労している

module ALUtb; 

reg clock = 1'b0; 

reg [0:7] val1; 
reg [0:7] val2; 

initial begin 
val1 = 8'b01010100; 
val2 = 8'b10101000; 

#50 $finish; 

end 
ALU piet(val1, val2,, clock); 

always begin 
    #5 clock = ~clock 
; 
end 

    endmodule 

Main code: 

// Code your design here 

    module ALU(
    a1, a2, out, clock 
    ); 

    output [0:7] out; 
    input [0:7] a1; 
    input [0:7] a2; 
    input clock; 

    wire clock; 
    reg out; 
    wire co; 
    wire a1, a2; 

    wire [0:7] poep; 

    initial begin 
    $monitor("Out=%d, co=%d, a=%d, a2=%d, poep=%d, clock=%d", out, co, a1, a2,  poep, clock); 

    end 

    always @ (posedge clock) begin 

    out <= poep; 

    end 

    adder addy(.output_byte(poep), .co(co), .a1(a1), .a2(a2), .clock(clock)); 

endmodule 

module adder(
    output_byte, co, a1, a2, clock 
); 
    initial begin 
    output_byte = 8'b00000011; 
    end 
    input [0:7] a1; 
    input [0:7] a2; 
    input clock; 

    output [0:7] output_byte; 
    output output_bit; 

    output co; 

    wire c1; 
    reg b1, b2; 
    reg [0:7] output_byte; 
    wire output_bit; 

    integer i; 

    always @ (posedge clock) begin 
    for(i = 0; i < 8; i = i + 1) begin 

     b1 = (a1[i] & (1 << i)); 
     b2 = (a2[i] & (1 << i)); 

     #1 output_byte[i] = output_bit; 
    end 
    end 

bitadder b_adder(.out(output_bit), .co(), .a1(b1), .a2(b2), .c1(c1)); 

endmodule 

// Deze module is een 1-bits adder. 
module bitadder(out, co, a1, a2, c1); 

    output out, co; 
    input a1, a2, c1; 

    wire out, co; 

    wire a1; 
    wire a2; 
    wire c1; 

    assign {co, out} = a1 + a2 + c1; 

endmodule 

Out= x, co=z, a= 84, a2=168, poep= 3, clock=0 
Out= 3, co=z, a= 84, a2=168, poep= x, clock=1 
Out= 3, co=z, a= 84, a2=168, poep= x, clock=0 
Out= x, co=z, a= 84, a2=168, poep= x, clock=1 
Out= x, co=z, a= 84, a2=168, poep= x, clock=0 
Out= x, co=z, a= 84, a2=168, poep= x, clock=1 
Out= x, co=z, a= 84, a2=168, poep= x, clock=0 
Out= x, co=z, a= 84, a2=168, poep= x, clock=1 
Out= x, co=z, a= 84, a2=168, poep= x, clock=0 
Out= x, co=z, a= 84, a2=168, poep= x, clock=1 
Out= x, co=z, a= 84, a2=168, poep= x, clock=0 

あなたはこれが唯一の8ビット加算器で見ることができるように。これでもまだ動作しないので、まだ進んでいません。 私の具体的な質問は、出力が正しく変化しない理由です。 Poepは実際の出力が出るバッファのようなものです。 coはキャリーアウトビット、aは最初の数、a2は2番目の数、c1はキャリーインビット、残りはそれ自体で話す必要があります。 出力が定義されていないのはなぜですか?

ご協力いただければ幸いです。

ありがとうございます!

+0

'#1 output_byte [i] = output_bit;'は合成できません。あなたは '加算 'に'常に 'ブロックを必要としないので、一緒にリンクされた8つの'枯れ'が必要です – Greg

答えて

0

これは、値が未定義のワイヤにクロックサイクルごとに割り当てるためです。 poepをバッファにしたい場合は、ワイヤではなくregにします。ワイヤーはデータを保持しません。