Forum: FPGA, VHDL & Co. Synchronisieren, wenn 2 clks phasenstarr, aber phasenverschoben sind.


von Fragender (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

Bedingungen (siehe Anhang):

Data_A ist synchron zu Clk_A
Data_B ist synchron zu Clk_B
Die Frequenzen von Clk_A und Clk_B sind identisch und phasenstarr, 
jedoch um einen unbekannten Wert phasenverschoben.

Ziel:

Ich möchte im FPGA mit nur einem der beiden Clocks weiterarbeiten.

Frage: Ist es möglich Clk_A & Clk_B miteinander zu vergleichen und den 
Phasenversatz zu ermitteln? Diesen Phasenversatz könnte ich schließlich 
auf Data_A oder Data_B addieren/subtrahieren um die Phasenverschiebung 
auszugleichen.

Frage:

Gibt es eine Möglichkeit zwei Clocks miteinander zu vergleichen und den 
ermittelten Wert als Delay auf ein Datensignal zu legen?

PS: Natürlich kann man auch einsynchronisieren  indem man ein 
Schieberegister verwendet und im Register nach Flankenwechseln sucht. 
Allerdings muss man das mit einer entsprechend ausreichenden Abtastrate 
machen. Ich wollte einfach mal fragen ob es da auch andere Optionen 
gibt, sofern zwei Clks phasenstarr sind und nur eine Phasenverschiebung 
vorliegt...

Ich hoffe meine Frage ist verständlich
und ich bedanke mich ganz herzlich

Fragender

von Fragender (Gast)


Lesenswert?

Nachtrag: beim FPGA handelt es sich um einen VIRTEX5

von Guest (Gast)


Lesenswert?

Fragender schrieb:
> PS: Natürlich kann man auch einsynchronisieren  indem man ein
> Schieberegister verwendet und im Register nach Flankenwechseln sucht.
> Allerdings muss man das mit einer entsprechend ausreichenden Abtastrate
> machen. Ich wollte einfach mal fragen ob es da auch andere Optionen
> gibt, sofern zwei Clks phasenstarr sind und nur eine Phasenverschiebung
> vorliegt...

Mit ausreichender Abtastrate wirst du so oder so arbeiten müssen. Du 
taktest die Daten eben mit dem entsprechenden CLK ein, also DATA_A mit 
CLK_A und DATA_B mit CLK_B und machst dann intern eine 
Syncronisationsstufe von CLK_B auf CLK_A und evtl noch ein FIFO (also 
Schieberegister) für DATA_A damit sie latenzmäßig zusammenpassen wenn 
das wichtig ist.

http://www.fpga4fun.com/CrossClockDomain.html

Wo ist das Problem?

von Duke Scarring (Gast)


Lesenswert?

Fragender schrieb:
> Die Frequenzen von Clk_A und Clk_B sind identisch und phasenstarr,
> jedoch um einen unbekannten Wert phasenverschoben.
Aufgrund der unbekannten Phasenverschiebung kannst Du Setup- und 
Holdtimeverletzungen nicht ausschließen. Behandele die Takte als 
asynchron und mach ein FIFO dazwischen. Das muß ja auch nicht groß sein, 
wenn die Frequenzen wirklich phasenstarr sind.

Duke

von Dogbert (Gast)


Lesenswert?

Unbekannt und Phasenstarr schließt sich doch irgendwie aus?

Irgendwann ändert sich die Phase also, wenn sie nicht bekannt ist. Soll 
das bedeuten nur beim Einschalten? Oder wenn ein Sicherheitssystem ein 
Flugzeug in den Berg fliegt? Oder ...

von Klakx (Gast)


Lesenswert?

Klar kann man die Clocks per Logik miteinander vergleichen und daraus 
sich etwas bauen. Für den FPGA sind diese Clockspielereien aber nur 
schwer zu kontrollieren.

Wäre der Phasenversatz voraussagbar kann man mit IDELAY Gliedern das 
korrigieren(ggf. wäre auch ein Regelkreis aus IDELAY und obigen Ansatz 
möglich).

Dein Problem kann man aber auch elegant über den Begriff "Phase 
Alignment FIFO" lösen. Das ist quasi ein FIFO was mit der selben 
Frequenz, aber mit unterschiedlicher Phasenlage ausgelesen wird. Ein 
Überlauf ist dadurch nicht möglich.

Im Beispiel arbeitest du einfach mit ClkA. DatenB und ClkB gehen in das 
FIFO, dass du mit ClkA einfach wieder ausliest. Jetzt hast du DataB und 
DataA auf ClkA und musst dich nur noch um den Versatz kümmern, der 
maximal um einen Takt schwanken kann. Also FIFO dann einfach das 
asynchrone FIFO nehmen.

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.