Forum: FPGA, VHDL & Co. UART-Core Doppeltbuffer


von Robert M. (andro86)


Lesenswert?

Guten Morgen zusammen,

ich hätte eine Verständnisfrage zum UART-Core von Altera Cyclone IV. In 
der Dokumentation dazu steht ja geschrieben, das ankommende Datenblöcke 
zurerst ins Shift-Register gelangen und von dort ins Holding-Register 
geshiftet werden. Aus Letzterem werden sie dann auch ausgelesen und nach 
dem Auslesen ist das Holding-Register leer. Doch was ist mit dem 
Shift-Register? Mal angenommen es werden irrtümlich zwei Datenblöcke 
geschickt. Im Zustand 1 befindet sich Datenblock 1 im Holding-Register 
und Datenblock2 im Shift-Register. Nun wird das Holding-Register 
ausgelesen und danach sofort die UART-Schnittstelle geschlossen (z.B. 
durch die Software oder durch einen Fehler). Nun ist das 
Holding-Register durch das Auslesen geleert, doch was ist mit dem 
Shift-Register? Hält es das Datenblock2 solange bis in einem neuen 
Stream ein neuer Datenblock ankommt?
Für den Fall das es so ist, wie könnte man den das Shift-Register wieder 
löschen?

Ich frage gerade, weil ich versuche mittels FPGA eine UART-Schnittstelle 
zu einem Host-Rechner zu implementieren. Der verkehrende Datenstream 
verläuft dabei über ein externes USB-Modul, dessen Rx- und Tx-Pins den 
GPIOs meines Cyclone IV verbunden sind. Mein Problem ist jetzt 
folgendes, sobald ich die Versorgung auf das USB-Modul schalte, sendet 
und empfängt es bereits Daten. Und ich vermute, dass der Datenblock, der 
zum FPGA gesendet wird, im Shift-Register gespeichert wird. Meine 
Vermutung beruht darauf, dass wenn ich die UART-Verbindung aufbaue und 
Daten an mein FPGA sende, mein geschriebener Datenbuffer  an seiner 
ersten Stelle bereits mit einem Datenblock (den ich nicht gesendet habe) 
belegt ist.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Robert M. schrieb:
> Nun ist das Holding-Register durch das Auslesen geleert, doch was ist
> mit dem Shift-Register?
Definiere "leer". Wie sollte denn ein "leeres" Flipflop aussehen?

> Und ich vermute, dass der Datenblock, der zum FPGA gesendet wird, im
> Shift-Register gespeichert wird. Meine Vermutung beruht darauf, dass
> wenn ich die UART-Verbindung aufbaue und Daten an mein FPGA sende, mein
> geschriebener Datenbuffer  an seiner ersten Stelle bereits mit einem
> Datenblock (den ich nicht gesendet habe) belegt ist.
Rätselstunde...
Wie wäre es, wenn du mal untersuchst, warum da was versendet wird?

Fazit insgesamt: Du denkst viel zu abstrakt und softwarelastig.

Da ist im FPGA nicht irgendein unbestimmter Buffer, der irgendwelche 
zufälligen Daten auf nicht nachvollziehbare wunderbare Weise versendet.
Sondern da sind lediglich Flipflops, die genau das tun, was ihnen die 
vorgeschaltete Kombinatorik sagt. Wenn da also was versendet wird, gibt 
es einen definierten Grund dafür.
Denn schon nach dem Anlegen der Versorgung an ein FPGA wird die 
Konfiguration aus dem Flash geladen und mit durchaus definierten Werten 
die Arbeit aufgenommen.

von Robert M. (andro86)


Lesenswert?

Lothar M. schrieb:
> Robert M. schrieb:
>> Nun ist das Holding-Register durch das Auslesen geleert, doch was ist
>> mit dem Shift-Register?
> Definiere "leer". Wie sollte denn ein "leeres" Flipflop aussehen?

Ja dann ist es nicht "leer", sondern auf Low-Pegel?
Ist es denn für gewöhnlich so, dass wenn man das UART initialisiert, als 
erstes das Low-Pegel aus dem Register gelesen wird?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Robert M. schrieb:
> Ja dann ist es nicht "leer", sondern auf Low-Pegel?
Ich vermute eher, dann gibt es irgendwo ein zusätzliches Bit, das den 
Inhalt (egal welchen) als "leer" markiert...

> Ist es denn für gewöhnlich so, dass wenn man das UART initialisiert, als
> erstes das Low-Pegel aus dem Register gelesen wird?
Aus welchem Register?
Mein Vorschlag: schreib einfach selber mal ein kleines RS232 Modul. Dann 
wird dir das recht schnell klar, wie da irgendwelche Buffer miteinander 
interagieren könnten.
Nim z.B. mal das da: http://www.lothar-miller.de/s9y/categories/42-RS232
Dort gibt es das "Holding" Register nicht. Das Schieberegister wird 
direkt auf den Ausgang abgebildet.
Wenn ich da so ein "Holding" Register wollte, dann müsste ich diese 
kleine Änderung machen:
1
   :
2
   :
3
   -- Empfangen
4
   process begin
5
      wait until rising_edge(CLK);
6
      rxd_sr <= rxd_sr(rxd_sr'left-1 downto 0) & RXD;
7
      if (rxbitcnt<9) then    -- Empfang läuft
8
         if(rxcnt<(Quarz_Taktfrequenz/Baudrate)-1) then 
9
            rxcnt    <= rxcnt+1;
10
         else
11
            rxcnt    <= 0; 
12
            rxbitcnt <= rxbitcnt+1;
13
            rxsr     <= rxd_sr(rxd_sr'left-1) & rxsr(rxsr'left downto 1);
14
         end if;
15
      else -- warten auf Startbit
16
         RX_Data <= rxsr;     -- mit dieser Änderung werden die empfangenen Daten nochmal gepuffert
17
         if (rxd_sr(3 downto 2) = "10") then
18
            rxcnt    <= ((Quarz_Taktfrequenz/Baudrate)-1)/2;
19
            rxbitcnt <= 0;
20
         end if;
21
      end if;
22
   end process;
23
24
   RX_Busy <= '1' when (rxbitcnt<9) else '0';


Und wie gesagt verbleibt noch die Frage: welche Daten werden in deinem 
Fehlerfall warum versendet?

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Hier habe ich gerade ein Artikel über einen Uart mit Puffer(FIFO) 
geschrieben. Da geht nichts verloren.


http://www.dossmatik.de/ghdl/GHDL_uart_sim.pdf
http://www.dossmatik.de/ghdl/UART.zip

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.