Forum: FPGA, VHDL & Co. Sehr schnelles LVDS Signal korrekt einlesen, Timing contraints?


von Johannes O. (jojo_2)


Lesenswert?

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.

von Lattice User (Gast)


Lesenswert?

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.

von Fpgakuechle K. (Gast)


Lesenswert?

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,

von Johannes O. (jojo_2)


Lesenswert?

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?

von J. S. (engineer) Benutzerseite


Lesenswert?

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
von Lattice User (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.