Forum: FPGA, VHDL & Co. 133MHz und 200 MHZ differentielle clk erzeugen


von Martin (Gast)


Lesenswert?

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

von Martin (Gast)


Lesenswert?

Ach so, ich benutze ISE 13.4 von Xilinx

von Cihan K. (lazoboy61)


Angehängte Dateien:

Lesenswert?

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:
1
component IBUFGDS
2
      port (
3
        I  : in  STD_LOGIC;
4
        IB : in  STD_LOGIC;
5
        O  : out STD_LOGIC
6
        );
7
    end component;
8
9
component OBUFDS
10
      port (
11
        O  : out STD_LOGIC;
12
        OB : out STD_LOGIC;
13
        I  : in  STD_LOGIC
14
        );
15
    end component;

Cihan

von Duke Scarring (Gast)


Lesenswert?

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

von Cihan K. (lazoboy61)


Lesenswert?

Die Library für die diff. Primitive müsstest du auch einbinden:
library UNISIM;
use UNISIM.VComponents.all;

Cihan

von Cihan K. (lazoboy61)


Angehängte Dateien:

Lesenswert?

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

von Christian R. (supachris)


Lesenswert?

Im FPGA 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.

von Martin (Gast)


Lesenswert?

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!

von Cihan K. (lazoboy61)


Lesenswert?

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

von Martin (Gast)


Lesenswert?

Hallo,

ja das ist das Problem.
Gibt es auch eine Moeglichkeit das zu loesen ohne an der DDR IP CORE 
etwas zu veraendern?

von Cihan K. (lazoboy61)


Lesenswert?

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

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.