Forum: FPGA, VHDL & Co. LVDS bei Xilinx Virtex 5 ML 507


von Cihan K. (lazoboy61)


Lesenswert?

Hallo,

habe mal ne kurze Frage an euch.

Ich verwende bei meinem zwei Xilinx Entwicklungsboards ML507 die 
differentiellen Ein- und Ausgänge mit LVDS IOSTANDARD.

Mit dem einem Board wird eine 20 MHz Clock erzeugt und über den 
differentiellen Ausgang (Clockausgang, SMA-Connector) zum anderen 
Eingang (Clockeingang, SMA-Connector) des zweiten Boards geschickt. Wenn 
ich am ersten Board wo die 20 MHz erzeugt wird die Frequenz messe, sehe 
ich einen sauberen Rechteck. Sobald ich die Verbindung zum zweiten Board 
per SMA-Connectoren schaffe und die Frequenz wieder messe, sehe ich das 
ich Störüngen auf der Clock habe und das Rechteck nicht mehr sauber ist.

Habe bei beiden Boards die IOSTANDARDS LVDS_25 benutzt. Sind da die Ein- 
und Ausgangswiderstände auf den Boards bei Xilinx schon mit integriert 
oder gibt es noch andere Standards die ich hier evtl. benutzen kann? 
Oder muss ich noch weitere Sachen beachten?

Würde mich auf jede Anregung sehr freuen.

MfG Cihan

von Robert K. (Firma: Projektleiter Medizinsoftware) (robident)


Lesenswert?

Was ist als Ausgangs-R und Eingangs-R vorgeschrieben worden?

Verwendest du DIFF TERM am Eingang?

Ich bin gerade an einem ähnlichen Thema dran:
Beitrag "Re: LVCMOS25 oder LVDS_25 für differntial signaling"

von Cihan K. (lazoboy61)


Lesenswert?

Ja mit Diff_Term hat es funktioniert, meine Clock ist wieder sauber. Der 
Abschlusswiderstand hat gefehlt.

Ich habe einfach in der UCF den Eingang den Parameter übergeben.
NET "<clockeingang>" DIFF_TERM = TRUE | IOSTANDARD = LVDS_25;

Hat super funktioniert. Ist auch alles im UG190 detailliert beschrieben 
so wie ich es rausgefunden habe.

Danke für die Anregung.

MfG Cihan

von Robert K. (Firma: Projektleiter Medizinsoftware) (robident)


Lesenswert?

Was hast Du am Ausgang des sendenden FPGAs für die Ports deklariert?

von Cihan K. (lazoboy61)


Lesenswert?

Hallo,

die 20 MHz Frequenz ist ursprünglich aus einem 140 MHz kreiert worden, 
ist ebend eigentlich ein Signal welches ich dann über einen OBUFDS über 
die GTX-Ports H14 und H15 differentiell ausgegeben habe, um den anderen 
FPGA zu takte. Das zweite Board nimmt dann mit eingestelltem 
Eingangswiderstand das Signal über ein IBUFGDS auf, welches ich dann 
über eine DCM weiter führe.

Ich habe allerdings Probleme mit den Verzögerungen. Ich sende ja sowohl 
Clock als auch Daten vom ersten FPGA- zum zweiten FPGA-Board und sehe 
das die Daten zur Clock verschoben sind (Messung am Oszi). 
Beispielsweise wenn ich eine Bitfolge "1110000" schicke empfange ich es 
als "0001110".

Die Clock geht durch mehrere Buffer durch und die Daten gehen nur über 
einen IBUFDS durch, kann es schon dadurch zu Verzögerungen kommen, wenn 
ja, wie kann man Sie eliminieren oder sogar synchron halten?

Bräuchte in dieser hinsicht mal eure Hilfe.

MfG Cihan

von Klaus F. (kfalser)


Lesenswert?

In Deinem beschriebenen Beispiel hast Du 3 Takte Verzögerung.
Bei 20 MHz wären es 50 ns Taktperiode und somit 150 ns Verzögerung.
Das ist viel, viel mehr als alle möglichen Durchlaufzeiten durch die 
FPGAs und würden sogar bei 20 cm/ns Ausbreitungsgeschwindigkeit einer 
Kabellänge von 30 m entsprechen.
Wenn Du wirklich solche Verzögerungen siehst, dann hast Du irgend einen 
anderen Fehler.

von Cihan K. (lazoboy61)


Lesenswert?

Abgesehen von der Verzögerung, wie sollte man denn beim Empfänger-Board 
die Clock und die Daten aufnehmen?

Ich habe es folgendermaßen gemacht:

20MHz (Eingangstakt) -> IBUFGDS -> DCM -> CLK0 -> BUFG -> (ab hier wird 
er im Progamm verwendet)

Daten -> IBUFDS -> (ab hier werden sie im Progamm verwendet)

Mir kommt es so vor, als ob die Clock schon richtig eingebunden wurde, 
aber die Daten nicht. Reicht es aus, wenn man die Daten nur über ein 
IBUFDS einliest? oder wie sollte ich es am besten machen (sowohl für 
Clock als auch für die Daten)

mfg Cihan

von Robert K. (Firma: Projektleiter Medizinsoftware) (robident)


Lesenswert?

wozu die DCM?  die bringt nur jitter auf den Takt, weil sie vorhandenen 
Jitter glättet und damit die Relation zwischen Takt und den Daten 
verschlimmbessert

von Cihan K. (lazoboy61)


Lesenswert?

Die DCM brauche ich, da die Daten mit 140 MHz gesendet werden. Aus der 
20 MHz wird dann die 140 MHz generiert, mit den dann die Daten erfasst 
werden. Die 20 MHz Clock dient sowohl zum generieren der 140 MHz und 
soll unter anderem auch als Synchronisation für die Daten dienen, um 
Beispielsweise den Startpunkt eines ankommenden Datenpaketes zu 
signalisieren.

Cihan

von Klaus F. (kfalser)


Lesenswert?

Ich kenne Deine Rahmenbedingungen nicht, aber solche Methoden sind ein 
absolut unprofessioneller Murx, der Dir nur Schwierigkeiten machen wird.

Verwende einen Serializer mit 8B/10B Kodierung.
Dann hast Du nur eine einzige serielle Leitung, auf der Takt und Daten 
gemeinsam wandern.

von Cihan K. (lazoboy61)


Lesenswert?

Danke für den Tip, aber wird mir warscheinlich nicht nützen.

Vielleicht hole ich mal bisschen mehr raus.
Das Ziel ist es von einer Camera die Pixeldaten zu speichern, welche mit 
dem CameraLink Protokoll kommen.

Da ich zur Zeit die Kamera noch nicht da habe, versuche ich sowohl die 
Kamera auf dem ersten Board und den Empfänger (zweites Board) zu 
programmieren.

Beim CameraLink hat man eine 20MHz Clock und die differentiellen 
Datenleitungen. Wie bekannt kommen nun diese Daten mit der sieben fachen 
Geschwindigkeit als die Clock.

Nun muss ich am Empfänger-Board die 20MHz aufnehmen (zur Synchronisation 
der Daten), sieben fach schneller machen (DCM) für die Datenaufnahme und 
dann alles abspeichern (DDR2-Ram, läuft schon).

Vllt. noch zum festhalten, das Sender-Board, welches die Kamera 
"simuliert" läuft eigentlich soweit OK. Die Clock und Datenbits auf dem 
Oszilloskop sehen plausibel aus. Nun müssen diese im Empfänger 
aufgenommen und verarbeitet werden, genau hier liegt mein Problem.

Wie oben beschrieben nehme ich die Clock folgendermaßen auf:
20MHz (Eingangstakt) -> IBUFGDS -> DCM -> CLK0 -> BUFG -> (ab hier wird
er im Progamm verwendet)

und die Daten:
Daten -> IBUFDS -> (ab hier werden sie im Progamm verwendet)


Ich habe auch viel recherchiert und sah, dass viele den IDDR benutzen, 
um die Daten aufzunehmen und anschließend zu parallelisieren.
Wie müsste ich es machen laut euren Erfahrungen.

Danke im voraus für alle Beiträge

mfg Cihan

von Christian R. (supachris)


Lesenswert?

Das muss man doch mit ISERDES und OSERDES machen, dann klappt das auch.

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.