Elektronik-Projekt: DCF-Uhr mit CPLD


zurück zu Elektronik, Homepage

DCF-Uhr im Betrieb

6. Simulation

Der nächste Schritt, nach dem Entwurf und der Eingabe des Designs, ist die Simulation. Dabei wird überprüft ob das Design die geforderten Aufgaben erfüllt.

Das Grundprinzip der Simulation ist, dass man an den Eingängen des Designs so genannte Eingangsvektoren anlegt, die auch in der Realität auftreten. Diesen Eingangsvektor nennt man auch Stimuli. Aus diesen Eingangsvektoren ermittelt die Entwicklungsumgebung alle Ausgänge des Designs und zeigt diese grafisch an. Daraus lässt sich dann erkennen, ob das erstellte Design auch wirklich die geforderten Aufgaben erfüllt.

Für die Simulation gibt es in Quartus mehrere Möglichkeiten. Ich möchte hier eine grafische Methode mit Hilfe eines "Vector Waveform File" (.vwf) vorstellen.

Schritt 1: Ein Vector Waveform File für dieses Projekt erzeugen

Durch anklicken von "File" und "New…" wird ein neues File geöffnet. Hier soll nun ein "Vector Waveform File" geöffnet werden. Dies befindet sich unter "Other Files" (siehe Bild 6.1.)

Waveform File erzeugen

Nach anklicken der "OK"-Taste zeigt Bild 6.2. den "neuen" Arbeitsbereich. Im neuen Fenster erfolgt nun die Eingabe der Eingangsvektoren.

Waveform File erzeugen

Ein nützliches Werkzeug ist der so genannte "Node Finder". Dieser wird wie folgt aufgerufen: "View" --> "Utility Windows" --> "Node Finder". Man schiebt ihn am Besten neben den "Projekt Navigator". Mit Hilfe dieses "Node Finder" können ganz bequem die zu simulierenden Ein- und Ausgänge ausgewählt werden. Im Filter sollte "Design Entry (all Names)" ausgewählt werden. Damit können "Komponenten" innerhalb eines Designs simuliert werden. Ein Klick auf die Taste "List" zeigt nun alle auszuwählenden "Komponenten" (siehe Bild 6.3).

Waveform File erzeugen

Wichtig: Damit der "Node Finder" wie der Name schon sagt etwas findet, muss das Design kompiliert werden. (Dies erfolgte schon, und ist daher jetzt nicht notwendig!)

Als erstes definieren wir das zu simulierende Zeitfenster. Fürs erste interessiere ich mich ob die Low- und High-Impulse des DCF-Datenstroms richtig ausgewertet werden. Daher ist zunächst mal ein Zeitfenster von, sagen wir mal, 5 Sekunden notwendig. Diese Einstellung erfolgt mit "Edit" (ganz oben in der Symbolleiste) --> "End Time…"

Waveform File erzeugen

Nach der Bestätigung ("OK") sollte der ganz rechte Bereich so eingestellt werden, dass der gesamte Zeitbereich sichtbar ist. Dazu mit der Maus in diesen Bereich klicken --> rechte Maustaste --> "Zoom" --> "Fit in Window" anklicken.

Als nächsten Schritt wollen wir nun alle Eingangsvektoren definieren. Als erstes ziehen wir "clock_DCF" mit gedrückter Maustaste vom "Node Finder" in das Feld rechts neben den "Node Finder". Dies ist ja unser Systemtakt, welchen wir schon an anderer Stelle definiert haben. Diesen Takt machen wir nun sichtbar, indem wir auf "clock_DCF" klicken --> rechte Maustaste --> "Value" --> "Clock…"

Waveform File erzeugen

In dieser Box wählen wir die Option "Clock settings" (Bild 6.5.) und anschließend "OK". Nun erscheint ein schwarzer Balken. Das ist schon okay. Denn wir haben hier einen Systemtakt von 32768 Hz. Bei einem Zeitfenster von 5 Sekunden ergeben sich somit 5 x 32768 = 163840 Takte. Diese können vom Bildschirm und vom menschlichen Auge nicht mehr als einzelne Taktimpulse aufgelöst werden. Es erscheint daher nur mehr ein Balken.

Als nächstes definieren wir den Reset-Eingang. Zunächst ziehen wir diesen wieder mit gedrückter Maustaste vom "Node Finder" in das Feld rechts neben den "Node Finder". Hier, bei diesem Projekt ergibt sich der Reset aus der Hardware. Beim Einschalten der Betriebsspannung ist der Reset für kurze Zeit Low. Danach, bis zum Ausschalten High. Wir müssen daher für die Simulation dieses Verhalten nachbilden. Dies geschieht am Einfachsten indem man mit der Maus ein Rechteck an der gewünschten Stelle aufzieht. Dieses Rechteck wird hellblau dargestellt, (1) im Bild 6.6. Ein Klick auf "Forcing High" (Symbol in der Toolbar zwischen "Project Navigator" und "Node Finder") ändert den hellblauen Bereich in einen High-Pegel (2) im Bild 6.6.

Waveform File erzeugen

Nun zum etwas aufwendigeren Teil. Als nächstes wollen wir den Eingang inDCF_In (also den auszuwertenden DCF-Datenstrom) erstellen. Bild 6.7. zeigt dazu ein Beispiel. Im Ruhezustand ist dieser Eingang High. Nach etwa einer Sekunde erfolgt für etwa 100ms ein Low-Impuls. Nach etwa zwei Sekunden ein 200ms langer Low-Impuls und nach drei Sekunden wieder ein 100ms langer Low-Impuls. Zwischen der dritten und vierten Sekunde soll ein kurzer Störimpuls auftreten und nach vier Sekunden wieder ein 200ms langer Low-Impuls (siehe Bild 6.7.)

Waveform File erzeugen

Als letztes müssen wir noch die Ausgänge angeben, die uns für diese Simulation interessieren. Interessant sind hier zunächst nur die Ausgänge outDCF_Lo, outDCF_Hi und outDCF_BitFehler. Interessant ist darüber hinaus auch das Verhalten der Zustandsmaschine (iZM_DCF). Bild 6.8. zeigt die so entstandenen "Eingangsvektoren". Zur besseren Übersicht werden die Ausgänge "zaunartig" dargestellt.

Waveform File erzeugen

Abschließend muss diese Datei noch gespeichert werden. Ich persönlich lege für die Eingangsvektoren (Stimuli) in einen eigenen Ordner namens "Stimuli" im Projektordner ab. Also "File" --> "Save" oder "Save As" --> Bild 6.9. (Wichtig ist hier der Dateityp: "Vector Waveform file"). Nennen wir diese Datei "dcf1" --> Taste "Speichern"

Waveform File speichern

Schritt 2: Simulator-Einstellungen

Nach anklicken von "Assignments" und "Settings" gelangt man zum folgenden Bild (Bild 6.10).

Simulator-Einstellungen

In der linken Liste "Simulator" auswählen (1). Als "Simulation input" das im Schritt 1 erzeugte Waveform File ("dcf1.vwf") (2).
Altera empfiehlt weiters die Option "Run simulation until all vector stimuli are used", "Automatically add pins to simulation output waveforms" und "Simulation coverage reporting" (siehe Bild 6.10.)

Schritt 3: Simulation beginnen

Die Simulation wird mit dem Symbol "Start Simulation" (gemäß Bild 6.11.) gestartet.

Simulation starten

Die Dauer der Simulation hängt davon ab, wie groß die "End-Time" (siehe Bild 6.4.) gewählt wurde, und natürlich auch von der Leistungsfähigkeit des verwendeten Computers. Hier, dauert die Simulation bei mir ca. 2 Minuten

Konnte die Simulation erfolgreich durchgeführt werden, erscheint ein Hinweis gemäß Bild 6.12. Konnte die Simulation nicht erfolgreich durchgeführt werden, so müssen natürlich die Fehler gesucht und behoben werden!

Erfolgreiche Simulation

Schritt 4: Simulationsergebnis analysieren

Simulationsergebnis

Im Bild 6.13. erkennt man sehr gut, wie der Eingang (also der DCF-Datenstrom, inDCF_in) ausgewertet wird. Der Ausgang "outDCF_Lo" wird logisch "1" nach einem kurzen Impuls (ca. 100ms) und der nächsten steigenden Flanke vom Eingang (inDCF_In), und der Ausgang "outDCF_Hi" wird logisch "1" nach einem langen Impuls (ca. 200ms) und der nächsten steigenden Flanke vom Eingang (inDCF_In). Bei einem "ungültigen" Impuls des Eingangs wird der Ausgang "outDCF_BitFehler" logisch "1".

Die erste Simulation war also erfolgreich. Als nächstes wollen wir einen Zeitbereich von ca. 80 Sekunden simulieren, damit wir sehen wie das Design ein komplettes DCF-Telegramm einließt, und ob dann die freilaufende Uhr zu starten beginnt.

Schritt 5: Zweite Simulation

Wir erzeugen zunächst ein zweites Vector Waveform File. Wir wiederholen also die Schritte 1 bis 4. Dieses File speichern wir unter "dcf2.vwf" im Unterordner "Stimuli". Als "End Time" geben wir hier 80 Sekunden ein.

Bild 6.14 zeigt dieses Vector Waveform File. Man erkennt bei ca. 10 Sekunden und bei ca. 70 Sekunden, dass hier keine Impulse vorhanden sind. Diese sind die Minutenmarken (gemäß dem DCF-Protokoll). Die kurzen und langen Impulse wurden so gewählt, dass beim Simulieren eine sinnvolle Uhrzeit und ein sinnvolles Datum zustande kommen.

Zweite Simulation

Diese Simulation wird etwas mehr Zeit in Anspruch nehmen. Bei mir dauerte diese Simulation ca. 28 Minuten!

Bild 6.15. zeigt das Simulationsergebnis.

Ergebnis der zweiten Simulation

Das Simulationsergebnis lässt sich mit der Taste "Full Screen" (siehe Bild 6.15) zur besseren Übersicht vergrößern. Bild 6.16. zeigt dasselbe Simulationsergebnis in vergrößerter Darstellung.

Ergebnis der zweiten Simulation (vergrößert)

Die Simulation zeigt sehr schön das Verhalten des Designs. Zu Beginn ist der Ausgang "outDCF_Fehler" gesetzt. Bei Sekunde 10 bleibt die Absenkung des DCF-Datenstroms (Eingang inDCF_In) aus. Es erfolgt also ein Minutenwechsel. Der Ausgang "outDCF_Fehler" wird zurückgesetzt (gemäß dem Zustandsdiagramm, Bild 4.12b). Nun werden alle kurzen und langen Impulse des Eingangs ("inDCF_In") ausgewertet. Die Ausgänge "outDCF_Lo" und "outDCF_Hi" zeigen dies sehr schön an. Interessant wird es bei Sekunde 70. Hier erfolgt der nächste Minutenwechsel. Da bei den vorhergehenden 60 Sekunden kein Fehler aufgetreten ist, muss nun die Uhrzeit an den entsprechenden Ausgängen ausgegeben werden. Der Wert für Stunden-Zehner beträgt "1", für Stunden-Einer beträgt er "9", für den Minuten-Zähler beträgt er "4" und der Minuten-Einer-Wert beträgt "7". Es ergibt sich also eine Uhrzeit von 19:47 Uhr. Weiters muss auch die Anzeige (Ausgang outANZEIGE_EN) aktiviert werden. Der Statusausgang "outDCF_Sync" geht ebenfalls von low auf high. Weiters erkennt man sehr gut einen Sekundentakt und der Wert für die Sekunden-Einer-Stelle beginnt mit jedem Sekundentakt hoch zu zählen.

Ist man an weiteren Details interessiert, so kann man natürlich auch Ausschnitte genauer betrachten (Zoom-Funktion).

Die Funktionalität des hier gewählten Designs wird hier also prinzipiell erfüllt. Natürlich kann man noch weitere, größere Zeitfenster (z. B. 2 Minuten) simulieren.

nach oben


zurück zu Elektronik, Homepage

Autor: Buchgeher Stefan
Erstellt: 1. November 2005
Letzte Änderung: