====== UART Transmitter mit FPGA und VHDL ======
[[dtlab_start|Zurück zur Themenübersicht]]
===== Aufgabenstellung =====
Bauen Sie einen UART Transmitter und senden Sie über die UART Schnittstelle Buchstaben vom FPGA zu einem angeschlossenen Rechner.
===== Vorbereitung =====
==== Projekt aktualisieren ====
Aktualisieren Sie das dtlab Projekt mit
cd ~/projects/dtlab
git pull
==== VHDL toplevel top_uart ====
Die Datei [[https://gitlab.elektrotechnik.hs-augsburg.de/beckmanf/dtlab/-/blob/master/src/top_uart.vhd|top_uart.vhd]] beschreibt das Modul "top_uart". "top_uart" stellt den toplevel auf dem FPGA dar.
==== Die UART ====
Auf dem FPGA soll ein UART Transmitter aufgebaut werden, mit dem man Zeichen an einen Rechner schicken kann. Die Übertragung hat die folgenden Parameter
* 57600 Baud
* Acht Datenbits, kein Paritybit
* Zwei Stopbits
Die Architektur ist in Abbildung 1 dargestellt.
{{ :public:praktikum_digitaltechnik:dt-uart-tx-simple.svg |UART Transmitter}}
{{ :public:praktikum_digitaltechnik:dt-uart-tx-simple.svg?linkonly |Abbildung 1}}: UART Transmitter Architektur auf dem FPGA
Wenn man auf den KEY1 drückt, dann sollen die Daten an den Schaltern SW[7..0] über die UART seriell übertragen werden. Die Übertragungsgeschwindigkeit wird mit dem "baudcnt" Modul gesteuert.
{{ :public:praktikum_digitaltechnik:dt-uart-tx-timing.svg |}}
{{ :public:praktikum_digitaltechnik:dt-uart-tx-timing.svg?linkonly |Abbildung 2}}: UART Transmitter Timing
In Abbildung 2 ist das Timing der Schaltung für eine Bitdauer von drei Systemtakten dargestellt. Das wäre eine Baudrate von 16,6 MBit/s bei einer Systemtaktfrequenz von 50 MHz. Das wäre also viel zu schnell. So kann aber das Zusammenspiel der Komponenten "baudcnt" und "uart_tx_shift" einfacher dargestellt werden.
* Die Komponenten [[https://gitlab.elektrotechnik.hs-augsburg.de/beckmanf/dtlab/-/blob/master/src/baudcnt.vhd|"baudcnt"]] und [[https://gitlab.elektrotechnik.hs-augsburg.de/beckmanf/dtlab/-/blob/master/src/uart_tx_shift.vhd|"uart_tx_shift"]] sind als leere Architectures schon im Projekt vorhanden
* Die [[https://gitlab.elektrotechnik.hs-augsburg.de/beckmanf/dtlab/-/blob/master/src/edge.vhd|"edge"]] Komponente enthält den Flankendetektor aus den vorherigen Projekten
* Instantiieren Sie die Komponenten "baudcnt" und "uart_tx_shift" in "top_uart" und verbinden Sie die Komponenten gemäß Abbildung 1
* Überprüfen Sie die Struktur mit dem RTL Viewer aus der Synthese
Die Testbench [[https://gitlab.elektrotechnik.hs-augsburg.de/beckmanf/dtlab/-/blob/master/src/t_top_uart.vhd|"t_top_uart"]] dient zur Simulation von "top_uart".
* Stellen Sie im Simulator sicher, dass das Signal "start" bei einem simulierten Tastendruck an KEY1 korrekt erzeugt wird
==== baudcnt ====
Das Modul [[https://gitlab.elektrotechnik.hs-augsburg.de/beckmanf/dtlab/-/blob/master/src/baudcnt.vhd|"baudcnt"]] steuert die Übertragungsrate wie in Abbildung 2 dargestellt. Das Enablesignal sorgt im "uart_tx_shift" Modul dafür, dass das nächste Bit ausgegeben wird.
* Entwerfen Sie eine Architektur für "baudcnt", die das Enablesignal wie in Abbildung 2 dargestellt erzeugt.
* Die Architektur soll auch für eine Baudrate von 57600 Baud geeignet sein.
* Zeichnen Sie die Architektur auf Papier auf
* Was muss man für eine Baudrate von 57600 Baud in baudcnt einstellen?
* Zeigen Sie die Funktion im Simulator wie in Abbildung 2
==== uart_tx_shift ====
Das Modul [[https://gitlab.elektrotechnik.hs-augsburg.de/beckmanf/dtlab/-/blob/master/src/uart_tx_shift.vhd|"uart_tx_shift"]] dient zur Serialisierung des 8 Bit Datenwortes, das von den Schaltern SW[7..0] kommt.
* Entwerfen Sie eine Architektur für das Modul "uart_tx_shift", mit der die Daten serialisiert werden
* Das Modul soll auch das Startbit für die UART Übertragung erzeugen
* Zeichnen Sie die Architektur auf Papier auf
* Zeigen Sie die Funktion der Gesamtuart im Simulator
===== Labor =====
Im Labor gibt es ein FTDI-RS232 Kabel zum Anschluss eines Rechners an eine RS-232 Schnittstelle. Auf dem FPGA Board ist ein MAX232 Chip mit dem die 3,3V Logiksignal auf RS-232 (+7/-7V) Niveau gewandelt werden. Das Kabel enthält einen [[https://ftdichip.com/products/ft231xq/|USB-UART Konverterchip von FTDI]]. Das Kabel kann also per USB an einen Rechner angeschlossen werden.
{{ :dt-ftdi-uart.jpg?600 | FTDI RS-232 Kabel}}
Abbildung 3: FTDI RS-232 Kabel
==== Software auf dem Rechner ====
Nach dem Einstecken des Modems erscheint unter /dev/ttyXXXXXXX ein neues Device. Unter Linux ist dies /dev/ttyUSB0, unter MacOS ist dies /dev/tty.usbserial-DM000IKG
Auf dem Rechner wird ein Terminalprogramm benötigt, mit dem die Daten von der seriellen Schnittstelle angezeigt werden können.
* Unter MacOS ist ''screen'' vorinstalliert und kann so verwendet werden:
sudo screen /dev/ttyUSB0 57600
* Unter MS Windows kann [[https://www.putty.org|putty]] installiert und genutzt werden.
* Unter Linux ist bei unseren virtuellen Maschinen ''gtkterm'' installiert und kann direkt so gestartet werden:
gtkterm --port /dev/ttyUSB0 --speed 57600 --echo
Stellen Sie auf dem FPGA Board über die Schalter verschiedende Zeichen ein und übertragen Sie das Zeichen an den Rechner.
Die [[https://de.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange#Zusammensetzung|ASCII Tabelle]] zeigt die Codes für die verschiedenen Buchstaben.