133MHz und 200 MHZ differentielle clk erzeugen

Gast #3029457
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
#3029480
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
Angehängte Dateien:
Gast #3029485
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
#3029497
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.
Gast #3029532
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!
#3029561
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
#3029634
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren