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
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
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!!
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.
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.
Sorry, hat sich erledigt, es handelte sich nicht um zwei zusammengehörende Pinpaare. Das hat den Fehler verursacht.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.