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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.