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:entitywork.DCM_DivBy4
2
portmap(
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:entitywork.DCM_Phase90
12
portmap(
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?
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.
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
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
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...
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.
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
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.
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.
> 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...