Anfänglicher oder undefinierter Wert des Flipflops

Ich modelliere digitale Schaltungen mit ICs in einer Software. Ich habe mit Flip-Flops und Theken gearbeitet, aber ich erinnere mich nicht gut daran. Wie modelliere ich einen undefinierten oder anfänglichen Wert von Flip-Flops (SR oder JK usw.)? Ich habe drei Möglichkeiten

  1. '0'-Zustand für alle nicht initialisierten Knoten
  2. Weisen Sie dem neuen Knoten den Zufallswert '0' oder '1' zu
  3. Fehlermeldung generieren und den Benutzer auffordern, das Flip-Flop zu löschen oder voreinzustellen

Betrachten Sie auch ein JK-Flip-Flop, wenn die Benutzereingabe '0' und '0' ist, ist die Ausgabe 'Q' und 'Q bar'. Welchen Wert vergebe ich in diesem Fall? '0' & '1'? Dies ist der Ausgangsfall, dh die Schaltung wurde hergestellt und die Konsole gerade eingeschaltet.

Bitte teilen Sie Ihre Erfahrungen mit.

Antworten (3)

Bei manchen Arten von Simulationen gilt: Je mehr Staaten, desto besser. Wenn Sie nur eine synchrone Einzeltaktlogik verwenden, würde ich drei Zustände vorschlagen (hoch / niedrig / undefiniert), aber die Logik des JK-Flipflops erweitern, um die vollständige Berechnung des nächsten Werts einzuschließen. Wenn man zum Beispiel eine Schaltung hat, in der sowohl die J- als auch die K-Eingänge mit dem UND des Ausgangs und einem RESET-Signal verbunden sind, sollte man anwenden, output := (J & !output) | (!K & output)damit sich der frühere Term aufhebt und übrig bleibt output := !RESET & output, dessen Wert wohldefiniert wäre wenn reset hoch ist, auch wenn outputes undefiniert ist.

Wenn Sie versuchen, eine zeitkontinuierliche Simulation durchzuführen, werden viel mehr Zustände erforderlich, einschließlich "steigend", "fallend", "stabil unbekannt", "instabil unbekannt" usw. mit einigen komplizierten Wahrheitstabellen, die von den vorherigen Zuständen abhängen der Eingänge sowie die aktuellen Zustände (z. B. 'steigend:hoch & steigend:hoch == steigend', aber 'steigend:hoch & hoch:fallend' == 'instabil unbekannt'), da das erste Signal dies möglicherweise getan hat oder nicht schnell genug hoch geworden, um einen hohen Impuls am Ausgang zu erzeugen.

Wow, du hast gerade zum Nachdenken angeregt. Ich beabsichtige sowohl die kontinuierliche Zeitsimulation als auch die Einzelzeit (früher in Form einer Wahrheitstabelle, später als interaktiver Kippschaltereingang).
@VinayakGarg: Zeitkontinuierliche digitale Simulation wirft einige knifflige Probleme auf. Viele Simulationen gehen einfach davon aus, dass der Ausgang eines Gatters zu einem bestimmten Zeitpunkt umschaltet, nachdem der Eingang umgeschaltet hat; In gewisser Weise würde ein nützlicheres Modell die Ausgabe nach der minimalen Ausbreitungsverzögerung "undefiniert" werden lassen und dann nach der maximalen Verzögerung auf den richtigen Wert umschalten. Obwohl ein solches Modell den Vorteil hat, dass eine Schaltung, deren Simulationsverhalten dem gewünschten entspricht, mit ziemlicher Sicherheit funktioniert, gibt es viele Designs, die in der Praxis funktionieren würden ...
@VinayakGarg: ...aber würden in der Simulation einfach alle Knoten "undefiniert" erscheinen. Das Modell nützlich zu machen und gleichzeitig das „Worst-Case“-Verhalten zu erfassen, ist etwas schwierig und erfordert das Hinzufügen vieler zusätzlicher Zustände.

Es gibt im Allgemeinen zwei Ansätze, die Simulatoren für so etwas verwenden können:

1) Zuweisung oder Unterstützung bei der Zuweisung eines Anfangszustands

2) Simulieren Sie mit 3 (oder mehr) Zustandslogik, von denen eine "undefiniert" ist - und lassen Sie die undefinierte Eingabe durch alle abhängigen Logiken ausbreiten, die undefinierte Ausgaben erzeugen. Dies ist ein recht üblicher Ansatz - bauen Sie eine Zustandsmaschine in Verilog, geben Sie eine Anweisung ein, damit der Simulator die Zustandsvariable druckt, und sehen Sie, dass "x" angezeigt wird, bis alles definiert ist, was in diesen Wert einfließt. (Im Falle Ihres Q und /Q wären beide undefiniert)

+1 Ich habe VHDL verwendet, vielleicht kann es meine Fragen beantworten.
Als Benutzer solcher Simulationen bevorzuge ich 2. Habe „unbekannt“ als dritten Zustand und lasse ihn gemäß den offensichtlichen Regeln 0 + u = u + u = u, 1 propagieren (und in einigen seltenen Fällen erzeugen). * u = u * u = u.

Ich würde mit dem Raise einen Fehler machen und die Simulation verweigern.

Einen schwebenden Eingang zu haben ist nie eine gute Idee.

+1 Das ist der bevorzugte Weg, aber kann es eine Situation geben, in der ein Benutzer keinen Ausweg hat?
Natürlich sollten Sie alle potentialfreien Eingänge erden. Sogar auf Teile des Chips, die nicht verwendet werden.
Bitte sprechen Sie mein weiteres wichtiges Anliegen an, ich habe meine Frage aktualisiert.
Warum nicht experimentell herausfinden? Schnappen Sie sich einen JK-Chip, stecken Sie ihn in ein Steckbrett, erden Sie die Eingänge, schalten Sie ihn ein und sehen Sie, was die Ausgänge sind?
@Majenko: es ist nicht spezifiziert. Selbst wenn er es experimentell herausfindet, gibt es keine Garantie dafür, dass es das immer tun wird. (Außerdem, über welche "floating input" sprechen wir?)
Undefinierte Eingaben sind undefiniert, wenn Sie sie nicht definieren.
Unbenutzte Eingänge müssen manchmal hochgezogen und nicht geerdet werden. zum Beispiel unbenutzte Active-Low-Interrupt-Pins.
@Majenko: Leider steht mir im Moment weder ein IC noch ein Steckbrett zur Verfügung :( Vielleicht erstelle ich deshalb diese Software :D
@Majenko Was passiert, wenn Sie den FF 1 uS nach dem Start der Simulation initialisieren möchten? Das ist eine völlig gültige Sache im wirklichen Leben (tm). Die Simulation sollte sich nicht weigern zu laufen. Stattdessen sollte es beachten, dass sich das FF in einem undefinierten Zustand befindet, aber ansonsten simulieren.