Forum: FPGA, VHDL & Co. DCM (Spartan3)


von Patric (Gast)


Lesenswert?

Hi!

ich versuche die Frequenz einer mit DCM erzeugten Clock zur Laufzeit zu
verändern. Kann das funktionieren?

von AxelMeineke (Gast)


Lesenswert?

What??? Was willst du ??? Irgendwie solltest du etwas genauer werden ...
Bis jetzt verstehe ich leider nur Bahnhof... Schreib doch bitte etwas
mehr als nen 1,5 Zeiler LOL...

von Tobias (Gast)


Lesenswert?

Geht nicht, da die generics für synthese benutzt werden, und dann
nachher nicht mehr verändert werden können.

von Konstantin (Gast)


Lesenswert?

Also ich meine, es geht :-o

Ich würde sagen: es kann funktionieren :-)

Mit Generics hat es nicht unbedingt was zu tun. Irgendwo habe ich es
schon gesehen, komme jetzt aber nicht drauf, ob das Spartan 3 oder
Cyclone ist.

Konstantin

p.s.: wenn Du Dich erkundigt hast, sag' unbedingt BEscheid, ob das
geklappt hat /* Daumendrück */

von Patric (Gast)


Lesenswert?

@Axel

Also nochmal ganz langsam. Man nehme einen DCM.
1
inst_DCM : DCM
2
generic map (
3
   CLKFX_DIVIDE      => 1,
4
   CLKFX_MULTIPLY    => 4
5
)
6
7
port map (CLKIN      => clk_in,
8
          CLKFX      => clkfb
9
)

Die Frequenz an CLKFX ist bestimmt durch:
CLKFX = (CLKFX_MULTIPLY / CLKFX_DIVIDE) * CLKIN

D.h. damit kann man (fast) jede beliebige Frequenz erhalten. Was ich
nun möchte ist die Parameter CLKFX_DIVIDE und CLKFX_MULTIPLY durch
extern anliegende Signale zu ändern um die Frequenz zu steuern. Wie das
vor der Synthese geht ist klar. Aber geht es auch irgendwie danach?

P.S. Zwei andere Leser haben den 1,5 Zeiler verstanden ;-)

von Konstantin (Gast)


Lesenswert?

@Patric:
ich habe gerade Datenblatt von Xilinx angeschaut (solltest Du
vielleicht auch tun). Und muss sagen: es sieht schlecht aus :-(

Wozu brauchst Du sowas?... okay, egal, Du brauchst das, also hier ist
mein Lösungsvorschlag:

Du baust Dir einen Zähler, und trigerst einen beliebigen Pin. Der wird
dann extern auf ein CLOCK-Buffer geführt - also normal verdrahten. Und
schon hast Du Deinen eigenen Clock.
Im Endeffekt hast Du dann 2 Clockdomains: z.B. 100 Mhz, mit denen Du
den Zähler speist, und die andere Logic, die dann mit dem ... ach, hast
schon verstanden, oder?

Gutes Gelingen,

Konstantin

von Tobias (Gast)


Lesenswert?

generics sind laut definition Konstanten. Aus den generics bestimmt die
Synthese wie die Hardware synthetisiert werden soll.  Nachträgliches
zuweisen in der gegossenen Hardware geht nicht. Ich würde versuchen
eine möglichst hohe Taktfrequenz mittels DCM zu erzeugen, eventuell
durch Kaskadierund mehrere DCM, und dann das ganze wieder mittels
counter herruntezuteilen.

von Patric (Gast)


Angehängte Dateien:

Lesenswert?

So mache ich das im Moment auch (siehe Anhang). Wäre eben sehr schön
gewesen, wenn das direkt mit DCM klappen würde.

von Michael (Gast)


Lesenswert?

1. Das Bild ist total unscharf. Ein neues wäre besser, damit ich mal
sehen kann was Du da genau gemacht hast, denn dies ist äußerst
interessant.

2. Kann man den globalen Clock Buffer (BufG) einfach so benutzen? Bei
mir hat das nie funktioniert. Zudem liegen die Clock Treiber sehr dicht
am Rand. Den neuen Clock, den Du über den Zähler erhälst, verbindest Du
mit dem BufG. Dadurch ensteht eine Clock-Skew, da der heruntergeteilte
Clockausgang eine Laufzeit zum BufG benötigt (kann eine ns betragen),
das ist somit immer eine unsaubere Lösung. Erst wenn das Signal wieder
auf der Clock-Leitung ist, besitzt das Signal wieder eine
Signalverzögerungszeit von wenigen Picosekunden. Am besten man kauft
einen Quarz mit der Frequenz die man benötigt (z.B. Auris.de dort kann
man Quarze in allen Frequenzen kaufen)

Viele Grüsse

Micahel

von Patric (Gast)


Angehängte Dateien:

Lesenswert?

Hier das Bild nochmal grösser.

> Kann man den globalen Clock Buffer (BufG) einfach so benutzen? Bei
> mir hat das nie funktioniert.

Das wird in xapp462 so beschrieben. DCM output über BUFG nach aussen
und auch als Feedback zum DCM.
1
   clk_out <= clkfb;
2
   
3
   inst_DCM : DCM
4
      generic map ( CLKIN_PERIOD            => 20.0,
5
         DFS_FREQUENCY_MODE      => "LOW",
6
         STARTUP_WAIT            => TRUE
7
      )
8
9
      port map (CLKIN   => clk_in,
10
         CLK2X          => clk2x,
11
         CLKFB          => clkfb,
12
         DSSEN          => GND,
13
         PSINCDEC       => GND,
14
         PSEN           => GND,
15
         PSCLK          => GND,
16
         RST            => reset
17
      );
18
19
   inst_BUFG1 : BUFG
20
      port map (I =>  clk2x,
21
            O     => clkfb
22
      );

>  Den neuen Clock, den Du über den Zähler erhälst, verbindest Du
> mit dem BufG. Dadurch ensteht eine Clock-Skew, da der
heruntergeteilte
> Clockausgang eine Laufzeit zum BufG benötigt (kann eine ns
betragen),
> das ist somit immer eine unsaubere Lösung.

Das ist klar. Da ich aber mit 2 Clockdomains, die nur über einen
Dualport-RAM verbunden sind, arbeite spielt Skew keine Rolle. Ich
nutzte auch immer nur einen Teilerausgang gleichzeitig.

> Am besten man kauft einen Quarz mit der Frequenz die man benötigt
> (z.B. Auris.de dort kann man Quarze in allen Frequenzen kaufen)

Das ist aber unnötig. Mittels DCM (DFS) kann man (fast) jeden
beliebigen Takt erzeugen. Ein Standard-Quarz ist völlig ausreichend.
Wie ich oben schon erwähnt habe:
CLKFX = (CLKFX_MULTIPLY / CLKFX_DIVIDE) * CLKIN

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.