Ich habe mich immer gefragt, was die richtige Lösung für das D-Flip-Flop ist, wenn sich der Eingang direkt an der steigenden Flanke des Takts ändert? Ich habe zwei Lösungen davon online gefunden, habe aber keine Ahnung, welche die richtige ist.
oder
Ich denke, die richtige Antwort sollte Bild 1 (oben) sein, wo der Ausgang q bei der nächsten steigenden Taktflanke erscheint. Dies ist, was Flip-Flop tun sollte, dh eine Verzögerung von einem Zyklus erzeugen.
Aber ich bekomme immer Bild 2 (unteres Bild), wenn ich meinen Verilog-Code ausführe. Mein Code ist:
module beh(q,d,en,clk);
input q,clk,en;
output d;
reg d;
always@(posedge clk)
begin
if(en==1)
d<=q;
end
endmodule
Was mache ich falsch?
Das erste ist im Allgemeinen , wie es aussehen soll, da der Ausgangspegel NACH der aktiven Taktflanke den Eingangspegel VOR der aktiven Taktflanke widerspiegeln sollte. Wenn der Eingangsübergang jedoch auf die aktive Taktflanke fällt, ist dies mehrdeutig, da es sich technisch gesehen um eine Verletzung der Setup-and-Hold-Zeit handelt. In diesem Fall bestimmt der Unterschied zwischen der Verwendung von <= und = in Ihrer Testbench, ob Sie #1 oder #2 erhalten. Dies liegt an der Funktionsweise von Delta-Zyklen. Wenn Sie = in der Testbench verwenden, wird der neue Wert sofort zu Beginn des Zyklus am Eingang des Flipflops gespiegelt und Sie erhalten #2. Wenn Sie jedoch <= verwenden, wird der neue Wert am Ende des Aktualisierungszyklus widergespiegelt und Sie erhalten #1.
Ich habe mehrere verschiedene Testbench-Iterationen durchlaufen, um die effektivste zu finden. Zuerst habe ich = in der Testbench für den Taktgenerator und für die Testbench-Logik verwendet und die Testbench-Logik lief auf der fallenden statt auf der steigenden Flanke. Dadurch wurden die Spuren im Simulator etwas offensichtlicher (auf halbem Weg zwischen Nr. 1 und Nr. 2), jedoch stieß ich auf einige Zeitprobleme, als ich versuchte, eine tiefere Interaktion zwischen der Testbench und dem DUT zu erreichen. Am Ende bin ich dazu übergegangen, = im Taktgenerator und <= in der Testbench zu verwenden und die Testbench auf die Verwendung der steigenden Flanke der Uhr umzustellen. Dies sah am Ende wie Ihre Nr. 1 aus und löste die Interaktionsprobleme, die ich hatte. Jetzt verwende ich das Python-basierte MyHDL für den funktionalen Teil der Testbench mit einem Verilog-Wrapper für das DUT, aber das ist eine ganz andere Geschichte.
Das Photon
alex.forencich
MarkU
post-synthesis model
des idealenbehavioral
Modells ausführen, sollten Sie die richtige Wellenform sehen (Q-Ausgang um einen Taktzyklus verzögert).Das Photon
Neugierig
Superkatze