Forum: FPGA, VHDL & Co. Protokoll für Kommunikation zwischen zwei FPGAs


von Johannes (Gast)


Lesenswert?

Hallo,

ich implementiere gerade eine schnelle serielle Datenverbindung (bis 
Gbps) zwischen zwei FPGAs über eine Backplane. Dazu benutze ich vom 
Altera Cyclone V die GXB Transceiver. Für das PHY (SERDES etc.) stellt 
Altera IP Cores zur Verfügung. Die Übertragung erfolg Byteweise.

Nun mache ich mir Gedanken über das Protokoll und finde keinen richtigen 
Einstieg. Ist es nötig die Datenübertragung mit einem Protokoll zu 
sichern? Welche Protokolle könnt ihr mir empfehlen für eine derartige 
Datenübertragung.

von ff (Gast)


Lesenswert?

> Ist es nötig die Datenübertragung mit einem Protokoll zu
> sichern?

Das kommt ganz drauf an was du machen willst und ob Datenverlust 
toleriert werden kann.

von Johannes (Gast)


Lesenswert?

Datenverlust kann nicht toleriert werden.

Der 1. FPGA Sampelt Daten und Packt diese in ein Telegramm (Startbyte, 
Datenmenge, u.a.). Diese Daten sind für den PC bestimmt, daher das 
Telegramm. Eine PC Software wertet das Telegramm aus. Der 2. FPGA hat 
die USB-Schnittstelle zum PC. Ich möchte also die Daten vom 1. zum 2. 
FPGA übertragen, dort in ein FIFO legen und weiter über USB zum PC 
übertragen. Was Fehlt ist die Datenferbindung zwischen 1. und 2. FPGA.

von Johannes (Gast)


Lesenswert?

Vermutlich wäre nicht ein Protokoll sondern eine fehlerkorrigierende 
Codierung am Sinnvollsten. Welche Codierung wäre denn am besten 
geeignet?

von Udo (Gast)


Lesenswert?

Eine reine Übertragung ist nicht sehr schwer zu implementieren da einem 
der Transceiver einiges abnimmt - wenn man das denn will.

Ich stelle einfach mal ein paar Ideen in den Raum.

Durch die 8b10b-Kodierung kannst du sehr einfach SOF, EOF und ALIGN 
kodieren.

Für das Wordalignment kannst du auch ein extra ALIGN-8b10b-Char 
verwenden. Das Wordalignment kann der Transceiver eigentlich selbst 
durchführen, alternativ geht das auch mittels bitslip und manuellem 
vergleich der Daten.


Ich würde erst einmal auf eine Fehlererkennung setzen. Hierfür kannst du 
einen CRC nehmen. Es gibt die Variante wo pro Takt über mehrere 
Datenbits die Checksumme berechnet wird. Dies kannst du bspw. hier 
erzeugen: http://www.easics.com/webtools/crctool

Ich würde es erst mal ohne Fehlerkorrektur angehen. Je nach Umfeld ist 
die Übertragung so robust dass du gar keine Fehler sehen wirst. Kommt 
aber natürlich auch auf die Anwendung drauf an. Lass es einfach mal mit 
dem CRC-Check ein paar Tage laufen dann siehst du ja ob weitere 
Anstrengungen nötig sind.

Ansonsten einfach SOF und EOF nutzen um den CRC generator zurückzusetzen 
und die Prüfung an der richtigen Stelle durchzuführen.


Weiter musst du die Reset-Sequenz der Transceiver einhalten.

Je nach Aufbau musst du auch auf ein Rate-Matching achten. Dies ist aber 
nur nötig wenn du keinen gleichen Referenztakt (0ppm) zwischen den FPGAs 
hast. Da hilft dir aber der Transceiver auch, du musst es dann aber 
natürlich auch in deiner Logik abkönnen.

Natürlich ist noch zu beachten dass du
1. lokalen Takt
2. TX Takt
3. RX Takt
hast und du also viel Clock Domain Crossing (CDC) haben kannst.

Ich mache es aktuell TX-seitig so, dass ich ein CMD und ein DATA 
Dualclock-FIFO habe. Zuerst schiebe ich in das data fifo die daten und 
dann in das CMD fifo wieviel drin steht. Die FSM die die eigentlichen 
Transceiver Daten (Frame) erzeugt liest die Länge aus dem CMD fifo und 
liest dann den DATA fifo entsprechend. In der Zeit in welcher keine 
Daten kommen sende ich NOP Frames, alternativ kansnt du aber auch 
ALIGN-Chars senden.

Ich hoffe ich konnte dir ein paar Ideen mit auf dem Weg geben. Eine 
einfache Übertragung zum laufen zu bekommen ist eigentlich nicht sooooo 
schwer aber ein paar Fallstricke gibt es schon. Wie gesagt würde ich 
mich zuerst einmal auf eine Fehlererkennung beschränken.

Achte darauf dass der differentielle Ausgangspegel eingestellt wird 
(assigment editor). Standardmäßig war der bei mir auf das minimum 
eingestellt - soweit ich mich erinnern kann 200mV - was ggf. für deinen 
Aufbau nicht ausreicht.

von Christian R. (supachris)


Lesenswert?

Also wir nutzen zwischen zwei FPGAs innerhalb eines Gerätes auch nur die 
K-Characters für Alignment und als Trennung zwischen den "Paketen" 
(haben sowieso eine Art Streaming Protokoll da noch drüber) und haben 
das mal einige Tage mit dem IBERT von Xilinx laufen lassen....nicht ein 
Bit-Fehler, und das bei 5GBit/s und selbst entworfener Platine. Selbst 
über PCIe Kabel gabs keine Fehler und das Augendiagramm war fast maximal 
offen. Das läuft schon sehr robust. Mit gleichem Ref-Takt für beide 
Seiten ersparst du dir die Clock Correction, ist aber auch nicht sooo 
wild, bei Xilinx machen das die Transceiver auch selber, man muss nur 
alle Nase lang mal den Datenstrom unterbrechen und ein Clock Correction 
K-Char senden, dann synchronisiert sich der Empfänger FIFO wieder. Ist 
zwar von Xilinx, aber schau dir mal das PDF "High-Speed Serial I/O Made 
Simple" an, das ist ectrem gut gemacht.

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.