Designhilfe getaktete synchrone Zustandsmaschine

Das ist das Problem, das ich in meinem Fall mit meinen eigenen Nummern 00000010 lösen muss.

Problem

Hier bin ich

Übergangstabelle

Übergangstabelle

Kmaps

Kmaps

Kmaps

Code eingeben

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.

Entworfene Ausgabe

Basierend auf dem Ausgabecode geht mein z-Zustand jedoch unabhängig vom dritten Takt hoch.

Tatsächliche Ausgabe

Kann mir jemand erklären, wo ich falsch gelaufen bin, damit das passiert?

Hallo, ja, bei steigender Flanke abgetastet.

Antworten (1)

Das Zurücksetzen Ihrer Zustandsmaschine erfordert, dass Sie mindestens eine ansteigende Flanke haben, die Xniedrig ist.

Ohne das haben Ihre Q0... Q3Zustandsvariablen 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 initialoder 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 Q0bereits 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
```
Hallo Dave, danke, dass du dich bei mir gemeldet hast. Ich glaube nicht, dass dies die Lösung ist, oder ich vermisse, was Sie mir sagen wollen, siehe Bearbeiten meines Beitrags.
Was ich sagen will, ist, schauen Sie sich die Signale in Ihrer Zustandsmaschine an . Es hat keinen Sinn zu raten, ob Sie sie direkt beobachten können.
Ok, Dave hat immer noch das Gespräch mit mir verloren, als wäre ich 5. Signale in meiner Zustandsmaschine, welches? Was beobachte ich? Für den Kontext zu meiner Bearbeitung. Ich stelle meine X- und Y-Werte manuell ein.
Sie haben eine Zustandsmaschine mit vier internen Zustandsvariablen Q0, Q1, Q2 und Q3 entworfen. Sie haben Gleichungen geschrieben, die ihr Verhalten für verschiedene Eingangskombinationen definieren, und Ihr Ausgangssignal hängt von ihren Werten ab. Sie müssen diese vier Signale in Ihr Simulatorausgabefenster einfügen, damit Sie sehen können, ob sie sich Zyklus für Zyklus so verhalten, wie Sie es erwarten.
Hallo Dave, ich habe gerade meinen Beitrag mit der Ausgabe mit den angezeigten Q-Zuständen erneut bearbeitet. Aus meiner Sicht sieht es so aus, als ob mein erster Taktzyklus mit all meinen Zuständen, die hoch gehen, falsch erscheint???
Also sehen sie für dich richtig aus? Sollten sie alle nach der zweiten Taktflanke hoch gehen? Es scheint, als wäre dies ein wichtiger Hinweis. Welchen Simulator verwendest du überhaupt?
Sehen Sie nicht richtig aus, ich würde eine Art von dieser dann diese Art von Logik erwarten. (das ist mir neu) quartus II Simulation Waveform Editor (altera???)
Siehe Bearbeiten oben. Ich musste die Simulation selbst ausführen, bevor ich erkannte, was das Problem ist.
Das scheint mein Problem gelöst zu haben, danke Dave. Schätzen Sie die Hilfe und die Erklärung.