Moin,
ich benötige für ein Projekt verschiedene Taktgeschwindigkeiten. Mein
Standardtakt hat eine Frequenz von 100MHz.
Für diverse Counter erzeugt mir der IP-Core "Clock-Wizard" einen
zusätzlichen 300MHz Takt.
Nun kommt das Problem: Eine Komponenten benötigt einen 140kHz-Takt.
Diesen kann ich nicht über den Clock-Wizard erzeugen lassen. Also habe
ich über einen Counter und Comparewert einen 140kHz selber erzeugt.
(nicht 100%ig diese Freqeunz, aber nahe genug dran, für meine
Anwendung):
1 | Zaehler_140kHz_Takt: process(clk300)
|
2 | begin
|
3 | if rising_edge(clk300) then
|
4 | if cnt_140 < 2140 then
|
5 | cnt_140 <= cnt_140 +1;
|
6 | else
|
7 | cnt_140 <= 0;
|
8 | end if;
|
9 | end if;
|
10 | end process;
|
11 |
|
12 | Takterzeugung_140kHz: process(cnt_140)
|
13 | begin
|
14 | if cnt_140 < 2140/2 then
|
15 | clk140 <= '0';
|
16 | else
|
17 | clk140 <= '1';
|
18 | end if;
|
19 | end process;
|
Nun ist das Problem, dass das Timing nicht hin haut. Dies wird vorallem
daran liegen, dass mein selbererzeugter Takt als Signal anliegt, aber
nicht auf dem Clocklayer (Clock tree?) geroutet wird.
Meine Frage ist nun:
Kann ich dem Implementierungstool die Info geben, dass hier "clk140" auf
dem Clocklayergeroutet werden soll? Oder muss ich dies Erzeugung
komplett anders gestalten?
Ich habe etwas über "BUFGCE" und dem constraint "create_generate_clock"
gelesen, bin aber nicht wirklich schlau daraus geworden, wie genau
dieses implementiert wird.
Habt ihr da eine Idee?