Buswert, wenn einige Pins floaten

Ich arbeite an einem Plugin für Simulationssoftware (nur digitales IC).
Beispielsweise gibt es einen 8-Bit-Bus.
Der Benutzer möchte seinen Wert lesen. Auf der Plugin-Seite überprüfe ich den Status jedes Pins. Es kann 1, 0 oder undefiniert sein. Im Moment, wenn mindestens ein Bit floatet, gebe ich null als Buswert zurück. Ist es überhaupt richtig? Kann ein besserer Rückgabewert sein, der Floating-Bits durch zufällige [1-0] ersetzt und den Benutzer im Protokoll darüber warnt?

Wenn der Benutzer interne Pullup-/Pulldown-Widerstände, die auf einigen Geräten vorhanden sind, nicht aktiviert hat, liegt diese Implementierung bei Ihnen. Wenn ich es wäre, würde ich wahrscheinlich den undefinierten Zustand oder einen zufälligen Wert zurückgeben, wie Sie vorgeschlagen haben, da es keine Möglichkeit gibt, den Zustand dieses Pins zur Abtastzeit zu kennen.

Antworten (3)

Es tut mir leid, aber Sie haben Pech. Es gibt keine offensichtliche Möglichkeit festzustellen, ob ein digitaler Eingang potenzialfrei ist. Die Busempfänger können nicht erkennen, ob ein bestimmter Eingangsspannungspegel auftritt, weil ein Treiber dies wollte, oder ob es daran liegt, dass kein Eingangstreiber vorhanden ist. Er weiß nur, dass der Eingang entweder höher (logisch 1) oder niedriger (logisch 0) als die Schwellenspannung des Empfängers ist.

Es ist sicherlich möglich, eine solche Schaltung zu bauen:

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

In diesem Fall ist Vth die nominelle Logikschwellenspannung und R4 ist ein größerer Widerstand. R1/R2/R3 legen die obere und untere Fehlergrenze für die Eingangsspannung fest.

Im Betrieb zieht ein gültiges High oder Low am Eingang diesen entweder über oder unter die Komparatorsollwerte, und beide Komparatoren lesen entweder High oder Low. Dadurch wird der XOR-Ausgang niedrig gesetzt, was anzeigt, dass der Ausgang gut ist. Wenn der Eingang schwebend gelassen wird, zieht R4 den Eingang auf einen Zwischenwert, und ein Komparator geht hoch, während der andere niedrig geht, und der XOR-Ausgang wird hoch getrieben, was einen schwebenden Eingang anzeigt.

Ich bezweifle natürlich sehr, dass Ihre digitalen Eingänge so aussehen.

Das Problem ist, dass ich sicher wissen kann, dass der Pin schwimmt, weil es Sache des Simulators ist, zu entscheiden, ob der Pin schwimmt oder nicht. Es wird gesagt, dass dies ein undefinierter Wert ist. Aber ich muss auf etwas Wert legen. Zum Beispiel habe ich eine Z80-CPU genommen und eine einfache Schaltung gemacht, ich habe sie einfach mehrmals ein- und ausgeschaltet. Der Adressbus war immer gleich, obwohl sein Wert von Anfang an undefiniert ist. Es ist also besser, Floats durch Zufallszahlen zu ersetzen, aber nicht durch Nullen? Entschuldigung für mein Englisch
Wenn Sie diese Schaltung in der Praxis verwenden würden, würden Sie bei jedem HL- und LH-Übergang einen kurzen "ungültigen" Impuls erhalten. Sie könnten das ungültige Signal entprellen, aber selbst dann wäre es ein massiver Hack.
@nitro2k01 - Ach ja. Es ist nur eines von mehreren realen Implementierungsdetails, mit denen ich das OP nicht belästigen wollte. Und "massiver Hack" fasst meine Gefühle ziemlich gut zusammen. Das soll nicht heißen, dass ich noch nie welche gemacht habe, nur dass diese die Zeit und Mühe nicht wert zu sein scheint.
@pugnator - das hängt davon ab, was die simulierte Schaltung mit den Busdaten machen wird. Im Fall eines Z80 zum Beispiel glaube ich, dass ein Hex 00 ein No-Op ist, also wäre eine Initialisierung dafür gut, wenn die simulierte Schaltung tatsächlich mit den Busdaten arbeitet. Auf der anderen Seite, wenn die simulierte Schaltung eigentlich nichts mit den Busdaten macht, dann schadet ein zufälliger Wert nicht. Es hängt alles von den Folgen Ihrer Wahl ab. Ich kenne die Details Ihrer Simulation nicht, daher kann ich Ihnen keine eindeutige Antwort geben. Verzeihung.
@WhatRoughBeast Roger das. Ich dachte, ich würde darauf hinweisen, falls jemand irgendwo denkt, dass dies tatsächlich eine gute Idee ist.

In den meisten Simulationsprogrammen hängt die Anzeige der Busdaten von der verwendeten Zahlendarstellung ab. Die allgemeine Regel lautet: Wenn eines der Bits, die eine bestimmte Anzeigeziffer beeinflussen, undefiniert ist, dann wird diese Ziffer als „X“ angezeigt.

Wenn die Anzeige binär, oktal oder hexadezimal ist, kann die resultierende Zahl gültige Ziffern mit 'X' enthalten, da jedes Bit nur eine Ziffer beeinflussen kann. Wenn die Anzeige jedoch dezimal ist, kann jede Anzeigestelle von einem der Bits beeinflusst werden. Wenn also eines der Bits nicht definiert ist, wird der gesamte Buswert als „XXXXXX“ angezeigt.

Vielen Dank für den Tipp, aber ich zeige keine Werte an. Ich lese die Pins nur als Tristate-Werte und die Frage ist, wie man sie als Wert interpretiert, um die entsprechende Registrierung zu füllen

Auf Computern der 1980er Jahre mit gemultiplexten Adress-/Datenbussen war ein fast gespenstischer Effekt zu beobachten - das Lesen von Adressen, an denen überhaupt kein Gerät vorhanden war, gab Ihnen tendenziell etwas, das wie eine ASCII-Tabelle in einem Debugger aussah. Was wahrscheinlich wirklich passiert ist, war, dass Sie die kapazitive Ladung zurückgelesen haben, die von den Adressschreibvorgängen übrig geblieben ist ... machbar, wenn am Leseende MOS-Geräte vorhanden wären.

In der Praxis hängt es vom Lesegerät ab und davon, was die Verkabelung stören kann: Fast alle TTL-ähnlichen Geräte behandeln einen schwebenden Eingang als solide 1, wenn kein Pulldown-Widerstand vorhanden ist und keine starken Störungen vorhanden sind. CMOS-Eingänge ohne Pulldown oder Pullup geben Ihnen in der Tat, was auch immer die kapazitive Ladung in der Verkabelung bereithält, wenn es einen ernsthaften Mangel an Interferenzen gibt - oft geben Ihnen schwebende CMOS-Eingänge einen 50/60-Hz-Takt.