Warum zeigt der Zähler anfangs Unsinn?
Eine Wellenform zeigt, wie sich die Signale einer Schaltung im Lauf der Zeit ändern. Der Simulator schreibt sie in eine VCD-Datei (Value Change Dump). Wer diese Datei lesen kann, sieht Takt für Takt, was die Schaltung getan hat.
So finden Entwickelnde Fehler, die im Quelltext unsichtbar sind, zum Beispiel einen Zähler, der beim Einschalten eine falsche Zahl zeigt.
Am Ende dieser Lektion
Notiz
Ich kann an einer Wellenform ablesen, was bei jedem Takt geschah.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Signal | ein Draht oder Bus der Schaltung, dessen Wert sich ändert | clk |
| Wellenform | der zeitliche Verlauf der Signale | |
| VCD-Datei | eine Textdatei, die jede Änderung eines Signals festhält | |
| Bus | mehrere Bits, die als eine Zahl gelten | q[3:0] |
| Zeitschritt | wie viele Zeiteinheiten eine Spalte der Anzeige umfasst |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Eine VCD-Datei ist Text mit Zeitmarken
Eine VCD-Datei besteht aus zwei Teilen. Im Kopf steht für jedes Signal eine Zeile $var mit Breite, Kurzkennung und Name. Danach kommen Zeitmarken wie #15.
Unter einer Zeitmarke steht nur, was sich dann ändert. Ein Bit schreibt der Simulator als 1": Wert, dann Kennung. Ein Bus beginnt mit b: b1 ! heißt, das Signal ! hat den Wert 1.
Was die Zeilen des Ausschnitts heißen
| Zeile | Bedeutung |
|---|---|
| $var reg 1 " clk $end | Das Signal clk ist 1 Bit breit und hat die Kennung " |
| #15 | Ab hier ist die Zeit 15 |
| b1 ! | Das Signal mit der Kennung ! (der Bus q) hat jetzt den Wert 1 |
| 1" | clk springt auf 1 |
| #20 | Ab hier ist die Zeit 20 |
| 0" | clk springt auf 0 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Den Zähler simulieren und die Datei ansehen
Die ersten Befehle übersetzen den gegebenen Zähler samt Testbench und führen ihn aus. Dabei schreibt $dumpfile die Datei out/counter.vcd.
grep var zeigt die Kopfzeilen. Die Signale stehen zweimal da, einmal im Testbench und einmal im Zähler, aber mit gleicher Kennung. sed zeigt den Teil zwischen zwei Zeitmarken.
In den Ordner hdl wechseln
cd ~/hdlHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Zähler und Testbench übersetzen
iverilog -o /tmp/zaehler counter.v counter_tb.vHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Simulieren und die Datei schreiben
vvp /tmp/zaehlerHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Signale im Kopf der Datei
grep var out/counter.vcdHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Alles zwischen den Zeitmarken 15 und 20
sed -n '/^#15/,/^#20/p' out/counter.vcdHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Wie viele Zeitmarken hat die Datei?
grep -c '^#' out/counter.vcdHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
vcd2txt macht aus der Datei Zeilen und Spalten
Das Werkzeug vcd2txt zeichnet jedes Signal als Zeile. Jede Spalte steht für einen Zeitschritt, den Sie als Zahl dahinter angeben.
Bei einem Bit steht # für 1 und _ für 0. Ein Bus zeigt seine Zahl, ein x ist unbekannt. Probieren Sie zwei Zeitschritte aus und vergleichen Sie, was Sie sehen.
Eine Spalte je 5 Zeiteinheiten
vcd2txt out/counter.vcd 5Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine Spalte je 10 Zeiteinheiten
vcd2txt out/counter.vcd 10Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein häufiger Fehler
Warnung
Viele denken, ein größerer Zeitschritt zeige dasselbe nur kürzer. Wählen Sie ihn aber so groß wie die Periode des Takts, liest die Anzeige den Takt immer im selben Moment. Dann sieht clk wie tot aus. Wählen Sie den Zeitschritt höchstens so groß wie die halbe Periode.