Hallo,
ich hab ein grundsätzliche Verständnisproblem:
In einem FPGA-Projekt habe ich zwei asynchrone Taktdomänen und möchte
einen std_logic_vector von der einen Taktdomäne (ich nenne sie "TD1") in
die andere ("TD2") übergeben.
1. Versuch:
1 | signal x_TD1 : std_logic_vector(7 downto 0);
|
2 |
|
3 | Proc_TD1 : process (Clk_TD1)
|
4 | begin
|
5 | if (rising_edge(Clk_TD1)) then
|
6 | x_TD1 <= ...
|
7 | end i;
|
8 | end process;
|
9 |
|
10 | Proc_TD2 : process (Clk_TD2)
|
11 | begin
|
12 | if (rising_edge(Clk_TD2)) then
|
13 | if (x_TD1 = ...) then
|
14 | ...
|
15 | end if;
|
16 | end i;
|
17 | end process;
|
Jetzt denke ich, dass dies nicht sauber funktionieren kann, da die
Taktflanken regelmäßig so ungünstig zusammenfallen werden, dass Proc_TD1
gerade auf x_TD1 schreibt, während Proc_TD2 von x_TD1 liest. Ich denke
mal, dass Proc_TD2 in diesem Fall ein paar neue und ein paar alte Bits
in x_TD1 vorfindet.
Daher meine Fragen:
1. Hilft es, ein zusätzliches Register als "Synchronisierungsschritt" in
Proc_TD2 einzubauen?
1 |
|
2 | Proc_TD2 : process (Clk_TD2)
|
3 | begin
|
4 | if (rising_edge(Clk_TD2)) then
|
5 | x_TD2 <= x_TD1;
|
6 | if (x_TD2 = ...) then
|
7 | ...
|
2. Wenn das Register hilft, warum hilft es? Müsste denn nicht x_TD2
genauso einen ungültigen Inhalt enthalten, wenn es zum falschen
Zeitpunkt von x_TD1 liest?
3. Wie macht man das korrekt?
Danke für Eure Hilfe.