Hallo zusammen, ich hab das Problem, dass ich den Systemtakt auf meinem Digilent S3 1000 Starterboard auf 100 MHz verdoppeln muss, um eine korrekte SRAM Ansteuerung zu entwerfen. In der Web ISE 8.1 hab 1. Xilinx Wizzard => DCM Wizzard => single DCM gewählt Dadurch wurde eine VHD Datei mit Xilinx spezifischen Befehlen erzeugt. Ergebnis in der Anlage als VHD Datei. 2. Die componente hab ich in meiner TOP Entity instanziert und mit Signalen verbunden. 3. Der ursprüngliche 50 Mhz Takt gibt den Input für die DCM. Den 50 MHz Takt Ausgang ( hoffentlich den richtigen ) von der DCM wurde als neuer Takt-Eingang für die ganze Schaltung verwendet. 4. Der 100 Mhz Takt wurde noch nirgends verwendet. Ergebnis => Schaltung funktioniert nicht mehr. (Schon der SRAM Lese- Schreibtest über ein PC Testprogramm über USB schlägt fehl ) Als Anlage hab ich die funktionierende Top Entity Datei und die modifizierte beigefügt. ------------------------------------------------------ Zur Übersicht. ================= ganz am Ende der Datei wird mit my_used_dcm: my_dcm port MAP ( CLKIN_IN => ext_mclk50, RST_IN => dcm_RST_IN, CLKIN_IBUFG_OUT => ext_mclk50_IBUFG_OUT, CLK0_OUT => mclk50, CLK2X_OUT => mclk100, LOCKED_OUT => dcm_LOCKED_OUT ); die DCM Komponente eingebunden. mclk ist der Port-Pin der mit dem externen Oszillator verbunden ist. Über die Anweisung ext_mclk50 <= mclk ; wird der mclk auf das Signal ext_mclk50 gelegt, welches dann it CLKIN_IN der DCM verbunden wird. Über die Anweisung dcm_RST_IN <= '0' wird der Reset auf 0 geklemmt. Über die Anweisung bei der DCM Instanzierung wird der neue 50 MHz Ausgang auf das neue 50MHz Taktsignal mclk50 gelegt, den ich als Eingang und Taktflankenabfrage in den Prozessen verwende. CLK0_OUT => mclk50 ---------------------------------------------------------------------- Die VHDL Datei für die DCM sieht folgendermaßen aus: library ieee; use ieee.std_logic_1164.ALL; use ieee.numeric_std.ALL; -- synopsys translate_off library UNISIM; use UNISIM.Vcomponents.ALL; -- synopsys translate_on entity my_dcm is port ( CLKIN_IN : in std_logic; RST_IN : in std_logic; CLKIN_IBUFG_OUT : out std_logic; CLK0_OUT : out std_logic; CLK2X_OUT : out std_logic; LOCKED_OUT : out std_logic); end my_dcm; architecture BEHAVIORAL of my_dcm is signal CLKFB_IN : std_logic; signal CLKIN_IBUFG : std_logic; signal CLK0_BUF : std_logic; signal CLK2X_BUF : std_logic; signal GND1 : std_logic; component IBUFG port ( I : in std_logic; O : out std_logic); end component; component BUFG port ( I : in std_logic; O : out std_logic); end component; component DCM generic( CLK_FEEDBACK : string := "1X"; CLKDV_DIVIDE : real := 2.000000; CLKFX_DIVIDE : integer := 1; CLKFX_MULTIPLY : integer := 4; CLKIN_DIVIDE_BY_2 : boolean := FALSE; CLKIN_PERIOD : real := 10.000000; CLKOUT_PHASE_SHIFT : string := "NONE"; DESKEW_ADJUST : string := "SYSTEM_SYNCHRONOUS"; DFS_FREQUENCY_MODE : string := "LOW"; DLL_FREQUENCY_MODE : string := "LOW"; DUTY_CYCLE_CORRECTION : boolean := TRUE; FACTORY_JF : bit_vector := x"C080"; PHASE_SHIFT : integer := 0; STARTUP_WAIT : boolean := FALSE; DSS_MODE : string := "NONE"); port ( CLKIN : in std_logic; CLKFB : in std_logic; RST : in std_logic; PSEN : in std_logic; PSINCDEC : in std_logic; PSCLK : in std_logic; DSSEN : in std_logic; CLK0 : out std_logic; CLK90 : out std_logic; CLK180 : out std_logic; CLK270 : out std_logic; CLKDV : out std_logic; CLK2X : out std_logic; CLK2X180 : out std_logic; CLKFX : out std_logic; CLKFX180 : out std_logic; STATUS : out std_logic_vector (7 downto 0); LOCKED : out std_logic; PSDONE : out std_logic); end component; begin GND1 <= '0'; CLKIN_IBUFG_OUT <= CLKIN_IBUFG; CLK0_OUT <= CLKFB_IN; CLKIN_IBUFG_INST : IBUFG port map (I=>CLKIN_IN, O=>CLKIN_IBUFG); CLK0_BUFG_INST : BUFG port map (I=>CLK0_BUF, O=>CLKFB_IN); CLK2X_BUFG_INST : BUFG port map (I=>CLK2X_BUF, O=>CLK2X_OUT); DCM_INST : DCM generic map( CLK_FEEDBACK => "1X", CLKDV_DIVIDE => 2.000000, CLKFX_DIVIDE => 1, CLKFX_MULTIPLY => 4, CLKIN_DIVIDE_BY_2 => FALSE, CLKIN_PERIOD => 20.000000, CLKOUT_PHASE_SHIFT => "NONE", DESKEW_ADJUST => "SYSTEM_SYNCHRONOUS", DFS_FREQUENCY_MODE => "LOW", DLL_FREQUENCY_MODE => "LOW", DUTY_CYCLE_CORRECTION => TRUE, FACTORY_JF => x"8080", PHASE_SHIFT => 0, STARTUP_WAIT => FALSE) port map (CLKFB=>CLKFB_IN, CLKIN=>CLKIN_IBUFG, DSSEN=>GND1, PSCLK=>GND1, PSEN=>GND1, PSINCDEC=>GND1, RST=>RST_IN, CLKDV=>open, CLKFX=>open, CLKFX180=>open, CLK0=>CLK0_BUF, CLK2X=>CLK2X_BUF, CLK2X180=>open, CLK90=>open, CLK180=>open, CLK270=>open, LOCKED=>LOCKED_OUT, PSDONE=>open, STATUS=>open); end BEHAVIORAL; Ich hoffe ich konnte alle relevanten Infos vernünftig darstellen, damit mir jemand helfen kann. Ich hab an dem Problem mittlerweile bestimmt 8 Stunden verbraten. ( Muß ich zu meiner Schande gestehen ) Bin Halt noch Anfänger Gruß vom FPGA-Fragenden
Hallo zusammen, und hier die DCM als vhd Datei als Anlage
Hallo zusammen, ich bin's nochmal. Hat wirklich keiner einen Tipp. Es geht ja nicht darum die Schaltung zu analysieren, sondern einfach den normalen Takt 50 MHz zunächst durch den Ausgang 50 MHz Takt aus der DCM zu ersetzen, was bei mir fehlschlägt. Gruß vom FPGA-Fragender P.S. Die Beiträge unter dem Stichwort DCM hab ich alle durchgearbeitet und die APP note ebenfalls gelesen.
nur auf die schnelle ein paar tipps 1) dcm vernuenftig reseten 2) warten bis lock gesetzt ist 3) 1fack clk nur an clk0_out abgreifen
Hallo beisammen, hier mein AKTUELLER Clock Report: Ich kann die Info nicht interpretieren. Net Skew is the difference between the minimum and maximum routing only delays for the net. Note this is different from Clock Skew which is reported in TRCE timing report. Clock Skew is the difference between the minimum and maximum path delays which includes logic delays. Erste Tabelle: Die Skew Werte sind sehr klein.( bis 0,5 ns ) das Delay bis 2,2 ns Das bedeutet ?? Ist der erste Wert ist der Delay nur innerhalb des Taktnetzes ? Und das Delay = Verzögerung der Taktphase über das gesamte FPGA Logik hinweg. Also das Ankommen der z.B. steigende Flanke inkl. Lokik variert maximal 2,2 ns richtig. ? Wie ist das gemeint includes logic delays. Welche Logik ist in dem Taktpfad noch enthalten ? Note this is different from Clock Skew which is reported in TRCE timing report Wenn ich das richtig verstehe ist die Zweite Tabelle die TRCE Tabelle richtig. Dort sind die Werte erschreckend hoch. Bin ratlos und komm ohne Hilfe nicht weiter. Ich bitte herzlich darum, dass einer der Profis weiterhilft. :-)) In meiner jetzt abgeänderten Version, hab ich unwichtige Teile weggelassen und alle Teile der Schaltung bekommen als Input nur noch den Ausgang DCM clk0_out Gruß vom FPGA-Fragenden Phase 9: 0 unrouted; (4) REAL time: 16 secs WARNING:Route:447 - CLK Net:clkdiv<23> may have excessive skew because 2 CLK pins and 1 NON_CLK pins failed to route using a CLK template. WARNING:Route:447 - CLK Net:kb1/clkDiv<3> may have excessive skew because 1 NON-CLK pins failed to route using a CLK template. Total REAL time to Router completion: 16 secs Total CPU time to Router completion: 16 secs Generating "PAR" statistics. ************************** Generating Clock Report ************************** +---------------------+--------------+------+------+------------+------- ------+ | Clock Net | Resource |Locked|Fanout|Net Skew(ns)|Max Delay(ns)| +---------------------+--------------+------+------+------------+------- ------+ | DCM_CLK0_OUT | BUFGMUX2| No | 298 | 0.477 | 1.177 | +---------------------+--------------+------+------+------------+------- ------+ | kb1/KCI | BUFGMUX3| No | 15 | 0.144 | 1.023 | +---------------------+--------------+------+------+------------+------- ------+ | vga1/clkdiv | BUFGMUX7| No | 14 | 0.199 | 0.981 | +---------------------+--------------+------+------+------------+------- ------+ | clkdiv<23> | Local| | 3 | 0.000 | 1.474 | +---------------------+--------------+------+------+------------+------- ------+ | kb1/clkDiv<3> | Local| | 5 | 0.072 | 2.208 | +---------------------+--------------+------+------+------------+------- ------+ * Net Skew is the difference between the minimum and maximum routing only delays for the net. Note this is different from Clock Skew which is reported in TRCE timing report. Clock Skew is the difference between the minimum and maximum path delays which includes logic delays. Timing Score: 0 Asterisk (*) preceding a constraint indicates it was not met. This may be due to a setup or hold violation. ------------------------------------------------------------------------ ------------------------------ Constraint | Requested | Actual | Logic | Absolute |Number of | | | Levels | Slack |errors ------------------------------------------------------------------------ ------------------------------ Autotimespec constraint for clock net DCM | N/A | 10.213ns | 4 | N/A | N/A _CLK0_OUT | | | | | ------------------------------------------------------------------------ ------------------------------ Autotimespec constraint for clock net clk | N/A | 3.704ns | 1 | N/A | N/A div<23> | | | | | ------------------------------------------------------------------------ ------------------------------ Autotimespec constraint for clock net kb1 | N/A | 2.037ns | 0 | N/A | N/A /clkDiv<3> | | | | | ------------------------------------------------------------------------ ------------------------------ Autotimespec constraint for clock net kb1 | N/A | 8.177ns | 2 | N/A | N/A /KCI | | | | | ------------------------------------------------------------------------ ------------------------------ Autotimespec constraint for clock net vga | N/A | 5.520ns | 2 | N/A | N/A 1/clkdiv | | | | | ------------------------------------------------------------------------ ------------------------------ All constraints were met. INFO:Timing:2761 - N/A entries in the Constraints list may indicate that the constraint does not cover any paths or that it has no requested value. Generating Pad Report. All signals are completely routed.
das hier is boese(tm):
1 | process (mclk) |
2 | begin
|
3 | if mclk = '1' and mclk'Event then |
4 | clkdiv <= clkdiv + 1; |
5 | end if; |
6 | end process; |
7 | |
8 | cclk <= clkdiv(23); |
niemals clock signale durch logik erzeugen. lieber ein clock enable signal erzeugen:
1 | process (mclk) |
2 | begin
|
3 | if mclk = '1' and mclk'Event then |
4 | clkdiv <= clkdiv + 1; |
5 | if (clkdiv = "100...00") then |
6 | cclk <= '1'; |
7 | else
|
8 | cclk <= '0'; |
9 | end if; |
10 | end if; |
11 | end process; |
und dann in dem process wo du es verwendest if rising_edge(mclk) then if (cclk = '1') then ... end if; end if; und generell immer so wenig verschiedene clocks wie moeglich ! (fuer viele designs) am allerbesten nur eine und ggf mit clk enables arbeiten
Hallo noob, Super dein Beitrag !! Ich hab genau den Quelltext, den Du bemängelst bereits gestern unabhängig vor deinem letzten Post bereits selbst abgeändert. Haben also beide genau die gleiche Störquelle entdeckt, leider ändert das an dem merkwürdigen Verhalten meiner Schaltung nichts. Nochmals Zusammenfassung meiner Problematik nach weiteren Versuchen mit der DCM. Für den Betrieb wird benötigt: =================================== - Takt ( Systemtakt ) - (1/2 Takt) wobei die Flanke des quasi halben Taktes nicht abgefragt wird. Es gibt also KEINEN Process(CLK habler Takt) Das Signals 1/2 Takt wird lediglich als Freigebesignal abgefragt. - Takt x 2 Für das verbesserte Timing SRAM wird noch ein doppelter Takt benötigt, deshalb der Einsatz der DCM 1. Versuch =========== Erzeugen eines Taktes mit doppelter Frequenz also 100 MHz. Dieser wird für die Schaltung jedoch gar nicht benutzt, sondern benutzt wird nur der - CLK50 Ausgang der DCM - CLKV mit Teiler 2 also 25 MHz TAkt der DCM => Schaltung funktioniert tadellos. 2. Versuch wie 1 aber ===================== Nun wird das CLKx2 ( 100 Mhz ) nur benutzt um einen 8 Bit Zähler hochzuzählen. sonst nichts . Der Zähler wird nicht für die eigentliche Schaltung benutzt es soll lediglich nachgewiesen werden dass die doppelte Zählfrequenz erzeugt wird. Die restliche Schaltung bleibt an CLK50 und CLKV => Schaltung funktioniert nicht mehr Das ist eben das für mich total unlogische 3. Versuch: ============ Es soll getestet werden wie empfindlich die Timings meiner Schaltung sind. Es wird eine DCM Erzeugt mit weiterhin Input 50 MHz jetzt aber Ausgangsfrequenz 70 Mhz CLKfx = 70 MHz wird nun als Master Clock verwendet also eine deutliche Erhöhung von 50 auf 70 MHz. In diesem Fall wird das halbe Taktsignal ( eigentlich Freigabesignal ) einfach aus dem 70 MHz Signal erzeugt. => Schaltung funktioniert tadellos Timing hat noch Luft !! 4. Versuch: ============ Es soll wieder getestet werden wie empfindlich die Timings meiner Schaltung sind. Es wird eine DCM Erzeugt mit weiterhin Input 50 MHz jetzt aber Ausgangsfrequenz 80 Mhz CLKfx = 80 MHz wird nun als Master Clock verwendet also eine deutliche Erhöhung von 50 auf 80 MHz. In diesem Fall wird das halbe Taktsignal ( eigentlich Freigabesignal ) einfach aus dem 80 MHz Signal erzeugt. => Schaltung bringt nun sporadische Lesefehler Also Taktlimit erreicht. Soweit logisch. Meine Folgerung: ================= Die Benutzung des 100 MHz Taktes führt zu einem anderen inneren Aufbau des Taktnetzwerkes des FPGA ( Routing ?? ) nur für einen Zähler zumn Test beeinflusst/verändert das Taktverhalten der ganzen Schaltung. Bin irgendwie ganz schön frustiert und brauch Trost :-(( Gruß vom FPGA-Fragenden
1) was ist denn mit dem reset der dcm und dem locked ausgang ? UNBEDINGT die dcm reseten und die gesamte schaltung nur bei LOCK der dcm laufen lassen ! 2) Evtl mal locked oder sogar die ganzen statusbits (STATUS : out std_logic_vector (7 downto 0);) der dcms auf leds legen und gucken was da los ist. Ich vermute eher ein problem mit der dcm als mit dem timing der clock trees. 3) verwendest du das signal dass du an CLKIN vom DCM anlegst noch irgendwo ? versuch mal das nur an die DCM und ggf an den reset counter fuer die dcm zu packen und fuer den rest clk0_out zu nehmen. ich hatte da mal ein problem mit dass aus irgendeinem grund die dcm immer wieder auf unlocked sprang wenn ich viel am signal dass nach CLKIN geht haengen hatte
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.