Forum: FPGA, VHDL & Co. Xilinx Spartan3 DCM - wann "locked" ?


von Ssss S. (sssssss)


Lesenswert?

Hi!

Weiss jemand zufällig wann die DCM locked meldet ?

Wenn ich folgende Signale aus einer 50mhz clock erzeuge:
         _   _   _   _   _   _   _   _   _   
100M | |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_...
                  __     ___     ___     __
 50M ............|   |___|   |___|   |___|   |___...
                  ______         ______
 25M ............|       |_______|       |_______...
                          ______         ______
!25M ............|_______|       |_______|       ...
                   _________________________________
locked ___________|

So sieht es im Simulator aus, locked kommt 0.1ns nachdem alle
Clocks ok sind und kurz nach der ersten gemeinsamen rising edge (der
nicht phasenverschobenen signale).
Ist das immer so oder nur im Simulator ?

Ich muss nämlich einen process der mit 100Mhz läuft so synchronisieren
dass er einen bestimmten Status hat wenn die eine 25Mhz Leitung
ihre rising edge hat.

Da hab ich aber irgendwie probleme mit...
Im Simulator gehts :(

Wie macht man sowas generell ?
Asynchron auf locked warten und dann davon ausgehen das man die erste
100mhz flanke verpasst hat ? (mein aktueller Ansatz)
Oder mit dem 100mhz Takt prüfen ob locked da ist und dann bis 4 zählen
und loslegen ?

Gruss,
Simon

von Tom (Gast)


Lesenswert?

Soweit ich das bei der Virtex DLL noch in Erinnerung habe, braucht diese
DLL einige tausend Taktzyklen, um auch das LOCKED Signal zu erreichen.
Wird wohl bei der Spartan DCM ähnlich sein...

Wie wäre es denn, wenn Du die aus Deinem Eingangstakt generierten Takte
erst dann auf die entsprechenden Ausgänge der Entity, die die  DCM
enthält, schaltest, wenn das LOCKED Signal auf High gesetzt wird, wie
zB:

SYSTEMCLK_2X_o <= CLK_2x_Buf when DLL1_Locked = '1' else '0';

Dabei sind CLK_2x_Buf und DLL1_Locked Signale, die laut dem Virtex
Datasheet an der Instanzierung der CLKDLL bzw benötigten Buffern
geschaltet werden.

Gruß
Tom

von Sssssss (Gast)


Lesenswert?

Hi!

Habe mitlerweile rausgefunden dass das locked nicht immer dann kommt
wenn alle übereinander synchron sind :(

Dein Vorschlag hilft mir aber nicht den ersten Takt zu finden
wo alle Signale die steigende Flanke haben...

Ich hatte dann einfach mal nach einer steigenden Flanke von 25mhz
gesucht:
1
if (rising_edge(clk100)) then
2
  if (sync = '0') then
3
    if (clk25_old = '0' and clk25 = '1') then
4
       sync <= '1';
5
    else
6
       sync <= '0';
7
    end if;
8
    clk25_old <= clk25;
9
  else
10
    --sync !
11
  end if; --sync
12
end if; --rising100

Aber das spukt auch irgendwie rum..

Mir ist vorhin beim testen aber noch was ganz seltsames aufgefallen:
Ich hatte mitten im Betrieb aufeinmal den Fall dass die DCM von locked
auf unlocked ging :o

Muss ich nochmal auf dem eval board testen morgen. Nicht
dass da irgendwas mit meiner entworfenen Platine nicht stimmt...

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.