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!