Show pageOld revisionsBacklinksBack to top This page is read only. You can view the source, but not change it. Ask your administrator if you think this is wrong. ====== UART Receiver mit FPGA und VHDL ====== [[dtlab_start|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 <code> cd ~/projects/dtlab git pull </code> ==== VHDL toplevel top_uart ==== Die Datei [[https://caeis.etech.fh-augsburg.de/beckmanf/dtlab.git/tree/src/top_uart.vhd|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 * 57600 Baud * Acht Datenbits, kein Paritybit * Ein Stopbit Die Architektur des UART Receivers ist in Abbildung 1 dargestellt. {{ :public:praktikum_digitaltechnik:uart-rx-simple.svg |UART Receiver}} {{ :public:praktikum_digitaltechnik:uart-rx-simple.svg?linkonly |Abbildung 1}}: UART Receiver Architektur auf dem FPGA Der Receiver soll wie in Abbildung 2 dargestellt auf dem toplevel eingebaut werden. {{ :public:praktikum_digitaltechnik:uart-rx.svg |UART Receiver auf toplevel}} {{ :public:praktikum_digitaltechnik:uart-rx.svg?linkonly |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. {{ :public:praktikum_digitaltechnik:uart-rx-timing.svg | UART Receiver Timing}} {{ :public:praktikum_digitaltechnik:uart-rx-timing.svg?linkonly |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 [[https://caeis.etech.fh-augsburg.de/beckmanf/dtlab.git/tree/src/uart_rx_baudcnt.vhd|"uart_rx_baudcnt"]], [[https://caeis.etech.fh-augsburg.de/beckmanf/dtlab.git/tree/src/uart_rx_bitcnt.vhd|"uart_rx_bitcnt"]], [[https://caeis.etech.fh-augsburg.de/beckmanf/dtlab.git/tree/src/uart_rx_shift.vhd|"uart_rx_shift"]] und [[https://caeis.etech.fh-augsburg.de/beckmanf/dtlab.git/tree/src/uart_rx.vhd|"uart_rx"]]sind als leere Architectures schon im Projekt vorhanden * Die [[https://caeis.etech.fh-augsburg.de/beckmanf/dtlab.git/tree/src/uart_rx_edge.vhd|"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 [[https://caeis.etech.fh-augsburg.de/beckmanf/dtlab.git/tree/src/t_top_uart.vhd|"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 ==== 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. * Analysieren Sie den VHDL Code in "uart_rx_edge". * Zeichnen Sie die Schaltung auf Papier * ErlĂ€utern Sie das Verhalten mit einem Timingdiagramm in dem die Signale UART_RXD, uart_rxd_sync, sr, edge und clk vorkommen 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 [[https://caeis.etech.fh-augsburg.de/beckmanf/dtlab.git/tree/src/uart_rx_baudcnt.vhd|"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. * Entwerfen Sie eine Architektur fĂŒr "uart_rx_baudcnt". * Die Architektur soll fĂŒr eine Baudrate von 57600 Baud geeignet sein. * Fangen Sie zunĂ€chst mit einer Bitdauer von 4 Takten an, wie in Abbildung 3 dargestellt. * Der Eingang "sres_i" hat die Funktion eines high aktiven, synchronen Resets. * Zeichnen Sie die Architektur auf Papier auf * Instantiieren Sie das Modul in "uart_rx". * Der Eingang "sres_i" wird spĂ€ter von dem jetzt noch nicht vorhandenen Modul "uart_rx_bitcnt" erzeugt. Schreiben Sie direkt in "uart_rx" einen kurzen Code fĂŒr den Simulator, der das Signal fĂŒr 30 Takt auf '0', dann fĂŒr drei Takte auf '1' und dann wieder auf '0' setzt. * Zeigen Sie die Funktion im Simulator wie in Abbildung 3, d.h. zeigen Sie, dass en_h und en_f korrekt erzeugt werden. 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 [[https://caeis.etech.fh-augsburg.de/beckmanf/dtlab.git/tree/src/uart_rx_shift.vhd|"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. * Entwerfen Sie eine Architektur fĂŒr das Modul "uart_rx_shift", mit der die Daten am Eingang "ser_i" seriell in das Schieberegister ĂŒbernommen werden. * Zeichnen Sie die Architektur auf Papier auf * Schreiben Sie den VHDL Code fĂŒr das Schieberegister * Instantiieren Sie das Modul in "uart_rx" 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 [[https://caeis.etech.fh-augsburg.de/beckmanf/dtlab.git/tree/src/uart_rx_bitcnt.vhd|"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 ===== 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: <code> sudo screen /dev/ttyUSB0 57600 </code> * 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: <code> gtkterm --port /dev/ttyUSB0 --speed 57600 --echo </code> Tippen Sie im Terminalprogramm Zeichen ein und beobachten Sie, ob die Zeichen korrekt auf den roten LEDs angezeigt werden. Die [[https://de.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange#Zusammensetzung|ASCII Tabelle]] zeigt die Codes fĂŒr die verschiedenen Buchstaben. dtlab_t9.txt Last modified: 2025/03/14 20:51by beckmanf