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 !!!
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
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.