Ein Zähler am Eingang des Lesesaals
Ein Zähler ist eine Schaltung, die bei jedem Taktschlag um eins weiterzählt. Der Takt ist ein Signal, das gleichmäßig zwischen 0 und 1 wechselt. Mit ihm bekommt eine Schaltung ein Gedächtnis.
Der Besucherzähler am Eingang eines Lesesaals muss sich merken, wie viele schon drin sind. Gatter allein können das nicht.
Am Ende dieser Lektion
Notiz
Ich kann eine Schaltung beschreiben, die sich bei einer Taktflanke ändert.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Takt | ein Signal, das gleichmäßig zwischen 0 und 1 wechselt | clk |
| Flanke | der Moment, in dem der Takt von 0 auf 1 springt | |
| Flipflop | ein Baustein, der ein Bit speichert | |
| Zustand | alles, was sich die Schaltung gerade merkt | |
| Reset | setzt die Schaltung auf ihren Startwert zurück | rst |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein Flipflop ändert sich nur bei der Flanke
Ein Flipflop speichert ein Bit. Es übernimmt einen neuen Wert nur im Moment einer Flanke, wenn der Takt von 0 auf 1 springt. Dazwischen hält es seinen Wert fest.
Mehrere Flipflops zusammen bilden den Zustand einer Schaltung. Ein Zähler mit vier Bits hat vier Flipflops. Ein Reset setzt den Zustand auf den Startwert.
Ein Zähler, der bei Flanke 1 zurückgesetzt wird
| Zeit | Flanke Nr. | Reset | Zähler danach |
|---|---|---|---|
| 5 | 1 | 1 | 0 |
| 15 | 2 | 0 | 1 |
| 25 | 3 | 0 | 2 |
| 35 | 4 | 0 | 3 |
| Vor der ersten Flanke | - | 1 | Unbekannt (x) |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
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.
Die Zeilen des Zählers, die zählen
grep -n "always\|<=" counter.vHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein Schieberegister schiebt Bits weiter
Ein anderes Schaltwerk ist das Schieberegister. Bei jeder steigenden Flanke rutschen alle Bits eine Stelle nach links, und ein neues Bit kommt von rechts hinein.
In Verilog beginnt die Beschreibung mit always @(posedge clk). Das heißt: tue das bei jeder steigenden Flanke von clk. Die geschweiften Klammern { } hängen Bits aneinander.
Das Modul schieber.v
module schieber(input clk, input din, output reg [3:0] q);
// Bei jeder steigenden Flanke rutschen alle Bits eine Stelle nach links.
always @(posedge clk) q <= {q[2:0], din};
endmoduleDas Schieberegister schreiben und laufen lassen
Die ersten zwei Befehle schreiben das Modul und den Testbench. Der Takt kippt alle 5 Zeiteinheiten, und din ist erst 1, dann 0, dann wieder 1.
$monitor druckt eine Zeile, sobald sich etwas ändert. Die Zeilen mit t= zeigen die Zeit, din und q. Das x steht für „noch unbekannt“.
Das Modul schieber.v schreiben
printf '%s\n' 'module schieber(input clk, input din, output reg [3:0] q);' ' always @(posedge clk) q <= {q[2:0], din};' 'endmodule' > schieber.vHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Den Testbench schieber_tb.v schreiben
printf '%s\n' 'module schieber_tb;' ' reg clk = 0, din = 1;' ' wire [3:0] q;' ' schieber dut(.clk(clk), .din(din), .q(q));' ' always #5 clk = ~clk;' ' initial begin' ' $dumpfile("out/schieber.vcd");' ' $dumpvars(0, schieber_tb);' ' $monitor("t=%0d din=%b q=%b", $time, din, q);' ' #7 din = 0;' ' #10 din = 1;' ' #30 $finish;' ' end' 'endmodule' > schieber_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.
Übersetzen
iverilog -o /tmp/schieber schieber.v schieber_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 Zeilen lesen
vvp /tmp/schieberHier 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 lesen <= als „kleiner oder gleich“. In einem always-Block mit posedge bedeutet es etwas anderes: Der neue Wert gilt erst nach der Flanke. So ändern sich alle Register gleichzeitig. Schreiben Sie in solchen Blöcken immer <= und nie =.