[[dtlab_t9]]

This is an old revision of the document!


UART Receiver mit FPGA und VHDL

Bauen Sie einen UART Empfänger, der seriell Daten empfängt und dann an den roten LEDs anzeigt.

Aktualisieren Sie das dtlab Projekt mit

cd ~/projects/dtlab
git pull

Die Datei top_uart.vhd beschreibt das Modul “top_uart”. “top_uart” stellt den toplevel auf dem FPGA dar. Das ist der gleiche toplevel wie bei der letzten Aufgabe.

Auf dem FPGA soll zusätzlich zum dem UART Transmitter ein UART Receiver aufgebaut werden, mit dem man Zeichen von einem Rechner empfangen kann. Die Übertragung hat die folgenden Parameter

  • 57600 Baud
  • Acht Datenbits, kein Paritybit
  • Zwei Stopbits

Die Architektur des UART Receivers ist in Abbildung 1 dargestellt.

UART Receiver

Abbildung 1: UART Receiver Architektur auf dem FPGA

Der Receiver soll wie in Abbildung 2 dargestellt auf dem toplevel eingebaut werden.

UART Receiver auf toplevel

Abbildung 2: UART Receiver auf toplevel

Die Daten kommen auf UART_RXD seriell an. Nach dem Empfang werden die acht empfangenen Datenbits auf den roten LEDs dargestellt.

 UART Receiver Timing

Abbildung 3: UART Receiver Timing

In Abbildung 3 ist das Timing der Schaltung für eine Bitdauer von vier Systemtakten dargestellt. Das wäre eine Baudrate von 15 MBit/s bei einer Systemtaktfrequenz von 50 MHz. Das wäre also viel zu schnell. So kann aber das Zusammenspiel der Komponenten einfacher dargestellt werden.

  • Die Komponenten "uart_rx_baudcnt", "uart_rx_bitcnt", "uart_rx_shift" und "uart_rx"sind als leere Architectures schon im Projekt vorhanden
  • Die "uart_rx_edge" Komponente enthält einen Flankendetektor und eine Verzögerungs- und Synchronisierstufe.
  • Instantiieren Sie die Komponenten “uart_rx_bitcnt”, “uart_rx_baudcnt”, “edge” und “uart_rx_shift” in “uart_rx” und verbinden Sie die Komponenten gemäß Abbildung 1
  • Instantiieren Sie “uart_rx” in “top_uart” gemäß Abbildung 2
  • Überprüfen Sie die Struktur mit dem RTL Viewer aus der Synthese

Die Testbench "t_top_uart" dient zur Simulation von “top_uart”. Dort ist ein simulierter UART Transmitter mit 57600 Baud enthalten.

  • Stellen Sie im Simulator sicher, dass die Daten korrekt empfangen werden

Das Modul "uart_rx_baudcnt" sorgt für das Timing der Bits. Es wird ein Signal “en_f_o” am Ende eines Bits und das Signal “en_h_o” zur Hälfte der Bitzeit ausgegeben.

  • Entwerfen Sie eine Architektur für “uart_rx_baudcnt”.
  • Die Architektur soll für eine Baudrate von 57600 Baud geeignet sein.
  • Zeichnen Sie die Architektur auf Papier auf
  • Zeigen Sie die Funktion im Simulator wie in Abbildung 3

Das Modul "uart_rx_shift" dient zum Empfang der Daten, die an UART_RXD ankommen.

  • Entwerfen Sie eine Architektur für das Modul “uart_rx_shift”, mit der die Daten an UART_RXD seriell in das Schieberegister übernommen werden.
  • Zeichnen Sie die Architektur auf Papier auf
  • Zeigen Sie die Funktion der Gesamtuart im Simulator

Das Modul "uart_rx_bitcnt" zählt nicht nur die empfangenen Bits, sondern erzeugt gleichzeitig das “shift” Signal für das Schieberegister und setzt den Baudzähler “uart_rx_baudcnt” zurück.

  • Der Zähler wird von dem Signal der Flankenerkennung “edge_i” und dann von den Signalen vom Baudcounter “uart_rx_baudcnt” beeinflusst.
  • Der Zähler soll im Wartezustand auf 0 stehen.
  • Ein fallende Flanke an UART_RXD sorgt dafür, dass der Zähler auf 1 geht und der Baudzähler von 0 anfängt zu zählen.
  • Immer wenn der Baudzähler fertig ist, zählt der Bitzähler eins weiter
  • Bei der Hälfte der Bitzeit wird bei den richtigen Bits das Schieberegister geschoben

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 USB-UART Konverterchip von FTDI. Das Kabel kann also per USB an einen Rechner angeschlossen werden.

 FTDI RS-232 Kabel Abbildung 3: FTDI RS-232 Kabel

Auf dem Rechner wird ein Terminalprogramm benötigt, mit dem die Daten von der seriellen Schnittstelle angezeigt werden können. Auf Linux oder MacOS ist das “screen” und auf Windows putty.

  • Unter Linux oder MacOS kann man “screen” als terminal verwenden
  • 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
  • Unter Linux muss man das terminal als root starten und die Baudrate von 57600 Baud angeben.
sudo screen /dev/ttyUSB0 57600
  • Unter MacOS ist kein sudo notwendig

Tippen Sie im Terminalprogramm Zeichen ein und beobachten Sie, ob die Zeichen korrekt auf den roten LEDs angezeigt werden. Die ASCII Tabelle zeigt die Codes für die verschiedenen Buchstaben.

  • dtlab_t9.1716897941.txt.gz
  • Last modified: 2024/05/28 14:05
  • by beckmanf