Das ist das Problem, das ich in meinem Fall mit meinen eigenen Nummern 00000010 lösen muss.
Hier bin ich
Basierend auf meinem Design sollte mein z-Zustand niemals hoch gehen, es sei denn, mein y-Zustand gibt 2 Tiefs, dann ein Hoch auf der 3. Uhr und dann mehr Tiefs bis zur 9. Uhr.
Basierend auf dem Ausgabecode geht mein z-Zustand jedoch unabhängig vom dritten Takt hoch.
Kann mir jemand erklären, wo ich falsch gelaufen bin, damit das passiert?
Das Zurücksetzen Ihrer Zustandsmaschine erfordert, dass Sie mindestens eine ansteigende Flanke haben, die X
niedrig ist.
Ohne das haben Ihre Q0
... Q3
Zustandsvariablen unbekannte/willkürliche Werte – das wäre offensichtlich gewesen, wenn Sie sie sich einfach angesehen hätten.
Das ist die erste Lektion beim Debuggen: Wenn die Ausgabe nicht das erwartete Ergebnis liefert, müssen Sie sich die Signale ansehen, die zur Erzeugung der Ausgabe verwendet werden. Wenn einer von ihnen nicht richtig aussieht, dann schauen Sie sich die Signale an, von denen sie abhängen, und so weiter.
Das ist aber nicht dein Hauptproblem. Ich entschuldige mich, ich hätte früher darauf eingehen sollen. In Verilog gibt es einen feinen Unterschied zwischen zwei Arten von Zuweisungen innerhalb eines initial
oder always
-Blocks. In Ihrem Code haben Sie
reg Q0, Q1, Q2, Q3;
always @(posedge clk)
begin
Q0 = ... ;
Q1 = ... ;
Q2 = ... ;
Q3 = ... ;
end
Der =
Operator heißt "Zuweisung blockieren", was bedeutet, dass die Zuweisung sofort wirksam wird, anstatt zu warten, bis alle anderen Zuweisungen ausgewertet wurden, und erst danach wirksam wird. Mit anderen Worten, wenn es an der Zeit ist, den Ausdruck für auszuwerten Q1
, wurde die Variable Q0
bereits aktualisiert, was zu einem anderen Ergebnis als erwartet führt.
Andererseits <=
wird dies als "nicht blockierende Zuweisung" bezeichnet, was bedeutet, dass alle Zuweisungen innerhalb eines Blocks parallel ausgewertet werden, bevor eine der linken Seiten aktualisiert wird. Der Wechsel zu dieser Art von Zuweisung liefert die erwarteten Ergebnisse.
reg Q0, Q1, Q2, Q3;
always @(posedge clk)
begin
Q0 <= ... ;
Q1 <= ... ;
Q2 <= ... ;
Q3 <= ... ;
end
```
Gewünscht