Forum: FPGA, VHDL & Co. zwei CLK-Domains sauber zusammenbringen


von Sync (Gast)


Lesenswert?

Hallo zusammen,

ich habe einen Dual-Port-RAM.
Jeweils ein Port des RAM wird von zwei an sich getrennten Modulen 
bedient. Jedes Modul hat seinen eigenen Takt.

Leider gehen von einem Modul zum anderen Modul ein paar Steuer- und 
Datenleitungen, die ich nun entsprechend behandeln muss.

Alle Kombinationen sind zulässig, also 10MHz/10MHz, 10MHz/5MHz, 
5MHz/10MHz und 5MHz/5MHz. Beide Takte CLK1 und CLK2 sind an sich 
synchron, nur eben auch mal doppelt so hoch.

Modul 1 taktet also z.B. mit 10MHz und bekommt von Modul 2 mit 5MHz die 
Daten- und Steuersignale.
__________                     __________
|          |                    |          |
|  Modul 2 |----Steuersignal--->|  Modul 1 |
| CLK=5MHz |                    | CLK=10MHz|
|__________|                    |__________|

Hier habe ich mir ein CLK-enable in Modul 1 gebaut
1
  PROCESS (CLK, NRES)
2
  BEGIN
3
    IF NRES = '0' THEN
4
      clk_toggle <= '0';
5
    ELSIF rising_edge(CLK) THEN
6
      clk_toggle <= NOT(clk_toggle);
7
    END IF;
8
  END PROCESS;
Die von Modul 2 mit 5MHz kommenden Steuersignale verknüpfe ich AND mit 
diesem Signal und so taste ich auch bei 10MHz die eigentlich doppelt so 
langen Steuersignale nur einmal ab.

Nun habe ich aber ein Problem mit der anderen Richtung, also wenn Modul 
2 10MHz hat und Modul 1 diese mit 5MHz abtasten soll.
Hier habe ich immer dann ein Problem, wenn das abzutastende Signal nicht 
zufällig auf die steigende Flanke von Modul-Takt 1 kommt.
__________                     __________
|          |                    |          |
|  Modul 2 |----Steuersignal--->|  Modul 1 |
| CLK=10MHz|                    | CLK=5MHz |
|__________|                    |__________|

Gibt es dort irgendwelche Methoden, wie man das sauber lösen kann, ohne 
dass ich auch den 10MHz Takt aus Modul 2 an Modul 1 reichen muss?
__________                     __________
|          |                    |          |
|  Modul 2 |----Steuersignal--->|  Modul 1 |
| CLK=10MHz|----Takt 10MHz----->| CLK=5MHz |
|__________|                    |__________|

Aber selbst dann muss ich an irgendeiner Stelle die Steuersignale an 
Modul 1 übergeben, spätestens dann habe ich wieder das gleiche Problem, 
dass ich immer doppelt so viele Informationen bekomme, wie ich 
verarbeiten kann.

Vielen herzlichen Dank!

von W.S. (Gast)


Lesenswert?

Na klar doch. Eigentlich mußt du es nur genau so machen, wie jeder uC: 
alle hereinkommenden Signale auf den herrschenden Takt synchronisieren, 
also durch einen D-FF jagen, der mit dem jeweiligen Takt getaktet wird. 
Anschließend hast du die Steuersignale halt synchron zum Takt.

W.S.

von Sync (Gast)


Lesenswert?

Hallo und vielen Dank!

Nehmen wir mal ein Bsp:
Das 10MHz Modul sendet zwei hintereinander folgnede WR_EN Pulse und die 
dazugehörigen Daten. WR_EN ist also bei 10MHz zwei Takte auf HIGH.

Das 5MHz Modul synchronisiert das WR_EN ein. Da der Takt aber nur halb 
so hoch ist, ist WR_EN auch nur einen Takt auf HIGH. Somit ist ein WR_EN 
verlustig gegangen.

Mir st bewusst, dass man keine Daten irgendwo herzaubern kann, aber 
vielleicht gibt es für derartige Fälle ja clevere Lösungen?

von Klaus F. (kfalser)


Lesenswert?

Sync schrieb:
> Mir st bewusst, dass man keine Daten irgendwo herzaubern kann, aber
> vielleicht gibt es für derartige Fälle ja clevere Lösungen?

Wie stellst Du dir dies gerade an diesem Beispiel vor? Das 5 MHz Modul 
kann niemals die Daten mit 10 MHz verarbeiten.
Erst wenn die Datenrate ingesamt geringer ist, dann kann es 
funktionieren, und zwar mit synchronisiertem Handshake.
Modul 1 sendet ein WR_EN und wartet bis Modul 2 das WR_EN verarbeitet 
hat.
Es braucht also eine Art Quittierungssignal.
Erst dann darf Modul 1 wieder ein WR_EN senden.

von Andreas D. (rackandboneman)


Lesenswert?

"Beide Takte CLK1 und CLK2 sind an sich synchron, nur eben auch mal 
doppelt so hoch."

Synchron gleich phasenstarr?

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.