Uart wann mit FIFO und wann ohne

Gast #2144595
Lesenswert?

Es ist eigentlich eine Grundsätzliche Frage.
Wann setzt mann bei einem UART ein FIFO ein?

Hintergrund:
Verwende im Projekt zwei UART. "MUSS"
Fertige IP-Core. Beide eigentlich mit Rx- Tx-FIFO.

Problem:
Das Entwicklungsprogramm gibt aber nun einen Fehler aus. Und zwar das 
ich beide UARTs nicht verwenden kann. Habe etwas rumgespielt und dabei 
heraus gefunden, das ich doch beide verwenden kann wenn ich einen UART 
ohne FIFO benutze.

Gruß
Marco
Gast #2144621
Lesenswert?

> Ein FIFO wird immer dann notwendig wenn du nicht in der Lage bist die
> Daten schnell genug abzuholen und zu verarbeiten.

Nicht ganz korrekt. Ein FIFO hilft dann, wenn du im Schnitt in der 
Lage bist, mit der Datenrate fertig zu werden, es aber einzelne zu hohe 
Peaks gibt (und dann aber wieder entsprechende "Täler"). Der FIFO 
verteilt die Last dann gleichmäßig. Bei einer dauerhaft zu hohen 
Datenrate hilft auch der FIFO nix, da muss dann die Verarbeitung 
verbessert werden.

Zusätzlich agiert der FIFO als Pipelinestufe, um Empfang der Daten und 
Verarbeitung zu parallelisieren.
Moderator (Firma: Titel) Persönliche Seite #2144637
Lesenswert?

Marco schrieb:
> Das Entwicklungsprogramm gibt aber nun einen Fehler aus. Und zwar das
> ich beide UARTs nicht verwenden kann.
Ob Fifo oder nicht, das ist dem Entwicklungsprogramm erst mal 
schnurzegal. Nur du hast hinterher Probleme, weil du Daten verlierst. 
Welchen Fehler bekommst du gemeldet?

> Habe etwas rumgespielt und dabei heraus gefunden, das ich doch beide
> verwenden kann wenn ich einen UART ohne FIFO benutze.
Dein Fehler liegt evtl. eher darin, dass der Fifo u.U. doppelt belegt 
würde...
Gast #2144689
Lesenswert?

Danke für die Hilfe, sehr hilfreich.
Werde dann wohl auf die FIFOs verzichten können.

Eine Frage habe ich noch:
ich (Gast) schrieb:
> Ein FIFO wird immer dann notwendig wenn du nicht in der Lage bist die
> Daten schnell genug abzuholen und zu verarbeiten.
> Z.B. wenn die Verarbeitung länger dauert als die Pause zwischen 2
> Zeichen.

Warum gibt es denn auch Tx FIFOs? Beim empfangen kann ich mir das mit 
dem Geschwindigkeitsproblem noch erklären.
Aber beim senden. Es ist doch egal ob ich die Daten in das FIFO schiebe 
und die Daten dann von dort in den UART gelangen, oder ob ich die Daten 
in den UART gebe.

Lothar Miller schrieb:
> Dein Fehler liegt evtl. eher darin, dass der Fifo u.U. doppelt belegt
>würde...

Habe ein bischen weiter geforscht und die Vermutung ist korrekt.
Ist aber ein komisches Design. Die IP-Core werden vom Programm bereit 
gestellt. Und dann kann man nicht mal zwei UART gleichzeitig verwenden, 
also ohne zwei FIFO.
Oder kann es sein das die FIFO extern von den UART generiert werden. 
Seperat von dem Entwicklungsprogramm. Und dieses stellt die FIFOs nur 
zur Verfügung?

Gruß
Marco
Gast #2144798
Lesenswert?

Marco schrieb:
> Warum gibt es denn auch Tx FIFOs? Beim empfangen kann ich mir das mit
> dem Geschwindigkeitsproblem noch erklären.
> Aber beim senden. Es ist doch egal ob ich die Daten in das FIFO schiebe
> und die Daten dann von dort in den UART gelangen, oder ob ich die Daten
> in den UART gebe.

Ein TX-FIFO verringert den zum Senden nötigen Softwareaufwand - 
zumindest in den Fällen, in denen die Nachrichten länger als 1 Zeichen, 
aber kürzer als die freie FIFO-Tiefe sind und daher die komplette 
Nachricht ins FIFO passt. Die Senderoutine wird dann ohne weiteres Zutun 
die ganze Nachricht auf einen Rutsch los.

Beim Senden ohne FIFO ist für jedes einzelne Zeichen eine 
Software-Aktion notwendig, sei es in einer pollenden Sendefunktion, in 
einer Interrupt-Routine, die das nächste Zeichen aus einem 
Pufferspeicher ins UART-TX-Register schaufelt (Soft-FIFO) oder in einer 
Task, wenn ein Multitaskingkern zum Einsatz kommt.
Gast #2144860
Lesenswert?

Was tritt denn nun für ein "Fehler" auf den die Entwicklungssoftware 
meldet? Sind die Resoucen im FPGA/CPLD alle, so dass der FIFO nicht 
reinpasst? Was ist es überhaupt für ein Baustein für den entwickelt 
wird?

Oder will vielleicht der Core eine spezielle Hardware-Resource des FPGAs 
für den FIFO verwenden, z.B. einen Ramblock? Dann könnte es helfen den 
Core umzukonfigurieren, falls möglich. Also so das z.B. generische 
Resourcen (LUTs und Flipflops) statt spezieller Resourcen genutzt 
werden. Oder den FIFO von der Speichertiefe zu verkleinern.

Anderen Falls schreib dir halt die UARTs und FIFOs selbst. Das sind 
jetzt keine so komplizierten Komponenten, dass das ewig dauern tät. Dazu 
findest du auch sicher auch viele Beispiele im Netz, aber schreib lieber 
selbst, einige Beispiele sind nicht gerade optimal implementiert.

Die FIFOs weglassen würde ich nur im Notfall. Das bremst meistens den 
Rest deutlich aus, weil du z.B. andauernd den UART abfragen musst um ja 
nix zu verpassen und beim Senden musst du nach jedem Zeichen warten.
Gast #2144935
Lesenswert?

Es sind noch ausreichend Resourcen vorhanden. Das habe ich überprüft.
Die Fehlermeldung gibt an das ein Device doppelt vorhanden ist.
Habe eben ein FIFO Dummy ohne Funktion implementiert und dann ging es. 
Es ist so, dass das FIFO extern vom eigentlichen IP-Core generiert wird.


Werde die UART auch selber schreiben mit FIFO. Der UART IP-Core von 
actel ist auch recht groß. Der verwendete CHIP hat 200k Gates und ein 
UART IP-Core verbraucht alleine 21% des FPGAs. Das ist doch recht viel.

Gruß
Marco

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren