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

Gatter zählen und Latches vermeiden

Nach dieser Lektion: Ich kann an einer Netzliste ablesen, wie viele Zellen ein Entwurf braucht und ob er einen Latch enthält.

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

Wie viele Gatter braucht ein Entwurf?

Eine Netzliste ist eine Schaltung als Liste von Gattern und Flipflops. Ein Syntheseprogramm baut sie aus Ihrer Beschreibung. Wie viele Zellen darin stehen, bestimmt Fläche und Preis des Chips.

Zwei Beschreibungen derselben Funktion können verschieden viele Zellen brauchen, und ein kleiner Fehler macht aus einer Beschreibung ungewollt einen Speicher.

Am Ende dieser Lektion

Notiz

Ich kann an einer Netzliste ablesen, wie viele Zellen ein Entwurf braucht und ob er einen Latch enthält.

Schlüsselwörter

BegriffWas er bedeutetBeispiel
Synthesemacht aus einer Beschreibung eine Liste von Gatternyosys
Netzlistedie Schaltung als Liste ihrer Zellen und Verbindungen
Zelleein Gatter oder ein Flipflop in der Netzliste
Flipflopeine Zelle, die ein Bit bei der Taktflanke speichert
Latchein Speicher ohne Takt, meist ungewollt$_DLATCH_P_

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

Synthese macht aus Text eine Zellenliste

Ein Simulator führt Ihre Beschreibung aus. Ein Syntheseprogramm wie yosys macht etwas anderes: Es baut aus ihr die Netzliste, also die Gatter, die ein Chip wirklich bräuchte.

Der Befehl hdl gates ruft yosys auf und zählt die Zellen. Zwei Beschreibungen können dieselbe Wahrheitstabelle haben und trotzdem verschieden viele Zellen ergeben.

Zwei Schreibweisen, eine Funktion

Code: c
// Zwei Beschreibungen derselben Funktion.
assign y = (a & b) | (a & c);   // wahl1: 3 Zellen
assign y = a & (b | c);         // wahl2: 2 Zellen

Ausklammern spart eine Zelle

EntwurfBeschreibungZellen laut yosys
wahl1(a & b) | (a & c)3: zwei UND, ein ODER
wahl2a & (b | c)2

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.

Den Entwurf wahl1.v schreiben

Befehl
printf '%s\n' 'module wahl1(input a, input b, input c, output y);' '  assign y = (a & b) | (a & c);' 'endmodule' > wahl1.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 Entwurf wahl2.v schreiben

Befehl
printf '%s\n' 'module wahl2(input a, input b, input c, output y);' '  assign y = a & (b | c);' 'endmodule' > wahl2.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.

Die Zellen von wahl1 zählen

Befehl
hdl gates wahl1.v wahl1

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 Zellen von wahl2 zählen

Befehl
hdl gates wahl2.v wahl2

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

Jedes gespeicherte Bit braucht ein Flipflop

Gatter allein speichern nichts. Ein Zähler, der sich seine Zahl merkt, braucht für jedes Bit ein Flipflop. Der Rest sind Gatter, die den nächsten Wert ausrechnen.

Schätzen Sie vor dem Befehl: Wie viele Flipflops hat ein Zähler, der bei jedem Takt um eins zählt und drei Bits breit ist? Die Datei zaehler3.v zählt dazu bei einem Reset auf 0.

Den Zähler zaehler3.v schreiben

Befehl
printf '%s\n' 'module zaehler3(input clk, input rst, output reg [2:0] q);' '  always @(posedge clk) if (rst) q <= 0; else q <= q + 1;' 'endmodule' > zaehler3.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.

Die Zellen von zaehler3 zählen

Befehl
hdl gates zaehler3.v zaehler3

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 fehlender else-Zweig baut einen Latch

Ein Latch ist ein Speicher ohne Takt. Er entsteht, wenn ein Ausgang nicht in jedem Fall einen Wert bekommt. Dann muss die Schaltung den alten Wert behalten, und dafür baut yosys einen Latch.

Das ist fast immer ein Fehler: Der Latch hängt von keinem Takt ab, und der Entwurf verhält sich schwer vorhersagbar. Setzen Sie den Ausgang deshalb in jedem Zweig.

Mit und ohne else

Code: c
// Fehlt der else-Zweig, muss y seinen Wert behalten: ein Latch.
always @(*)
  if (frei) q = d;
// Mit else q = 0; ist q in jedem Fall gesetzt: nur ein UND.

Den Entwurf speicher.v schreiben

Befehl
printf '%s\n' 'module speicher(input frei, input d, output reg q);' '  always @(*) if (frei) q = d;' 'endmodule' > speicher.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.

Die Zellen von speicher zählen

Befehl
hdl gates speicher.v speicher

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 Entwurf ohne Latch schreiben

Befehl
printf '%s\n' 'module ohne_speicher(input frei, input d, output reg q);' '  always @(*) if (frei) q = d; else q = 0;' 'endmodule' > ohne_speicher.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.

Die Zellen ohne Latch zählen

Befehl
hdl gates ohne_speicher.v ohne_speicher

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 denken, ein fehlender else-Zweig heiße: Dann passiert nichts, der Ausgang ist 0. In Hardware heißt es: Der Ausgang behält seinen alten Wert. Dafür baut die Synthese einen Latch. Geben Sie dem Ausgang deshalb in jedem Zweig einen Wert.

Ü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.