Senderentwurf
Teil des Abschnitts Grundlagen der Verilog-Journey von Coddy. Lektion 89 von 90.
Aufgabe
In dieser Lektion vervollständigst du den UART-Transmitter, indem du das Schieberegister hinzufügst, um beliebige Bytes zu senden, nicht nur den festgelegten Buchstaben 'A'.
Das Schieberegister lädt den vollständigen Frame (Stopbit + 8 Datenbits + Startbit) und gibt ihn Bit für Bit aus.
Frame-Format
| Stop (1) | Daten (8 Bits) | Start (0) |
|---|---|---|
| 1 | data_in | 0 |
Wenn beispielsweise data_in = 8'b01000001 (Buchstabe 'A') ist, wird das Schieberegister zu: 1 01000001 0
Deine Aufgabe
Du erhältst die Zustandsmaschine aus der vorherigen Lektion (sie überträgt ein festgelegtes Byte). Du musst sie so ändern, dass sie beliebige Bytes aus dem data_in-Eingang sendet.
Was zu tun ist:
- Füge ein
input [7:0]namensdata_inzur Portliste hinzu (innerhalb der Klammern). - Füge ein 10-Bit-
regnamensshift_regaußerhalb der Klammern hinzu (innerhalb des Modulrumpfs, da es sich um ein internes Signal handelt). - Wenn
cnt == 0undstart == 1gilt:- Lade
shift_regmit{1'b1, data_in, 1'b0}.
- Lade
- Wenn
cntzwischen 1 und 8 liegt:- Sende
tx <= shift_reg[0]. - Nach rechts schieben:
shift_reg <= shift_reg >> 1
- Sende
- Wenn
cnt == 9gilt:- Sende
tx <= shift_reg[0]. - Nach rechts schieben:
shift_reg <= shift_reg >> 1
- Sende
Probier es selbst
module uart_tx (
input clk,
input start, // NEW: Startsignal zum Beginn der Übertragung
output reg tx, // NEW: serielle Ausgangsleitung
output reg [3:0] cnt // Als Ausgang zum Testen belassen
);
initial begin
cnt = 0;
tx = 1; // NEW: tx auf HIGH setzen (Ruhezustand)
end
always @(posedge clk) begin
// NEW: Zählerlogik mit Startbedingung
if (cnt == 0 && start) begin // NEW: Übertragung starten
cnt <= 1;
end
else if (cnt > 0 && cnt < 9) begin // NEW: während der Übertragung zählen
cnt <= cnt + 1;
end
else if (cnt == 9) begin // NEW: nach dem letzten Bit zurücksetzen
cnt <= 0;
end
end
endmoduleAlle 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 erstellenÜbe selbstständig: Online-Verilog-Compiler