Forum: FPGA, VHDL & Co. Uart wann mit FIFO und wann ohne


von Marco (Gast)


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

von ich (Gast)


Lesenswert?

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.

von Morin (Gast)


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.

von ich (Gast)


Lesenswert?

Ich habe nicht behauptet dass die Zeichen immer so schnell kommen durfen 
dass man sie nicht mehr verarbeiten kann.

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


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...

von Marco (Gast)


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

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


Lesenswert?

> Die IP-Core werden vom Programm bereit gestellt.
Welches denn?
>>> Das Entwicklungsprogramm gibt aber nun einen Fehler aus.
Welchen denn?

von ich (Gast)


Lesenswert?

Tx Fifo damit dein Programm nicht warten muss bis das Zeichen fertig 
übertragen wurde

von willibald (Gast)


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.

von Marco (Gast)


Lesenswert?

Zu der Frage welcher IP-Core.
Es ist CoreUART v4.2 von Actel und das Entwicklungsprogramm ist Libero 
v9.1

von Felix (Gast)


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.

von Marco (Gast)


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

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.