Digitalschaltung simulator schleifenproblem
-
ich weiß nicht ob das hier hingehört aber habe nichts passenderes gefunden ^^.
Mein Problem:
ich will einen Digitalsimulator für Logische schaltungen programieren, geh dabei beim output auswerten rückwärts durch. D.h. ich schau was angeschlossen ist und berechne dort den output, und das bis zum anfang (schaltern oder ähnlichem)
nun mien problem schließe ich ein output weiter vorne als input an erzeuge ich hiermit eine schleife.jemand ahnung wie man das problem lösen könnte?
hier noch eine Grafic die das problem verdeutlicht:
http://img146.imageshack.us/img146/5872/unbenanntlsh.png
-
Vielleicht solltest du eher von vorne her berechnen, was dort herauskommt (für die Rückkopplung mußt du berücksichtigen, daß normale Schaltungen eine gewisse Verzögerung haben).
PS: Die Schaltung sieht ein wenig nach einem Flip-Flop aus.
-
^^ ja z.B. bei FFs hat man das problem.
wen man vorne beginnt geht man die schleife eben anderst herum durch aber hängt immer noch drin.
Ich beginne hinten da ich so z.B. direkt einen output abfragen kann, ohne zu schaun wo die schaltung beginnt
-
Aber wenn du von hinten anfängst, kannst du nicht wirklich Rückschlüsse auf auf die Eingänge ziehen. (Beispiel: Am Ausgang eines UND-Gatters liegt 0 - was für Signale sind reingekommen?)
Du kannst ja von einem definierten Anfangszustand ausgehen und dann analysieren, wie sich die Werte daraufhin ändern. Bei solchen Schaltungen mit Rückkopplung mußt du sowieso das Zeitverhalten berücksichtigen.
-
Natürlich gibt das eine Schleife, schliesslich hast du da ja auch "in Wirklichkeit" Rückkopplung, was zu einer schwingenden Schaltung führen kann.
Um das zu Simulieren musst du eine kleine Verzögerung in jedes Element einfügen und ein bestimmtes Zeitinterval simulieren. Das kannst du z.B. so machen, dass du in jedem Zeitschritt alle deine Blöcke updatest.
-
auf die idee bin ich dan gestern auch gekommen, und das mit dem "startwert" dürfte auch helfen, dan werd ichs mal weiter versuchen.
Danke für die Antworten!
-
AntiHeadshot schrieb:
auf die idee bin ich dan gestern auch gekommen, und das mit dem "startwert" dürfte auch helfen, dan werd ichs mal weiter versuchen.
Danke für die Antworten!
(so jetzt endlich nen Account ^^)
hab es jetzt so gelöst dass ich eine funktion habe die von jedem Baustein den output berechnet. Somit wird bei schleifen immer bei einem stein der alte output genommen.
z.B. ein RF-FF kann ich damit aufbauen, und das ergebniss stimmt fast.
das einzigste problem ist das wenn er zuerst das obere Nor berechnet beim reset erst nach dem 2. update die ausgänge stimmen.
Und jenachdem ob oben oder unten zuerst der zustand nach E1=1 und E2=1 (verbotenerzustand)
Q1 oder Q2 =1 ist
http://www.elektronik-kompendium.de/sites/dig/schalt/02093021.gifobere zuerst (vor jeder Zeile wurde Update aufgerufen)
E[t]1[/t] E[t]2[/t] Q[t]1[/t] Q[t]2[/t] 0 0 0 1 1 0 1 0 0 0 1 0 0 1 0 0 0 1 0 1 0 0 0 1 1 1 0 0 0 0 0 1
untere zuerst
E[t]1[/t] E[t]2[/t] Q[t]1[/t] Q[t]2[/t] 0 0 1 0 1 0 1 0 0 0 1 0 0 1 0 1 0 1 0 1 1 1 0 0 0 0 1 0
(Ne Tabellen funktion währ hier auch mal ganz nett
)
die Updatefunktion
void updateall(void) { for(int i=0,x=0;i<anz;i++,x++) //geht alle erzeugten Steine durch { for(;steine[x]==NULL;x++) //geht zum nechsten existierenden Stein {;} steine[x]->calcout(); //ruft die output berechnung auf } }
-
Du musst alle parallel berechnen (das meinte ich mit alle updaten), bevor du die neuen Ausgangswerte mit einbeziehst.
Also so:
Startwerte: E1=0,E2=0,Q1=0,Q2=0
Erster Zeitschritt:
a) Alle Blöcke parallel berechnen
Block 1: E1 nor Q2 = 0 nor 0 = 1; Q1'=1
Block 2: E2 nor Q1 = 0 nor 0 = 1; Q2'=1 (hier Q1, nicht Q1' verwenden)
b) Alle Ergebnisse übernehmen (erst jetzt!)
Q1=Q1'
Q2=Q2'Dann weiter mit den nächsten Zeitschritten.
-
ok versuch ich gleich einmal theorie in praxis umzusetzen
Block 1: E1 nor Q2 = 0 nor 0 = 1; Q1'=1
Block 2: E2 nor Q1 = 0 nor 0 = 1; Q2'=1das versteh ich nicht ganz warum nach dem nor noch einmal nor mit 0
und funktioniert leider immernoch nicht nach reset habe ich leider immer noch den selben fehler und zu beginn sind die werte noch falsch...
E[t]1[/t] E[t]2[/t] Q[t]1[/t] Q[t]2[/t] 0 0 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0 1 0 1 0 0 0 1 1 1 0 0 0 0 1 1
-
Hmm, das habe ich ungünstig formuliert (ausserdem sind die Ausgänge auf der Zeichnung nicht so wie ich das gedacht hatte). Da ist kein nor mit null.
Aber zuerst mal: Du hast bei einem NOR-Latch einen verbotenen Zustand (E1=E2=0), bei dem das Latch unkontrolliert zu Schwingen anfängt. Deshalb solltest du sicherstellen, dass das beim testen (zumindest für einen ersten Test) nicht vorkommt. Bei dir fängt aber genau damit der Test an... da kommt logischerweise nicht viel schlaues raus.
Soo nochmal ein ausführliches Bsp (E1=1, E2=0):
Du berechnest zwei Dinge:
a) Q2=E1 nor Q1
b) Q1=E2 nor Q2Das muss parallel geschehen, d.h. du speicherst das Resultat von E1 nor Q1 nicht direkt in Q2 sondern in einer Hilfsvariablen Q2'. Nachdem alle neuen Ausgänge berechnet wurden, übernimmst du die Werte und rechnest es erneut.
Bsp:
In der ersten Iteration: E1=1, E2=0, Q1=0, Q2=0. Zuerst berechnest du alle Ausgänge:
Q2' = E1 nor Q1 = 1 nor 0 = 0
Q1' = E2 nor Q2 = 0 nor 0 = 1
Du rechnest noch mit den alten Werten!
Erst jetzt übernimmst du die Zustände:
Q1=Q1'
Q2=Q2'Also nach der ersten Iteration:
E1=0, E2=0, Q1=1, Q2=0Zweite Iteration (immer noch E1=1, E2=0 aber jetzt Q1=1, Q2=0):
Q2' = E1 nor Q1 = 1 nor 1 = 0
Q1' = E2 nor Q2 = 0 nor 0 = 1
Q1=Q1'
Q2=Q2'Also nach der zweiten Iteration (immer noch das gleiche, wie es sein soll):
E1=0, E2=0, Q1=1, Q2=0Das Verfahren funktioniert aber auch, wenn du im verbotenen Zustand bist (naja, mehr oder weniger zumindest)
Beispiel Race Condition (E1=0, E2=0):
Erste Iteration (E1=0, E2=0 aber jetzt Q1=0, Q2=0):
Q2' = E1 nor Q1 = 0 nor 0 = 1
Q1' = E2 nor Q2 = 0 nor 0 = 1
Q1=Q1'
Q2=Q2'Zweite Iteration (E1=0, E2=0 aber jetzt Q1=1, Q2=1)
Q2' = E1 nor Q1 = 0 nor 0 = 1
Q1' = E2 nor Q2 = 0 nor 0 = 1
Q1=Q1'
Q2=Q2'Dritte Iteration (E1=0, E2=0 aber jetzt Q1=0, Q2=0)
Wieder wie bei Iteration 1, die Schaltung schwingt unkontrolliert zwischen den beiden Zuständen hin und her.
-
Ok hab die Gleichungen missverstanden^^ aber das ändert am Ergebnis ja nichts.
Habe die Updatefunktion auch so umgeschrieben das zur Berechnung die alten Werte genommen werden und sobald alle Rechnungen durchgeführt sind überschreibt er die alten Werte mit den Neuen.
Der verbotene Zustand bei einem NOR-Latch ist E1=E2=1 dann habe ich Q1=Q2=1/0 und dan schwingt es bis E1!=E2.
E1=E2=0 ist normalerweise der speicherzustand. Welcher aber davor 2 Iterationen benötigt da es sonst in schwingungen gerät.:(
Was ist da dan Programmtechnisch so anderst, den Praktisch funktioniert es jaEs brginnt auch nur zu schwingen 1. wenn zu Beginn der Berechnungen E1=E2 und Q1=Q1=0 ist (Ausgänge werden beim Erstellen eines Objectes automatisch erstmal auf 0 gesetzt) oder nach dem Verbotenen zustand E1=E2=1
Und zu den Ausgängen bei der Schaltung; die hab ich auch nicht noch extra Überkreutz, das dient ja auch nur dazu das Q oben und !Q unten ist.