Forum: FPGA, VHDL & Co. IP zu µBlaze ; PLB schnell?


von olpo (Gast)


Lesenswert?

Hallo Welt,

auf meinem Microblaze läuft LWIP. Jetzt möchte ich in einem IP-Core die 
empfangenen Daten verarbeiten.
Ich habe mir das so gedacht, daß der IP-Core den Pointer und Länge 
bekommt. Der IP greift jetzt selber auf den RAM. Sobald er damit fertig 
ist, schickt er den Pointer zurück, damit Microblaze weiß, welche Daten 
er löschen kann.

Was haltet ihr davon?
Den Pointer wieder zurückzugeben scheint anfangs etwas ungeschickt, aber 
ich habe keine Lust auch noch die Funktion pbuf_free( struct *p ), also 
Speicher freigeben, in HW zu machen.
Ich hätte den IP und µBlaze jetzt über PLBus verbunden. Ist das über den 
Bus schnell genug, oder gibt es da bessere Methoden?

Schreibt einfach mal, was euch zu meinem Design einfällt. Ich brauche 
halt einen hohen Durchsatz.

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


Lesenswert?

olpo schrieb:
> Ich brauche halt einen hohen Durchsatz.
Gibts da auch Zahlen dazu? MByte/s o.ä.?

von olpo (Gast)


Lesenswert?

Es sollten mindesten 100 MegaBIT/s sein.
Im Xilinx Datenblatt steht, daß der LWIP auf Virtex5 maximal 129Mb/s 
schafft.

von Christian R. (supachris)


Lesenswert?

Der LwIP ist wirklich Murks, denn der nutzt kaum die HW-Features des 
MAC. Wir hatten das damals auf dem Virtex 4 FX mal probiert. Da ging 
kein Checksum offloading, kein DMA und keine großen Puffer. Also Stack 
selber geschrieben und schon kam man unter Ausnutzung all der Sachen auf 
knapp über 100MByte/s im UDP mit dem GbE und einer PCIe Karte auf der 
Gegenseite. Wenn´s schnell sein soll, musst du den LwIP zumindest 
bearbeiten. Aber über 100MBit/s hat der mit dem GbE MAC schon geschafft. 
Zumindest auf dem PPC.

von olpo (Gast)


Lesenswert?

Ich habe ja gesagt, daß ich pbuf_free( struct *p ) in SW machen will und 
dafür der IP den Pointer p über PLB an µBlaze senden muss. Microblaze 
muss also ständig horchen: PLB_read( addr) [oder so ähnlich].
Jetzt ist die Frage, wo stecke ich das PLB_read(addr) hin, so daß es die 
Maschine am wenigsten ausbremst?
Ich sehe da zwei Möglichkeiten: Als Thread in der Callback-Funktion oder 
im main(). Dort läuft sowieso
1
while(1){
2
recv_data();
3
}

Was wird weniger Ressourcen verschwenden? LWIP läuft im RAW Modus ohne 
BS.
Oder bremsen beide Methoden zu stark aus?
Wie könnte ich denn sonst die Daten im Puffer wieder freigeben?

von Strubi (Gast)


Lesenswert?

Christian R. schrieb:
> Der LwIP ist wirklich Murks, denn der nutzt kaum die HW-Features des
> MAC

Ist halt ein generisch geschriebener Stack, aber in der Tat für EMACs 
und schnelle Anwendungen nicht zu gebrauchen. Full Ack :-)
Für lokale Netzwerke tut's meistens ein handgeschriebener, auf die 
DMA-Engine optimierter UDP-Stack, der IP-Core macht dann nur noch 
bisschen Sequencing-Arbeit und ev. ARP, ICMP usw. -Requests. Für 
weiteren Speed kann man auch Jumbo-Pakete (8k) benutzen (wenns der 
Router auch kann).
IMHO macht es mehr Sinn, speziell optimierte UDP-Stacks zu benutzen 
anstatt bestehende TCP/IP-Lösungen doch noch irgendwie schneller zu 
kriegen.

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.