Weryfikacja wyjścia
Część sekcji Podstawy ścieżki Verilog w Coddy. Lekcja 83 z 90.
Wyzwanie
W tej lekcji dodasz polecenia zrzutu przebiegu i sprawdzisz, czy sterownik sygnalizacji świetlnej działa poprawnie.
Do tej pory testbench był ukryty i dołączony do twojego modułu. W tym kroku testbench jest częścią twojego pliku: zachowaj moduł traffic_light z poprzedniego kroku (odmierzanie czasu licznikiem, bez wejścia next) i dodaj poniżej moduł testbench. Jeśli w pliku nie ma jeszcze module testbench, skopiuj ten moduł:
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
endmoduleCo zrobić:
Zaktualizuj testbench, aby:
- Dodać
$dumpfile, aby utworzyć plik przebiegu o nazwietraffic.vcd - Dodać
$dumpvars, aby zrzucić wszystkie sygnały w testbench - Uruchomić symulację i sprawdzić wynik
Test porównuje cały wynik symulatora, dlatego testbench musi wypisać dokładnie to, co wypisuje powyższy testbench, i nic więcej: nagłówek $display("Traffic Light Test"), jeden wiersz $monitor przy każdej zmianie świateł, zegar przełączający się co jednostkę czasu, zwolnienie resetu w chwili 2 oraz $finish po #90. Nie dodawaj innych wierszy $display (bez "Test complete").
Oczekiwany wynik (symulator sam dodaje na końcu wiersz $finish called at 92):
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=0Spróbuj swoich sił
module traffic_light (
input clk,
input reset,
output reg red,
output reg yellow,
output reg green
);
// Stany: 0=Zielone, 1=Żółte, 2=Czerwone
reg [1:0] state;
reg [5:0] counter;
always @(posedge clk or posedge reset) begin
if (reset) begin
state <= 2; // Zacznij od czerwonego światła
counter <= 0;
end else begin
if (counter == 0) begin
// Zmień stan
if (state == 0) begin // Zielone -> Żółte
state <= 1;
counter <= 10; // Żółte światło trwa 10 sekund
end else if (state == 1) begin // Żółte -> Czerwone
state <= 2;
counter <= 40; // Czerwone światło trwa 40 sekund
end else begin // Czerwone -> Zielone
state <= 0;
counter <= 30; // Zielone światło trwa 30 sekund
end
end else begin
counter <= counter - 1;
end
end
end
// Logika wyjściowa
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: Dodaj $dumpfile, aby utworzyć "traffic.vcd"
// TODO: Dodaj $dumpvars, aby zapisać wszystkie sygnały (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
Wszystkie lekcje w sekcji Podstawy
1Wprowadzenie
Czym jest VerilogSprzęt a oprogramowanieTwój pierwszy modułKomentarzePoziomy abstrakcji projektu4Operatory, część 1
Operatory arytmetyczneOperator moduloOperatory porównaniaPowtórka — prosta matematykaOperatory bitowe7Przypisania i bramki
Przypisanie ciągłePrzypisanie z operatoramiWbudowane prymitywy bramekBramki AND, OR i NOTBramki XOR i XNORPodsumowanie — układ z bramek logicznych10Podejmowanie decyzji
Instrukcja ifIf-elsePowtórka – prosty komparatorInstrukcja caseCaseX i CaseZPowtórka – projektowanie ALU13Odmierzanie czasu i opóźnienia
Czym są opóźnieniaOpóźnienia bramekOpóźnienia przypisańDyrektywa timescaleGenerowanie zegaraPodsumowanie — kontrola czasu2Typy danych
Typ WireTyp RegLiczby całkowite i rzeczywisteWektoryTabliceParametryPowtórka — deklarowanie sygnałów5Operatory — część 2
Operatory logiczneOperatory redukcjiOperatory przesunięciaOperator konkatenacjiOperator warunkowyPowtórzenie — wyzwanie z operatorami11Pętle
Pętla forPętla whilePętla repeatPętla nieskończonaInstrukcja wyłączaniaPowtórka — wzorce pętli3System liczbowy
Reprezentacja binarnaLiczby o określonej szerokościLiczby o nieokreślonej szerokościLiczby ujemneWartości specjalne X i ZPodsumowanie — formaty liczb6Moduły
Struktura modułuPorty wejściowe i wyjściowePorty dwukierunkoweInstancjonowanie modułuMapowanie portów według nazwMapowanie portów według kolejnościPodsumowanie — zbuduj moduł9Bloki proceduralne
Blok alwaysBlok initialLista czułościPrzypisanie blokującePrzypisanie nieblokującePodsumowanie — always a initial12Projekt multipleksera
Projekt multipleksera 2 do 1Projekt multipleksera 4 do 115Sterownik sygnalizacji świetlnej
Definiowanie stanówLogika maszyny stanówPoćwicz samodzielnie: Kompilator Verilog online