Forum: FPGA, VHDL & Co. Pipeline -> Nios


von Viktor Bronder (Gast)


Lesenswert?

Guten Tag zusammen,

ich habe im März mit FPGA angefangen und komme soweit ganz gut zurecht 
habe jetzt aber ein kleines Problem bei welchem ich etwas Hilfe brauchen 
könnte...

Es geht um ein Kamerasystem welches die Daten über Ethernet ausgeben 
soll.
Die Daten kommen aus der Kamera und landen in einer Pipeline welche dann 
an den Daten herumrechnet.

Parallel läuft auf dem FPGA eine Nios 2 Embedded CPU welche sich um das 
TCP/IP und die I2C Konfiguration der Kamera übernehmen soll. I2C 
funktioniert bereits aber nun stehe ich vor dem Problem das die Daten 
aus der Pipeline irgendwie in die CPU müssen.

Ich habe hier ein DE2-115 Board von Altera/Terasic und habe die Daten 
aus der Pipeline bisher testweise ins SRAM geschrieben und dann über das 
"Control Panel" ausgelesen um zu testen ob bis zum Ende der Pipeline 
alles richtig funktioniert.

Das Nios System besteht bisher aus einer Clock, der CPU, 
128MB-SDRAM,sysid,parallel-out und einer I2C-Schnittstelle. Die Clock 
hat 125MHz, die Pipeline rechnet mit 20 MHz.

Nun ist mein Problem wie ich die Daten aus der Pipeline in die CPU bzw. 
das RAM bekomme... ein PIO als Input wird wohl vermutlich zu langsam 
arbeiten und bei weitem nicht synchron genug werden. Momentan lade ich 
das NIOS C-Programm noch in den SRAM könnte dafür aber noch etwas 
On-Chip RAM/ROM anlegen um den SD-RAM für die Pipeline frei zu machen.

Die Pipeline liefert etwa zu 50% der Zeit Daten mit 20 MHz, die CPU kann 
die Daten schneller aus dem RAM holen daher sollte das wohl machbar 
sein.

Meine Frage ist nun wie ich das ganze konkret im QSYS vernünftig 
umsetze.
Soll ich einen DMA Controller nutzen oder lieber ein FIFO?
Oder gibt es eine Art Stream to Memory Sink mit FIFO und Trigger um die 
Pipeline Daten asynchron zur CPU Clock anzunehmen?

Könnt ihr mir dabei helfen?
Vielen Dank schon mal für eure Zeit und Hilfe :-)

Lieben Gruß
Viktor

von Sigi (Gast)


Lesenswert?

Deine Kamera in dein Qsys-System einzubinden ist
nicht all zu schwer. Lad dir mal zu Qsys die
sog. Avalon-Spezification runter, sie beschreibt
zu allen Qsys-Interfacetypen die Signal- und
Timing-Details. Schau dir insbes. MM-Master und
MM-Slave an. Für dein Kamerasystem kannst du dann
mit MM-Master ein einfaches DMA-System aufbauen.
Bei kleiner Datenrate ist das relativ einfach.

von Viktor Bronder (Gast)


Lesenswert?

Hi, danke für deine Antwort Sigi aber das wird so nicht funktionieren.

Es geht um eine spezielle Kamera. Ich muss bei dieser erst 4 
Einzelbilder holen um daraus ein finales zu berechnen. Während der 
Berechnung werden aber bereits die nächsten 4 Bilder geholt was zu 
massiven Timing Problemen beim schreiben/lesen per CPU führen würde da 
die Kamera die Pixel mit 80MHz ausgibt und dabei auch nicht verzögert 
werden kann. Ich habe das jetzt so gelöst das ich die 8 Bilder in 2 
dedizierte Hardware SRAM´s ablege und die Write bzw. Read Kontrolle 
jeweils zwischen Kameraseite und Pipeline Seite tausche da ich bis zu 
64,5FPS (258 Einzelbilder) a 320*240*16Bit durchbringen muss.

Zur Berechnung wäre noch zu sagen das ich 3 Multiplikationen und 4 
Additionen sowie ein ATAN2(x,y) auszuführen hab was die NIOS CPU bei 
einer Eingangsdatenrate von fast 10MB/s und der resultierenden 
Ausgangsdatenrate von fast 20MB/s nicht mehr schaffen wird.

Ich habe gerade ein wenig herumprobiert und bin jetzt dabei folgendes zu 
testen:

DC-FIFO im QSYS nimmt die Daten an, wenn der FIFO > 80-90% belegt ist 
pausiere ich die Pipeline, leere den FIFO und lasse die Pipeline dann 
weiter laufen bis das Bild fertig ist. Sobald ein Bild komplett ist wird 
es über Ethernet ausgegeben.
Ich weiß aber noch nicht ob ich so 20MB/s da durch bekomme, das gilt es 
jetzt zu testen.
Falls ihr eine bessere Idee habt bin ich offen für jede Anregung.

Lieben Gruß

von berndl (Gast)


Lesenswert?

Viktor Bronder schrieb:
> Zur Berechnung wäre noch zu sagen das ich 3 Multiplikationen und 4
> Additionen sowie ein ATAN2(x,y) auszuführen hab was die NIOS CPU bei
> einer Eingangsdatenrate von fast 10MB/s und der resultierenden
> Ausgangsdatenrate von fast 20MB/s nicht mehr schaffen wird.

Multiplikationen gehen im FPGA-Teil (ausserhalb der CPU) schnell und 
problemlos. Additionen sowieso. ATAN2 geht mit CORDIC in ~10 Takten. 
Also: Raus aus der CPU, im HW-Teil berechnen und nur die Ergebnisse mit 
Hilfe der CPU verwalten...

von Viktor Bronder (Gast)


Lesenswert?

berndl schrieb:
> Multiplikationen gehen im FPGA-Teil (ausserhalb der CPU) schnell und
> problemlos. Additionen sowieso. ATAN2 geht mit CORDIC in ~10 Takten.
> Also: Raus aus der CPU, im HW-Teil berechnen und nur die Ergebnisse mit
> Hilfe der CPU verwalten...

wie gesagt die Pipeline mit den Multiplikationen und Additionen und 
ATAN2 in Cordic funktionieren schon. Ich nehme die Daten der Kamera auch 
per Hardware an da die Zeilen aus der Kamera ab 
Z120,Z121,Z119,Z122...Z0,Z239 ausgegeben werden und vorsortiert werden 
müssen. Das sind 3 Binärzähler und ein addierer für die Adresse, die CPU 
wird sich damit vermutlich wieder schwer tun wenn ich das in C 
schreibe...

Bin vielleicht noch etwas zu sehr C/C++ geschädigt :-)
Ich habe das ganze wie oben beschrieben mit dem FIFO aufgebaut und schon 
mal in einzelschritt getestet und bisher sieht es soweit ganz gut aus...

Ich tuh mich gerade mur etwas schwer mit dem
> ... und nur die Ergebnisse mit Hilfe der CPU verwalten...

Ich muss mir jetzt aber erstmal was für die PC-Seite programmieren was 
die Daten annimmt und das ganze dann mal in Echtzeit ausprobieren, falls 
es nicht klappt bzw. irgendwas verschluckt wird melde ich mich noch 
mal...

trotzdem danke für eure Ideen. Falls das alles nicht geht werde ich es 
mal versuchen wie von euch vorgeschlagen in der CPU zu verwalten wobei 
ich immer noch nicht überzeugt bin das die CPU das schafft...

Lieben Gruß

von berndl (Gast)


Lesenswert?

du brauchst also einen klassischen Coprozessor, ausgelagert in das FPGA 
und gesteuert mit einem klassischen Registerinterface...

von Kest (Gast)


Lesenswert?

Ich würde es so machen:
Cam -> FIFO -> AVALON MASTER -> SRAM
SRAM ist im QSYS als Speicher definiert und deshalb kann NIOS darauf 
zugreifen. Im NIOS kannst Du dann einfach diesen Speicher nehmen und 
damit was machen.

Eigentlich musst Du gar nichts anhalten, sondern die Bilder 
wegschreiben, sobald die kommen und dann prozessieren. Dann spielst Du 
etwas mit den Arbitration-Shares herum und, voila, läuft das Ganze.

in deinem CAM-AVALON-Master kannst Du dann die Adressen so generieren, 
wie Du es haben möchstes, die Daten kannst Du auch vorberechnen (z.B. 2 
AVALON-MASTER: Lesen/Schreiben).

Ich habe soetwas schon oft gemacht und im Endeffekt kann ich sagen, dass 
ich immer auf NIOS verzichtet habe, weil zu langsam. Für I2C, ein 
bisschen Konfiguration oder TCP/IP ist es noch okay, aber wenn 
irgendwelche große Datenbengen kommen, kannst Du es komplett vergessen. 
Aber Du hast ja nichts zur Frame-Rate und Auflösung gesagt ;-)

Grüße
Kest

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.