clk ein- und ausschalten

Gast #2564195
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
Moderator (Firma: Titel) Persönliche Seite #2564212
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?
Gast #2564219
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.
#2564878
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.
Gast #2564972
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.
Gast #2565168
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 :-)
#2565197
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren