Forum: FPGA, VHDL & Co. Xilinx Vivado LVDS RX DPA (dynamic phase alignment)


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von P. K. (pek)


Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen

ich habe folgenden Ansatz für meinen LVDS-Receiver (Vivado 2016.2, 
Kintex UltraScale):
1
  -----------------------------------------------------------------------------
2
  IBD : IBUFDS
3
    generic map (
4
      DQS_BIAS => "FALSE"               -- (FALSE, TRUE)
5
      )
6
    port map (
7
      O  => RxxD(i),                    -- 1-bit output: Buffer output
8
      I  => LvdsRxxDI_p(i),             -- 1-bit input: Diff_p buffer input (connect to top-level port)
9
      IB => LvdsRxxDI_n(i)              -- 1-bit input: Diff_n buffer input (connect to top-level port)
10
      );
11
  -----------------------------------------------------------------------------
12
  ISD : ISERDESE3
13
    generic map (
14
      DATA_WIDTH        => 8,           -- Parallel data width (4,8)
15
      FIFO_ENABLE       => "FALSE",     -- Enables the use of the FIFO
16
      FIFO_SYNC_MODE    => "FALSE",     -- Enables the use of internal 2-stage synchronizers on the FIFO
17
      IS_CLK_B_INVERTED => '0',         -- Optional inversion for CLK_B
18
      IS_CLK_INVERTED   => '1',         -- Optional inversion for CLK
19
      IS_RST_INVERTED   => '0',         -- Optional inversion for RST
20
      SIM_DEVICE        => "ULTRASCALE" -- Set the device version (ULTRASCALE, ULTRASCALE_PLUS_ES1)
21
      )
22
    port map (
23
      FIFO_EMPTY  => open,              -- 1-bit output: FIFO empty flag
24
      Q           => RxParxD((8*i)+7 downto (8*i)),           -- 8-bit registered output
25
      CLK         => RxxC,              -- 1-bit input: High-speed clock
26
      CLK_B       => RxxC,              -- 1-bit input: Inversion of High-speed clock CLK
27
      CLKDIV      => LocxC,             -- 1-bit input: Divided Clock
28
      D           => RxxD(i),           -- 1-bit input: Serial Data Input
29
      FIFO_RD_CLK => '0',               -- 1-bit input: FIFO read clock
30
      FIFO_RD_EN  => '0',               -- 1-bit input: Enables reading the FIFO when asserted
31
      RST         => ResLvdsxR          -- 1-bit input: Asynchronous Reset
32
      );
33
  ---------------------------------------------------------------------------

Das funktioniert soweit tipp-topp, solange mein PLL-Input-Clock zusammen 
mit den Daten kommt. Nun habe ich ein anderes LVDS-Interface (ein 
einzelnes Signal-Paar), welches ohne Clock daher kommt, dessen Quelle 
aber von meinem FPGA geclockt wird. Das System läuft also synchron (wenn 
alle PLL eingeschwungen sind) aber mit unbekannter Phase.

Zum Thema DPA (dynamic phase alignment) heisst es im Xilinx PG188 April 
2016 lapidar: Unsupported feature (p.6).

Wie geht Ihr das an?

Gruss

von Duke Scarring (Gast)


Bewertung
0 lesenswert
nicht lesenswert
P. K. schrieb:
> Zum Thema DPA (dynamic phase alignment) heisst es im Xilinx PG188 April
> 2016 lapidar: Unsupported feature (p.6).
Klingt für mich, als wenn da was in der Hardware kaputt ist.

Evtl. kannst Du ja die Phase an der PLL verschieben.
Hilfreich ist es da, wenn man auf dei Leitung ein Trainigspattern geben 
kann, um auf der anderen Seite die richtige Phase zu finden...

Duke

von Weltbester FPGA-Pongo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Da bräuchte man noch ein bischen mehr Code. Wie berechnest Du den offset 
zwischen der ausgehenden und der eingehenden Phase? Gibst Du den 
ausdrücklich an?

von P. K. (pek)


Bewertung
0 lesenswert
nicht lesenswert
Weltbester FPGA-Pongo schrieb im Beitrag #4817426:
> Da bräuchte man noch ein bischen mehr Code.
Mehr ist da nicht. Es handelt sich beim Beispiel um dasjenige, welche 
ein I/F bedient, welches den clock mit dabei hat und ich so die PLL 
damit speisen kann. Das funktioniert soweit ganz gut.

Weltbester FPGA-Pongo schrieb im Beitrag #4817426:
> Wie berechnest Du den offset
> zwischen der ausgehenden und der eingehenden Phase?
Gar nicht, der ist nach jedem Restart anders. Deswegen hätte ich ja 
gerne DPA eingesetzt und bin über den zitierten Kommentar im PG188 
gestolpert.

Duke Scarring schrieb:
> Evtl. kannst Du ja die Phase an der PLL verschieben.
Ja, das wäre dann das letzte Mittel, wenn sonst gar nichts mehr hilft. 
Möchte natürlich vermeiden, das händisch zu tun...

von Weltbester FPGA-Pongo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Das wirst Du aber müssen, wenn Du mit einem nicht gekoppelten Takt 
arbeitest.

von Weltbester FPGA-Pongo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Eines noch:

Wozu brauchst du das:

IS_CLK_INVERTED   => '1',

?

von P. K. (pek)


Bewertung
0 lesenswert
nicht lesenswert
Weltbester FPGA-Pongo schrieb im Beitrag #4818627:
> Das wirst Du aber müssen, wenn Du mit einem nicht gekoppelten Takt
> arbeitest.

Tja, mittlerweile sehe ich das auch so. Aussage meines FAE: Die normalen 
IOs haben leider keinen Clock-Recovery Schaltkreis. Diesen 
Clock-Recovery gibt es nur in den Gigabit-Transceivern (GTx).

von Duke Scarring (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Wie das mit der Data Recovery auf normalen IOs funktioniert steht in 
XAPP224 drin.

Duke

von Jürgen S. (engineer) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Das hätte ich jetzt auch gesagt. Du musst den SERDES-Takt aus dem 
eingehenden Takt gewinnen und im Fall der unbekannten Phase, diese 
ermitteln. Also Takt sampeln und Rauschen bestimmen, dann die Phase der 
SERDES-Clock mittig einstellen.

Ohne einen Takt, wie gehabt, anhand der Qualität der Daten.

Das Vorgeben per Clock-PLL-Offset ginge nur für ausreichend langsame 
Takte. Eine statische Beziehung zwischen den Takten erschlägt z.B. nicht 
den Temperaturdrift.

Ich hatte das Thema mal beim Cameralink. Beim Virtex ging es 
konventionell, beim Spartan musst man nachsynchronisieren.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.