Algorithmus um digitale Schaltung zu Simulieren



  • Gibts da ein Vorgehen, wie man normalerweise so eine Schaltung aufbröselt? Irgendwie in einem Baum? Das Problem ist ja, dass in der Realität alles parallel abläuft. Im Rechner darf ich ja jeden Baustein erst auswerten, wenn am Eingang gültige Daten stehen.



  • Du könntest ein Auswertungsmodell ähnlich zu VHDL nehmen:

    Dabei führt man zu jedem Signal, dass es gibt, eine Zeittabelle. Da steht der aktuelle Wert drin und alle zukünftigen Werte mit ihren Zeiten. Man fängt also bei einem Startzustand an und wertet dann alle Bausteine aus. Dabei kann ein Baustein an seiner Ausgabe ja einen ggf. neuen Wert ausgeben. In dem Fall notiert man in der Tabelle des Ausgangssignals den neuen Wert und ab wann er gilt (jedes Bauteil hat schließlich Signallaufzeiten). Zusätzlich kann man für "sofort"-Signalwechsel einen Zeitraum δ nehmen, der kleiner als jede Zeiteinheit ist. Beispiel:

    A ----|>o----  B
    

    (dies sei ein Inverter, A initialisiert mit 1, soll auf 0 wechslen nach 10ms. Der Inverter hat ne Signallaufzeit von 1ms)

    Aktuelle Signaltabelle

    |    jetzt   | in 10 ms
    ---+------------+-----------
     A |      1     |    0
     B | unbestimmt | unbestimmt
    

    Die Evaluation startet, der Inverter wird ausgewertet zu

    |    jetzt   |   in 1 ms  | in 10 ms
    ---+------------+------------+-----------
     A |      1     |      1     |     0
     B | unbestimmt |      0     |     0
    

    Es sind alle Bauteile ausgewertet worden, nun nimmt man sich den nächstkleineren Zeitraum und macht ihn zu "jetzt". Also hier 1ms

    |    jetzt   |  in 9 ms
    ---+------------+-----------
     A |      1     |    0
     B |      0     |    0
    

    Wieder werden alle Bauteile ausgewertet, aber ein hinzufügen zu "Der Inverter ist in 1ms am Ausgang 0" würde nichts neues bringen, also verändert sich die Tabelle nicht.

    Nächster Simulationsschritt (9 ms später):

    |    jetzt   |  
    ---+------------+
     A |      0     |
     B |      0     |
    

    Wieder kommt der Inverter dran:

    |    jetzt   |  in 1 ms
    ---+------------+-----------
     A |      0     |    0
     B |      0     |    1
    

    Und im nächsten Schritt (1 ms später)

    |    jetzt   |
    ---+------------+
     A |      0     |
     B |      1     |
    

    Das Auswerten des Inverters bringt wie oben keine neuen Einträge, es sind keine weiteren Simulationsschritte vorhanden, also bleibt das System bis in aller Ewigkeit so.

    Insgesmat kann man als System dann daraus auch den Signalverlauf von A und B ableiten.

    Hätte der Inverter keine Signallaufzeit, würde anstatt "in 1 ms" halt ein δ als zeitraum kommen, der Verlauf wäre dann grob so:

    |    jetzt   | in 10 ms
    ---+------------+-----------
     A |      1     |    0
     B | unbestimmt | unbestimmt
    

    Inverter auswerten:

    |    jetzt   |    delta   | in 10 ms
    ---+------------+------------+-----------
     A |      1     |      1     |     0
     B | unbestimmt |      0     |     0
    

    Ein δ später (also unendlich wenig Zeit)

    |    jetzt   |  in 10 ms
    ---+------------+-----------
     A |      1     |    0
     B |      0     |    0
    

    10 ms später:

    |    jetzt   |  
    ---+------------+
     A |      0     |
     B |      0     |
    

    Inverter auswerten:

    |    jetzt   |   delta
    ---+------------+-----------
     A |      0     |    0
     B |      0     |    1
    

    Ein δ später:

    |    jetzt   |
    ---+------------+
     A |      0     |
     B |      1     |
    

    --------------------------------------------------

    Auf diese Weise kann man nun also Digitale Schaltungen simulieren, auch quasi-Gleichzeitigkeit ist kein Problem, die Delta-Zyklen ermöglichen eine genaue Simulation davon.

    Ich hoffe das verdeutlicht ein wenig was ich sagen will und hilft dir 🙂

    TriPhoenix



  • Auch fuer analoge Schaltungen funktioniert das so, man verwendet dafuer die entsprechenden Differentialgleichungen, stellt diese so um, dass man die Zustandsraumdarstellung bekommt (Hinweis: dann gilt df/dt = irgendein_term(t)) und kann nun df/dt durch ein kleines Delta t ersetzen, und simuliert auf diese Weise die Aenderungen.

    Wird natuerlich wesentlich komplexer im Analogen, wenn man auch noch Rauschen etc beruecksichtigt, aber die Vorgehensweise erfolgt ebenso. Auch andere gleichzeitige physikalische Modelle kann man auf diese Weise iterativ berechnen. Allerdings sollte man einen Blick in die numerische Mathematik werfen, wie man die sich aufbauenden Rechenfehler und Rundungsfehler im Griff halten kann.



  • Ah, Danke schonmal für die tollen Tips!


Anmelden zum Antworten