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
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
danke für die schnelle Auskunft... muss ich es doch irgendwie in Logik schreiben.
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 :)
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...
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.