Forum: FPGA, VHDL & Co. DCMs kaskadieren!?


von Cihan K. (lazoboy61)


Lesenswert?

Hallo,

habe mal hier wieder ein kleines Problem und bräuchte mal einen 
Denkanstoß.

Ich habe einen Virtex 5 Custom Board, wo ich extern einen Taktoszillator 
habe, mit dem ich 5 verschiedene Clocks über GCLK Pins im FGPA verwenden 
kann. Nun habe ich so gelesen und gehört, dass es immer besser ist, eine 
Clock einzulesen (Bsp. 100MHz) und die restlichen nötigen Clocks über 
eine PLL/DCM im FPGA herzuleiten. Kann mich auch irren !?

Nun habe ich erstmal im V5 12 DCMs und 6 PLLs. Die PLLs sind alle schon 
belegt und können nicht verwendet werden, also bleiben mir die 12 DCMs 
übrig. Es ist auch nicht möglich DCMs statt PLLs für diese best. Module 
zu verwenden, da die DCM eine mind. Freqeunz erwartet.

Nun brauche ich intern im FPGA folgende Clocks:
100MHz, 200MHz, 125MHz, 59,09...MHz.

Mit einer DCM schaffe ich entweder 100MHz, 200MHz und 125MHz zu 
generieren oder 100MHz, 200MHz und 59,09MHz.

Jetzt war die Überlegung bei mir, das im StartUp Moment des FPGAs alle 
Clocks mit der pos. Flanke gleichzeitig anfangen sollen, um ebend einen 
sauberen StartUp zu haben. Also muss ich irgendwie das Locked Signal 
verwenden.

Meine Überlegung war folgende:
Ich lese eine 100MHz in eine DCM(DCM_1) ein. Das Locked-Signal dieser 
DCM resetted 2 weitere DCMs. Sobald DCM_1 sein Locked freigibt, werden 
die 2 DCMs auch freigegeben und erhalten als Clock Input den 100MHz 
Output vom DCM_1. Nun laufen die 2 DCMs an und generieren die nötigen 
Clock, die oben schon erwähnt sind. Nun habe ich hier warscheinlich das 
Problem, dass diese 2 DCMs nicht gleichzeitig ihr Locked Signal 
freigeben werden, d.h. das die Clocks des einen DCM nicht gleichzeitig 
mit der anderen starten werden.

Kann man hier in diesem Punkt den DCMs mitteilen, wann sie starten 
sollen?

Oder sollte ich es ganz anders machen, vllt. sollte man es auch nicht so 
machen wie ich es beschrieben habe? Ist es evtl. OK wenn ich alle Clocks 
die ich intern brauche vom äußeren Taktgenerator generieren lasse und 
sie dann im FPGA einfach verwende? Evtl. verwende ich dann für jede 
Clock eine eigene DCM um Jitter zu minimieren?

Bräuchte in dieser Hinsicht mal einen Denkantoß, was wäre eine gute 
Variante, wie sollte man es machen?

Danke schon mal im voraus

MfG
Cihan

von Cihan K. (lazoboy61)


Lesenswert?

Keiner ne Idee?

von Klaus (Gast)


Lesenswert?

Na, na, nach etwas über einer Stunde schon anfangen zu quengeln?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Cihan Kalayci schrieb:
> Ist es evtl. OK wenn ich alle Clocks die ich intern brauche vom äußeren
> Taktgenerator generieren lasse und sie dann im FPGA einfach verwende?
Das ist die denkbar schlechteste Lösung, denn dann hast du sogar 
zwischen augenscheinlich "geraden" Takten (100MHz+200MHz) immer einen 
asynchronen Übergang.
Es kann aber in Bezug auf eine fällige EMV-Messung auch besser sein, 
unabhängige Takte zu haben, weil es dann nicht so viele SSO 
(gleichzeitig schaltende Ausgänge) geben kann.

> Kann man hier in diesem Punkt den DCMs mitteilen, wann sie starten
> sollen?
Du kannst dem gesamten Design sagen, dass es erst dann "loslaufen" 
darf, wenn alle PLL richtig takten...

> Evtl. verwende ich dann für jede
> Clock eine eigene DCM um Jitter zu minimieren?
Wozu denn einen DCM? Wenn du einen brauchbaren externen Taktgenerator 
hast, dann kannst du diesen Takt direkt verwenden.

von Cihan K. (lazoboy61)


Angehängte Dateien:

Lesenswert?

Lothar Miller schrieb:
> Das ist die denkbar schlechteste Lösung, denn dann hast du sogar
> zwischen augenscheinlich "geraden" Takten (100MHz+200MHz) immer einen
> asynchronen Übergang.

Wenn ich aber zwischen den Clockdomainen synchronisiere, quasi mit 2 FFs 
oder bei Daten sogar mit Fifos, ist es dann in Ordnung mit dieser 
Lösung?

Lothar Miller schrieb:
> Du kannst dem gesamten Design sagen, dass es erst dann "loslaufen"
> darf, wenn alle PLL richtig takten...

Auf meine PLLs will ich mich eigentlich überhaupt nicht beziehen, da 
diese nur laufen werden, wenn das dazugehörige Gerät auch die Clock 
liefert, quasi wenn er eingeschaltet ist. Und er ist nicht immer im 
Betrieb eingeschaltet, kann bzw. auch ausgesteckt und wieder eingesteckt 
werden.

Aber auf meine DCMs würde ich mich beziehen wollen. Ich habe eine 
Testimplementierung mal gemacht mit 3 DCMs. Doch leider bisher nicht so 
das richtige oder erwartete Verhalten. Hätte ich eine PLL zur Verfügung 
gehabt, könnte ich ganz leicht alle vier Frequenzen generieren, aber mit 
einer DCM schaffe ich es nur mit 2. Ich habe mir meine Simulation 
angeguckt, dort sehe ich auch dass beide Locks der DCMs gleichzeitig 
freigeben, aber auf der Hardware ist es leider nicht so.

Im Anhang sind meine vhd files beigefügt. Am Anfang hatte ich die Clocks 
auf dem Oszi mir angeguckt, doch leider sehr unsauber gewesen. Deswegen 
habe ich mit der ersten Flanke jeder Clock einen Output auf HIGH gelegt 
und schaue mir die Schaltpunkte dabei an.

lg Cihan

von Cihan K. (lazoboy61)


Angehängte Dateien:

Lesenswert?

Und hier mal auch eine RTL-Schematic in pdf Format.

Das sollte denke ich mal meine Vorgehensweise klar machen.

Cihan

von Cihan K. (lazoboy61)


Angehängte Dateien:

Lesenswert?

Hallo nochmal,

habe mal versucht das ganze ein bisschen zu optimieren. Daraus erschließ 
sich, dass ich anstatt 59,..MHz 66,66MHz verwenden kann. Ich brauche 
diese Frequenz für Kommunikationsmodule. Letztendlich brauche ich nur 
noch eine DCM(siehe USER_DCM.vhd und RTL-Schematic), wo alle vier 
Frequenzen (Input: 100MHz; Output: CLK0 = 100MHz, CLK2X = 200MHz, CLKFX 
= 125MHz, CLKDV = 66,66MHz) generiert werden. Der StartUp-Wait Attribut 
ist auf TRUE gesetzt.

Nun habe ich im TOP_MODULE (auch im Anhang) Outputs mit den jeweiligen 
Frequenzen auf 1 gesetzt, um im StartUp Moment beobachten zu können(auf 
dem Oszi natürlich) ob alle gleichzeitig auf HIGH schalten, doch leider 
ist dies nicht der Fall. Die Simulation ist hier OK, aber auf der 
Hardware habe ich noch Probleme.

Habe dann versucht die BitGen Optionen zu benutzen, habe DONE_cycle auf 
4 gesetzt, GTS_cycle auf 1, GWE_cycle auf 1 und LCK_cycle auf 2. 
StartUpClk ist JTAG Clock. Doch leider hat es nicht viel gebracht. 
Manche Outputs sind schon vor dem LOCKED Signal auf HIGH bzw. das LOCKED 
kommt irgendwie 2 mal. Falls gewünscht kann ich hier versuchen noch 
Screenshots vom Oszilloskopen zu machen.

Doch wo liegt mein Fehler, was kann ich tun, damit alle Frequenzen 
sauber und gleichzeitig nach dem LOCKED Signal starten? Sollte ich hier 
evtl. das Primitive Startup_Virtex5 benutzen?

Bitte um eure Hilfe.

Gruß Cihan

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.