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


von P. K. (pek)


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)


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)


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)


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)


Lesenswert?

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

von Weltbester FPGA-Pongo (Gast)


Lesenswert?

Eines noch:

Wozu brauchst du das:

IS_CLK_INVERTED   => '1',

?

von P. K. (pek)


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)


Lesenswert?

Wie das mit der Data Recovery auf normalen IOs funktioniert steht in 
XAPP224 drin.

Duke

von J. S. (engineer) Benutzerseite


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.

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.