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
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
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
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.
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
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
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
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.
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