Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Zähler und Taktflanke

Nach dieser Lektion: Ich kann eine Schaltung beschreiben, die sich bei einer Taktflanke ändert.

Lektion, 55 Min.6 BefehleDigitaldesign-Lab: Verilog, VHDL und yosys in einer privaten Ubuntu-VM

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

BegriffWas er bedeutetBeispiel
Taktein Signal, das gleichmäßig zwischen 0 und 1 wechseltclk
Flankeder Moment, in dem der Takt von 0 auf 1 springt
Flipflopein Baustein, der ein Bit speichert
Zustandalles, was sich die Schaltung gerade merkt
Resetsetzt die Schaltung auf ihren Startwert zurückrst

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

ZeitFlanke Nr.ResetZähler danach
5110
15201
25302
35403
Vor der ersten Flanke-1Unbekannt (x)

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

In den Ordner hdl wechseln

Befehl
cd ~/hdl

Hier 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

Befehl
grep -n "always\|<=" counter.v

Hier 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

Code: c
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};
endmodule

Das 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

Befehl
printf '%s\n' 'module schieber(input clk, input din, output reg [3:0] q);' '  always @(posedge clk) q <= {q[2:0], din};' 'endmodule' > schieber.v

Hier 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

Befehl
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.v

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Übersetzen

Befehl
iverilog -o /tmp/schieber schieber.v schieber_tb.v

Hier 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

Befehl
vvp /tmp/schieber

Hier 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 =.

Über dieses Lab und seinen Quellcode: Digitaldesign-Lab: Verilog, VHDL und yosys in einer privaten Ubuntu-VM

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.