Forum: FPGA, VHDL & Co. LVDS mit Spartan3A DSP


von Andreas B. (loopy83)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe als Eingang meines FPGAs folgende Signale:
erstes  LVDS Paar: Bit 0 bis Bit 6 Channel 1
zweites LVDS Paar: Bit 7 bis Bit 13 Channel 1
drittes LVDS Paar: Bit 0 bis Bit 6 Channel 2
viertes LVDS Paar: Bit 7 bis Bit 13 Channel 2
fünftes LVDS Paar: LVDS Takt
jeweils 14 bit pro Kanal

Der Takt ist 160MHz. Es werden sowohl an der fallenden, als auch an der 
steigenden Flanke Daten angelegt (Double Data).

Nun möchte ich diese Daten in ein Register schreiben, damit die dort 
"sortiert" (bzw. gleich richtig abgelegt) werden und von dort (über ein 
Fifo, burst) in den RAM geschrieben werden können.

Nun habe ich noch keinerlei Erfahrungen mit FPGAs und LVDS. Verwendet 
wird der Spartan 3A DSP (XC3SD1800A-4CS484C), der sowohl den 25er, als 
auch den 33er LVDS Standard kann.

Nun habe ich ein paar Fragen dazu:
- es können ja jeweils nur zwei Standards pro Bank vergeben werden, aber 
da ich kein LVDS ausgeben will, sondern nur lesen, muss ich denn die 
speziellen VCCIO-Pins mit 2,5/3,3V versorgen?

- Jede Bank verfügt ja über N- und P- Paare. Kann ich jedes dieser Paare 
verwenden, oder gibt es spezielle Pins, die für LVDS vorgesehen sind?

- Im Anhang befindet sich ein Bild. Daraus kann ich entnehmen, dass ich 
die Bausteine IBUFDS und OBUFDS brauche. Nur erschließt sich mir nicht 
ganz der Sinn einer solchen Feedbackloop... wenn ich doch nur die LVDS 
Daten seriell in ein internes Register zur späteren 
Weiterverarbeitung/Transport speichern will.

An die 100Ohm Terminierung bei 50Ohm Impedanz denke ich :)

Ich wäre für hilfreiche Kommentare zum Thema LVDS sehr dankbar.
Vielleicht hat jemand schon einen Code-Schnippsel parat, wie die 
"Abtastung" und Speicherung der LVDS Daten aussehen kann?

VIELEN DANK !!!

von Thomas R. (Firma: abaxor engineering) (abaxor)


Lesenswert?

Hallo,

die Feedback-Loop brauchst du hier nicht, da du anscheinend einen 
externen Takt hast, der nur für die seriellen Daten relevant ist.

Du solltest dir mal die Bibliothek mit den Elementen im Spatan3A-DSP 
ansehen, siehe Link 
http://www.xilinx.com/itp/xilinx82j/books/docs/s3adl/s3adl.pdf. Damit 
musst du dir deinen Datenfluss zusammen bauen. U.U. gibt es noch eine 
App-Note für so etwas. Grundsätzlich sind 160 MHz für einen Spartan3 
eine ganze Menge, denn dieser verfügt nicht über einen SERDES wie z.B, 
ein Virtex 4.

Deinen Takt gibst du auf einen IBUFGDS, dann auf einen DCM_SP. Den 
DCM_SP musst du so einstellen, dass es keine Phasenverschiebung zwischen 
dem CLKIN und CLK0/CLK180 gibt.
Die Daten gehen über einen IBUFDS oder IBUFDS_DLY_ADJ an ein IDDR2. 
Letzteres liefert dir die Daten zu den steigenden Flanke der beiden 
Eingangstakte, an den Ausgängen Q0 und Q1. Diese Daten legst du auf zwei 
Register, die du mit demselben Takt (z.B. CLK0) betreibst. Ein Signal 
hat damit nur eine halbe Periode Zeit vom IDDR2-Eingang zum 
Register-Dateneingang. Damit hast du deine Eingangsdaten auf einen Takt 
synchronisiert. Danach kommt das Schieberegister.
Die Kunst besteht jetzt darin, die internen Laufzeiten auszugleichen. 
Üblicherweise gibt es dafür Trainingsdaten.
Da 160MHz auf einem Spartan3 keinen Spaß mehr machen, würde ich den Takt 
für die Funktionen nach der Deserialisierung reduzieren, wenn es geht.

Es gibt für jedes LVDS-Paar immer eine p und eine n Leitung und auch ein 
Pin-Paar. Diese Pins leigen immer neben einander.

Auch wenn du nur LVDS-Eingänge hast, musst du die Bank mit der 
entsprechenden Spannung, meist 2,5V versorgen.

Viel Spaß

Tom

von Andreas B. (loopy83)


Lesenswert?

Danke für die ausführliche Antwort, ich werde mir das alles mal genauer 
anschauen und dann ggf. noch einmal nachfragen!

Gibt es denn Probleme bei der LVDS Verarbeitung, dass die Signale auf 
der fallenden und steigenden Flanke übertragen werden? Oder kann der 
FPGA auch damit arbeiten?

VIELEN DANK!

von Thomas R. (Firma: abaxor engineering) (abaxor)


Lesenswert?

Hallo Andreas,

so richtig verstehe ich deine Frage nicht, darum interpretiere ich.

Die normalen Register im FPGA können Daten nur an einer Flanke 
übernehmen, also nur SDR (Single Data Rate). Zur Verarbeitung von 
DDR-Signalen, gibt es noch IDDR zur Wandlung DDR->SDR bzw. ODDR für die 
Richtung SDR->DDR.

Für LVDS spielt es keine Rolle ob du SDR oder DDR verwendest. Denn dein 
Takt ist immer DDR. Wenn du den übertragen bekommst, dann eben auf 
DDR-Daten mit der selben Frequenz.

LVDS wird am IBUFDS in SE gewandelt. Das sollte bei 160 MHz kein Problem 
sein. Wenn du dein ganzes Design mit 160 MHz laufen lässt, müssen die 
Signal auf allen Pfaden im FPGA in weniger als 1/160MHz = 6,25 ns von 
einem zum nächsten Register laufen können.


Tom

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.