Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
dtlab_t9 [2024/05/28 14:26] beckmanf [uart_rx_baudcnt] |
dtlab_t9 [2025/03/14 20:51] (current) beckmanf switch code server |
||
---|---|---|---|
Line 17: | Line 17: | ||
==== VHDL toplevel top_uart ==== | ==== 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. Das ist der gleiche toplevel wie bei der letzten Aufgabe. | + | 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 ==== | ==== Die UART ==== | ||
Line 25: | Line 25: | ||
* 57600 Baud | * 57600 Baud | ||
* Acht Datenbits, kein Paritybit | * Acht Datenbits, kein Paritybit | ||
- | * Zwei Stopbits | + | * Ein Stopbit |
Die Architektur des UART Receivers ist in Abbildung 1 dargestellt. | Die Architektur des UART Receivers ist in Abbildung 1 dargestellt. | ||
Line 47: | Line 47: | ||
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. | 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://gitlab.elektrotechnik.hs-augsburg.de/beckmanf/dtlab/-/blob/master/src/uart_rx_baudcnt.vhd|"uart_rx_baudcnt"]], [[https://gitlab.elektrotechnik.hs-augsburg.de/beckmanf/dtlab/-/blob/master/src/uart_rx_bitcnt.vhd|"uart_rx_bitcnt"]], [[https://gitlab.elektrotechnik.hs-augsburg.de/beckmanf/dtlab/-/blob/master/src/uart_rx_shift.vhd|"uart_rx_shift"]] und [[https://gitlab.elektrotechnik.hs-augsburg.de/beckmanf/dtlab/-/blob/master/src/uart_rx.vhd|"uart_rx"]]sind als leere Architectures schon im Projekt vorhanden | + | * 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://gitlab.elektrotechnik.hs-augsburg.de/beckmanf/dtlab/-/blob/master/src/uart_rx_edge.vhd|"uart_rx_edge"]] Komponente enthält einen Flankendetektor und eine Verzögerungs- und Synchronisierstufe. | + | * 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 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 | * Instantiieren Sie "uart_rx" in "top_uart" gemäß Abbildung 2 | ||
* Überprüfen Sie die Struktur mit dem RTL Viewer aus der Synthese | * Ü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". Dort ist ein simulierter UART Transmitter mit 57600 Baud enthalten. | + | 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 | * Stellen Sie im Simulator sicher, dass die Daten korrekt empfangen werden | ||
Line 69: | Line 69: | ||
==== uart_rx_baudcnt ==== | ==== uart_rx_baudcnt ==== | ||
- | Das Modul [[https://gitlab.elektrotechnik.hs-augsburg.de/beckmanf/dtlab/-/blob/master/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. | + | 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". | * Entwerfen Sie eine Architektur für "uart_rx_baudcnt". | ||
Line 84: | Line 84: | ||
==== uart_rx_shift ==== | ==== uart_rx_shift ==== | ||
- | Das Modul [[https://gitlab.elektrotechnik.hs-augsburg.de/beckmanf/dtlab/-/blob/master/src/uart_rx_shift.vhd|"uart_rx_shift"]] dient zum Empfang der Daten, die an UART_RXD ankommen. | + | 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 an UART_RXD seriell in das Schieberegister übernommen werden. | + | * 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 | * Zeichnen Sie die Architektur auf Papier auf | ||
- | * Zeigen Sie die Funktion der Gesamtuart im Simulator | + | * 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 ==== | ==== uart_rx_bitcnt ==== | ||
- | Das Modul [[https://gitlab.elektrotechnik.hs-augsburg.de/beckmanf/dtlab/-/blob/master/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. | + | 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 wird von dem Signal der Flankenerkennung "edge_i" und dann von den Signalen vom Baudcounter "uart_rx_baudcnt" beeinflusst. | ||
Line 109: | Line 114: | ||
==== Software auf dem Rechner ==== | ==== Software auf dem Rechner ==== | ||
- | 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 [[https://www.putty.org|putty]]. | + | 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 oder MacOS kann man "screen" als terminal verwenden | + | Auf dem Rechner wird ein Terminalprogramm benötigt, mit dem die Daten von der seriellen Schnittstelle angezeigt werden können. |
- | * 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. | + | * Unter MacOS ist ''screen'' vorinstalliert und kann so verwendet werden: |
<code> | <code> | ||
Line 119: | Line 124: | ||
</code> | </code> | ||
- | * Unter MacOS ist kein sudo notwendig | + | * 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. | 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. | ||