Forum: FPGA, VHDL & Co. FIFO für Videodaten ohne Prozessor (Spartan 6)


von D. S. (des)


Lesenswert?

Hallo zusammen,

ich möchte einen FIFO realisieren (wenn möglich mit einem externen DDR3 
RAM). Für das RAM habe ich schon ein vorbereitetes MIG Projekt passend 
zu meinem Board, auf das ich aufbauen könnte.

Was ich speichern muss:
- ein komplettes Bild ca 1400x600 (RGB888)
- Format: AXI4 (video) Stream mit 24bit Breite
- Geschwindigkeit ist erstmal nicht entscheidend, gut wäre, wenn so mit 
1 bis 2 Bildern pro Sekunde ausgelesen und geschrieben werden kann

Was ich an HW habe
- Spartan 6 XC6SLX45 auf einem Trenz TE0600 (und dazu passend das 
GigaBee TE0603)
- was ich NICHT habe ist ein Prozessorsystem (Projekt komplett in ISE)

Meine Bisherige Überlegung ist es vielleicht den Virtual FIFO von Xilinx 
zu nehmen. Nach meinem Verständnis realisiert der einfach einen FIFO und 
verwendet als Speicher einen externen DDR Speicher, der über ein AXI4 
Interface angesteuert wird (-> MIG Interface).

Meine Fragen:
- ist es überhaupt möglich diesen/ einen IP Core FIFO von Xilinx 
einzubinden OHNE ein Prozessorsystem, das alles überwacht?
- der Virtual FIFO hat 32bit Breite am Ein- und Ausgang -> lässt sich 
das überhaupt mit einem 24bit breitem Signal verbinden (zB indem man die 
übrigen Bits einfach auf '0' zieht)?
- würden sich einzelne Zeilen ansonsten auch direkt auf dem FPGA 
speichern lassen oder ist er dafür nicht groß genug (bzw das nicht 
sinnvoll)?

Vielen Dank schon mal

von Christian B. (casandro)


Lesenswert?

Im Prinzip sollte das relativ einfach gehen. Du hast 2 taktgesteuerte 
Einheiten die jeweils eine Adresse hochzählen, den Zählerstand auf den 
Speichercontroller geben und den daraus kommenden Wert auf die Ports 
geben. (bzw in den Speicher schreiben)

Das Komplexe wird der Speichercontroller sein, den kriegst Du aber 
bestimmt wo fertig.

Oder Du machst das mit 2 Videorekordern: ;)
http://www.youtube.com/watch?v=fezrsTAf5x0

von Franke (Gast)


Lesenswert?

D. S. schrieb:
> 1 bis 2 Bildern pro Sekunde ausgelesen und geschrieben werden kann

mit etwas Geschick geht das in Echtzeit rein / raus.

von Cihan K. (lazoboy61)


Lesenswert?

D. S. schrieb:
> - ist es überhaupt möglich diesen/ einen IP Core FIFO von Xilinx
> einzubinden OHNE ein Prozessorsystem, das alles überwacht?

ja ist möglich, hab ich auch drin.

> - der Virtual FIFO hat 32bit Breite am Ein- und Ausgang -> lässt sich
> das überhaupt mit einem 24bit breitem Signal verbinden (zB indem man die
> übrigen Bits einfach auf '0' zieht)?

du kannst auch ein Fifo vom CoreGenerator generieren der nur 24 Bit In- 
und Output hat. Könntest aber wenn du 32 Bits behalten willst den Rest 
mit Nullen füllen, die ja sowieso nach der Synthese rausfallen werden. 
Also gleich das was man braucht verwenden.

> - würden sich einzelne Zeilen ansonsten auch direkt auf dem FPGA
> speichern lassen oder ist er dafür nicht groß genug (bzw das nicht
> sinnvoll)?

Der interne BlockRam sollte das schaffen können. Aber wenn du es sowieso 
nur auf dem Ext. Ram speichern willst, verwendest du den Fifo(Blockram) 
ja nur als Pipeline zum DDR3 Ram, im grunde genommen brauchst du dann 
nicht viel Zwischenspeicher.

Cihan

von D. S. (des)


Lesenswert?

Cihan Kalayci schrieb:
> D. S. schrieb:
>> - ist es überhaupt möglich diesen/ einen IP Core FIFO von Xilinx
>> einzubinden OHNE ein Prozessorsystem, das alles überwacht?
> ja ist möglich, hab ich auch drin.

Von welchem sprichst du da? - dem Virtual FIFO Controller oder den FIFO 
Generator? Die Datenbreite kann ich bei beiden nicht auf 24bit Breite 
stellen.

Der Virtual FIFO enthält noch massenweise Statussignale, die braucht man 
doch eigentlich für die Grundfunktion nicht, oder? Was macht man dann am 
besten mit diesen ungenutzen Ports? (Oder finden die alle beim MIG 
Verwendung?)

von Christian R. (supachris)


Lesenswert?

Ich glaube, du siehst das viel zu kompliziert. Ich denke, du hast zwei 
Möglichkeiten, das schnell und unkompliziert zu machen:

1. Die Übertragung zum PC ist im Mittel schneller als die Bild-Daten 
eintreffen und es tut keinem weh, wenn was verloren geht: Dann kannst du 
die Bild-Daten zusammen mit den Steuersignalen in einen 32 Bit breiten 
FIFO schieben und auf der anderen Seite mit dem GbE Takt wieder 
herausholen und dir die UDP Pakete zusammen bauen. Die Auswertung, wann 
eine Zeile und ein neues Bild anfängt, machst du dann auf dem PC, denn 
in dem zusätzlichen Byte hast du dann die Bild-Steuersignale. Hat 
allerdings den nachteil, dass im Bild auch mal Pixel fehlen können, wenn 
du zu langsam auf der PC Seite bist.
Das ist meiner Meinung nach der einfachste Weg und du kommst komplett 
ohne den AXI Quatsch und einen externen Speicher aus, denn du musst kein 
ganzes Bild puffern. Einen FIFO brauchst du sowieso nur, wenn du im 
Mittel gleich schnell lesen wie schreiben kannst.

2. Die Übertragung zum PC ist langsamer als die Bilddaten und es darf 
nichts während des Bildes verloren gehen: Dann würde ich ohne FIFO 
arbeiten und das komplette Bild (Auswertung der Frame-Sync Signale im 
FPGA) in den externen Speicher schreiben. Wenn das erledigt ist, wird 
das Bild zum PC übertragen. Hierbei hast du alle Zeit der Welt, in 
dieser Zeit ist das Schreiben neuer Bild-Dtaen abgeschaltet. Erst wenn 
das Bild am PC ist, schreibst du wieder ein Bild rein. Ist dann so wie 
beim Speicher-Oszilloskop. Hat den nachteil, dass du dich auch noch mit 
dem RAM Controller rumschlagen musst, aber den Vorteil dass du immer ein 
ganzes Bild überträgst und damit zumindest an der Stelle keine Pixel 
verloren gehen. UDP bleibts ja weiterhin, da ist eh keine 
Datensicherheit.

von Informatiker (Gast)


Lesenswert?

Cihan Kalayci schrieb:
> Fifo vom CoreGenerator generieren der nur 24 Bit In-
> und Output hat. Könntest aber wenn du 32 Bits behalten willst den Rest
> mit Nullen füllen

oder man acht es ganz schlau und stellt ihn auf 24:96 und einen weiteren 
auf 96:32, um etwas entspannter reinschreiben zu können.

von D. S. (des)


Angehängte Dateien:

Lesenswert?

ich muss da nochmal nachhaken - ich hab die Cores erzeugt und zum Teil 
eingebunden (ich will das jetzt machen mit Virtual Fifo Controller und 
MIG), aber bin mir ist noch nicht ganz klar, wie viele Ports ich beim 
MIG zum Virtual FIFO brauche.

Der Virtual FIFO hat ja eigentlich zwei Ausgänge, einen zum Schreiben 
und einen zum Lesen (Komponentendeklaration siehe vfifo_signals.vhdl). 
Also habe ich mir gedacht, dass der MIG eingangsseitig auch zwei 32bit 
AXI4 Ports braucht, einen zum Lesen und einen zum Schreiben und habe 
zwei unidirektionale Ports ausgewählt. Jetzt habe ich aber folgende 
Komponentendeklaration erhalten (siehe mig.vhdl), die aus meiner Sicht 
die doppelte Anzahl an Signalen erhält.

Könnt ihr mir helfen, wo da mein Denkfehler ist? Es bleiben ja sonst die 
Hälfte der Signale übrig.

Jetzt hab ich nochmal ein MIG Core erstellt und diesmal mit einem 
einzelnen bidirektionalen Port (mig_2.v, die Deklaration hab ich noch 
nicht in VHDL umgeschrieben, Namen sind aber die gleichen). Jetzt würde 
das von der Anzahl der Signale zusammenpassen. Aber ist das so noch 
korrekt? Braucht der Virtual Fifo nur einen einzigen bidirektionalen 
Port um auf den Speicher zuzugreifen?

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.