Forum: FPGA, VHDL & Co. Anfängerfrage: Datenübergabe zwischen zwei Taktdomänen


von Jens Langecker (Gast)


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.

von berndl (Gast)


Lesenswert?


von P. K. (pek)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.