Ah, ok - das ist schon fortgeschrittenes Level ;-)
Vielleicht noch ein Tipp dazu: zwei oder mehr Taktdomänen nimmt man nur,
wenn's sich wirklich nicht vermeiden lässt - weil der Aufwand und die
Fehlerträchtigkeit enorm ansteigt. Die Taktdomänen müssen unbedingt
sauber getrennt bleiben und Signale, die in der anderen Taktdomäne
verwendet werden, müssen umsynchronisiert werden - ansonsten sind
Funktionsfehler garantiert!
Langsamere Takte in einem Single-Clock-Design generiert man sich am
besten per heruntergeteiltem Clock-Enable (ungetestet, einfach mal
runtergeschrieben):
1 | constant ClockDivider: integer = 10;
|
2 | signal clk_div: integer range 0 to ClockDivider-1;
|
3 | signal clk_en: std_logic;
|
4 |
|
5 | clk_div: process(reset, clk)
|
6 | begin
|
7 | if (reset = '1') then
|
8 | clk_en <= '0';
|
9 | clk_div <= ClockDivider-1;
|
10 | elsif rising_edge(clk) then
|
11 | clk_en <= '0';
|
12 |
|
13 | if clk_div = 0) then
|
14 | clk_en <= '1'; -- clock enable für einen Takt
|
15 | clk_div <= ClockDivider-1; -- Taktteiler neu starten
|
16 | else
|
17 | clk_div <= clk_div - 1;
|
18 | end if;
|
19 | end if;
|
20 | end process clk_div;
|
21 |
|
22 | slow_clk_proc: process(reset, clk)
|
23 | begin
|
24 | if (reset = '1') then
|
25 | -- ...
|
26 | elsif rising_edge(clk) then
|
27 | if (clk_en = '1') then
|
28 | -- jeden 10. Takt etwas ausführen
|
29 | end if;
|
30 | end if;
|
31 | end process slow_clk_proc;
|
Aber auf gar keinen Fall einen Takt herunterteilen und diesen bzw.
dieses Signal als neuen Takt verwenden (Stichwort 'gated clock'). Klingt
zwar verlockend einfach, ist aber aber tatsächlich ziemlich
problembehaftet und kann Fehler verursachen, die nur sporadisch
auftreten können und schwer zu finden sind.
Weiterhin viel Spaß mit VHDL und FPGA - damit kann man echt tolle Sachen
machen!