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.