Hi! ich versuche die Frequenz einer mit DCM erzeugten Clock zur Laufzeit zu verändern. Kann das funktionieren?
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...
Geht nicht, da die generics für synthese benutzt werden, und dann nachher nicht mehr verändert werden können.
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 */
@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 ;-)
@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
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.
So mache ich das im Moment auch (siehe Anhang). Wäre eben sehr schön gewesen, wenn das direkt mit DCM klappen würde.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.