2 Takte miteinander syncronisieren

Gast #1854627
Lesenswert?
• ▲
▼
Ich benutze wie so viele hier einen Spartan 3. Ich habe heute schon den 
ganzen tag über mein Problem nachgedacht und inzwischen ein Knoten im 
Kopf.

Ich habe einen Counter den mit dem CLK 1 erhöhe. Die Geschwindkeit von 
CLK 1 hängt steht noch nicht 100% fest. Kann also zwischen 1MHz und 
20MHz liegen. Dies ist der Takt von meinem externen ADC-Wandler.

Nun habe ich einen weiteren Clock. Nennen wir diesen doch einfach CLK_2. 
Dieser arbeitet mit einer 2. Frequenz. Mit dem Clock 2 wird ebenfalls 
ein Counter um 1 erhöht. Da die beiden Clocks von externen Quellen 
kommen ist die Phasenlage nicht bekannt.

Nun möchte ich einen Programmcode ausführen wenn die beiden Counter 
ungleich sind. Jedoch habe ich da so einige Bendenken (leider bringt 
hiert kein DCM etwas nur wenn ich die Platine neue ROuten lasse, dies 
ist momentan aber nicht möglich)

Meine Bendenken äußern sich wie folgt.

Wenn mit CLK 1_ Counter 1 erhöht wird dann wird mit der ansteigenden 
Flanke von CLK_2 der COUNTER 1 mit COUNTER 2 verglichen. Wenn die beiden 
Counter ungleich sind dann führe eine Funktion aus und erhöhe den 
anschließend den COUNTER_2.

Nun kann es sein das die Phasenlage der beiden Counter so bescheiden 
zueinander liegt das ich den Vergleich gerade während des Schalten 
ausführe und somit einen undefinierten Zustand erwische.

Gibt es eine Möglichkeit dies zu verschalten?
#1854860
Lesenswert?
• ▲
▼
@  Martin (Gast)

>CLK 1 hängt steht noch nicht 100% fest. Kann also zwischen 1MHz und
>20MHz liegen. Dies ist der Takt von meinem externen ADC-Wandler.

Also eher langsam.

>Nun habe ich einen weiteren Clock. Nennen wir diesen doch einfach CLK_2.
>Dieser arbeitet mit einer 2. Frequenz. Mit dem Clock 2 wird ebenfalls
>ein Counter um 1 erhöht. Da die beiden Clocks von externen Quellen
>kommen ist die Phasenlage nicht bekannt.

Also klassich asynchron.

>Wenn mit CLK 1_ Counter 1 erhöht wird dann wird mit der ansteigenden
>Flanke von CLK_2 der COUNTER 1 mit COUNTER 2 verglichen. Wenn die beiden
>Counter ungleich sind dann führe eine Funktion aus und erhöhe den
>anschließend den COUNTER_2.

Das solltest du mal ganz schnell vergessen.

>Nun kann es sein das die Phasenlage der beiden Counter so bescheiden
>zueinander liegt das ich den Vergleich gerade während des Schalten
>ausführe und somit einen undefinierten Zustand erwische.

Eben.

>Gibt es eine Möglichkeit dies zu verschalten?

Ja. Das ist ein klassisches Problem, wie es in asynchronen FIFOs 
auftaucht. Du musst einen Zähler von binär in Gray umwandlen, das geht 
recht einfach. Diesen musst du dann mit dem anderen Takt abtasten. Dabei 
machst du maximal einen Fehler von +/-1 Schritt.

@  Lothar Miller (lkmiller) Benutzerseite

>Vergleiche die beiden Zähler kombinatorisch und synchronisiere das
>Vergleichsergenbis über die obligatorischen 2 FF auf den Arbeitstakt
>ein.

>Bei relativ niedrigen Frequenzen (<<300MHz) reicht hier auch 1 FF... ;-)

Wenn das mal kein Irrtum ist! Das geht bestenfalls für ein ECHTES 1 Bit 
Signal, aber nie und nimmer für ein mehrbittiges Signal. Und der 
Vergleicher verarbeitet solche mehrbittigen Signale. Siehe meine 
Kommentare oben.

MFG
Falk

P S Wenn das 2. Taktsignal deutlich langsamer als dein ADC-Takt ist, 
sprich Faktor 4 und mehr, kann man es einfach abtasten und in ein Clock 
Enable überführen. Damit kann man dann vollkommen sauber einen zweiten 
Zähler takten und den Vergleich einfach so machen. Siehe auch [[Taktung 
FPGA/CPLD]].
#1873149
Lesenswert?
• ▲
▼
@  Segor (Gast)

>Wieso Faktor 4?

Der Sicherheit wegen. Rein theoretisch reicht es, ein Taktsignal mit 50% 
Tastverhältnis mit der doppelten Frequenz abzutasten, da erwischt man 
THEORETISCH immer abwechselnd ein HIGH und ein LOW. Praktisch ist das 
aber zu unsicher, deshalb besser 4x pro Periode abtasten.

MFG
Falk

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.