Forum: FPGA, VHDL & Co. 8 Kanal ADC LTM9011-14 an Zynq Ultrascale anschließen


von Mattias M. (brushless)


Angehängte Dateien:

Lesenswert?

Hallo liebe Profis,
ich bin gerade dabei ein LTM9011-14 an ein Board von Trenz (TE0820) 
anzuschließen. Leiterkarte ist so geroutet, dass alle serielle Leitungen 
die gleiche Länge haben. (Die Längen auf dem Trenz Board sind 
berücksichtigt). Ich habe schon mal etwas code geschrieben und mit dem 
ILA überprüft.
Auf allen Leitungen sehe ich Bewegung. Ich gehe also erstmal davon aus, 
dass elektrisch alles funktioniert.
So, wie ich das angeschlossen habe, kann ich natürlich keine sinnvollen 
Daten bekommen, da meine Clock nicht synchron zu den Daten ist. Nun habe 
ich schon viel über das Bitslip und Idelay gelesen, kann mir aber nicht 
so richtig vorstellen, wie ich das machen soll. Der ADC bietet ja auch 
die Frame clock Leitungen an. Die stehen mir auch im FPGA zur Verfügung. 
Vielleicht kann man die elegant dafür nutzen?
Meine Frage ist daher:
Wie würdet ihr das jetzt machen?
Ist es einfacher, das jetzt händisch zu machen? Oder sollte man den 
high-speed-select-wiz benutzen.
Ich habe mir das auch schon angeschaut, finde das aber sehr kompliziert!
Könntet ihr mir bitte mit euren Erfahrungen einige Tipps geben?
Danke schon mal,
brushless

von Gustl B. (-gb-)


Lesenswert?

Mattias M. schrieb:
> Der ADC bietet ja auch
> die Frame clock Leitungen an. Die stehen mir auch im FPGA zur Verfügung.
> Vielleicht kann man die elegant dafür nutzen?

Exakt die solltest du verwenden um mit dem Deserializer die Bits zu 
parallelisieren.

Mattias M. schrieb:
> Bitslip

Brauchst du dann eigentlich nicht wenn du die Frameclock verwendest.

Mattias M. schrieb:
> Idelay

Das kann hilfreich sein wenn die Daten nicht schön getroffen werden. Du 
solltest erstmal vom ADC ein statisches Bitmuster ausgeben lassen, das 
kann man bestimmt konfigurieren. Dann guckst du ob du das korrekt 
bekommst. Wenn ja dann kannst du im ADC umschalten auf echten Betrieb, 
wenn nein, dann schiebst du so lange mit dem idelaye bis du das 
Bitmuster stabil bekommst.

von Christian R. (supachris)


Lesenswert?

Wir nutzen genau dieses Modul auch. Und zwar im 16 Bit 2 Lane Modus. 
Also 500MHz DDR dann.

Dazu geht der DCO (wir nutzen nur einen, die beiden Dies sind 
hinreichend gleich angebunden) zunächst in ein IBUFGDS, danach in einen 
IDELAY im Clock Modus. Da wir auch die Leitungslängen der Signale gleich 
ausgelegt haben, ist es einfacher, nur den DCO in der Phase zu den Daten 
zu verzögern.
Danach geht es auf auf einen BUFIO und danach auf einen BURF mit 
Teiler-Faktor 4. Somit kommt da schon mal der 125MHz Sample Takt wieder 
raus. Der 500Mhz nach dem BFIO und der 125MHz Takt nach dem BUFR gehen 
dann an die ISERDES.

Die ISERDES für die Daten arbeiten im 8 Bit DDR Mode, das wird vom IP 
Wizzard ganz gut bei 2:16 (SYS_W:DEV_W) als Klartext VHDL/Verilog 
Quellcode erstellt.

Die FRA Signale werden mit 1:8 eingelesen und steuern die BitSlip Logik. 
Solange das Ausgangssignal des FRAx nicht 00001111 ist, wird der Bit 
Slip durchgeführt. Die grundsätzliche Logik dafür generiert ja auch der 
IP Wizzard. Das wird beim Start solange gemacht, bis FRA 00001111 ist 
und dann passen auch die Daten.

Du brauchst also 8x ein ISERDES IP mit 2:16 und 2 mal eins mit 1:8 und 
die ganze Clocking Sache.

D
Funktioniert sauber und ohne Timing Probleme auf einem Artix. Durch die 
BUFR Sache hat man die 500MHz nur in der IO Bank und kriegt gleicht die 
125Mz synchron zu den deserialisierten Daten mit raus. Klappt natürlich 
nur wenn alle Daten und FRA in der gleichen Bank liegen und DCO an einem 
SRCC oder MRCC Paar.

von Christian R. (supachris)


Lesenswert?

Achso, genau wie Gustl sagt, haben wir die Inbetriebnahme gemacht. Per 
SPI den ADC auf ein festes Pattern eingestellt und dann solange das 
IDELAY am Clock verstellt bis man die Grenzen hat, wo es gerade nicht 
mehr passt. Dann auf die Mitte im fertigen Design als fixed Delay.

von brushless (Gast)


Lesenswert?

Super,
vielen Dank, das hat mir schon mal sehr geholfen...
Das werde ich am Montag gleich mal umsetzten und berichten.

Schönen Sonntag noch,
MM

von Brushless (Gast)


Lesenswert?

So,

das konfigurieren vom ADC scheint schon mal zu funktionieren (über SPI). 
Mein Test Muster herhalte ich noch nicht zurück, muss also das Auswerten 
vom frame-clock noch richtig machen.
Gibt es da eventuell ein Code Schnipsel?
Dann noch eine Verständnis Frage: Wie kann ich dem ISERDESE3 denn den 
Modus mitteilen SDR oder DDR?

Weiß der das aus der Clock Beziehung?
Hier eine Antwort von Xilinx:
You must be knowing whether the incoming data is SDR or DDR.
If the Data is DDR  and required de-serialization ratio is 1:8,  CLK_DIV 
= CLK/4.
If the Data is DDR  and required de-serialization ratio is 1:4,  CLK_DIV 
= CLK/2.
In short if you know the data nature and set the DATA_WIDTH attribute 
and Derive the CLK_DIV properly, you will get the expected 
de-serialization  i.e there is no

Damit kann ich nicht s anfangen.
Bei dem ISERDESE2 kann man das ja angeben.

MM

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Christian R. schrieb:
> Dann auf die Mitte im fertigen Design als fixed Delay.

Als kleine Ergaenzung: Wenn mans noch den Fall abfedern moechte, dass 
die Timings einem im Betrieb weglaufen, kann man die IDELAYs auch 
dynamisch halten und mit IBUFDS_DIFF_OUT Buffern arbeiten. Ein Pfad ist 
dann der kalibrierte Datenpfad, der andere der Kontrollpfad der die 
Timings weitermisst und gegebenfalls den ersten Pfad vor oder zurueck 
tappt.

Funktioniert wirklich saustabil. :-)

von Christian R. (supachris)


Lesenswert?

Brushless schrieb:
> So,
> das konfigurieren vom ADC scheint schon mal zu funktionieren (über SPI).
> Mein Test Muster herhalte ich noch nicht zurück, muss also das Auswerten
> vom frame-clock noch richtig machen.
> Gibt es da eventuell ein Code Schnipsel?
> Dann noch eine Verständnis Frage: Wie kann ich dem ISERDESE3 denn den
> Modus mitteilen SDR oder DDR?
> Weiß der das aus der Clock Beziehung?
> Hier eine Antwort von Xilinx:
> You must be knowing whether the incoming data is SDR or DDR.
> If the Data is DDR  and required de-serialization ratio is 1:8,  CLK_DIV
> = CLK/4.
> If the Data is DDR  and required de-serialization ratio is 1:4,  CLK_DIV
> = CLK/2.
> In short if you know the data nature and set the DATA_WIDTH attribute
> and Derive the CLK_DIV properly, you will get the expected
> de-serialization  i.e there is no
> Damit kann ich nicht s anfangen.
> Bei dem ISERDESE2 kann man das ja angeben.
> MM

Hm, klingt ja seltsam. Ist das im Core Generator auch so?
Ansonsten: Wer oder was hindert dich, das zu simulieren?

von J. S. (engineer) Benutzerseite


Lesenswert?

Christian R. schrieb:
>> You must be knowing whether the incoming data is SDR or DDR.
>> If the Data is DDR  and required de-serialization ratio is 1:8,  CLK_DIV
>> = CLK/4.
>> If the Data is DDR  and required de-serialization ratio is 1:4,  CLK_DIV
>> = CLK/2.

Mir fehlt hier irgendwie die Angabe, wie es einzustellen wäre, wenn es 
SDR ist. Meines Erachtens ist das eigentlich der case 1 mit CLK/8

von Brushless (Gast)



Lesenswert?

So, habe fertig...
Ich habe mal einige Infos angehangen, wie ich das jetzt gelöst habe.
Zum Serdes:
Der Serdes arbeitet immer im DDR Format. Hat man Daten im SDR Format, 
benutzt man einfach jedes 2. bit am Ausgang.
Das Prinzip ist eigentlich recht einfach.
Bei mir geht der DCO clock vom ADC (400 MHz) und der Frame clock (100 
MHz) über LVDS Buffer direkt an den Serdese3. Die Datenleitung habe ich 
mit einem idelay3 etwas verzögert (empirisch ermittelt).
Nun der Trick:
Aus dem Serdes kommen dann parallele Daten, gewonnen aus dem input 
Stream.
Diese Daten sind dann noch nicht richtig aber wegen des Frame clocks 
immer gleich!
Nun kann man sich bequem aus zwei samples das gewünschte bit Muster 
zusammenbauen. Das bedeutet nur einen Takt Verzögerung (10ns).
Die gesamte bit-slpi Logik ist damit überflüssig.
Kann man im Xapp 1208 bitslip logic page 10! nachlesen.
Ich habe versucht, das in den Bildern deutlich zu machen und hoffe 
anderen damit helfen zu könne.
Eine Frage habe ich aber noch. Wie kann man die clock Leitungen am 
besten verzögern, wenn das notwendig wird? Mit dem clock wiz kann man 
zwar die Phase einstellen, aber viel zu grob!
Das idelay3 darf keine clock Leitungen treiben!

Viele Grüße,
MM

von FPGA Notfallseelsorge (Gast)


Lesenswert?

Brushless schrieb:
> Bei mir geht der DCO clock vom ADC (400 MHz) und der Frame clock (100
> MHz) über LVDS Buffer direkt an den Serdese3.

Genau, wenn man den Frameclock wie Daten behandelt, dann kann man 
darüber seine echten Daten alignen ohne Bitslip.

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.