Table of Contents

UART Receiver mit FPGA und VHDL

Zurück zur Themenübersicht

Aufgabenstellung

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

Vorbereitung

Projekt aktualisieren

Aktualisieren Sie das dtlab Projekt mit

cd ~/projects/dtlab
git pull

VHDL toplevel top_uart

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. In das Modul wird zusätzlich zu dem vorhanden UART Transmitter jetzt der UART Receiver eingebaut. Die Gesamtschaltung kann dann senden und empfangen.

Die UART

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

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 Testbench "t_top_uart" dient zur Simulation von “top_uart”. Dort ist ein simulierter UART Transmitter mit 57600 Baud enthalten.

uart_rx_edge

Die Komponente “uart_rx_edge” enthält einen Flankendetektor und eine Synchronisierstufe. Das Modul sorgt dafür, dass das Flankenerkennungssignal “edge” aktiv wird, bevor das Signal an “rxd_o” von 1 auf 0 geht.

Im Timingdiagramm in Abbildung 3 sind die Signale uart_rxd_sync und edge dargestellt. Ihr Timingdiagramm soll erläutern wie es dazu kommt und wie sich UART_RXD dazu verhält.

uart_rx_baudcnt

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. Dieses Timing beruht auf dem eigenen Systemtakt. Im Timingdiagramm in Abbildung 3 ist der Signalverlauf uart_rxd_sync dargestellt, der in der Abbildung perfekt zu dem Zähler “baudcnt” passt. Das echte System erzeugt die UART Signale allerdings mit einer abweichenden Frequenz. Bei der Konstruktion des Baudzähler geht man einfach davon aus, dass die eigene Taktfrequenz perfekt ist.

Jetzt sollte das Modul “uart_rx_baudcnt” fertig sein. Es muss später im Gesamtmodell noch die korrekte Funktion unter Beweis stellen.

uart_rx_shift

Das Modul "uart_rx_shift" dient zum Empfang der Daten, die an UART_RXD ankommen. Die Daten von UART_RXD gehen allerdings erst durch die Synchronisierstufe in “uart_rx_edge” und werden um zwei Takte verzögert.

Jetzt muss das Schiebesignal “shift_i” zum richtigen Zeitpunkt wie in Abbildung 3 dargestellt kommen. Das Schiebesignal wird vom Modul “uart_rx_bitcnt” erzeugt. Prüfen Sie im Simulator die Funktion des Schieberegister zunächst mit einem kurzen Code, der das Schiebesignal zweimal aktiviert.

uart_rx_bitcnt

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.

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 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

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.

sudo screen /dev/ttyUSB0 57600
gtkterm --port /dev/ttyUSB0 --speed 57600 --echo

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.