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.
> 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.
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.
Vermutlich wäre nicht ein Protokoll sondern eine fehlerkorrigierende Codierung am Sinnvollsten. Welche Codierung wäre denn am besten geeignet?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.