[[dtlab_t9]]

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
dtlab_t9 [2024/05/28 14:05]
beckmanf add rx timing and uart_rx_edge
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
 +
 +==== 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 ==== ==== 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. ​+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"​.
   * Die Architektur soll für eine Baudrate von 57600 Baud geeignet sein.   * 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   * Zeichnen Sie die Architektur auf Papier auf
-  * Zeigen Sie die Funktion im Simulator wie in Abbildung 3+  ​* 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 ==== ==== 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 93: 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önnenAuf 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 DeviceUnter 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ötigtmit 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/​ttyUSB0unter 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 103: 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.
  
  
  • dtlab_t9.1716897941.txt.gz
  • Last modified: 2024/05/28 14:05
  • by beckmanf