Hallo,
ich bin leider noch relativ neu bei VHDL.
Ich probiere gerade verschiedene Dinge aus und wuere nun folgendes gerne
machen:
Habe auf meinem Board eine 100MHz System clock.
system_clk_100MHz_n
system_clk_100MHz_p
Mit Hilfe eines DCM erhalte ich damit eine Single-ended 200MHZ clk:
DCM_200MHZ: DCM_200MHZ PORT MAP(
CLKIN_N_IN => system_clk_100MHz_n ,
CLKIN_P_IN => system_clk_100MHz_p ,
RST_IN => '0',
CLKFX_OUT => open,
CLKIN_IBUFGDS_OUT => Clk_pin,
CLK0_OUT => clk_200MHz,
LOCKED_OUT => open
);
Wie kann ich mit Hilfe der system_clk_100MHz_n und system_clk_100MHz_p
eine differentielle 200MHz und 133MHz clock erzeugen?
Also so etwas
system_clk_200MHz_n
system_clk_200MHz_p
system_clk_133MHz_n
system_clk_133MHz_p
Diese differentiellen clks brauche ich spaeter fuer ein DDR.
Danke,
Martin
Mit einer PLL würde es gehen. Hier eine .vhd Datei, die ich gerade mit
dem CoreGenerator erzeugt habe.
Für differentielle Angelegenheiten kannst du die IBUFGDS oder OBUFDS
Primitive von Xilinx benutzen. Bsp:
Martin schrieb:> Mit Hilfe eines DCM erhalte ich damit eine Single-ended 200MHZ clk:>> DCM_200MHZ: DCM_200MHZ PORT MAP(> CLKIN_N_IN => system_clk_100MHz_n ,> CLKIN_P_IN => system_clk_100MHz_p ,> RST_IN => '0',> CLKFX_OUT => open,> CLKIN_IBUFGDS_OUT => Clk_pin,> CLK0_OUT => clk_200MHz,> LOCKED_OUT => open> );
Dein DCM hat einen single-ended-Eingang, bzw. da hängt noch ein BUFDS
drin, der aus differential single-ended macht. Wenn Du CLK0 verwendest
bleiben Deine 100 MHz in auf 100 MHz out.
Wenn Du 200 MHz haben willst, kannsr Du CLKFX verwenden. Dazu muß FXMUL
und FXDIV geeignet eingestellt sein, z.B.: FXMUL=4 und FXDIV=2.
Für FXMUL=4 und FXDIV=3 kommen dann 133 MHz raus.
Schau Dir das mal in der Simulation an.
Für differentielle Ausgänge suchst Du hier im Forum mal nach ODDR.
Duke
Mit einer DCM würde es natürlich auch gehen. In diesem Fall könntest du
den CLK2x als 200 MHz Clock benutzen und den CLKFX als 133 MHz. Die
Clock Buffer für diff. müsstest du selber noch einbiden.
Cihan
ImFPGA gibts keine "differenziellen" Clocks, sondern höchstens
welche, die um 180° phasenverschoben sind. Das kann dir der DCM
ausgeben, CLKFX180 und CLK2X180 sind die Ausgänge für die "negierten"
Takte.
Da kannst du die 200MHz mit CLK2X und CLK2X180 ausgeben und bei
passender MUL/DIV Einstellung die 133MHz an CLKFX und CLKFX180.
Hallo,
danke erst mal fuer die schnellen Antworten. Ich habe jetzt mal die
Loesung von Christian R. ausprobiert. Laut Simulation bekomme ich auch
die richtigen Frequenzen.
Wenn ich das allerdings an mein DDR Instantiation anschliese bekomme ich
folgenden Error:
ERROR:NgdBuild:770 - IBUF 'ddr2/IDLY_CLK_INST_1'
and BUFG 'DCM_200MHz/CLK2X_BUFG_INST' on net 'DDR_200MHZ_clk_n' are
lined up in series. Buffers of the same direction cannot be placed in
series.
Was kann ich tun? Gibt es auch ein DCM ohne BUFG?
Danke gleich mal wieder!
Du hast wahrscheinlich einer DDR Speicher Komponente eingebunden und
willst dementsprechend ihm die Clocks ereugen und verbinden, oder?
Du musst hier aufpassen, da die DDR IP CORE von Xilinx schon eine PLL
oder DCM besitzt, wo die Clocks mit einem IBUF eingelesen werden. Daher
hast du wahrscheinlich den Error bekommen, da ein BUFG auf einen IBUF
geht, vermutlich. Ich hab immer den IBUF des DDR IP CORES rausgenommen
und dann ging auch alles glatt. In der Infrastruktur.vhd Datei der IP
CORE ist die PLL des DDRs zu finden.
Cihan
Die Core erwartet eigentlich ja einen I/O Pin mit 200 MHz Clock, quasi
z.B. direkt aus einem Quarz. Da du aber nun nur die 100 MHz zur
Verfügung hast, musst du ebend eine DCM verwenden. Eine Möglichkeit wäre
glaube ich, dass du aus dem IBUFG bzw. IBUFGDS einen BUFG machst und ihn
einbindest. Oder du verbindest deine DCM direkt mit der PLL ohne IBUF.
Das Problem liegt am IBUF, der erwartet ebend keine Signale aus
Clock-Buffern. Schau dir mal im User Guide UG190 an wie man DCM mit PLL
am besten verbindet. Ich habs genauso gemacht und benutze die DDR2
Komponente bei mir seit Monaten so und das ohne jegliche Probleme.
Cihan