2017-09-04 2 views
0
module subtractor(out,x,y); 
    output [31:0]out; 
    input [31:0]x,y; 
    wire c_out,c_dummy; 
    wire [31:0]sum1,sum2,sum3,y_c; 
    reg c_in; 

    ones_complement oc0(y_c,y); 
    thirtytwo_bit_fa thirtytwo_fa0(c_out,sum1,c_in,x,y_c); 
    thirtytwo_bit_fa thirtytwo_fa1(c_dummy,sum2,c_in,sum1,c_out); 
    thirtytwo_bit_fa thirtytwo_fa2(c_dummy,sum3,c_in,sum2,{32{~c_out}}); 

    initial 
    begin 
     #1 c_in=0; 
     $display("%b",c_out); 
    end 

    assign out=c_out?sum1:-sum1; 
endmodule 

Also schrieb ich diese einfache 32-Bit-Subtrahierer module..The Problem ist, dass der Ausgang des C_OUT immer ‚x‘ zu sein, erweist sich und damit die gesamte outputis ‚xxxxxxxx ...‘ .. Was mache ich falsch? Hinweis: Alle Module funktionieren einwandfrei, genau wie die Ergänzung und die Volladdierer ... funktioniert gut.Verilog Uknowns

+1

wenn 'thirtytwo_bit_fa' bekannt ist, funktioniert dann meine Vermutung ist' $ display' wird zu bald ausgegeben. Fügen Sie eine '# 1 'davor hinzu oder ändern Sie sie in' $ strobe' und lassen Sie uns wissen, ob das irgendetwas geändert hat. – Greg

+1

woher wissen Sie, dass separate Module funktionierten. Dies ist ein seltsames Modell alle zusammen. Es gibt weder Uhr noch Reset. Alle Werte werden von Verilog auf "x" initialisiert, sodass Ihr Modul sie nicht aktualisiert. Was ist es auf jeden Fall? – Serge

+0

Alle Werte werden beim Start standardmäßig "x" sein. Sie können den "Bit" -Datentyp verwenden, um ihn beim Start "0" zu machen. Aber im Idealfall sollte das nicht verwendet werden, und Sie sollten eine Reset-Bedingung haben, um Ihr System zu starten. –

Antwort

1

Sie überprüfen einen Ausgang, während Sie gleichzeitig ein Eingangssignal ändern. Schalten Sie die Zuordnung von c_in und der Verzögerung um. Ich nehme an, dass Sie meinen, dass c_in einen Wert hat, wenn das System startet.

initial 
    begin 
    c_in=0; 
    #1; 
    $display("%b",c_out); 
    end 

Seien Sie vorsichtig, wenn Sie Eingaben optimieren und Ausgänge überprüfen. Wenn Sie den Wert eines Signals ändern, müssen Sie warten, bis sich die Änderung durch den Rest des Systems ausbreitet, bevor Sie die Ausgaben überprüfen.

Da es jedoch scheint, dass c_in nur in diesem System als Konstante verwendet wird, schlage ich vor, dass Sie in loc_param oder einen konstanten Wert in c_in an Stelle suchen. Zum Beispiel:

localparam c_in_zero = 1'b0; 

thirtytwo_bit_fa thirtytwo_fa0(c_out,sum1,c_in_zero,x,y_c);