Forum: FPGA, VHDL & Co. clk ein- und ausschalten


von Cybermaus (Gast)


Lesenswert?

Hi!

Ich würde gerne einen ADC mit einem FPGA ansteuern. Leider muss ich dazu 
eine clk Leitung ein und ausschalten. Normalerweise würde ich schreiben
1
dclk_o <= clk and clk_enable;

Aber jeder der mit FPGA´s arbeitet weis, dass man die clk nicht angreift 
sonst kann es zu Metastabilitäten und Syncronitätsproblemen kommen wenn 
das Ding sich verändert (warm wird).

Habt Ihr eine bessere Lösung?

Liebe Grüße
Isabelle

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Cybermaus schrieb:
> dass man die clk nicht angreift sonst kann es zu Metastabilitäten und
> Syncronitätsproblemen kommen wenn das Ding sich verändert (warm wird).
Das was du das fahrlässig als clk bezeichnest, ist gar kein Takt, 
sondern (hoffentlich) "nur" ein Pin, der an den ADC angschlossen ist. 
Ist es so?
Oder wird dieser clk auch im FPGA mit rising_edge() oder 'event 
abgefragt?

von Cybermaus (Gast)


Lesenswert?

Nein, das ist ein Pin zum ADC. Sonst arbeite ich mit einer "sauberen" 
clk.

von Lattice User (Gast)


Lesenswert?

Falls es kein supperschneller (> 200 MHz) ADC ist:

Intern die doppelte (oder noch grösser) Frequenz verwenden, und den ADC 
mit einer Statemachine ansteueren.

dclk_o wird dann einfach über ein Register erzeugt, das bei Befarf 
getoggelt wird. Hat auch den Vorteil, dass man das externe Timing 
leichter im Griff hat.

von Cybermaus (Gast)


Lesenswert?

super, danke

von Christian R. (supachris)


Lesenswert?

Da man die Clock-Ausgabe sinnvoll sowieso nur mit einem ODDR-Register 
(Xilinx) macht, ist es kein Problem, das sauber abzuschalten. Einfach 
den Set oder Reset Eingang benutzen, je nachdem, welcher Ruhepegel sich 
einstellen soll. Fertig ist der Lack.

von Sigi (Gast)


Lesenswert?

Christian R. schrieb
> ..  sowieso nur mit einem ODDR-Register
> (Xilinx) macht, ..

Clock-Signale an OPins lassen sich auch ohne DDR-Output sinvoll
generieren (ODDRs haben natürlich gew. Vorteile).

von Christian R. (supachris)


Lesenswert?

Kommt drauf an. Wenn es ein Takt ist, der auch intern direkt vom 
Taktnetzwerk kommt, ist bei Xilinx zumindest sonst nichts sinnvolles zu 
machen. Gerade bei höheren Geschwindigkeiten. Um den Ausgang direkt 
anzusteuern muss das Signal den schnellen globalen oder regionalen 
Taktpfad verlassen und das resultiert darin, dass dass alle anderen an 
dieses Taktnetz angeschlossenen internen Sachen ebenfalls über ein 
normales Routing-Netz betrieben werden müssen. Er hat ja nicht 
geschrieben, wie schnell der ADC ist, wenn das nur kS/s oder wenige MS/s 
sind, kann man natürlich den Takt für den ADC als normales Signal 
behandeln und generieren. Aber bei 100MS/s oder sowas wird das schon 
schwierig. Vom Jitter ganz abgesehen. Normal schließt man den CLK des 
ADC direkt an einen jitterarmen Oszillator an und betreibt das FPGA 
parallel dazu.

von Sigi (Gast)


Lesenswert?

Ob DDR oder nicht, verlassen wird der Clockpfad eh.
Aber das Interesante am (DDR-)FF ist ja die extrem
kurze Beschaltung zum Pin inkl. "Jitterfreiheit". Das
gilt aber auch fur SDR-FFs. Ich habe z.B. gerade ein
CycloneII mit vier 250MHz-ADCs (Welec-Oszi), die sich
auch bis 300MHz hochschrauben lässt.
Der Vorteil am DDR-FF liegt aber an der einfacheren
Verwendung: Init-Werte setzen (1/0 oder 0/1), ENABLE
und obiges Problem ist gelöst.

von Christian R. (supachris)


Lesenswert?

Sigi schrieb:
> Ob DDR oder nicht, verlassen wird der Clockpfad eh.

Mit dem internen CLK wird durch das DDR quasi ein neuer Takt am Ausgang 
erzeugt. Wir beide wissen ja, was gemeint ist, aber ich glaube der 
Thread-Ersteller ist da noch nicht ganz so bewandert in 
FPGA-spezifischen Technologien.

von Kalle (Gast)


Lesenswert?

Könnt ihr denn bei eurem Gespräch konkreter werden?
Ihr wisst natürlich wovon ihr redet und um die angesprochenen Interna, 
aber wenn ihr da erklärender würdet, dann hätten auch die unerfahrenen 
weiteren Input.
Irgendwie muss man ja dahinter kommen. Ich würde z.B. da ansetzen, daß 
ich frage, wie würde ich denn die Taktausgabe mit einem oddr Register 
machen und reset zum 'klemmen' aufschalten?
Da wär doch die Bescheibung als Beispiel eine nette Sache.
Ihr versteht was ich meine?

"Da man die Clock-Ausgabe sinnvoll sowieso nur mit einem ODDR-Register
(Xilinx) macht, ist es kein Problem, das sauber abzuschalten. Einfach
den Set oder Reset Eingang benutzen, je nachdem, welcher Ruhepegel sich
einstellen soll. Fertig ist der Lack."

Nur die Diskussion zwischen Wissenden ist sicher auf höherem Niveau 
möglich, aber hier würdet ihr z.B. einen Thread von einem Unwissenderen 
User dafür missbrauchen. Und ihr hättet noch die Chance, Wissen zu 
verbreiten :-)

von Christian R. (supachris)


Lesenswert?

Naja, was gibts da groß zu erklären. Erstens steht das in jedem User 
Guide von Xilinx FPGAs drin, zweitens ist das ziemlich einfach, kann man 
sich auch selbst herleiten/überlegen aus der ODDR Funktionsweise. An den 
CLK Eingang des ODDR kommt der interne Clock, an den Ausgang das Pin. An 
D0 legst du fest ein High an, an D1 fest ein Low. Dann schaltet das ODDR 
bei jeder steigenden Flanke die 1 auf den Ausgang (D0) und bei jeder 
fallenden eine 0 (D1). Somit ist der Takt auf den Ausgang dupliziert, 
ohne dass der Takt selbst auf den Ausgang gelegt ist. Den R-Eingang des 
ODDR kannst du zum Reset benutzen. Wenn du den Takt invertiert ausgeben 
möchtest, einfach 1 auf D1 und 0 auf D0 legen, dann läuft das umgekehrt.

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.