Forum: FPGA, VHDL & Co. Problem mit DCM Management in Spartan 3


von FPGA-Fragender (Gast)


Angehängte Dateien:

Lesenswert?

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

von FPGA-Fragender (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen

hier noch die nächste Anlage

von FPGA-Fragender (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

und hier die DCM als vhd Datei als Anlage

von FPGA-Fragender (Gast)


Lesenswert?

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.

von noob (Gast)


Lesenswert?

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

von FPGA-Fragender (Gast)


Lesenswert?

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.

von noob (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?


von FPGA-Fragender (Gast)


Lesenswert?

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

von noob (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.