Forum: FPGA, VHDL & Co. 0-20kHz Takt verdoppeln bzw. vervierfachen


von Bustle (Gast)


Lesenswert?

Hallo,

ich habe einen variablen Eingangstakt 0-20kHz an meinem FPGA (XC3S1000). 
Diesen Takt möchte ich gerne verdoppeln. Kann ich dies über ein DCM 
sinnvoll machen? Auch wenn ich kein konstanten Grundtakt habe?

Auch liegt das Taktsignal nicht an einem Clk-Eingang sondern "nur" an 
einem gewöhnlichen IO...

Gruß, Bustle

von Bernd G. (Gast)


Lesenswert?

Nein geht nicht, der DCM braucht min 1 MHz am Eingang (Referenzebene des 
Phasendetektors). Der VCO gibt min. 18 MHz raus. Siehe hierzu UG 331 und 
XAPP 462 von Xilinx.

Gruß, Bernd

von Bustle (Gast)


Lesenswert?

danke für die schnelle Auskunft... muss ich es doch irgendwie in Logik 
schreiben.

von Morin (Gast)


Lesenswert?

0-20 kHz ist normalerweise für einen FPGA Pillepalle, weil der 
Systemtakt viel höher liegt. Wenn du sagen wir 10 MHz Systemtakt hast, 
dann entspricht der ext. Takt mindestens 500 Clockzyklen je Periode.

Also kannst du folgenden Ablauf nehmen:

- ein genügend breiter Zähler wird bei jeder Flanke (pos oder neg) des 
ext. Takts auf 0 gesetzt und zählt ab da Systemtaktperioden. Außerdem 
wird vor dem Rücksetzen der halbe Zählerwert (alle Bits bis auf das 
unterste) in ein Register kopiert.
- beim Zähler-Reset wird ein Flag-Register "Halbzeit" genullt. Dieses 
Flag wird gesetzt, sobald der Zähler und der Registerinhalt gleich sind. 
Das Halbzeit-Flag wird als verdoppelter Takt ausgegeben.

Einziges Problem sind zu lange oder zu kurze Pegel wenn sich der ext. 
Takt ändert. Das kann z.B. zu einem zu kurzen 1-Peak des verdoppelten 
Takts führen. Das Problem überlasse ich mal deiner Kreativität :)

von Bustle (Gast)


Lesenswert?

Auf diese Weise habe ich es bereits gelöst, aber wie du schon erkannt 
hast gibt es bei Probleme bei starken und schnellen Änderung des 
externen Taktes...

von Morin (Gast)


Lesenswert?

Idee: Bau eine Erkennung für zu schnelle Wechsel ein. Beim Reset des 
Zählers wird außerdem ein Flag resettet das "ausreichende Pulsbreite" 
bedeutet. Sobald der Zähler einen bestimmten Wert erreicht (*) wird 
dieses Flag auf 1 gesetzt. Die Schwelle für den Zähler wird so bestimmt, 
dass ein entsprechender 0- oder 1-Puls breit genug ist, um als Clockpuls 
zu dienen. Wenn bei der nächsten Flanke des ext. Takts das Flag noch 
nicht gesetzt ist, dann wird das Ausgabetakt für die nächste Periode 
angehalten, damit der Puls breit genug wird.

Das setzt immer noch voraus, dass sich die Häufigkeit der Änderungen ein 
gutes Stück unter der ext. Taktrate selbst bewegt. Ansonsten wird du 
kaum drumrum kommen die Erkennung der ext. Taktrate und die Erzeugung 
des doppelten Takts zu trennen; dazwischen liegt dann die ext. Taktrate 
als numerischer Wert vor, den du Tiefpassfiltern kannst um zu schnelle 
Änderungen in der Taktrate einfach abzufangen.

(*) wenn du die erwartete minimale Pulsbreite nach oben schiebst bist du 
auf der sicheren Seite und kannst die Schwellenerkennung auf die Abfrage 
von einem oder wenigen Zählerbits reduzieren -> weniger Logik.

von Bustle (Gast)


Lesenswert?

danke Morin für die ausführliche Antwort. Bin nun aber doch dazu 
übergegangen die externe Hardware zu ändern, so dass ich einen doppelten 
Takt von vorneweg rein bekomme. War zwar auch kompliziert dies 
umzusetzen, ist aber wenigstens eine saubere Lösung.

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.