Ustalanie czasu przejść
Część sekcji Podstawy ścieżki Verilog w Coddy. Lekcja 81 z 90.
Wyzwanie
W tej lekcji dodasz logikę licznika, która kontroluje, jak długo każde światło pozostaje włączone. Licznik odlicza od ustawionej wartości do zera, a następnie wyzwala zmianę stanu.
Wymagania dotyczące czasu
| Stan | Czas trwania | Wartość licznika |
|---|---|---|
| Zielone | 30 sekund | 30 |
| Żółte | 10 sekund | 10 |
| Czerwone | 40 sekund | 40 |
Jak działa licznik
- Gdy rozpoczyna się stan, do licznika wczytywana jest wartość czasu jego trwania
- Przy każdym takcie zegara licznik zmniejsza się o 1
- Gdy licznik osiągnie 0, należy przejść do następnego stanu
Twoim zadaniem jest dodanie brakującej logiki licznika do automatu stanów. Wejście next z poprzedniego kroku nie jest już używane: teraz to licznik decyduje o zmianie stanu, a testbench nie steruje już sygnałem next.
Co należy zrobić:
- Usuń
input next,z nagłówka modułu i zastąp warunekelse if (next)poniższą logiką licznika - Dodaj deklarację
reg [5:0] counter(zachowaj ją, jeśli została już zadeklarowana w pierwszym kroku) - Podczas resetowania ustaw
counterna 0 - Gdy
counter == 0:- Wczytaj czas trwania następnego stanu do licznika
- Przejdź do następnego stanu
- W przeciwnym razie zmniejszaj licznik o 1 przy każdym takcie zegara
Spróbuj swoich sił
module traffic_light (
input clk,
input reset,
output reg red,
output reg yellow,
output reg green
);
reg [1:0] state;
// TODO: Zadeklaruj rejestr licznika (6 bitów)
// Przypisania wyjść
always @(*) begin
case (state)
0: begin green = 1; yellow = 0; red = 0; end
1: begin green = 0; yellow = 1; red = 0; end
2: begin green = 0; yellow = 0; red = 1; end
default: begin green = 0; yellow = 0; red = 1; end
endcase
end
// Maszyna stanów z odmierzaniem czasu
always @(posedge clk or posedge reset) begin
if (reset) begin
state <= 2; // Rozpocznij od stanu Red
// TODO: Ustaw licznik na 0
end else begin
if (counter == 0) begin
case (state)
0: begin
state <= 1;
// TODO: Ustaw licznik dla stanu Yellow (10 sekund)
end
1: begin
state <= 2;
// TODO: Ustaw licznik dla stanu Red (40 sekund)
end
2: begin
state <= 0;
// TODO: Ustaw licznik dla stanu Green (30 sekund)
end
endcase
end else begin
// TODO: Zmniejsz licznik o 1
end
end
end
endmoduleWszystkie 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