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<=clkandclk_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
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?
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.
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.
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).
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.
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.
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.
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 :-)
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.