Forum: FPGA, VHDL & Co. Fehlerhandling bei Serdes Verbindung


von Achim (Gast)


Lesenswert?

Hallo Zusammen,

ich will eine Serdes Verbindung zwischen zwei Spartan 6 aufbauen, die 
Daten mit 4b/5b überträgt. Wenn ich über den Core-Generator die 
Eingangsseite über ein SelectIO Interface erstelle, wird intern eine Art 
Frame-Signal für die 5 Bit breiten Datenpakete durch einen BUFIO2, der 
durch 5 teilt, erstellt. Hinter dem SelectIO/Serdes würde ich nun einen 
4b/5b decoder setzen. Was ist aber, wenn im Fehlerfall der Eingang z.B. 
am Takteingang eine "Extraflanke" sieht oder eine Flanke übersieht - ab 
dem Moment würden alle 4b/5b Datenpakete Empfängerseitig ein Bit 
verschoben und komplett falsch ankommen. Habe ich da einen Denkfehler 
und wenn nein, wie fängt man sowas ab?

Danke und viele Grüße

Achim

von pks (Gast)


Lesenswert?

Du musst Dein Signal entweder über-abtasten oder mit einem externen 
Baustein den Takt aus dem Datenstrom zurückgewinnen.

von Dieter (Gast)


Lesenswert?

>Serdes Verbindung zwischen zwei Spartan 6 aufbauen, die Daten mit 4b/5b

Wird hier nicht standardmäßig 8b10b verwendet?

von pks (Gast)


Lesenswert?

Dieter schrieb:
> Wird hier nicht standardmäßig 8b10b verwendet?

Du meinst wahrscheinlich die MGTs?

von Achim (Gast)


Lesenswert?

pks schrieb:
> Du musst Dein Signal entweder über-abtasten oder mit einem externen
> Baustein den Takt aus dem Datenstrom zurückgewinnen.

Den Takt will ich mit übertragen, also Clock und Daten getrennt - in dem 
Fall kann ich mir die Taktrückgewinnung sparen.

8b/10b wäre auch eine Möglichkeit, da stoße ich aber 1. an die Grenzen 
der Breite des SelectIOs mit SDR und 2. brauche ich es eigentlich nicht, 
da ich wie oben beschrieben keine Taktrückgewinnung mache.

von Dieter (Gast)


Lesenswert?

Achim schrieb:
> Den Takt will ich mit übertragen, also Clock und Daten getrennt - in dem
> Fall kann ich mir die Taktrückgewinnung sparen.

nein, der Takt bei ist mehr ein Frame Sync als ein Takt. Du musst daraus 
Deinen Takt generieren.

von Christian R. (supachris)


Lesenswert?

Nee, im Normalfall kommt der (HighSpeed) Takt zu dem die Daten und das 
Frame Sync synchron sind aus der Quelle. Mit dem Takt betreibst du die 
ISERDES über die BUFIO2 Geschichte.
Das Frame Sync dient nur dazu beim Starten die Bits richtig zu schieben, 
das geht über das BitSlip. Wenn das einmal ausgrichtet ist, kann 
eigentlich bei so einer source synchronous Strecke nicht mehr viel 
passieren. Siehe XAPP1064

von Achim (Gast)


Lesenswert?

Dieter schrieb:
> nein, der Takt bei ist mehr ein Frame Sync als ein Takt. Du musst daraus
> Deinen Takt generieren.

Wenn ich mich an den Core-Generator halte, ist er das nicht - da ist der 
Takt ein Takt und im Empfangs-FPGA wird dieser runter geteilt um ein 
Frame Sync daraus zu machen. Daher rührt meine Frage oben. Ist der 
Ansatz vom CoreGen grundsätzlich falsch und man sollte den Weg gehen, 
ein langsames Frame Sync (im Fall von 4b/5b Rechteck in 5 Datenbit 
Breite) übertragen und dann im Empfangs-FPGA via DCM auf Datenfrequenz 
multiplizieren?

von Christian R. (supachris)


Angehängte Dateien:

Lesenswert?

Das Frame Sync intern erzeugen bringt ja nichts. Das muss der Sender 
erzeugen, damit der Empfänger weiß, wann ein neues Byte anfängt (oder 
bei dir halt wann das MSB/LSB des nächsten 5 Bit Wortes kommt). Du musst 
das Frame Sync vom Sender ausgeben und ein konstantes Muster einstellen, 
anhand dessen du im Empfänger zweifelsfrei feststellen kannst, wann die 
Bits ausgerichtet sind. Am LTC2175 ADC wird das beispielsweise so 
gemacht wie im Bild. Mit jeder Flanke des High Speed Cloks wird ein 
Datenbit abgetastet und das Frame Signal zeigt eindeutig die Lage an. 
Intern musst du dann beim Starten solange das Bit Slip machen bis die 
Lage stimmt, also am Frame Sync Parallel Vektor dein am Sender 
eingestelltes konstantes Muster anliegt.

von Achim (Gast)


Lesenswert?

Christian R. schrieb:
> Du musst
> das Frame Sync vom Sender ausgeben und ein konstantes Muster einstellen,
> anhand dessen du im Empfänger zweifelsfrei feststellen kannst, wann die
> Bits ausgerichtet sind.

Das klingt gut und sinnvoll, nur brauche ich dann für das FS extra Pins, 
auf die ich gerne verzichten würde (muss). Ich hatte grade die Idee, in 
regelmäßigen Abständen, also vor jedem größeren "Datenblock" eine 
Sync-Sequenz aus 5x Steuerwörtern zu schicken (z.B. J -> 11000). Dann 
könnte der Empfänger darauf warten, maximal 5x Bit Slippen und wäre dann 
für den nächsten größeren Traffic im FS. Gute oder schlechte Idee? ;)

von Lattice User (Gast)


Lesenswert?

Achim schrieb:
> Christian R. schrieb:
>> Du musst
>> das Frame Sync vom Sender ausgeben und ein konstantes Muster einstellen,
>> anhand dessen du im Empfänger zweifelsfrei feststellen kannst, wann die
>> Bits ausgerichtet sind.
>
> Das klingt gut und sinnvoll, nur brauche ich dann für das FS extra Pins,
> auf die ich gerne verzichten würde (muss). Ich hatte grade die Idee, in
> regelmäßigen Abständen, also vor jedem größeren "Datenblock" eine
> Sync-Sequenz aus 5x Steuerwörtern zu schicken (z.B. J -> 11000). Dann
> könnte der Empfänger darauf warten, maximal 5x Bit Slippen und wäre dann
> für den nächsten größeren Traffic im FS. Gute oder schlechte Idee? ;)

Genau das meinte Christian auch so.
Wenn man noch sicherstellt, dass auch ein verschobenes Sync kein legales 
Symbol ist, wird ein Versatz einfach detektier- und korrigierbar.

von Achim (Gast)


Lesenswert?

Stimmt, ich hätte besser lesen/verstehen sollen. Mein J-Symbol muss auch 
nicht 5x gesendet werden, sondern nur ein mal beim Start jedes 
Datenblocks - so wie auch in der xapp495 beschrieben.

Also, danke und Euch ein schönes Wochenende!

Viele Grüße

Achim

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.