Ich benutze das Spartan 3A Starter Kit.
Da steht mir ein 50MHz Quarz zur Verfügung. Für eine Ethernetanwendung
brauche ich jedoch einen 100MHz-Takt. Dazu instanziere ich einen DCM,
der den Eingangsclock von 50Mhz auf 100MHz verdoppelt.
Meine Frage ist nun die folgende:
Wie kann ich verhindern, dass keine Prozesse ausgeführt werden, solange
die DLL noch nicht eingeschwungen ist, d.h. das locked-Signal noch nicht
auf '1' ist?
Ich habe mir das so vorgestellt:
1 | -- Die DLL während 255 Clock-Zyklen im Reset behalten
|
2 | -- Für diesen Prozess wird der 50MHz-Clock verwendet
|
3 | reset_dll: process(CLK_50M)
|
4 | begin
|
5 | if(rising_edge(CLK_50M)) then
|
6 | if(reset_cnt = x"FF") then
|
7 | dll_reset <= '0';
|
8 | else
|
9 | reset_cnt := reset_cnt + 1;
|
10 | end if;
|
11 | end if;
|
12 | end process reset_dll;
|
13 |
|
14 | -- Alle anderen Prozesse laufen nun mit dem 100MHz-Clock von der DLL
|
15 | irgendein_prozess: process(CLK_100M)
|
16 | begin
|
17 | if(rising_edge(CLK_100M)) then
|
18 | if(dll_locked = '0') then
|
19 | -- solange DLL nicht eingeschwungen, darf nichts geschehen
|
20 | else
|
21 | -- hier steht die Logik meines Prozesses
|
22 | end if;
|
23 | end if;
|
24 | end process irgendein_prozess;
|
Darf ich das so machen? Oder ist es einfach ein riesen Murx?
Hat irgendjemand eine saubere "Standartlösung"?
Vielen Dank