Hallo zusammen, es ist fast vier Jahren her das ich VHDL programmiert habe. Deshalb brauche ich dringend Hilfe. Ich möchte aus einem 66MHz externen Clock 33 MHz erzeugen. Sehr gerne würde ich das DCM für Spartan-3E benutzen. Hat mir jemand vielleicht einen komplettes beispiel? Herzlichen dank
Schau mal in der ISE unter Langauge Templates, da ist eine komplette DCM-Instanziierung dabei. Copy/Paste und schon bist du fertig ;)
kann ich das nicht ohne weiteres in meinen vorhandene VHDL file einfügen? Bei mir kommt immer ein Error und sagt, dass ich das nicht in den bestehenden file einfügen kann. Gruss, Jo
Es hat doch geklappt. Nun muss ich alle Eingänge verbinden und deklarieren? Herzlichen dank
Es reicht, den Clock-Eingang, den Clock-Feedback und die von dir benötigten Ausgänge anzuschließen. Im ISE libraries guide, im Datenblatt des FPGA und in zahlreichen application notes (suche: xapp dcm) steht dazu noch etwas mehr.
So wie Jan schon gesagt hat, reicht es eine Clock und den Feedback anzulegen. Dann noch den gewünschten Teiler einstellen und den Ausgang davon als Clock für dein weiteres Design verwenden. Die restlichen Ausgänge legst Du einfach auf "open"
hm, das funktioniert leider nicht nicht. ich zeige euch am besten den bsp code. Zurzeit probiere ich einfach rum, damit ich mehr Übung rein bekomme. Hoffe das ist euch nicht zu wider, meine code zu lesen. ----- library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; use ieee.numeric_std.ALL; library UNISIM; use UNISIM.Vcomponents.ALL; ---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code. --library UNISIM; --use UNISIM.VComponents.all; entity test02 is Port (led : out STD_LOGIC_VECTOR (7 downto 0); clk : in STD_LOGIC; SW0 : in STD_LOGIC; SW1 : in STD_LOGIC; SW2 : in STD_LOGIC; SW3 : in STD_LOGIC); end test02; architecture Behavioral of test02 is signal sw : STD_LOGIC_VECTOR (3 downto 0); signal CLKIN : STD_LOGIC; signal CLK2X180 : STD_LOGIC; signal CLKFB : STD_LOGIC; signal CLKDV : STD_LOGIC; signal CLK0 : STD_LOGIC; signal CLK180 : STD_LOGIC; signal CLK270 : STD_LOGIC; signal CLK2X : STD_LOGIC; signal CLK90 : STD_LOGIC; signal PSCLK : STD_LOGIC; ------------------------------------------------------------------------ ------------ -- -- declaration of KCPSM3 -- component kcpsm3 Port ( reset : in std_logic); end component; begin sw(0) <= SW0; sw(1) <= SW1; sw(2) <= SW2; sw(3) <= SW3; CLKIN <= clk; CLKFB <= CLK2X180; ----------------------------------------------------------------- DCM_SP_inst : DCM_SP generic map ( CLKDV_DIVIDE => 2.0, -- Divide by: 1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5 -- 7.0,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0 or 16.0 CLKFX_DIVIDE => 1, -- Can be any interger from 1 to 32 CLKFX_MULTIPLY => 4, -- Can be any integer from 1 to 32 CLKIN_DIVIDE_BY_2 => FALSE, -- feature CLKIN_PERIOD => 0.0, -- Specify period of input clock CLKOUT_PHASE_SHIFT => "NONE", CLK_FEEDBACK => "1X", DLL_FREQUENCY_MODE => "LOW", DUTY_CYCLE_CORRECTION => TRUE, FACTORY_JF => X"C080", PHASE_SHIFT => 0, 255 STARTUP_WAIT => FALSE) port map ( --CLK0 => "open", -- 0 degree DCM CLK ouptput --CLK180 => "open", -- 180 degree DCM CLK output --CLK270 => "open", -- 270 degree DCM CLK output --CLK2X => "open", -- 2X DCM CLK output --CLK2X180 => "open", -- 2X, 180 degree DCM CLK out --CLK90 => "open", -- 90 degree DCM CLK output CLKDV => CLKDV, -- Divided DCM CLK out (CLKDV_DIVIDE) --CLKFX => "open", -- DCM CLK synthesis out (M/D) --CLKFX180 => "open", -- 180 degree CLK synthesis out --LOCKED => LOCKED, -- DCM LOCK status output --PSDONE => PSDONE, -- Dynamic phase adjust done output --STATUS => STATUS, -- 8-bit DCM status bits output CLKFB => CLKFB, -- DCM clock feedback CLKIN => CLKIN -- Clock input (from IBUFG, BUFG or DCM) --PSCLK => PSCLK, -- Dynamic phase adjust clock input --PSEN => PSEN, -- Dynamic phase adjust enable input --PSINCDEC => PSINCDEC, -- Dynamic phase adjust increment/decrement --RST => RST -- DCM asynchronous reset input ); -- End of DCM_SP_inst instantiation- ----------------------------------------------------------------- output_ports: process(clk) begin if (clk'event and clk ='1') then case sw is when "0000" => led <= "00000000"; when "1111" => led <= "10000001"; when "0001" => led <= "11111111"; when "0010" => led <= "01010101"; when "0100" => led <= "11001100"; when "1000" => led <= "00110011"; when others => end case; end if; end process output_ports; end Behavioral;
warum machst du nicht mit Schematic? es ist übersichlicher und einfacher, auch mit DCM
Ich hab schon damals(vor 4 Jahren) in VHDL das ganze gemacht. Deswegen würde ich ganz gerne das ganze wieder in VHDL machen. Aber danke trotzdem
CLKFB <= CLK2X180; Wo kommt denn die feedback-clock her? CLKFB muss mit CLK0 verbunden sein (allenfalls noch CLK2x, aber nicht einen der anderen Ausgaenge)
Danke Jan, den CLK_FB habe ich korrigiert. Aber es läuft immer noch nicht. Ich versuche es mit mein TestBanch zum laufen zukriegen. Aber vergeblich. Also, ich habe folgende parameter: CLK = 20MHz und das will ich auf 10MHz teilen. So sieht nun der Code aus: ------------------- ------------------------------------------------------------------------ -------- -- Copyright (c) 1995-2007 Xilinx, Inc. All rights reserved. ------------------------------------------------------------------------ -------- -- ___ ___ -- / /\/ / -- ___ \ / Vendor: Xilinx -- \ \ \/ Version : 9.2.04i -- \ \ Application : xaw2vhdl -- Filename : DCM.vhd -- ___ /\ Timestamp : 06/04/2008 08:55:03 -- \ \ / \ -- \___\/\___\ -- --Command: xaw2vhdl-intstyle D:/VHDLTutorial/LEDMITDOFILE-5/DCM.xaw -st DCM.vhd --Design Name: DCM --Device: xc3s500e-4fg320 -- -- Module DCM -- Generated by Xilinx Architecture Wizard -- Written for synthesis tool: XST -- Period Jitter (unit interval) for block DCM_SP_INST = 0.03 UI -- Period Jitter (Peak-to-Peak) for block DCM_SP_INST = 0.93 ns library ieee; use ieee.std_logic_1164.ALL; use ieee.numeric_std.ALL; library UNISIM; use UNISIM.Vcomponents.ALL; entity DCM is port ( CLKIN_IN : in std_logic; RST_IN : in std_logic; CLKDV_OUT : out std_logic; CLKFX_OUT : out std_logic; CLK0_OUT : out std_logic; LOCKED_OUT : out std_logic); end DCM; architecture BEHAVIORAL of DCM is signal CLKDV_BUF : std_logic; signal CLKFB_IN : std_logic; signal CLKFX_BUF : std_logic; signal CLK0_BUF : std_logic; signal GND_BIT : std_logic; begin GND_BIT <= '0'; CLK0_OUT <= CLKFB_IN; CLKDV_BUFG_INST : BUFG port map (I=>CLKDV_BUF, O=>CLKDV_OUT); CLKFX_BUFG_INST : BUFG port map (I=>CLKFX_BUF, O=>CLKFX_OUT); CLK0_BUFG_INST : BUFG port map (I=>CLK0_BUF, O=>CLKFB_IN); DCM_SP_INST : DCM_SP generic map( CLK_FEEDBACK => "1X", CLKDV_DIVIDE => 2.0, CLKFX_DIVIDE => 4, CLKFX_MULTIPLY => 2, CLKIN_DIVIDE_BY_2 => FALSE, CLKIN_PERIOD => 15.152, CLKOUT_PHASE_SHIFT => "NONE", DESKEW_ADJUST => "SYSTEM_SYNCHRONOUS", DFS_FREQUENCY_MODE => "LOW", DLL_FREQUENCY_MODE => "LOW", DUTY_CYCLE_CORRECTION => TRUE, FACTORY_JF => x"C080", PHASE_SHIFT => 0, STARTUP_WAIT => FALSE) port map (CLKFB=>CLKFB_IN, CLKIN=>CLKIN_IN, DSSEN=>GND_BIT, PSCLK=>GND_BIT, PSEN=>GND_BIT, PSINCDEC=>GND_BIT, RST=>RST_IN, CLKDV=>CLKDV_BUF, CLKFX=>CLKFX_BUF, CLKFX180=>open, CLK0=>CLK0_BUF, CLK2X=>open, CLK2X180=>open, CLK90=>open, CLK180=>open, CLK270=>open, LOCKED=>LOCKED_OUT, PSDONE=>open, STATUS=>open); end BEHAVIORAL; Ich muss doch nur noch folgendes machen: CLKIN <= CLK; und CLKFB <= CLK0; und wenn ich simuliere, dann muss ich doch am Pin CLKDV 10MHz haben, oder?
Zur Sicherheit solltest du noch die richtige Zeit bei CLKIN_PERIOD angeben. Wie hast du die Simulation getestet? Ich weiss gerade nicht genau, wie die Simulation der DCM aussieht, aber in Wirklichkeit braucht sie bis ein ordentlicher Takt am Ausgang anliegt eine ganze Weile. Wie lange liegt der Reset an? Die DCM braucht ein relativ langes Signal hier.
Hallo Jan, die Simulation war nicht richtig. Jetzt habe ich das ganze in den FPGA geladen und es funktioniert. Herzlichen dank an alle.
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.