Forum: FPGA, VHDL & Co. Differentieller Clock_output über SerDes I/O


von Chris (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

Ich bin noch etwas unerfahren mit FPGAs und ich habe folgende Frage:
Ich möchte einen digitalen Datenrekorder (FPGA-basiert) entwickeln und 
möchte einen externen ADC mit differentiellen Clk-Signalen takten, die 
im FPGA generiert werden sollen. Die USERCLKs des J1-Connectors (siehe 
Seite 1 des Anhangs) können nur als Single-Ended-Clks verwendet benutzt 
werden. Der ADC benötigt allerdings differentielle Signale (z.B. LVDS).

Nun habe ich noch einen zweiten Connector (J2, siehe Seite 2 des 
Anhangs) mit Multi-Gigabit-SerDes I/O.
Kann mir jemand sagen, wie ich damit differentielle Clk-signale (nClk 
und pClk) an zwei Toplevel-Ports schicken kann? D.h. was für Instanzen 
brauche ich und wie muss man die .ucf dafür anpassen?
Vielen Dank schon mal für eure Antworten!!

Viele Grüße,
Chris

von Christian R. (supachris)


Lesenswert?

Für die Ausgabe eine LVDS-Taktes kannst du ein beliebiges I/O Pärchen 
nehmen, die GCLK usw. sind nur Takt-Eingänge relevant. Zur Ausgabe 
(Clock forwarding) nimmt man dann ein ODDR FlipFlop, die Dateneingäge 
fest verdrahtet, einmal 0 einmal 1 und den Ausgang an ein OBUFDS und 
dann auf die Pins raus. Aber einen intern generierten Takt kann man 
eigentlich für einen ADC nicht gebrauchen, der jittert viel zu sehr, da 
bekommst du Rauschen in dein Signal.

Die MGT Sachen kannst du für sowas überhaupt nicht nehmen. REFCLK ist 
nur ein Eingang und auch nur für die MGTs, damit kannst du PCIe oder 
SATA oder sowas machen.

: Bearbeitet durch User
von Chris (Gast)


Lesenswert?

Hi,
Danke für die Antwort.
D.h. wenn ich ein z.B. 200MHz-Signal über den FPGA an den ADC schicke, 
kommt da kein gutes Signal mehr an?
Was gibt es denn für andere Möglichkeiten?
Könnte man z.B. sowas benutzen?
http://www.eea.epson.com/portal/pls/portal/docs/1/1543634.PDF
oder
http://www.silabs.com/Support%20Documents/TechnicalDocs/Si5326.pdf
um den ADC mit ner Clock zu speisen.

Nichtsdestotrotz, wenn ich es direkt über den FPGA versuchen möchte habe 
ich ein OBUFDS:

inst_CLK_OUT : OBUFDS
  generic map (IOSTANDARD => "DEFAULT")
    port map (O => USER_IO_P,
              OB => USER_IO_N,
              I => clkout );
                --USER_IO_* sind die top-level-ports
                --clkout ist ein internes std_logic-Signal

Wie genau mache ich das mit dem ODDR FlipFlop? Das versteh ich nicht so 
ganz.
Danke schon mal!!

von Christian R. (supachris)


Lesenswert?

Jetzt musst du nur noch dein "clkout" durch das ODDR erzeugen:
1
CLK_FORWARD : ODDR Port map(Q => clkout, C => OUT_CLK, CE => '1', D1 => '1', D2 => '0', R => '0', S => '0');
Wenn du das nicht machst, kann der Takt nicht auf den internen 
Takt-Netzen geroutet werden, und das beeinflusst massiv dein ganzes 
inneres Timing.
Aber 200MHz ADC sollte man schon aus einem eigenen Oszillator betreiben 
und den Takt dann parallel an das FPGA führen. Bei Maxim gibts einen 
Jitter Calculator auf der Homepage der errechnet dir den maximal 
erlaubten Jitter ausgehend von Samplerate, Auflösung und Signalfrequenz.

von Chris (Gast)


Lesenswert?

Ich habe mal folgendes probiert:
1
    inst_CLK_OUT : OBUFDS
2
    generic map (
3
      IOSTANDARD => "DEFAULT")
4
    port map (
5
      O => clkoutP,     -- Diff_p output (connect directly to top-level port)
6
      OB => clkoutN,   -- Diff_n output (connect directly to top-level port)
7
      I => oddr_clk     -- Buffer input 
8
    );
9
10
    ODDR_inst : ODDR
11
    generic map(
12
      DDR_CLK_EDGE => "OPPOSITE_EDGE", -- "OPPOSITE_EDGE" or "SAME_EDGE" 
13
      INIT => '0',   -- Initial value for Q port ('1' or '0')
14
      SRTYPE => "SYNC") -- Reset Type ("ASYNC" or "SYNC")
15
    port map (
16
      Q => oddr_clk,   -- 1-bit DDR output
17
      C => clk200MHz,    -- 1-bit clock input
18
      CE => '1',  -- 1-bit clock enable input
19
      D1 => '1',  -- 1-bit data input (positive edge)
20
      D2 => '0',  -- 1-bit data input (negative edge)
21
      R => '0',    -- 1-bit reset input
22
      S => '0'     -- 1-bit set input
23
    );

mit der .ucf:
1
NET "CLKOUT*" DIFF_TERM = TRUE | IOBDELAY = NONE | IOSTANDARD = LVDS_25;
2
NET "CLKOUTN" LOC = A5;
3
NET "CLKOUTP" LOC = G21;

Damit erhalte ich beim Mapping den folgenden Fehler:
Kann mir da jemand weiterhelfen?


ERROR:Pack:1107 - Pack was unable to combine the symbols listed below 
into a
   single IOBM component because the site type selected is not 
compatible.

   Further explanation:
   The component type is determined by the types of logic and the 
properties and
   configuration of the logic it contains. In this case an IO component 
of type
   IOBM was chosen because the IO contains an true differential buffer 
symbol.
   Please double check that the types of logic elements and all of their
   relevant properties and configuration options are compatible with the
   physical site type of the constraint.

   Summary:
   Symbols involved:
     PAD symbol "clkoutP" (Pad Signal = clkoutP)
     BUFINV symbol "inst_CLK_OUT/OBUFDS" (Output Signal = clkoutP)
   Component type involved: IOBM
   Site Location involved: G21
   Site Type involved: IOBS


Mapping completed.
See MAP report file "topmodule_map.mrp" for details.
Problem encountered during the packing phase.

Design Summary
--------------
Number of errors   :   1
Number of warnings :  80

Process "Map" failed
WARNING:ProjectMgmt - File 
Z:/FPGA_Entwicklung/FPGA_recorder/VHDL_Project/topmodule_map.ncd is 
missing.

von Chris (Gast)


Lesenswert?

Sorry, hat sich erledigt, es handelte sich nicht um zwei 
zusammengehörende Pinpaare. Das hat den Fehler verursacht.

von Christian R. (supachris)


Lesenswert?

Du brauchst da auch nur den _P anzugeben, den zugehörigen _N sucht sich 
map alleine raus.

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.