Projekt nadajnika
Część sekcji Podstawy ścieżki Verilog w Coddy. Lekcja 89 z 90.
Wyzwanie
W tej lekcji uzupełnisz nadajnik UART, dodając rejestr przesuwny, aby wysyłać dowolny bajt, a nie tylko ustaloną literę 'A'.
Rejestr przesuwny wczytuje całą ramkę (bit stopu + 8 bitów danych + bit startu) i wysyła ją po jednym bicie naraz.
Format ramki
| Stop (1) | Dane (8 bitów) | Start (0) |
|---|---|---|
| 1 | data_in | 0 |
Na przykład, jeśli data_in = 8'b01000001 (litera 'A'), rejestr przesuwny przyjmuje wartość: 1 01000001 0
Twoje zadanie
Otrzymujesz maszynę stanów z poprzedniej lekcji (wysyła ustalony bajt). Musisz ją zmodyfikować, aby wysyłała dowolny bajt z wejścia data_in.
Co zrobić:
- Dodaj
input [7:0]o nazwiedata_indo listy portów (wewnątrz nawiasów) - Dodaj 10-bitowy
rego nazwieshift_regpoza nawiasami (wewnątrz ciała modułu, ponieważ jest to sygnał wewnętrzny) - Gdy
cnt == 0istart == 1:- Wczytaj do
shift_regwartość{1'b1, data_in, 1'b0}
- Wczytaj do
- Gdy
cntma wartość od 1 do 8:- Wyślij
tx <= shift_reg[0] - Przesuń w prawo:
shift_reg <= shift_reg >> 1
- Wyślij
- Gdy
cnt == 9:- Wyślij
tx <= shift_reg[0] - Przesuń w prawo:
shift_reg <= shift_reg >> 1
- Wyślij
Spróbuj swoich sił
module uart_tx (
input clk,
input start, // NEW: sygnał start rozpoczynający transmisję
output reg tx, // NEW: szeregowa linia wyjściowa
output reg [3:0] cnt // Pozostaw jako wyjście do testowania
);
initial begin
cnt = 0;
tx = 1; // NEW: ustaw tx na stan HIGH (stan bezczynności)
end
always @(posedge clk) begin
// NEW: logika licznika z warunkiem rozpoczęcia
if (cnt == 0 && start) begin // NEW: rozpocznij transmisję
cnt <= 1;
end
else if (cnt > 0 && cnt < 9) begin // NEW: zliczaj podczas transmisji
cnt <= cnt + 1;
end
else if (cnt == 9) begin // NEW: wyzeruj po ostatnim bicie
cnt <= 0;
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