Xilinx Spartan 6, mehrere DCMs

#2127736
Lesenswert?

Moin,

in einem Spartan 6 gibt es netterweise mehrere DCMs (Digital Clock 
Manager), die jeweils 6 (!) Ausgangstakte erzeugen können, einstellbar 
zB in Frequenz und Phase im Verhältnis zum Eingangssignal.

Ich benötige zur Erzeugung von 8 Clocks (aus einer) nun 2 dieser DCMs, 
habe aber das Problem, dass in jeder von mir getesten Konfiguration 2 
globale Clock Buffer hintereinander entstehen. Diese werden scheinbar 
bei der Synthese erzeugt, das Translate liefert dann den Fehler "Clock 
Buffer in Serie darf nicht".

Meine gescheiterten Versuche, das zum umgehen waren bisher folgende:

1) Eingangsclock an 2 DCMs, Fehler: scheinbar gibt's am DCM Eingang 
einen Buffer, und den GCK-Buffer am Clock IO.
Lösungsversuch: in den Synthese-Optionen das "auto IO buffer" 
ausschalten.
Problem: alle IO-Buffer weg
Ach ja, und man braucht einen Buffer, um 2 DCMs zu treiben.

Okay, das könnte man evtl umgehen und alle anderen IO Buffer per Hand im 
ucf setzen. Aber geht das dann wirklich?

2) DCM1 so eingestellt, das ein Takt-Ausgang ohne BUFG erzeugt wird. 
Dieser soll dann DCM2 Eingangstakt sein.
Geht auch nicht, meckert wieder, dass 2 BUFs hintereinander sind.
Das verstehe ich leider auch nicht.

Irgendwelche Ideen?

Danke,
X
Gast #2127746
Lesenswert?

X- Rocka schrieb:
> Ich benötige zur Erzeugung von 8 Clocks
Bist Du Dir sicher so viele zu brauchen?
Was willst Du denn damit machen?
Welche Anforderung stehen denn an die Takte?
Evtl. kannst Du Dir Clock Enables erzeugen und damit arbeiten.
Ich bin bisher immer mit max. fünf Takten ausgekommen (1xSDRAM, 
3xVGA/SVGA gemuxt, Systemtakt).

Duke
Gast #2127773
Lesenswert?

X- Rocka schrieb:
> Ich bräuchte Augänge zB alle 200MHz, und dann je +22.5° (1/16 von 360°
> ist wohl Minimalauflösung) zur nächsten.

Immer gleichzeitig? Was willst Du denn damit machen?
Vielleicht hilft es Dir ja auch, wenn Du einen Takt erzeugst und bei 
diesem daan von Deinem Design aus die Phase hin- und herschiebst...

Duke
#2127781
Lesenswert?

Duke Scarring schrieb:

> Immer gleichzeitig? Was willst Du denn damit machen?

Frequenzen messen.

> Vielleicht hilft es Dir ja auch, wenn Du einen Takt erzeugst und bei
> diesem daan von Deinem Design aus die Phase hin- und herschiebst...

Da bin ich mir sicher, dass das der DCM deutlich besser und genauer 
kann. Bei 200MHz sind 200ps Gatterlaufzeit ja schon ~15°.

Ja, es ist ein etwas grenzwertiges Design, da werden die schnellen Pfade 
mit den entscheidenden FFs auch von Hand platziert.
Aber das scheint mir sicherer, als eine auf Gatterlaufzeiten (und somit 
noch mehr Temperatur- und Spannungs-abhängig) basierende hohe Auflösung. 
Vielleicht werde ich aber mal aus Neugierde eine Tapped Delay Line mit 
den hübschen CARRY4s testen.
Gast #2127842
Lesenswert?

X- Rocka schrieb:
> Trotzdem wurmt es mich, dass ich nicht die DCM parallel oder seriell zum
> laufen bekommen habe.
Da schau Dir nochmal genau den Abschnitt zur DCM im Datenblatt an. Da 
stehen dann auch die Einschränkungen bzgl. der globalen Buffer dazu.
Ich hab gerade auch das hier noch gefunden:

Spartan-6 FPGA Clocking Resources UG382
http://www.xilinx.com/support/documentation/user_guides/ug382.pdf

Duke
#2127907
Lesenswert?

Ich hab auch gemerkt, dass der S6 da einige blöde Einschränkungen hat. 
Ich verwende in meinem Design auch 45° Takte, die sind auch nötig, und 
müssen gleichzeitig anliegen und für einen Teil des Designs umschaltbar 
sein (geht auch nach außen dann an einen ADC). Beim S3E geht das 
problemlos und mit erstaunlich wenig Jitter. Für die nächste Revision 
wollte ich den S6 einsetzen, da geht sowas erst mal gar nicht. Der hat 
da viel weniger globale Clocking-Ressourcen, sowas blödes aber auch...
#2127923
Lesenswert?

Christian R. schrieb:
...
> problemlos und mit erstaunlich wenig Jitter. Für die nächste Revision
> wollte ich den S6 einsetzen, da geht sowas erst mal gar nicht. Der hat
> da viel weniger globale Clocking-Ressourcen, sowas blödes aber auch...

Ich hatte nur den alten S3-original verwendet, da bin ich mit dem S6 und 
den 2+ DCMs ganz zufrieden.
Was meinst du mit "da geht sowas erst mal gar nicht"?
#2128227
Lesenswert?

X- Rocka schrieb:
> Was meinst du mit "da geht sowas erst mal gar nicht"?

Ich hab für den Takt nach außen einen BUFGMUX und dann das ODDR Element, 
damit ich nicht 3 BUFGMUX für die 4 Takte brauche. Allerdings will das 
nicht in den S6, weil dann (wie im S3 auch) 2 BUFGMUX hintereinander 
sind (der am DCM Ausgang zählt auch). Und da das ganze 2 mal im FPGA 
ist, gehen dem die Ressourcen aus. Hab dann aber auch noch keine Zeit 
gehabt, da weiter zu probieren, wie man das am besten umschifft. Im S3E 
klappt das wunderbar. Der einzige Vorteil für ein Redesign mit dem S6 
wäre für uns das Golden Image beim SPI Multiboot.
#2128270
Lesenswert?

Christian R. schrieb:
> Ich hab für den Takt nach außen einen BUFGMUX und dann das ODDR Element,
> damit ich nicht 3 BUFGMUX für die 4 Takte brauche. Allerdings will das
> nicht in den S6, weil dann (wie im S3 auch) 2 BUFGMUX hintereinander
> sind (der am DCM Ausgang zählt auch). Und da das ganze 2 mal im FPGA
> ist, gehen dem die Ressourcen aus. Hab dann aber auch noch keine Zeit
> gehabt, da weiter zu probieren, wie man das am besten umschifft.
Ich treffe nächste Woche einen Xilinx FAE, vielleicht kennt der den 
Kniff.

> Der einzige Vorteil für ein Redesign mit dem S6
> wäre für uns das Golden Image beim SPI Multiboot.
Das ist schon mal eine gute Sache und auch bei uns angedacht, aber 
soweit sind wir auch noch nicht.
#2128373
Lesenswert?

Das ist das Code-Stück:
1
  Mux_0 : BUFGMUX
2
   port map (
3
      O   => CLK,          -- Clock MUX output
4
      I0 => CLK0,        -- Clock0 input
5
      I1 => CLK90,        -- Clock1 input
6
      S   => CLK_SEL_0      -- Clock select input
7
   );
8

9
  Mux_1 : BUFGMUX
10
   port map (
11
      O   => CLK_n,          -- Clock MUX output
12
      I0 => CLK180,        -- Clock0 input
13
      I1 => CLK270,        -- Clock1 input
14
      S   => CLK_SEL_0        -- Clock select input
15
   );
16
  
17
  Sel_1_n <= not CLK_Sel_1;
18
  
19
  OutDDR : ODDR2  Port map(Q   => CLK_Out, C0 => CLK, C1 => CLK_n, CE => '1', D0 => Sel_1_n, D1 => CLK_SEL_1, R => '0', S => '0');

Mit den 2 Bits CLK_SEL_0 und CLK_SEL_1 kann man den CLK-Ausgang 0°, 90°, 
180°, 270° umschalten.
Wie gesagt auf dem S3E1200 klappt das prima. Hab mich oben übrigens 
verschrieben, sind 90° Taktabstände, nicht 45°. 45 wäre natürlich noch 
besser, aber dann bestand schon beim S3 das Problem mit den vielen DCMs 
bzw. BUFGMUX.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren