Forum: FPGA, VHDL & Co. Spartan3: zwei DCMs in Serie schalten


von Bronco (Gast)


Lesenswert?

Hallo Freunde,

ich hab folgende Anforderung:
In einem Spartan3 mit einem 80MHz-Oscillator muß ich einen 20MHz-Takt 
und einen 20MHz-Takt mit 90° Phase erzeugen.
Mein erster Ansatz sieht so aus:
1. DCM: Oscillator-Takt ("CLK_OSC80") durch 4 teilen = iClock_80divby4
2. DCM: aus iClock_80divby4 den 20MHz und  20MHz+90° erzeugen
1
iDcmClockRam80 : entity work.DCM_DivBy4   
2
  port map(
3
    CLKIN_IN     => CLK_OSC80,
4
    RST_IN       => '0',
5
    CLKDV_OUT    => iClock_80divby4,
6
    CLKIN_IBUFG_OUT   => open,
7
    CLK0_OUT     => iClock_80,
8
    LOCKED_OUT   => open  
9
);
10
11
iDcmClockRam20 : entity work.DCM_Phase90
12
  port map(
13
    CLKIN_IN     => iClock_80divby4,
14
    RST_IN       => '0',
15
    CLKIN_IBUFG_OUT   => open,
16
    CLK0_OUT     => iClock_20,
17
    CLK90_OUT    => iClock_20_90,
18
    LOCKED_OUT   => open  
19
);

Jetzt meldet mir die ISE einen Fehler:

NgdBuild:770 - IBUFG 'iDcmClockRam20/CLKIN_IBUFG_INST' and BUFG
   'iDcmClockRam80/CLKDV_BUFG_INST' on net 'iClock_80divby4' are lined 
up in
   series. Buffers of the same direction cannot be placed in series.

Ich versteh nicht so ganz, was mir dieser Fehler sagen will:
Was meint ISE mit "the same direction"?
Kann man DCMs beim Spartan3 grundsätzlich nicht in Serie schalten?
Wie kann ich das alternativ machen?

von P. K. (pek)


Lesenswert?

Du musst die zwei doch gar nicht in Serie schalten. Das Teilen kannst Du 
bequem im selben DCM erreichen (DIVIDE und MULTIPLY), welcher Dir die 
Clocks ausgibt.

von Christian R. (supachris)


Lesenswert?

Die 90° Ausgabe eines /4 geteilten Taktes geht da aber nur über 2 DCM in 
Reihe.
Du musst nur einstellen, dass der erste DCM am Ausgang keinen BUFG hat 
oder halt beim 2. einstellen dass am Eingang kein BUFG ist.
Standardmäßig macht der BUFG an Eingang und Ausgang, so sieht es jetzt 
vermutlich aus:

Clock -> BUFG -> DCM1 -> BUFG -> BUFG -> DCM2

von Thosch (Gast)


Lesenswert?

Christian R. schrieb:
> Die 90° Ausgabe eines /4 geteilten Taktes geht da aber nur über 2 DCM in
> Reihe.
stimmt auffallend. Es gibt ja auch nur die Attribute
CLKDV_DIVIDE
CLKFX_DIVIDE
CLKFX_MULTIPLY

und die wirken sich halt nur auf die CLKDV bzw. CLKFX Ausgänge aus,
nicht auf CLK0, CLK90 usw.


> Standardmäßig macht der BUFG an Eingang und Ausgang, so sieht es jetzt
> vermutlich aus:
>
> Clock -> BUFG -> DCM1 -> BUFG -> BUFG -> DCM2

nicht ganz, steht doch in der Fehlermeldung der ISE, wie's aussieht:
Clock-Pin -> IBUFG -> DCM1 -> BUFG -> IBUFG -> DCM2

der IBUFG vor DCM2 muß weg.
Also am besten die DCMs direkt als DCM_SP instanziieren, und die 
benötigten Buffer auch direkt instanziieren.

Gruß,
Thosch

von Bronco (Gast)


Lesenswert?

Danke Euch allen.

Jetzt mach ich eben den IP-Core-Generator auf und was muß ich sehen?
Es wird standardmäßig ein IP-Core aus zwei kaskadierten DCMs angeboten, 
der ganz genau das kann, was ich wollte! Warum hab ich den vorher nicht 
gesehen? Mir stehen die Haare zu Berge...

von Christian R. (supachris)


Lesenswert?

Thosch schrieb:
> nicht ganz, steht doch in der Fehlermeldung der ISE, wie's aussieht:
> Clock-Pin -> IBUFG -> DCM1 -> BUFG -> IBUFG -> DCM2

Richtig, hab die "I" unterschlagen. Kann man ja aber im Core-Gen auch 
alles einstellen, da muss man nicht unbedingt die DCM_SP selbst 
instanziieren.

von Thosch (Gast)


Lesenswert?

Christian R. schrieb:
> Richtig, hab die "I" unterschlagen. Kann man ja aber im Core-Gen auch
> alles einstellen, da muss man nicht unbedingt die DCM_SP selbst
> instanziieren.

Jo, das ist die Macht der Gewohnheit...
Da ich normalerweise wenig mit VHDL mache (fast alles als hierarchiche 
Schematics, meine Root-Designs sind EDIF-Netzlisten) arbeite ich da 
sowieso mit den Primitiva als Symbol.
Und bevor ich für solche Trivialitäten den Coregen anwerfe, packe ich 
lieber die paar BUFGs und DCMs in meinen Schaltplan und verdrahte sie. 
:)

Für komplexe Cores mache ich mir dann einen VHDL-Wrapper, der mit einem 
selbsterstellten Symbol übereinstimmt, so kommen dann die VHDL-Cores ins 
Design.

Gruß,
Thosch

von Neuinbibi (Gast)


Lesenswert?

Bronco schrieb:
> Es wird standardmäßig ein IP-Core aus zwei kaskadierten DCMs angeboten,
>
> der ganz genau das kann, was ich wollte!
Richtig, wollte ich Dir gerade empfehlen,

 Warum hab ich den vorher nicht gesehen?
Tja, das kann ich dir nicht sagen.

Der kaskadierte DCM scheint im Übrigen ein Mysterium in den S3 zu sein:
Manuell nachbauen konnte ich ihn auch noch nicht. Nicht im S3 und nicht 
im S6.

von Christian R. (supachris)


Lesenswert?

Neuinbibi schrieb:
> Der kaskadierte DCM scheint im Übrigen ein Mysterium in den S3 zu sein:
> Manuell nachbauen konnte ich ihn auch noch nicht. Nicht im S3 und nicht
> im S6.

Das geht schon, aber meistens schlägt dann eine andere kranke 
Beschräkung im Clock-Netzwerk der Spartaner zu. Ich hab das auch in 
einem Fall mal hinbekommen. Man muss nur mi den Buffern aufpassen, dann 
klappts eigentlich.

von Georg A. (georga)


Lesenswert?

> Der kaskadierte DCM scheint im Übrigen ein Mysterium in den S3 zu sein:

Hm, dann habe ich bei meinem Design mit 5 DCMs im S3E wohl Glück gehabt. 
Takteingang ist 16.384MHz, gebraucht werden 33 (PCI), 66 (System) und 
133 (DDR, einmal intern+Ausgang, einmal zu Speichern der Eingänge). 
Alles von Hand instanziiert samt Buffern. Das ist alles soweit synchron, 
dass die Übergaben zwischen den Taktebenen ohne massenweise 
Registerstufen gehen...

Allerdings ist es schon auch nötig, die Orte der DCMs und Buffer 
ebenfalls vorzugeben, sonst wird das nix...

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.