Hi, ich hab gerade ein wenig Probleme, dass ich das korrekte Einlesen einer LVDS Verbindung zu nem ADC hinbekomme. Mein (geplanter) Aufbau sieht folgendermaßen auf. Der 50MHz Quarzoszillator geht in den GlobalClock Pin des FPGAs (Virtex 5) rein und direkt auf eine PLL. Diese macht unter anderem 250MHz draus, mit denen die Logik dann arbeitet. Diese Frequenz geht über LVDS Pins raus zum ADC an den ENC Pin, welcher dann bei jeder steigenden Taktflanke einmal sampelt und die Daten dann ausgibt (da ist eine Pipeline drin) Nach 1.0 bis 2.8 ns nach der steigenden Flanke auf ENC, werden die Daten vom ADC an 12 LVDS Pins angelegt und es kommt auch ein Daten-Taktsignal heraus. (Skew zwischen Datensignal und Taktsignal ist +-0.6ns). Der Datentakt hat natürlich die gleiche Frequenz wie das ENC Signal, besitzt aber eine Phasenverschiebung um 1.0 bis 2.8 ns. Die Datenleitungen und der Datentakt gehen zum FPGA. Der Datentakt wird auf einen ClockCapable Pin geführt, kommt dann intern auf einen BUFIO und steuert damit die Eingangsflipflops der Datenleitungen an. Die Flipflops sind im ILOGIC integriert. Wie im Datenblatt empfohlen arbeiten die Flipflops mit der fallenden(!) Flanke. Bei der steigenden Flanke würde es Hold und Setup Zeitverletzungen geben, bei der fallenden Flanke sind die Daten lange genug davor und danach stabil. Nun aber zum Problem: Wie kann ich diese Daten nun weiterverarbeiten? Sobald ich ein Flipflop dranhänge, was mit den internen 250MHz läuft gibts am Übergang zwischen den beiden Taktbereichen Timing Probleme. (und zwar richtig merkwürdige, wo der Slack dann bei -3.9 ns liegt usw. wobei ich da wohl die Constrains falsch gesetzt hab) Grundsätzlich sollte es möglich sein, ich hab mir alle Signale mal auf Papier gezeichnet. Vermutlich liegt das Problem aber daran, dass die Contraints nicht richtig gesetzt sind. Wie kann ich dem Programm (Xilinx ISE) sagen:? - Der Datentakt kommt 1.0 bis 2.8ns nachdem der interne Takt über Pin XYZ den FPGA verlassen hat. Ich kenne die Phase nicht zwischen Datentakt und internem Takt, und daran scheitert es wohl gerade. Es wäre übrigens kein Problem den Takt am ADC zum internen Takt in der Phase zu verschieben, das könnte ich bei der PLL einstellen. Eine andere Möglichkeit wäre natürlich, das Eingangssignal abzutasten und damit einzusynchronisieren. Wobei ich Zweifel habe, ob das bei den 250MHz überhaupt noch möglich ist.
Johannes O. schrieb: > Hi, > > ich hab gerade ein wenig Probleme, dass ich das korrekte Einlesen einer > LVDS Verbindung zu nem ADC hinbekomme. > > Mein (geplanter) Aufbau sieht folgendermaßen auf. > Der 50MHz Quarzoszillator geht in den GlobalClock Pin des FPGAs (Virtex > 5) rein und direkt auf eine PLL. Diese macht unter anderem 250MHz draus, > mit denen die Logik dann arbeitet. Keine gute Idee, aus 2 Gründen: Erstens die PLLS in einem FPGA sind nicht gerade Jitterarm, das kann dich durchaus 1-2 Bits Genauigkeit kosten. Über den zweiten Grund bist du schon gefallen: > > Nun aber zum Problem: Wie kann ich diese Daten nun weiterverarbeiten? > Sobald ich ein Flipflop dranhänge, was mit den internen 250MHz läuft > gibts am Übergang zwischen den beiden Taktbereichen Timing Probleme. > (und zwar richtig merkwürdige, wo der Slack dann bei -3.9 ns liegt usw. > wobei ich da wohl die Constrains falsch gesetzt hab) Grundsätzlich > sollte es möglich sein, ich hab mir alle Signale mal auf Papier > gezeichnet. > Die Lösung dafür ist einfach: Du verwendest die vom ADC zurückkommende Clock (die geht ja auf einen Clockpin) als Takt für die Weiterverarbeitung.
Johannes O. schrieb: Virtex-5 hat doch ISERDES, da kannst Du dich nach dieser XAPP richten: http://www.xilinx.com/support/documentation/application_notes/xapp1064.pdf Siehe auch Userguide zu Virtex-5 bezüglich ISERDES: http://www.xilinx.com/support/documentation/user_guides/ug190.pdf MfG,
Danke für die Antworten! Das mit dem Jitter ist mir soweit bekannt, das ist aber erstmal eine andere Baustelle, das wird ggf. noch anders gelöst. Das Problem würde aber auch dann bestehen bleiben. Zurzeit verwende ich die ADC Clock schon zum internen Weiterverarbeiten. Irgendwann werden die Daten aber zwangsweise mit der anderen Clock zusammengeführt und dann gibts immer Probleme, nur eben an einer anderen Stelle. ISERDES dürfte mir auch nicht helfen (sofern richtig verstanden, ansonsten bitte korrigieren!), da ich bereits parallele Daten hab und das auch so bleiben soll/muss. Eine andere Möglichkeit habe ich nun aber, glaube ich, gefunden: Kann das mit einem FIFO im FPGA klappen? Es gibt da welche mit 2 unterschiedlichen clocks, den einen zum Lesen und den anderen zum Schreiben. Da ich nur eine Phasenverschiebung aber gleiche Frequenz hab, sollte es auch nicht zu nem Überlauf oder Unterlauf kommen. Natürlich kommt dadurch eine Verzögerung ins System, aber das wäre noch akzeptabel. Machbar, oder stehe ich dann vor einem ähnlichen Problem?
Die ISERDES sollst Du deshalb nehmen, weil die in hardware und nicht in fabric logic laufen und timingtechnisch 1GHz packen und dies ganz ohne Verrenkungen. Dass die Daten dann falsch parallelisiert werden, ist kein grosses Übel. Du nimmst einfach die kleinstmögliche Menge an - einen 4er Block schätze ich mal, schiebst das in ein Register-RAM oder, wenn Du geschickt arbeitest, auch direkt in ein asymmetrisches BRAM und drehst sie einfach später zurück, sodass die Bits wieder zueinander stimmen. Bei 250 MHz könnte es aber in einem V5 auch noch konventionell gehen. Das Annehmen auf der negierten Flanke ist etwas unschön, aber der Wandler liefert es ja offenbar so. Dazu solltest Du aber nochmals sehen, ob die Clockleitung(en) des Wandlers nicht 2=symmetrisch sind und damit zu tauschen wären. Gfs kannst Du auch eine PLL dranhängen und den Takt justieren. U.U. kannst Du ja die Daten dann auch mit dem halben Takt als DDR annehmen, wenn das nicht schon so gedacht sein sollte (?) Die Rüpelmethode, nämlich die IO-Delays zu bemühen und die Daten vorzudrehen und die Clock nachzustellen, dürfte bei 250 MHz noch nicht ganz gehen, da zu langsam. :-) Zu dem Thema Wandlerjitter: Eigentlich haben Wandler dieser Klasse eine PLL drin, die den ankommenden Takt filtert und einen internen Datentakt erzeugt, der eine saubere Abtastung gewährleistet. Ist das so, bist Du fein raus und kannst den FPGA als Taktgeber nutzen. Dass die Daten dann digital jittern, ist unerheblich, solange Du sie reinkriegst. Was clock constraints angeht, beziehst Du Dich einfach auf die negative Flanke, wie im Editor angegeben. Wenn er das Timing nicht schafft, dann kann das der Chip eben nicht. Dann bleibt nur SERDES.
:
Bearbeitet durch User
Johannes O. schrieb: > Danke für die Antworten! > > Das mit dem Jitter ist mir soweit bekannt, das ist aber erstmal eine > andere Baustelle, das wird ggf. noch anders gelöst. Das Problem würde > aber auch dann bestehen bleiben. > > > Zurzeit verwende ich die ADC Clock schon zum internen Weiterverarbeiten. > Irgendwann werden die Daten aber zwangsweise mit der anderen Clock > zusammengeführt und dann gibts immer Probleme, nur eben an einer anderen > Stelle. Soweit richtig, hintert dich aber niemand daran deine anderen Takte aus der eingehenden ADC Clock abzuleiten, statt aus der ausgehenden. Hat auch den Vorteil, dass wenn das Jitterproblem relevant sein sollte man nicht von vorne anfangen muss. > > > ISERDES dürfte mir auch nicht helfen (sofern richtig verstanden, > ansonsten bitte korrigieren!), da ich bereits parallele Daten hab und > das auch so bleiben soll/muss. > Ich würde wegen der negativen Clockflamke, IDDR verwenden, da bekommst du für jeden Eingang 2 bits, eines auf der positiven Flanke und eines auf der negativen Flanke abgetastet. Du verarbeitest das passende weiter. > > > Eine andere Möglichkeit habe ich nun aber, glaube ich, gefunden: > Kann das mit einem FIFO im FPGA klappen? Es gibt da welche mit 2 > unterschiedlichen clocks, den einen zum Lesen und den anderen zum > Schreiben. Da ich nur eine Phasenverschiebung aber gleiche Frequenz hab, > sollte es auch nicht zu nem Überlauf oder Unterlauf kommen. > Natürlich kommt dadurch eine Verzögerung ins System, aber das wäre noch > akzeptabel. > Machbar, oder stehe ich dann vor einem ähnlichen Problem? Ja sollte gehen. Jürgen Schuhmacher schrieb: > > Bei 250 MHz könnte es aber in einem V5 auch noch konventionell gehen. > Das Annehmen auf der negierten Flanke ist etwas unschön, aber der > Wandler liefert es ja offenbar so. Wie schon erwähnt, IDDR verwenden. > Die Rüpelmethode, nämlich die IO-Delays zu bemühen und die Daten > vorzudrehen und die Clock nachzustellen, dürfte bei 250 MHz noch nicht > ganz gehen, da zu langsam. :-) Ausserdem hat man unbekannte Delays (Ausgang, Platine, ADC, Platine, Eingang) , und muss deshalb u.U. dynamisch calibriert werden. > > Zu dem Thema Wandlerjitter: Eigentlich haben Wandler dieser Klasse eine > PLL drin, die den ankommenden Takt filtert und einen internen Datentakt > erzeugt, der eine saubere Abtastung gewährleistet. Hmm, habe ich noch nicht gesehen. Datenblatt des verwendeten ADCs wäre hilfreich.
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.