Hat jemand Erfahrung damit gemacht ADC Daten 500MB/s über Ethernet an
einen PC zu übertragen um die Daten dort erstmal einfach nur zu
speichern und später auszuwerten. Ich würde dazu gerne ein FPGA
benutzen, der das handling der ADCs übernimmt und die Daten dann an den
PC überträgt.
Alternative Lösung wäre PCIe aber Ethernet wäre mir lieber, da die
Leitung deutlich länger sein kann und die Anbindung an den PC einfacher
wäre.
Samuel C. schrieb:> Mit einer konkreten Frage kommst du vermutlich weiter. Wo liegt> das> Problem?
Kann jemand IP cores (Ideal Xilinx) oder Demoanwendungen empfehlen? Am
besten wäre eine TCP Verbindung, die vom Host PC aufgebaut wird aber ich
denke UDP wäre einfacher. Also einfach eine Menge UDP Pakete per
EthernetIP vom FPGA senden.
Samuel C. schrieb:> Mit einer konkreten Frage kommst du vermutlich weiter. Wo liegt das> Problem?
Berechtigte Frage!
Ich orakle, er sucht einen FIFO der über Ethernet mit TCP/IP Daten
schickt. Und das auf einem FPGA.
Carsten F. schrieb:> ADC Daten 500MB/s über Ethernet an einen PC zu übertragen
Wenn das "B" für Byte steht, dann müsstest du da noch ein paar
Geräte-Generationen warten.
Mit aktuellem Gigabit-Ethernet "schafft" man halt theoretisch 1000
Mega-bit/Sekunde, praktisch wohl maximal 940 Mega-bit/Sekunde
https://de.wikipedia.org/wiki/Datendurchsatz
Carsten F. schrieb:> Kann jemand IP cores (Ideal Xilinx) oder Demoanwendungen empfehlen? Am> besten wäre eine TCP Verbindung, die vom Host PC aufgebaut wird aber ich> denke UDP wäre einfacher. Also einfach eine Menge UDP Pakete per> EthernetIP vom FPGA senden.
Wenn du's schnell entwickelt haben willst nimmst du einen
Zynq/Ultrascale+ und handlest das Ethernet über das PS. 500MB/s sind
halt schon ne Ansage, aber sollte gehen. Allerdings ist Daten zu
Ethernet-Paketen zu packen jetzt auch nicht die Welt. Für Ethernet
selbst gibt es IP-Cores.
Wegstaben V. schrieb:> Wenn das "B" für Byte steht, dann müsstest du da noch ein paar> Geräte-Generationen warten.
10G gibt's jetzt auch schon ne Weile. Ist auch nicht groß schlimmer,
wenn man sich nicht um das Layout kümmern muss.
Alternativ, wenn PCIe für dich einfacher ist, könntest du dafür auch
Extender über Ethernet oder Glasfaser bekommen. Macht's aber vermutlich
kaum günstiger.
Die Frage von wegstabenverbuchsler ist daher durchaus relevant. Meinst
du 500MByte/s oder 500Mbit/s?
Samuel C. schrieb:> Alternativ, wenn PCIe für dich einfacher ist, könntest du dafür> auch> Extender über Ethernet oder Glasfaser bekommen. Macht's aber vermutlich> kaum günstiger.>> Die Frage von wegstabenverbuchsler ist daher durchaus relevant. Meinst> du 500MByte/s oder 500Mbit/s?
Ich meine 500MBit.
Wenn es nicht unbedingt Ethernet seien muss wäre USB3 eine einfache
Möglichkeit. Da reicht ein kleines FIFO im FPGA und etwas Beschreibung
drum herum die auch in kleine billige FPGAs passt.
ich glaube auch ein USB3 FIFO ist wahrscheinlich einfacher, da die Daten
auch sicher ankommen.
Bei Ethernet kann dir immer mal einer ein Frame dir droppen, wenns zu
eng wird. Ob dein UDP das absichern kann? Ansonsten brauchst du eine
leistungsfähige TCP verbindung.
Klakx schrieb:> Bei Ethernet kann dir immer mal einer ein Frame dir droppen, wenns zu> eng wird. Ob dein UDP das absichern kann?
UDP garantiert sogar, dass es Paketausfälle nicht absichert. TCP jedoch
schon und sogar ohne weiteres Zutun. Wäre ja traurig wenn im Browser ab
und zu mal was fehlt.
TCP garantiert aber auch hohe Einbrüche in der Datenrate und variable
Latenzen, wenn gelegentlich Pakete verloren gehen. UDP verliert dann
einzelne Datenpakete, aber Rate und Latenz bleiben ansonsten erhalten.
Man sollte also gut überlegen, worauf es ankommt.
> Wäre ja traurig wenn im Browser ab und zu mal was fehlt.
Wenn die "Verlustrate" auf der Strecke zu gross wird, nuetzt
TCP auch nichts mehr. 10 % Schwund reichen da schon.
Und schwupps fehlt was.
Auf einer UDP-Verbindung in einem per Port geswitchen Netz
sind es eher 0 %. Der Backbone sollte das aber auch in seiner
Kapazitaet unterstuetzen. Also als 10G/40G/100G ausgefuehrt sein.
Niemand wird sich deswegen daher TCP auf einem FPGA antun wollen.
Aber selbst kleine ungemanagede Soho-Switche haben bei 8 1G-Ports
eine nonblocking 16 G Switchfabric.
Homer J. S. schrieb:> Und schwupps fehlt was.
Die Verbindung bricht u.U. ab, wenn die Leitungskapazität das
Retry-Verfahren nicht auffängt und eine explodierende Pufferung und
Verzögerung zu Überlauf oder Timeout führt. Bei 500 aus 1000 halte ich
das für ein realistisches Szenario.
Carsten F. schrieb:> Hat jemand Erfahrung damit gemacht ADC Daten 500MB/s über Ethernet an> einen PC zu übertragen um die Daten dort erstmal einfach nur zu> speichern und später auszuwerten.
Ja, vor 13 Jahren ("NetCeiver"), war Streamen von DVB-Transport-Streams
in IP6-Multicast. Mit 6 Tunern so um die maximal 300Mbit/s, ging
testweise aber auch mit knapp 800Mbit/s. Aus heutiger Sicht langweiliger
3S1600E mit billiger RTL8169 GBit-Karte dran, HW-Kosten 50EUR. Eigener
PCI-Core, eigener DDR3-Core, ein Microblaze und viele Statemachines ;)
Der Gag an den 8169 ist, dass sie zwei TX-Queues haben. Die eine hing
"normal" am (uC)Linux-Teiber, die andere ging auf einen Speicherbereich,
der im FPGA "on demand" die DMA-Deskriptoren zusammengebaut hat. Beim
Zugriff auf die Paketdaten wurde dann im FPGA auch der ganze
IP/UDP-Header on the fly zusammengebaut, bevor die eigentlichen
Paketdaten aus dem Speicher kamen.
Wird aber auch heute selbst mit Zusammenklöppeln fertiger IP-Cores kein
Samstag-Nachmittags-Projekt sein, wenn man es noch nie gemacht hat.
> Bei 500 aus 1000 halte ich das für ein realistisches Szenario.
Bei 50 % auf WAN-Strecken ruehrt TCP sich gar nicht mehr.
WAN meint Verbindungen so ab 2 Mbps und besser und 50 bis
300 ms RTT.
Ich habe das mit einem konfigurierbaren Bridgemodul
schon mal ausprobiert. Das konnte jedes n-te Paket in
den Orkus werfen.
Bei 20 % Verlust erinnert eine SSH-Session an das Stanzen einer
Lochkarte, mit anschliessender Wartezeit von einer Minute bis
eine Reaktion zu sehen ist. Mitunter klappt auch die ganze
Sitzung ab. Solche Strecken sind in Richtung China z.B.
voellig normal.
Bei 10 % laueft HTTP schon spuerbar unrund.
Eine Webseite besteht ja neben HTML, CSS aus vielen Zutaten.
Und bei 10 % kommt da schon mal was abhanden, was haeufig
nicht mal auffaellt.
Probier es aus! Einen Paketzaehler wirst du ja wohl in dem
Quelltext des Linux-Bridgemoduls unterzubringen wissen.
Aber bei 500 aus 1000 ist es voellig utopisch dass da noch was geht.
Hoechstens theoretisch...
Kannst du das mal konkretisieren? Was meinst du genau mit 50% auf WAN
Strecken? Wenn ich hier mein DSL mit Downloads fülle, kann ich nebenbei
trotzdem noch rumsurfen und sogar online Zocken mit geringer Latenz
bleibt möglich. Auch wenn der Torrent weit über 50% der Datenrate nutzt.
Das Gleiche im LAN. Wenn z. B. mein Schreibtisch PC ein automatisiertes
Backup auf das NAS schreibt, dann kann ich den wunderbar trotzdem
benutzen. Auch für Internetkram und so obwohl das Netzwerk fast komplett
ausgelastet ist.
Nenn mir ein konkretes Szenario bei dem ich was merken würde.
Homer J. S. schrieb:> Wenn die "Verlustrate" auf der Strecke zu gross wird, nuetzt> TCP auch nichts mehr. 10 % Schwund reichen da schon.> Und schwupps fehlt was.
Mehr als das ist dazu nicht zu sagen:
TCP (Transmission Control Protocol) – Übertragung von Datenströmen
(verbindungsorientiert, zuverlässig)
UDP (User Datagram Protocol) – Übertragung von Datenpaketen
(verbindungslos, unzuverlässig, geringer Overhead)
Carsten F. schrieb:> Ich meine 500MBit.
In Kuerze:
- 1G-faehigen Ethernet-Core nehmen
- In C programmierbaren Core um ARP/UDP zu implementieren
- Schlauen DMA-Core hernehmen, der direkt aus einem Datenstrom
Ethernet-Pakete 'scattert'.
Auf Empfangsseite musst du, falls Paketverluste nicht tolerabel sind,
deine Maschine entsprechend konfigurieren (geht mit Linux leichter als
Windows) oder
einen angepassten UDP-Stack hernehmen, der keine Pakete verwirft.
Bei vielen Stoerungen bietet sich Forward Error Correction an.
Sobald du TCP bei der Datenrate willst, kannst du von obigem 'bare
metal' eigentlich die Finger lassen, und gleich einen Linux-SoC nehmen.
Bei USB3 ergibt sich dasselbe Problem im 'bulk' Mode. Im 'isochronous'
Mode koennen manche Motherboard-Chipsaetze Schluckauf kriegen und Pakete
verlieren. Am meisten Zeit verbraet man IMHO am Interfacing mit den
FTDI/Cypress Kaefern.
Wenn es 'huebsche' (wenig verrauschte) Daten sind, komprimieren sie
allenfalls auch gut per DPCM (adaptiv lossy oder non-lossy). So kriege
ich hier meinen Datenwust auch noch durch eine 100M-Leitung.
Gustl B. schrieb:> Kannst du das mal konkretisieren?> Was meinst du genau mit 50% auf WAN Strecken?
Er meint 50% Paketverlust, nicht 50% Auslastung.
Selbst wenn der Paketverlust bei moderaten 3-5% liegt, fällt das bei der
normalen Internetnutzung schon negativ auf. In der Theorie ist das kein
Problem, in der Praxis ein Tod nach dem anderen und bei verschlüsselten
Verbindungen (TLS, HTTPS) wird das alles noch viel schlimmer.
Dafür TCP zu verwenden, bringt mehr Aufwand als Nutzen. Das ganze ist
doch eine stinklangweilige Streaming-Anwendung. Dazu verwenden man eben
genau kein TCP, sondern UDP mit einem simplen Streaming-Protokoll
On-Top.
Das Prinzip ist Pipi-einfach: Der Sender, pakiert die Daten und haut sie
sequentiell per UDP heraus, speichert sie aber auch in einem FIFO
dazwischen. Der Empfänger streamt ebenso die Sequenz-Nummern der
empfangen und der verlorenen Pakete an den Sender zurück. Der Sender
löscht die quittierten Pakete aus seinem FIFO, und die verloren werden
erneut (an den Anfang, das ist einfach) in die FIFO geschrieben. Das
sortieren der Pakete kann man bequem am Empfänger machen, auch offline.
Der Trick ist eben, dass der FIFO drei Pointer hat: Start, Gesendet und
Ende. Das Ende wird durch den Rückwärts-Stream verwaltet.
Bei 500 MBit/s sind das pro Gigabyte Sender-Puffer ja 16 Sekunden. In
der Zeit kann man ja sogar einen Switch mit umstecken tauschen...
Homer J. S. schrieb:>> Bei 500 aus 1000 halte ich das für ein realistisches Szenario.>> Bei 50 % auf WAN-Strecken ruehrt TCP sich gar nicht mehr.> WAN meint Verbindungen so ab 2 Mbps und besser und 50 bis> 300 ms RTT.
Ich meinte eigentlich 500 Mbit/s Last auf einer 1000 Mbit/s Strecke,
nicht 50% Paketverlust. Auch geringe Paketverluste können dann m.E. bei
einem steten Datenstrom aufgrund der Arbeitsweise von TCP Stacks zum
Problem werden.
Nick M. schrieb:> TCP (Transmission Control Protocol) – Übertragung von Datenströmen> (verbindungsorientiert, zuverlässig)
TCP: Zuverlässig unter bestimmten Bedingungen. Neigung zu Abbrüchen und
Verstopfungen ausserhalb davon. NB: Gerne gemachter Fehler ist TCP over
TCP, z.B. TCP/IP in einem auf TCP aufbauenden VPN-Tunnel - das kann sich
als Schönwetterprotokoll erweisen.
UDP: Unzuverlässig, aber anders als TCP verträglich mit konstantem
Datenstrom bei signifikanter Last. Man muss dann je nach Anwendung
entscheiden, ob man fehlende Daten erneut anfordert, die bereits
erwähnte Redundanz einbaut, oder mit einem Verlust schlicht lebt. Bei
Video/Voice neigt man zu Letzterem.
(prx) A. K. schrieb:> Neigung zu Abbrüchen und Verstopfungen ausserhalb davon.
Weil es halt gesichert ist, die Leitung ist voll. Ändert also nichts an
meiner Aussage.
(prx) A. K. schrieb:> Gerne gemachter Fehler ist TCP over> TCP, z.B. TCP/IP in einem auf TCP aufbauenden VPN-Tunnel
Ist das dein Fehler? Ist das ein Fehler von TCP? Kann das nicht mit UDP
passieren?
Für was ist die Aussage ein Argumen? Für nichts?
Und warum ist TCP oder UDP über einen VPN-Tunnel ein Fehler? Es sollen
halt mehrere Sockets über eine sichere Verbindung laufen. Ist halt die
Anforderung des Kunden.
Nick M. schrieb:> Und warum ist TCP oder UDP über einen VPN-Tunnel ein Fehler?
Nur bei einem TCP-Tunnel. Weil Fehler Retries auf mehreren Ebenen zur
Folge haben können, mit vervielfachter Übertragung der gleichen Daten
auf beiden Ebenen, wenn man das Verhalten der beiden TCP Stacks nicht
gut koordiniert. Im Jargon ist das als TCP Meltdown bekannt.
UDP over TCP verliert die Fähigkeit zu isochronem Transport, weil der
untere TCP Layer durch variable Latenz das empfindliche Zeitverhalten
stört. Blöderweise weiss die Anwendung das nicht, die das UDP nutzt.
Gute VPN-Lösungen setzten deshalb auf UDP oder pures IP, etwa IPsec oder
Wireguard. OpenVPN kann leider beides:
https://openvpn.net/faq/what-is-tcp-meltdown/
Ich hatte mal den Fall von gleich 3 Retransmission-Layers übereinander,
noch dazu mit völlig unpassendem Zeitverhalten der jeweiligen Layer
zueinander. Mit der Folge von gelegentlichen pathologischen Zuständen
dauerhafter totaler Verstopfung bei keiner effektiven
Nutzdatenübertragung.
Er wird ja seinen ADC nicht am anderen Ende der Welt betreiben...
In Laborumgebungen, wo man Einfluß auf die Netzwerktopologie und die
Switche hat, ist UDP genau gar kein Problem, da gibt es keine
Paketverluste. Und auch ein Host-PC hat i.d.R. kein Problem damit,
mehrere UDP-GBit-Links gleichzeitig zu empfangen (mit einer 10
GBit/s-Netzwerkkarte).
Mit der üblichen Paketgröße kommt man bei 1 GBit auf ca. 115 MByte/s.
Wenn man Jumboframes kann, gehen auch 124 MByte/s. BTDT.
Duke
Nur mal ein Update. Ich habe mich entschlossen das über USB 3.0 zu
machen mit dem FTDI Chip und einem Spartan 6. Der Aufwand mit Ethernet
steht in keinen Verhältnis. Den FIFO des FTDI kann man leicht per FPGA
befüllen (Sowas ähnliches habe ich schon gemacht) aber bis man überhaupt
UDP im Spartan am laufen hat ist man einige Haare los.
Moin,
Und wie siehts aufm PC aus mit der Weiterverarbeitung ausm USB?
Ethernet/UDP-Pakete hol' ich mir ueber einen Socket und fertig. Wie
sieht das bei USB mit der Kommunikation ueber den Treiber oder so aus -
gibts da was genormtes wie Sockets?
Gruss
WK