2016-03-22 2 views
0

Ich bin Codierung, die den Wert von 'd' in 'z' setzen, wann immer 'clk' in '1' geändert wird.Wertänderungen basierend auf clk funktioniert nicht für Zufallszahlen

Zum Beispiel

clk=0 d=  15, z=   x 
clk=1 d=  20, z=  20 
clk=0 d=  25, z=  20 
clk=1 d=  30, z=  30 

es ausdrückte Wert von 'd' in 'z', wenn clk '1' ist.

Also unten ist Code, der es für 20 mal für Zufallszahlen wiederholt.

module lab9; 
reg [31:0] d; 
reg clk, enable, flag; 
wire [31:0] z; 
reg [31:0] e; 
register #(32) mine(z, d, clk, enable); 

always begin 
#5 clk = ~clk; 

end 

initial 
#1 $monitor("%5d: clk=%b,d=%d,z=%d,expect=%d", $time,clk,d,z, e); 

initial begin 
clk=0; 
flag = $value$plusargs("enable=%b", enable); 

repeat (20) begin 
#2 d = $random; 
end 
$finish; 

end 

endmodule 

Und die Ausgabe erhalte ich:

1: clk=0,d=   x,z=   x,expect=   x 
    2: clk=0,d= 303379748,z=   x,expect=   x 
    4: clk=0,d=3230228097,z=   x,expect=   x 
    5: clk=1,d=3230228097,z=3230228097,expect=   x 
    6: clk=1,d=2223298057,z=3230228097,expect=   x 
    8: clk=1,d=2985317987,z=3230228097,expect=   x 
    10: clk=0,d= 112818957,z=3230228097,expect=   x 
    12: clk=0,d=1189058957,z=3230228097,expect=   x 
    14: clk=0,d=2999092325,z=3230228097,expect=   x 
    15: clk=1,d=2999092325,z=2999092325,expect=   x 
    16: clk=1,d=2302104082,z=2999092325,expect=   x 
    18: clk=1,d= 15983361,z=2999092325,expect=   x 
    20: clk=0,d= 114806029,z=2999092325,expect=   x 
    22: clk=0,d= 992211318,z=2999092325,expect=   x 
    24: clk=0,d= 512609597,z=2999092325,expect=   x 
    25: clk=1,d= 512609597,z= 512609597,expect=   x 
    26: clk=1,d=1993627629,z= 512609597,expect=   x 
    28: clk=1,d=1177417612,z= 512609597,expect=   x 
    30: clk=0,d=2097015289,z= 512609597,expect=   x 
    32: clk=0,d=3812041926,z= 512609597,expect=   x 
    34: clk=0,d=3807872197,z= 512609597,expect=   x 
    35: clk=1,d=3807872197,z=3807872197,expect=   x 
    36: clk=1,d=3574846122,z=3807872197,expect=   x 
    38: clk=1,d=1924134885,z=3807872197,expect=   x 
    40: clk=0,d=3151131255,z=3807872197,expect=   x 

On Line 6 dieser Ausgabe ‚2223298057‘ sein müssen, aber nach wie vor Wert der vorherigen ‚z‘, obwohl seine clk auf 1 gesetzt ist ".

Wie kann ich das beheben?

+0

Was ist 'register'? – toolic

+0

@toolic Ich habe diese Datei nicht, aber sie kompiliert und läuft. –

+0

Der Punkt ist, dass Ihr Problem im Register ist. Ich nehme an, z ist eine Ausgabe von Register, weil nichts anderes in Ihrem Code z z. – toolic

Antwort

1

Aus dem Verhalten der Ausgänge erscheinen würden Sie haben vorgestellt, dass

register #(32) mine(z, d, clk, enable); 

ist ein Satz von 32 D-Flip-Flops, die ihren Namen gegeben und die Namen der Signale, die Sie auch verbunden haben scheint der Fall zu sein. Es wäre einfacher gewesen, Ihre Frage zu beantworten, wenn Sie den Code für register angegeben hätten.

Also, wenn register ist in der Tat eine Reihe von 32 D-Flip-Flops, würden Sie nicht z erwarten zu Zeit ändern 6. Das ist nicht, wie jede Art von Flip-Flop verhält: der Ausgang eines Flip- Flop ändert sich nur an einer (steigenden oder fallenden) Flanke einer Uhr.

Angesichts dieser D-Typ Flip-Flops waren vorhanden, bevor Sie diese Übung begann, es scheint, dass Sie d viel zu schnell ändern. Sie sollten es einmal pro Takt ändern (clk) Zyklus, dh einmal alle #10. Mit anderen Worten versuchen, chaninging

#2 d = $random; 

zu

#10 d = $random; 
+0

stangely Ich habe keinen Quellcode für die Registrierung. (Ich habe keine Datei namens register.v im gleichen Ordner dieses Quellcodes, auch, auch außerhalb) Es kompiliert nur s und läuft, auch wenn die Ausgabe nicht die ist, die ich wollte. –

+0

@ online.0227 Was ist der vollständige Befehl, den Sie verwenden, um Ihre Simulation zu kompilieren und auszuführen? Wenn Sie es von einer GUI aus steuern, könnte der Befehl das erste in der Simulatorausgabe sein. –

+0

iverilog -o-Schaltung lab9_part2.v && vvp circuit + enable = 1 –

1

Ihr Register funktioniert bereits korrekt. Register sind flankengetriggert; Es gibt keine Uhr Kante zwischen den Zeitschritten 5 und 6, so dass der Wert z nicht aktualisiert wird.

Wenn Sie wollen z kontinuierlich aktualisiert werden, solange die Uhr hoch ist, möchten Sie eine Latch, kein Register. Seien Sie jedoch gewarnt, dass die Timing-Analyse in Designs, die Latches enthalten, viel schwieriger ist und daher normalerweise vermieden werden sollte.

Verwandte Themen