Forum: FPGA, VHDL & Co. GBE mit FPGA einfach und lizenzfrei nun Möglich


von Max M. (fpga_eth)


Lesenswert?

Vor ca. 15 Jahren (meine letzten Erfahrungen mit FPGA) wars nach meinem 
Wissensstand noch sehr schwierig lizenzfrei GBE zu erreichen.

Ich Spreche von einer simplen Anforderung zum Datentransfer FPGA-PC: 
Also ARP und UDP packete bidirektional. Fixe IP im HDL (ohne DHCP).

Wie ist die Situation aktuell? Konnen Altera (oder halt nun Intel) oder 
AMD/Xilinx nun sowas direkt mit den freien IP blöcken? Existieren andere 
freie und einfach Lösungen für dieses basic data transfer Problem?

von J. S. (engineer) Benutzerseite


Lesenswert?

Der TEMAC (Xilinx) ist nach meinem Wissen nach wie vor kostenpflichtig. 
Als ich ihn zuletzt eingesetzt hatte, lag er bei 5.000 für eine 
site-license.

von Marius W. (mw1987)


Lesenswert?

Hallo,

ich nutze in einem Projekt diesen Ethernet-MAC: 
https://github.com/alexforencich/verilog-ethernet

Allerdings hat das Board nur 10/100 Mbit/s, aber in dem Repository 
finden sich verschiedene Ethernet-MACs für Geschwindigkeiten bis 10GbE.

Marius

von N. M. (mani)


Lesenswert?

Schon mal bei opencores geschaut? Da hat es ein paar. Keine Ahnung ob 
die was taugen.

von Max M. (fpga_eth)


Lesenswert?

Hallo Danke erst mal für die Antworten.

Hmm was soll ich sagen, einerseits ist es natürlich zu begrüssen, dass 
Opencores etc. Lösungen existieren, andererseits ist der 
Einarbeitungsaufwand  doch erheblich. Daher wären natürlich "verified" 
Lösungen zu bevorzugen.

Evtl. kann ich die TO Fragestellung etwas aufweiten:
Gesucht: Minimalanforderung zb.: Datentransfer FPGA-PC (Datenbank (PC) - 
Registerliste (FPGA)) welche sich stupide immer aktuallisiert 
(bidirektional also 2 registerlisten).

Wobei ich folgene Probleme der verschiedenen Technologien sehe:
1. UART - Langsam
2. USB (FTDI) - Bedenken wegen EMV da keine Galv Trennung. Habe 
ebenfalls von Langzeitstabilitätsproblemen im Industriebereich gehört.
3. PCI-e - maximale Kabellänge sehr begrenzt. Meines wissens eher 
ungeeignet für alles was in einem anderen Gehäuse verbaut ist.
4. ETH - Ideal wenn über LWL, auch relativ EMV robust wenn über Kabel da 
Trafo.

Damals wurde nebst dem FPGA ein ETH fähiger uC verbaut, welcher 
lediglich die Brücke ETH-SPI gemacht hat und das FPGA über SPI mit Daten 
versorgt.

Datentransfer ist ja ein Grundlegendes FPGA Problem, welche Lösungen 
nutzt Ihr? Was sind die Erfahrungen?

von Markus W. (mwww)


Lesenswert?

Max M. schrieb:
> Vor ca. 15 Jahren (meine letzten Erfahrungen mit FPGA) wars nach meinem
> Wissensstand noch sehr schwierig lizenzfrei GBE zu erreichen.
>
> Ich Spreche von einer simplen Anforderung zum Datentransfer FPGA-PC:
> Also ARP und UDP packete bidirektional. Fixe IP im HDL (ohne DHCP).
>

Bis zu welcher Schicht willst du denn einen Stack im FPGA haben?

- PCS/PMA ("Anschluss" an den SerDes, 8b/10b oder 64b/66b Codierung, 
Synchronisierung usw.) gibt es für 1G/10G lizenzfrei von Xilinx, d.h. da 
fällt schon mal ein ganzer Teil low-level Zeug weg

- MAC (ETH-Frames zusammenbauen und checken, Flusskontrolle) kostet von 
Xilinx etwas; manche IP von opencores sind meiner Erfahrung nach gut 
anwendbar (habe vor Jahren 1G/10G MAC jeweils einen mal in Betrieb 
genommen und hat gefühlt out-of-the-box funktioniert)

- ARP/IP/UDP gibt es direkt von Xilinx m.W. nicht, zumindest nicht als 
HDL, evtl. als SW für den Zynq; ansonsten als SW für beliebige 
uC-Softcores, wenn man es im FPGA haben will


Btw.: Den 100G MAC gibt es kostenlos, wenn man die hard IP im US+ nutzt 
:-) .

von Max M. (fpga_eth)


Lesenswert?

Markus W. schrieb:
> Bis zu welcher Schicht willst du denn einen Stack im FPGA haben?

Bis zu der die nötig ist um das Ziel Bidirektionale kommunikation 
Datenbank (PC/Server) - FPGA zu ermöglichen.
Bei einem anderen Tread welchen ich im uC Bereich erstellt habe ist 
meine Aufmerksamkeit auf Node-Red gelenkt worden; das scheint genial zu 
sein. Node-Red kann die Daten für die DB aufbereiten, daher kann die 
Netzwerkanforderung im FPGA reduziert werden: auf das lowest level 
node-red protokoll komunizieren. (UDP, TCP, MQTT etc.)

Markus W. schrieb:
> Btw.: Den 100G MAC gibt es kostenlos, wenn man die hard IP im US+ nutzt
> :-) .

Nun 100G ist natürlich komplett overkill, will ja nicht wissen was für 
ein Server benötigt würde damit Node-Red/DB diese Bandbreite ausnutzen 
könnte :P

von Gustl B. (gustl_b)


Lesenswert?

Max M. schrieb:
> auf das lowest level node-red protokoll komunizieren. (UDP, TCP, MQTT
> etc.)

Ja, genau. TCP ist schon sehr anspruchsvoll ohne CPU. Und nein, du 
willst das ohne CPU machen wenn du Durchsatz brauchst.

Was ist denn die Ziel Datenrate?

von Max M. (fpga_eth)


Lesenswert?

Gustl B. schrieb:
> Was ist denn die Ziel Datenrate?

nun original hatte ich grob an einige 100mbit/s gedacht. Ob dies nun mit 
NodeRed überhaupt noch realistisch ist kann ich nicht sagen.

Einfache Implementierung soll ersmal wichtiger sein als Performance.

von Frank K. (fchk)


Lesenswert?

Max M. schrieb:

> 3. PCI-e - maximale Kabellänge sehr begrenzt. Meines wissens eher
> ungeeignet für alles was in einem anderen Gehäuse verbaut ist.

Nö, dafür gibts Lösungen und Standards, mit denen Du etliche Meter 
überbrücken kannst. Bei meinem Arbytegeber gibts Kameras, die über PCIe 
Rohbilddaten unkomprimiert mit PCIe Gen 2 x4 direkt in den 
PC-Hauptspeicher schreiben. Eine direkte und latenzärmere Anbindung 
gibts nicht.

https://www.ximea.com/en/products/pci-express-high-speed-cameras-xib/cb500cg-cm

Host-Karte:
https://www.ioi.com.tw/products/proddetail.aspx?CatID=106&DeviceID=3036&HostID=2052&ProdID=1060236

Stecker/Kabel:
https://www.molex.com/en-us/products/connectors/high-speed-pluggable-io/ipass-connector-system

PCI Express External Cabling Specification Revision 3.0, Version 1.0
Ältere Spezifikation:
https://picture.iczhiku.com/resource/eetop/wHigyzpZfEQiRmmv.pdf

fchk

von Martin S. (strubi)


Lesenswert?

Moin,

den hier kann ich, im Gegensatz zum Xilinx Temac empfehlen:

https://github.com/yol/ethernet_mac

Läuft mit kleinen Modifikationen auch absolut rund per Autobuffer-DMA, 
d.h. wenn eine CPU mit ins Spiel kommt. Überdies portabel (auf Xilinx 
Spartan usw. wie auch Lattice ECP* in Betrieb). Stichwort Kameras: Ich 
nutze die Lösung für low latency JPEG-Video-Streaming.

Die GbE-Domäne wird allerdings durch Nutzung von TCP ad absurdum 
geführt, die volle Performance hast du nur per UDP. Und TCP in der 
Hardware willst du nicht wirklich nachbauen, einen TCP zwischen 
PCI-Wrapper in der Hardware wurde meiner Erinnerung nach mal von einem 
Fraunhofer-Team gestrickt und lag preislich im Bereich Luxus-Auto.

von Max M. (fpga_eth)


Lesenswert?

Martin S. schrieb:
> Moin,
>
> den hier kann ich, im Gegensatz zum Xilinx Temac empfehlen:
>
> https://github.com/yol/ethernet_mac
>
> Läuft mit kleinen Modifikationen auch absolut rund per Autobuffer-DMA,
> d.h. wenn eine CPU mit ins Spiel kommt. Überdies portabel (auf Xilinx
> Spartan usw. wie auch Lattice ECP* in Betrieb). Stichwort Kameras: Ich
> nutze die Lösung für low latency JPEG-Video-Streaming.
>
> Die GbE-Domäne wird allerdings durch Nutzung von TCP ad absurdum
> geführt, die volle Performance hast du nur per UDP. Und TCP in der
> Hardware willst du nicht wirklich nachbauen, einen TCP zwischen
> PCI-Wrapper in der Hardware wurde meiner Erinnerung nach mal von einem
> Fraunhofer-Team gestrickt und lag preislich im Bereich Luxus-Auto.

Danke!
Verstehe ich das korrekt:
8 Bit FIFO, ohne Garantie, dass Daten geordnet kommen (wegen udp, 
packetloss, variabler Packetgrösse etc...), ebenfalls ohne info in 
welchem Paket, an welcher Stelle etc. diese 8 bit liegen. Daher muss in 
diesen 8 Bit die jeweilige Zuweisungsinfo enthalten sein?!?

: Bearbeitet durch User
von Gustl B. (-gb-)


Lesenswert?

Max M. schrieb:
> Verstehe ich das korrekt:

Nein. Wie kommst du auf 8 Bit? Bei UDP können Pakete verloren gehen und 
in zufälliger Reihenfolge ankommen. Ist eben so. Beim Versenden schreibt 
man üblicherweise rein welche Paketnummer das ist, dann kann der 
Empfänger das wieder sortieren.
Das ist aber alles auf Paketebene, nicht auf 8 Bit Ebene oder wie auch 
immer. Wie du deine Pakete baust solltest du schon selber unter 
Kontrolle haben.

Martin S. schrieb:
> Und TCP in der
> Hardware willst du nicht wirklich nachbauen, einen TCP zwischen
> PCI-Wrapper in der Hardware wurde meiner Erinnerung nach mal von einem
> Fraunhofer-Team gestrickt und lag preislich im Bereich Luxus-Auto.

Ja, gibt es, aber nicht nur von denen. TCP hat Vorteile, aber kostet 
auch. TCP braucht man z. B. wenn man darüber RDMA wie iWARP machen 
möchte.

von Max M. (fpga_eth)


Lesenswert?

Gustl B. schrieb:
> Wie kommst du auf 8 Bit?

Nun dieser IP Block (https://github.com/yol/ethernet_mac), basiert auf 
einem angeblich einfach zu benutzenden 8Bit FIFO.

Ich vestehe nicht, wie davon ausgegangen werden kann dass dies sortiert 
sein soll. Es sei den der IP Block hat eine absprache mit dem Sender 
(ist aber hier meines wissens nicht vorgesehen da der Sender ein PC ohne 
TCP-like kommunikation).

Also RX FIFO = random 8 Bitausschnitte aus empfangenen Daten?

von Gustl B. (-gb-)


Lesenswert?

Pakete können unterschiedlich lang sein. Und irgendwie muss man dem MAC 
das Paket übergeben. Jetzt ist es aber unsinnig den FIFO so breit zu 
machen, dass das größte Paket direkt parallel reingeladen werden kann. 
Stattdessen hat man sich hier für einen schmalen FIFO entschieden und 
der Nutzer/die Schicht drüber muss das Paket Byte für Byte in den FIFO 
schreiben.

Das steht auch hier 
https://github.com/yol/ethernet_mac/blob/master/README.md ganz unten.

Zitat:
Both the TX and the RX FIFO have a simple communication scheme. A packet 
unit on the FIFO interface consists of: 2 bytes of size information, 
most significant byte first, and then exactly as many bytes of data as 
were indicated. The data includes all Ethernet MAC headers (destination 
address, source address, and length/type) in the exact same order as 
defined in the standard, but not the frame check sequence trailer.

von Martin S. (strubi)


Lesenswert?

Nochmal zur Klarstellung: Ins FIFO steckt man die Rohdaten des 
Ethernet-Pakets, ob das UDP oder TCP oder ARP usw. ist interessiert das 
Interface nicht. Aus dem RX kommt entsprechend das Rohpaket wieder raus.
Darüber strickt man seinen Stack oder portiert was wie lwip im 
Push-pull-Betrieb, das ist allerdings eine Performance-Sackgasse und bei 
GbE IMO komplett sinnlos.
Allerdings kann man besagten Core wie gesagt relativ leicht aufbohren, 
dass er mit Packet-Queues so läuft, dass die CPU nur noch minimale 
Arbeit (Quittierung von Paket-Interrupts) hat. Dann braucht man auch je 
nach Konfiguration den ganzen Hardware-Rabbel nicht, und man kann den zu 
versendenden Nutzlast-Datenstream effektiv in einen virtuellen Port im 
SoC reinfüttern.
[ Der TEMAC hatte diesbezüglich einen architektonischen Bock, aber 
andere Geschichte ]
Siehe auch dazu 
https://section5.ch/index.php/2017/05/10/dma-autobuffering-techniques/.
Senden am physikalischen Limit ist damit relativ trivial, und meistens 
machen FPGA-Lösungen auch nur das, beim Empfangen über längere Distanzen 
und Router allerdings muss sich eine separate Engine um die Sortierung 
kümmern.
Mit TCP geht das auch, nur macht das ACK-Pingpong-Spiel das ganze viel 
komplexer und schwerfälliger und es kommt externes RAM mit in den Topf.

Auf jeden Fall kommt man nicht umhin, sich mit der Programmierung eines 
auf seine Anwendung zugeschnittenen UDP/IP/ARP-Stacks und einer 
entsprechenden State-Machine (Software) zu beschäftigen.

von Max M. (traffo)


Lesenswert?

https://www.enclustra.com/en/products/fpga-manager/ <-- kostet einen 
kleinwagen.

Da das noch verkauft wird, kannst du davon ausgehen dass es gratis nix 
brauchbares giebt.

von Max M. (traffo)


Lesenswert?

Der Triple-Speed Ethernet Intel FPGA IP scheint gratis verfügbar zu sein

von Rick D. (rickdangerus)


Lesenswert?

Gustl B. schrieb:
> Bei UDP können Pakete verloren gehen und
> in zufälliger Reihenfolge ankommen.
Ich habe es noch nicht erlebt, das Pakete in den Switchen umsortiert 
wurden. I.d.R. sind die Strecken zwischen FPGA und Host-PC auch 
überschaubar.

Max M. schrieb:
> basiert auf
> einem angeblich einfach zu benutzenden 8Bit FIFO.
Wenn deine Rohdaten eine Bitbreite von 42 Bit (oder einem anderen 
krummen Wert) haben, dann muß du dir natürlich was zur Synchronisation 
einfallen lassen. Ansonsten füllt man das FIFO auf der Senderseite mit 
Bytes, die auf der anderen Seite gebündelt wieder rausfallen. Oder auch 
andersrum: Pakete im Host zusammenbasteln (Größe je nach MTU 1500 Byte 
oder 9000 Byte) und im FPGA aus dem RX-FIFO auslesen, sobald was da ist.
Was der Stack macht, wenn er ein Paket nicht vollbekommt, hängt vom 
jeweiligen Stack ab.

Martin S. schrieb:
> Auf jeden Fall kommt man nicht umhin, sich mit der Programmierung eines
> auf seine Anwendung zugeschnittenen UDP/IP/ARP-Stacks und einer
> entsprechenden State-Machine (Software) zu beschäftigen.
Wobei man für die Grundfunktionen nicht viel braucht (ARP-Response, 
Ping-Reply und ggf. UDP-Portfilter). BTDT.

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.