Logika maszyny stanów
Część sekcji Podstawy ścieżki Verilog w Coddy. Lekcja 80 z 90.
Wyzwanie
W tej lekcji dodasz logikę przejść między stanami do sterownika sygnalizacji świetlnej. Automat stanów określa, kiedy przejść z jednego stanu do następnego.
Logika automatu stanów steruje tym, kiedy i jak sygnalizacja świetlna zmienia stany.
Sekwencja stanów
Zielony → Żółty → Czerwony → Zielony → …
Twoim zadaniem jest dodanie logiki automatu stanów do modułu.
W tym kroku każdy stan zmienia się po otrzymaniu nowego sygnału wejściowego next; licznik czasu pojawi się w następnym kroku. Zachowaj wszystko, co napisałeś w poprzednim kroku (rejestr state, nieużywaną deklarację counter i blok wyjściowy always @(*)).
Co zrobić:
- Dodaj 1-bitowy port wejściowy o nazwie
nextdo nagłówka modułu, poreset:input next,. Testbench podaje na niego impuls, aby zażądać następnego stanu - Dodaj blok
always @(posedge clk or posedge reset) - Podczas resetu ustaw
statena Czerwony (2) - Gdy
nextma wartość 1, przejdź do następnego stanu:- Jeśli stan to Zielony (0): zmień na Żółty
- Jeśli stan to Żółty (1): zmień na Czerwony
- Jeśli stan to Czerwony (2): zmień na Zielony
Spróbuj swoich sił
module traffic_light (
input clk,
input reset,
input next, // Sygnał wyzwalający zmianę stanu
output reg red,
output reg yellow,
output reg green
);
reg [1:0] state;
// 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
// TODO: Dodaj logikę maszyny stanów (bez odmierzania czasu)
// always @(posedge clk or posedge reset) begin
// if (reset) begin
// state <= 2;
// end else if (next) begin
// case (state)
// 0: state <= 1;
// 1: state <= 2;
// 2: state <= 0;
// endcase
// 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