mikrocontroller.net

Forum: FPGA, VHDL & Co. Kann mir jemand beim Platzieren von DCMs helfen?


Autor: Steffen Hausinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich benötige in meinem Design zwei Taktfrequenzen, einen Systemtakt und 
einen Takt für ein I/O-Modul (16 MHz). Da ich für keine von beiden den 
Eingangstakt verwenden möchte, habe ich zwei DCMs angelegt. Soweit so 
gut, in der Simulation klappt alles und synthetisieren lässt es sich 
auch.

Nur beim Platzieren bekomme ich folgende Fehlermeldung (ISE 11.1):
ERROR:Place:1012 - A clock IOB / DCM component pair have been found that are not placed at an optimal clock IOB / DCM site pair.  The clock component <CLKGen_100MHz_unit/DCM_SP_INST> is placed at site <DCM_X0Y1>.  The clock IO/DCM site can be paired if they are placed/locked in the same quadrant.  The IO component <CLK_ext> is placed at site <T10>.  This will not allow the use of the fast path between the IO and the Clock buffer. If this sub optimal condition is acceptable for this design, you ma
y use the CLOCK_DEDICATED_ROUTE constraint in the .ucf file to demote this message to a WARNING and allow your design to continue. However, the use of this override is highly discouraged as it may lead to very poor timing results. It is recommended that this error condition be corrected in the design. A list of all the COMP.PINs used in this clock placement rule is listed below. These examples can be used directly in the .ucf file to override this clock rule. < NET "CLK_ext" CLOCK_DEDICATED_ROUTE
 = FALSE; >
   < PIN "CLKGen_100MHz_unit/DCM_SP_INST.CLKIN" CLOCK_DEDICATED_ROUTE = FALSE; > 


Es gibt einen recht aktuellen Thread hier im Forum (siehe 
Beitrag "Problem mit DCM-Position"). Leider unterhalten sich da 
offensichtlich zwei Leute vom Fach, wozu ich mich leider (noch) nicht 
zählen kann. Daher kann ich dem Post nicht folgen.

Ich lese aus der Fehlermeldung, dass der Platzierer es nicht schafft, 
die DCMs in den gleichen Quadranten wie den Takteingang zu setzen. 
Deshalb muss er irgendeinen langsameren Pfad auswählen und der Takt wird 
suboptimal ausgeführt.

Was ich aber nicht verstehe, ist, ...

...wieso er das denn nicht ordentlich Platzieren kann? Der verwendete 
Spartan 3E (XC3S500E) hat 8 DCMs, demnach werden in jeden Quadranten 2 
DCMs fallen. Mehr brauche ich auch nicht - wieso klappt das denn nun 
nicht?

...was das Faß überhaupt zum Überlaufen gebracht hat? Oder ist es etwa 
generell immer so, dass man bei der Verwendung von zwei DCMs automatisch 
in diese Beschränkung rennt?


Was kann ich jetzt sinnvolles tun, um dieses Problem aufzulösen? Was 
meint der Platzierer in seiner Fehlermeldung, wenn er von "very poor 
timing results" spricht? Was erwartet mich da?


Grüße
Steffen

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Steffen Hausinger schrieb:
> <CLK_ext> is placed at site <T10>.  This will not allow the use of the
> fast path between the IO and the Clock buffer.
Ist der Pin T10 bei deinem FPGA ein Takteingang?

> wenn er von "very poor timing results" spricht?
Jitter und Skew werden unkalkulierbar und schlecht.
> Was erwartet mich da?
Das kann keiner genau sagen...  :-/

Autor: Steffen Hausinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
> Ist der Pin T10 bei deinem FPGA ein Takteingang?

Nein, aber nach der Lesart oben bin ich auch davon ausgegangen, dass mit 
"Side T10" etwas anderes gemeint sei. Sonst hätte ich das Wort "Pad" 
erwartet.

Der Takteingang liegt auf Pin C9 (-> Digilent-Bord). Das habe ich dem 
Tool aber auch in der *.ucf bekannt gegeben:
NET "CLK_ext" LOC = C9;
NET "CLK_ext" IOSTANDARD = LVCMOS33;
NET "CLK_ext" TNM_NET = CLK_ext;
TIMESPEC TS_CLK_ext = PERIOD "CLK_ext" 50 MHz HIGH 40% INPUT_JITTER 1 ps;


Was würdest Du denn jetzt an meiner Stelle machen?

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst nix anderes machen, als das CLOCK_DEDICATED_ROUTE = FALSE in 
die UCF einzutragen, wenn dein Takt auf so einem Pin bleiben muss. Schau 
dir mal im User Guide das Übersichtsbild zu den DCMs und Clock-Leitungen 
an, dann siehst du schnell die Grenzen. Nur bestimmte CLK Eingänge 
können direkt auf die einzelnen DCMs gehen, und die Zahl der internen 
Clock Lanes ist auch nur 8. Somit kannst du z.B. nicht jeweils alle 4 um 
90° verschobenen Ausgänge zweier nebeneinander liegender DCMs 
gleichzeitig auf die Clock Lanes aufschalten.

Autor: Steffen Hausinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian R. schrieb:
> Nur bestimmte CLK Eingänge
> können direkt auf die einzelnen DCMs gehen

Mein Takteingang, C9, ist so einer. Er geht direkt auf DCM_X0Y1 - passt 
also.


Christian R. schrieb:
> Somit kannst du z.B. nicht jeweils alle 4 um
> 90° verschobenen Ausgänge zweier nebeneinander liegender DCMs
> gleichzeitig auf die Clock Lanes aufschalten.

Na gut, aber das will ich doch auch gar nicht. Schon klar, dass das nur 
ein Beispiel von Dir war. Aber soll das mit anderen Worten heißen, dass 
es nicht möglich ist, zwei verschiedene Taktfrequenzen zu erzeugen?! 
Bzw. nur mit den genannten Einschränkungen?

Ich bin bisher davon ausgegangen, das wäre eine Standard-Aufgabe und ein 
FPGA langweilt sich über sowas. Aber demnach würden ja alle Spartan 3 da 
draußen nur mit maximal 2 Takten betrieben werden (oder die 
Einschränkung in Kauf nehmen). Ist das denn wirklich so?! Warum gibt es 
denn dann überhaupt 4 DCM-Einheiten?

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Steffen Hausinger schrieb:
> Christian R. schrieb:
>> Nur bestimmte CLK Eingänge
>> können direkt auf die einzelnen DCMs gehen
>
> Mein Takteingang, C9, ist so einer. Er geht direkt auf DCM_X0Y1 - passt
> also.

Das schon. Aber den meckert er ja nicht an, sondern den 2. Takteingang 
am T10. Das ist offenbar überhaupt kein CLK Eingang oder einer, der 
nicht benutzbar ist, weil durch den anderen DCM blockiert.

> Christian R. schrieb:
>> Somit kannst du z.B. nicht jeweils alle 4 um
>> 90° verschobenen Ausgänge zweier nebeneinander liegender DCMs
>> gleichzeitig auf die Clock Lanes aufschalten.
>
> Na gut, aber das will ich doch auch gar nicht. Schon klar, dass das nur
> ein Beispiel von Dir war. Aber soll das mit anderen Worten heißen, dass
> es nicht möglich ist, zwei verschiedene Taktfrequenzen zu erzeugen?!
> Bzw. nur mit den genannten Einschränkungen?

Doch, natürlich geht das. Sogar bis zu 8 Takte, die auf den schnellen 
Clock Lanes laufen können. Allerdings muss man sich dafür beim Entwurf 
der Außenbeschaltung schon im klaren drüber sein, dass es gewisse 
Einschränkungen hinsichtlich der Plazierung der CLK Eingänge gibt. Siehe 
oben.

> Ich bin bisher davon ausgegangen, das wäre eine Standard-Aufgabe und ein
> FPGA langweilt sich über sowas. Aber demnach würden ja alle Spartan 3 da
> draußen nur mit maximal 2 Takten betrieben werden (oder die
> Einschränkung in Kauf nehmen). Ist das denn wirklich so?! Warum gibt es
> denn dann überhaupt 4 DCM-Einheiten?

Wie gesagt, das geht schon, wenn du 4 CLK Eingänge an den 4 Seiten des 
Chips benutzt und insgesamt bei unter 8 Takten im FPGA bleibst. Bei 
niedrigeren Frequenzen und/oder geringeren Anforderungen an Skew und 
Jitter usw. geht´s natürlich auch über die normalen Routing-Ressourcen.

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

oben in der ISE Fehlermeldung steht:
The IO component <CLK_ext> is placed at site <T10>.

Du schreibst aus deinem .ucf:
NET "CLK_ext" LOC = C9;

Da passt doch etwas nicht zusammen. Wieviele externe Eingangsclocks hast 
du denn nun? Und auf welchen Pins?

Autor: Steffen Hausinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
berndl schrieb:
> Da passt doch etwas nicht zusammen. Wieviele externe Eingangsclocks hast
> du denn nun? Und auf welchen Pins?

Nach ausgiebiger Lektüre vermute ich, dass genau hier mein Denkfehler 
liegt. Ich habe nämlich nur einen einzigen CLK-Eingang (den auf C9). 
Sehe ich es richtig, dass ich dessen Takt nur auf ein einziges DCM 
schalten kann? D.h. pro Takteingang kann ich zwei Takte nutzen - nämlich 
den Originaltakt und einen daraus per DCM abgeleiteten?

Denn so würde das alles einen Sinn machen...

Autor: Michael Sauron (Firma: www.das-labor.org) (laborsauron)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Sehe ich es richtig, dass ich dessen Takt nur auf ein einziges DCM
>schalten kann?

Ja

Der DCM hat noch einen Ausgang mit dem Namen IBUFG_OUT. Den nimmst du 
als quelle für den 2. DCM

Sauron

Autor: Steffen Hausinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aha, dann kann ich aus einem einzigen Takteingang also schon mehrere 
Taktfrequenzen ableiten. Das werde ich gleich einmal ausprobieren!

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Den 2. DCM aber dann auf "Internal" Source stellen. Sonst klappts nicht.
Aber wo kommt dann die Fehlermeldung mit T10 als Input her?

Autor: Steffen Hausinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian R. schrieb:
> Aber wo kommt dann die Fehlermeldung mit T10 als Input her?

Ich habe eine Vermutung: Gestern Abend habe ich in meiner Verzweiflung 
viele Einstellungen einmal durchgespielt. Dabei habe ich wohl auch die 
Kombination erwischt, in der beide DCMs als "Input" eingestellt sind. 
Demnach ist Ihnen gar kein Takteingang zugeordnet. Möglicherweise hat 
das irgendwie dazu geführt, dass "T10" ausgewählt wurde? Ich weiß es 
nicht.



Ich habe nun aber folgendes ausprobiert:

Externer Takt an erstes DCM:
  CLKGen_25MHz_unit : CLKGen_25MHz Port map(
      CLKIN_IN => CLK_ext,             -- IBUFG
      CLKFX_OUT => iCLK_25MHz,         -- BUFG
      CLKIN_IBUFG_OUT => CLK_ext_IBUF, -- Abzweigung aus dem IBUFG von CLKIN_IN
      CLK0_OUT => open,
      LOCKED_OUT => open );

Daran angeschlossen nun das zweite DCM:
  CLKGen_16MHz_unit : CLKGen_16MHz Port map(
      CLKIN_IN => CLK_ext_IBUF,        -- Siehe oben
      CLKFX_OUT => iCLK_16MHz,         -- BUFG
      CLK0_OUT => open,
      LOCKED_OUT => open );



Leider kommt immernoch obige Fehlermeldung (diesmal aber mit "Site C9"). 
Habe ich da irgendetwas falsch gemacht? Muss ich noch manuell einen 
"BUFG" im DCM-Wizard anlegen?

Autor: Steffen Hausinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe meinen Aufbau von zwei DCMs mal probeweise auf eine DCM 
reduziert. In meinem Modell verwende ich also jetzt zwei Takte - den 
originalen Eingangstakt (50 MHz) und einen davon abgeleiteten (16MHz).

Die oben beschriebene Fehlermeldung taucht nun nicht mehr auf. Dafür 
werden meine Laufzeiten miserabel! Hier der Auszug:
+-------------------------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+
|                               |   Period    |       Actual Period       |      Timing Errors        |      Paths Analyzed       |
|           Constraint          | Requirement |-------------+-------------|-------------+-------------|-------------+-------------|
|                               |             |   Direct    | Derivative  |   Direct    | Derivative  |   Direct    | Derivative  |
+-------------------------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+
|TS_CLK_in                      |     20.000ns|     34.392ns|     82.736ns|           11|          556|      2943528|        42589|
| TS_CLKGen_16MHz_unit_CLKFX_BUF|     62.500ns|    258.550ns|          N/A|          556|            0|        42589|            0|
+-------------------------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+

Wenn ich das Ganze mit nur einem Takt aufbaue, beispielsweise, indem ich 
nur den 16MHz-Takt aus dem DCM verwende, entspannt sich die Lage völlig:
+-------------------------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+
|                               |   Period    |       Actual Period       |      Timing Errors        |      Paths Analyzed       |
|           Constraint          | Requirement |-------------+-------------|-------------+-------------|-------------+-------------|
|                               |             |   Direct    | Derivative  |   Direct    | Derivative  |   Direct    | Derivative  |
+-------------------------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+
|TS_CLK_in                      |     20.000ns|      7.500ns|      6.405ns|            0|            0|            0|      3076989|
| TS_CLKGen_16MHz_unit_CLKFX_BUF|     62.500ns|     20.016ns|          N/A|            0|            0|      3076989|            0|
+-------------------------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+



Was ist hier nur los? Was bereitet ihm solche Probleme, einen zweiten 
Takt zu routen? Wo kommen diese langen Laufzeiten her?

Wie macht ihr das in Euren Projekten, verwendet ihr da keine 
abgeleiteten Takte? Gibt es irgendwelche Kniffs oder Tricks, die ich 
beachten muss?

Steffen

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es kann sein das Du den Clock Buffer beim DCM vergessen hast. Wenn ich 
das noch richtig in Erinnerung habe muss man eine BUFG verwenden.

Autor: Steffen Hausinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei meinem letzten Design mit nur einem DCM war ein IBUF am Eingang und 
ein BUFG am CLKFX. Ist es das, was Du meintest?

Kann man da noch mehr falsch machen?

Autor: Weltbester FPGA Pongo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
war das nicht so, daß Xilinx bei DCMs die BUFGs automatisch plaziert?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.