Die Ausgabe überprüfen
Teil des Abschnitts Grundlagen der Verilog-Journey von Coddy. Lektion 83 von 90.
Aufgabe
In dieser Lektion fügst du Befehle zum Dumpen von Wellenformen hinzu und überprüfst, ob der Ampelcontroller korrekt funktioniert.
Bisher war die Testbench verborgen und wurde an dein Modul angehängt. In diesem Schritt ist die Testbench Bestandteil deiner Datei: Behalte das traffic_light-Modul aus dem vorherigen Schritt bei (Zähler-Timing, kein next-Eingang) und füge darunter ein testbench-Modul hinzu. Falls deine Datei noch kein module testbench enthält, kopiere dieses:
module testbench;
reg clk, reset;
wire red, yellow, green;
traffic_light uut (
.clk(clk),
.reset(reset),
.red(red),
.yellow(yellow),
.green(green)
);
always #1 clk = ~clk;
initial begin
// TODO: Add $dumpfile to create "traffic.vcd"
// TODO: Add $dumpvars to dump all signals (0, testbench)
$display("Traffic Light Test");
$monitor("Time %0t: red=%b, yellow=%b, green=%b", $time, red, yellow, green);
clk = 0;
reset = 1;
#2 reset = 0;
#90;
$finish;
end
endmoduleWas zu tun ist:
Aktualisiere die Testbench wie folgt:
- Füge
$dumpfilehinzu, um eine Wellenformdatei mit dem Namentraffic.vcdzu erstellen - Füge
$dumpvarshinzu, um alle Signale in der Testbench zu dumpen - Führe die Simulation aus und überprüfe die Ausgabe
Der Test vergleicht die gesamte Sim simulatorausgabe, daher muss die Testbench exakt das ausgeben, was die obige Testbench ausgibt, und nichts anderes: den $display("Traffic Light Test")-Header, eine $monitor-Zeile pro Änderung der Lichter, eine Uhr, die bei jeder Zeiteinheit umschaltet, die bei Zeit 2 aufgehobene Rücksetzung und $finish nach #90. Füge keine weiteren $display-Zeilen hinzu (kein "Test complete").
Erwartete Ausgabe (der Simulator fügt selbst eine abschließende Zeile $finish called at 92 hinzu):
VCD info: dumpfile traffic.vcd opened for output.
Traffic Light Test
Time 0: red=1, yellow=0, green=0
Time 3: red=0, yellow=0, green=1
Time 65: red=0, yellow=1, green=0
Time 87: red=1, yellow=0, green=0Probier es selbst
module traffic_light (
input clk,
input reset,
output reg red,
output reg yellow,
output reg green
);
// Zustände: 0=Grün, 1=Gelb, 2=Rot
reg [1:0] state;
reg [5:0] counter;
always @(posedge clk or posedge reset) begin
if (reset) begin
state <= 2; // Starte bei Rot
counter <= 0;
end else begin
if (counter == 0) begin
// Zustand ändern
if (state == 0) begin // Grün -> Gelb
state <= 1;
counter <= 10; // Gelb dauert 10 Sekunden
end else if (state == 1) begin // Gelb -> Rot
state <= 2;
counter <= 40; // Rot dauert 40 Sekunden
end else begin // Rot -> Grün
state <= 0;
counter <= 30; // Grün dauert 30 Sekunden
end
end else begin
counter <= counter - 1;
end
end
end
// Ausgabelogik
always @(*) begin
red = (state == 2);
yellow = (state == 1);
green = (state == 0);
end
endmodule
module testbench;
reg clk, reset;
wire red, yellow, green;
traffic_light uut (
.clk(clk),
.reset(reset),
.red(red),
.yellow(yellow),
.green(green)
);
always #1 clk = ~clk;
initial begin
// TODO: Füge $dumpfile hinzu, um "traffic.vcd" zu erstellen
// TODO: Füge $dumpvars hinzu, um alle Signale auszugeben (0, testbench)
$display("Traffic Light Test");
$monitor("Time %0t: red=%b, yellow=%b, green=%b", $time, red, yellow, green);
clk = 0;
reset = 1;
#2 reset = 0;
#90;
$finish;
end
endmodule
Alle Lektionen in Grundlagen
1Einführung
Was ist VerilogHardware vs. SoftwareIhr erstes ModulKommentareAbstraktionsebenen des Designs4Operatoren Teil 1
Arithmetische OperatorenModulo-OperatorVergleichsoperatorenWiederholung – einfache MathematikBitweise Operatoren7Zuweisungen und Gatter
Kontinuierliche ZuweisungZuweisung mit OperatorenIntegrierte Gatter-GrundelementeUND-, ODER- und NICHT-GatterXOR- und XNOR-GatterRückblick – Logikgatter-Schaltung10Entscheidungsfindung
If-AnweisungIf – ElseRückblick – Einfacher KomparatorCase-AnweisungCasex und CasezRückblick – ALU-Entwurf13Zeitsteuerung und Verzögerungen
Was sind Verzögerungen?GatterverzögerungenZuweisungsverzögerungenTimescale-DirektiveTakterzeugungZusammenfassung – Zeitsteuerung2Datentypen
Wire-TypReg-TypInteger und RealVektorenArraysParameterZusammenfassung – Signale deklarieren5Operatoren Teil 2
Logische OperatorenReduktionsoperatorenSchiebeoperatorenVerkettungsoperatorBedingter OperatorRückblick – Operatoren-Herausforderung11Schleifen
For-SchleifeWhile-SchleifeWiederholungsschleifeEndlosschleifeAnweisung deaktivierenRückblick – Schleifenmuster3Zahlensystem
Binäre DarstellungZahlen mit fester BreiteZahlen ohne feste BreiteNegative ZahlenSpezialwerte X und ZZusammenfassung – Zahlenformate6Module
ModulstrukturInput- und Output-PortsInout-PortsModulinstanziierungPortzuordnung nach NamenPortzuordnung nach ReihenfolgeRückblick – Ein Modul erstellen9Prozedurale Blöcke
Always-BlockInitial-BlockSensitivitätslisteBlockierende ZuweisungNicht blockierende ZuweisungZusammenfassung – Always vs. Initial15Ampelsteuerung
Zustände definierenLogik der ZustandsmaschineÜbe selbstständig: Online-Verilog-Compiler