Anfängerfrage: Datenübergabe zwischen zwei Taktdomänen

Gast #2705092
Lesenswert?

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.
#2705167
Lesenswert?

Jens Langecker schrieb:
> 3. Wie macht man das korrekt?

Nimm ein einzelnes Bit (direkter von FF zu FF über den Domain-Übergang) 
um gültige Daten zu signalisieren und schau, dass in dieser Zeit Dein 
Register stabil ist (der Pfad von Datenregister zu Datenregister kann 
dann "false_path" sein).

Ist zwar etwas langsam, könnte aber durch parallelisieren (e.g. 
Verdoppelung der Registerbreite) aufgefangen werden, falls erforderlich.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren