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:
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
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
Die Library für die diff. Primitive müsstest du auch einbinden: library UNISIM; use UNISIM.VComponents.all; Cihan
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
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.
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
Hallo, ja das ist das Problem. Gibt es auch eine Moeglichkeit das zu loesen ohne an der DDR IP CORE etwas zu veraendern?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.