Hallo,
ich habe einen 500 MHz Oszillator, der ist an einem Taktteiler AD9508
angeschlossen. Aus dem Taktteiler gehen mehrere Takte raus zu ADC, DAC,
aber auch zum FPGA.
Der Taktteiler ist für den Ausgang zum FPGA so konfiguriert:
Register 0x27 bis 0x2C, im Datenblatt
https://www.analog.com/media/en/technical-documentation/data-sheets/AD9508.pdf
auf Seite 38.
0x27: x"04"
0x28: x"00"
0x29: x"00"
0x2A: x"00"
0x2B: x"14"
0x2C: x"00"
Konkret:
x"04" in Register 0x27 ist der Teiler -1. Es wird also durch 5 geteilt.
Aus den 500 MHz werden 100 MHz.
Die Register 0x28 ... 0x2A machen sind nur weiter für Teiler und Phase.
x"14" b"00010100" in Register 0x2B sagt:
Divider 3 power-down: 0
0 = Divider 3 is synchronized during output sync (default): 0
These bits determine the phase of the OUT3 driver: 01 = noninverting
These bits determine the OUT3 driver mode: 010 = LVDS 1 × 3.5 mA
(default)
Reserved: 0b = default
Das ist als LVDS mit dem Artix7 verbunden und zwar so wie im Anhang. 100
Ohm zwischen den Leitungen und dann noch je Leitung 100 nF hin zum FPGA.
Das habe ich aus dem ADC Datenblatt:
https://www.analog.com/media/en/technical-documentation/data-sheets/AD9650.pdf
Figure 90 Seite 33.
Im FPGA habe ich folgendes:
Im XDC:
## Clock signal Sch name = CLK_AD9508_OUT3
set_property PACKAGE_PIN G4 [get_ports CLK_AD9508_OUT3p]
set_property PACKAGE_PIN F4 [get_ports CLK_AD9508_OUT3n]
set_property IOSTANDARD DIFF_SSTL15 [get_ports CLK_AD9508_OUT3p]
set_property IOSTANDARD DIFF_SSTL15 [get_ports CLK_AD9508_OUT3n]
Da ist auch gleich die erste Frage:
DIFF_SSTL15 habe ich verwendet, weil ich kein LVDS oder so gefunden
habe. Was sollte ich an dieser Stelle verwenden?
Im VHDL habe ich dann das:
1
IBUFGDS_inst : IBUFGDS
2
generic map (
3
DIFF_TERM => FALSE, -- Differential Termination
4
IBUF_LOW_PWR => FALSE, -- Low power (TRUE) vs. performance (FALSE) setting for referenced I/O standards
5
IOSTANDARD => "DIFF_SSTL15")
6
port map (
7
O => CLK_AD9508_OUT3, -- Clock buffer output
8
I => CLK_AD9508_OUT3p, -- Diff_p clock buffer input (connect directly to top-level port)
Bisher verwende ich den Takt im FPGA nur für einen Zähler der eine LED
blinken lässt. Und da ist das Problem: Manchmal hört die auf zu blinken
oder hat kurz aussetzer. Wenn ich den Takt mit dem Oszi messe, also
Tastkopf an den 100 Ohm Widerstand, dann sehe ich schöne 100 MHz ohne
Aussetzer mit einer Amplitude von fast 500 mV und einem DC Offset von
ca. 1,2 V. Sonst passen die Spannungen auch, das FPGA bekommt 1,8 V, 1,0
V und 3,3 V.
Mache ich etwas grob falsch? Ein wenig Rumlöten wäre kein Problem. Zur
Not konfiguriere ich den Taktteiler auch auf CMOS und verwende nur eine
Leitung für den CMOS Takt.
Edit:
Doch ich kann LVDS_25 verwenden. Mal gucken ob das hilft.
Und noch weitere Fragen:
1. Wie testet am ob eine Clock im FPGA korrekt ankommt? Ich könnte da
jetzt zählen und mit einer anderen Clock ausgeben, aber da die Clocks ja
nicht exakt den gleichen Takt haben kann ich auch nicht sicherstellen,
dass das 100% passt. Ich könnte den Takt im FPGA herunterteilen oder mit
einer PLL herabsetzen und wieder auf einem IO herausgeben und dort mit
dem Oszi messen ob die Periodendauer konstant ist. Aber da sehe ich eben
nicht ob einzelne Takte ab und zu fehlen.
2. Meine Hardware wird über USB mit Strom versorgt. Ich habe ein kleines
USB Strommessgerät, das ist ganz praktisch weil ich dadurch beim
Bestücken jeweils nachmessen konnte wie viel Strom jedes zusätzliche IC
zieht. Jetzt zieht die Platine über USB 0,34 A. Wenn ich aber das Oszi
anschließe, konkret die Masse des Oszis, dann sinkt der Strom über USB
auf ca. 0,12 A. Warum ist das so? Muss ich mir Angst um das Oszi machen
weil da Strom über irgendwelche Schutzdioden oder so fließt?
Du musst entweder den 100 Ohm Widerstand an das FPGA setzen (also
"hinter" die Kondensatoren, oder VCCIO auf 2.5V und intern terminieren.
Sonst wird das nix zuverlässiges. Als IO Standard muss es auch LVDS
geben. Da gibts auch noch LVDS_25 aber das ist nur für HP. Oder genau
anders herum ^^
Dein Problem ist aber die falsche bzw aus Sicht des FPGA fehlende
Terminierung.
Nils schrieb:> Für LVDS muss di VCCIO an der entsprechenden Bank am Artix 2,5V> betragen. Sonst wird das nix
Doch, wenn man extern terminiert geht auch eine 3.3 V Bankspannung.
Siehe untere Grafik in:
https://www.xilinx.com/support/answers/43989.html
So, jetzt habe ich ein paar Datenblätter gelesen und werde nicht
wirklich schlauer.
https://www.analog.com/media/en/technical-documentation/data-sheets/ad9528.pdf
Figure 20 Seite 22
https://www.analog.com/media/en/technical-documentation/data-sheets/AD9508.pdf
Figure 39 Seite 20
Das ins beides Takt ICs, den AD9508 verwende ich, also die Clock zum
FPGA kommt aus diesem Stein. Beide sagen im Datenblatt klar, dass zuerst
der Widerstand und dann die Kondensatoren kommen.
Andererseits finde ich auch Datenblätter die genau das Gegenteil
behaupten/empfehlen.
Ich lasse mir jetzt den Takt wieder auf einem anderen IO als CMOS
ausgeben. Das sieht OK aus und ich konnte keine Fehler sehen, aber ich
weiß auch nicht wie man das mit dem Oszi gut misst.
Das Problem ist irgendwie deutlich anders. Wenn ich den Tastkopf vom
Oszi abstecke, dann wird meine Hardware wie oben geschrieben nur über
USB versorgt. Mit Tastkopf irgendwie zum Teil auch über den Masseclip?!*
Jedenfalls ... ohne angeschlossenes Oszi gibt es wohl Fehler und die LED
blinkt ab und an mal nicht. Sprich der Takt kommt nicht immer an.
Aber es muss gar nicht das Oszi sein, es genügt auch wenn ich mit dem
Multimeter (Handgerät, ohne Masseverbindung) einen Testpunkt berühre.
Mit nur einer Prüfspitze.
Sehr seltsam, denn die Spannungen sind wunderbar OK.
Und manchmal wie jetzt funktioniert alles super und egal wie die
Hardware berührt wird gibt es keine Fehler. Ich habe ja schon die etwas
wackelige USB Buchse in Verdacht aber es kann natürlich auch etwas
komplett anderes sein.
*Ich habe ein USB Strommessgerät UT658 und auch eines von Plugable. So,
wenn ich das Oszi nicht mit meiner Hardware verbunden habe, dann zeigen
beide Messgeräte 0,34 A an. Schließe ich die Masse vom Oszi an die Masse
meiner Hardware so zeigt das UNI-T gerät nur noch 0,17 A an, das von
Plugable zeigt weiterhin die 0,34 A. Schön ist auch wenn beide Geräte in
Reihe geschalten sind. Das eine zeigt weniger als das andere obwohl der
Strom durch beide ja doch annähernd gleich groß sein muss (bis auf den
Eigenbedarf). Sehr seltsam. Ich vertraue jetzt dem Billiggerät von
Plugable.
Edit:
Es könnte sein, dass das UNI-T Gerät den Strom in der Masse Leitung
misst? Wenn das Oszi verbunden ist fließt über dessen Masse ein Teil des
Stroms zurück. Das Gerät von Plugable hingegen misst in der +5 V
Versorgungsleitung.
Nur eine Vermutung.
gustl, du solltest die XilinxDatenblätter lesen. Dort gibt es eines,
welche die Bankproblematik behandelt. Es gibt eine regelrechte
pfadähnliche Strategie, wann man einen DiffTerm setzen kann und muss.
Jo, hier sind sogar Bildchen wie man die Entscheidung fällt. Aber wie
oben geschrieben verwende ich DIFF_TERM => FALSE. Mein Problem scheint
irgendwo anders zu liegen. Vielleicht sollte ich dazu einen anderen
Thread aufmachen ...
Moin,
Gustl B. schrieb:> Es könnte sein, dass das UNI-T Gerät den Strom in der Masse Leitung> misst? Wenn das Oszi verbunden ist fließt über dessen Masse ein Teil des> Stroms zurück. Das Gerät von Plugable hingegen misst in der +5 V> Versorgungsleitung.> Nur eine Vermutung.
Die wuerd' ich teilen.
Gruss
WK
Gustl B. schrieb:> Edit:> Es könnte sein, dass das UNI-T Gerät den Strom in der Masse Leitung> misst? Wenn das Oszi verbunden ist fließt über dessen Masse ein Teil des> Stroms zurück. Das Gerät von Plugable hingegen misst in der +5 V> Versorgungsleitung.> Nur eine Vermutung.
Das könnte eine gute Vermutung sein. Was oft vergessen geht ist, dass
die "Masse" eines Oszilloskops eine Erde ist (Hart verbunden mit dem
Schutzleiter des Netzkabels).
Hier fehlt definitiv die Bias-Spannung. Nach den Kondensatoren ist das
Signal gleichspannungsfrei und um 0V zentriert. Die Eingaenge
unterstuetzen nur >= 0V, daher wird das Signal nicht sauber in den FPGA
uebertragen.
Was sind die Pegel vor den Cs? Sind die nach Datenblatt LVDS-kompatibel?
Die 7er-Reihe hat hier recht breite toleranzen, es ist durchaus
wahrscheinlich, dass man die Cs durch 0 Ohm ersetzen kann, und alles
funktioniert.
Verstehe ich schon, aber wieso ist das in den AD Datenblättern anders
gezeichnet?
Jetzt habe ich den R entfernt und die Cs durch 0 Ohm ersetzt. Also quasi
das LVDS direkt angeschlossen und zwar auch ohne Terminierung. Auch
nicht im FPGA. Und siehe da, auch bei dieser Schaltung blinkt die LED.
Bis jetzt noch keine Aussetzer.
LVDS_25 kann ich zwar bei 1.8 V Bankspannung verwenden, aber nur ohne
interne Terminierung.
LVDS kann ich auch nicht verwenden weil das das FPGA nicht unterstützt.
Ich muss also extern tterminieren. Aber ... was ist denn nun die
optimale Beschaltung? AC-koppeln und terminieren? Wo ist dann der
DC-Bias? DC-koppeln und terminieren?
Ich habe jetzt mit 100 Ohm extern terminiert und beide Cs durch 0 Ohm
ersetzt. Funktioniert auch.
Ich mag das nicht wenn etwas auf viele unterschiedliche Arten
"funktioniert" weil für mich dann unklar ist wie ich das machen sollte.
Moin,
Gustl B. schrieb:> Ich muss also extern tterminieren.
Wie lange ist denn deine Taktleitung aufm PCB?
Bei 100MHz wuerd' ich das mal nicht so eng sehen mit der Terminierung,
wenns nicht gerade ueber zig cm wilde Leitungen laeuft.
Gruss
WK
Kleiner 3 cm.
Wozu ist denn diese Terminierung? Ist das für die Impedanz da oder sind
die LVDS Ausgänge Stromquellen und man braucht den Widerstand damit da
eine Spannung drüber messbar wird (für das FPGA)?
Ich meine wenn das also 3,5 mA LVDS Quelle eingestellt ist, dann sorgt
der IC dafür, dass da 3,5 mA fließen. Bei 100 Ohm Terminierung geht das
und dann wird da eine Spannung von 350 mV draus. Mal fließt der Strom
von +Out nach -Out und mal umgekehrt. Macht einen Hub von 2*350 mV = 700
mV.
Wenn der Widerstand fehlt kann kein Strom fließen. Aber der Widerstand
ist dann auch sehr groß. Da ist dann unklar welche Spannung anliegt.
So stelle ich mir das gerade vor. Bitte verbessern wenn falsch.
Gustl B. schrieb:> Ich meine wenn das also 3,5 mA LVDS Quelle eingestellt ist, dann sorgt> der IC dafür, dass da 3,5 mA fließen.
Naja, aber diese Regelung hat ein Einschwingverhalten, wegen des
nichtlinearen Ausgangs, der Last und vor allem eine Transiente wegen der
Leitungsreflektionen. Diese sind es ja, die mit der Anpassung /
Abschluss-R unterdrückt werden.
Das Schalten der CMOS-Eingänge der Last ist über dies auch eher ein
kapazitiver Ladevorgang, als eine Konstantstrombedarf.
Dergute W. schrieb:> Wie lange ist denn deine Taktleitung aufm PCB?> Bei 100MHz wuerd' ich das mal nicht so eng sehen mit der Terminierung,
Bei 2,5cm sehe ich Reflektionen im Bereich 2 x 2,5cm / 200km/s = 250ps x
n
Alles klar, also ist die Terminierung nur wegen der Reflexionen da weil
man eben lange Kabel terminiert. Die dient also NICHT dazu, dass über
dem Widerstand eine definierte Spannung abfällt weil der LVDS Treiber
eine Stromquelle ist. Ist es das was ihr sagen wollt?
Wenn ja, dann ist eine LVDS Terminierung bei kurzen Leitungen egal.
Moin,
Gustl B. schrieb:> Wenn ja, dann ist eine LVDS Terminierung bei kurzen Leitungen egal.
Natuerlich wurde ich sowas nieeeeemals sagen ;-)
Aber es erklaert:
Gustl B. schrieb:> Ich mag das nicht wenn etwas auf viele unterschiedliche Arten> "funktioniert"
Gruss
WK
Ey man ... das hilft mir bei dem Verständnis echt nicht weiter. Ich habe
immer noch keine klare Antwort warum da terminiert wird. Ist es:
a) Damit keine Reflexionen entstehen oder
b) damit über dem Widerstand eine definierte Spannung abfällt weil der
LVDS Treiber eine Stromquelle ist.
Weil es so im Datenblatt des FPGA-Herstellers steht. Ob die Terminierung
im oder ausserhalb vom FPGA ist, macht nicht sooo viel Unterschied. Aber
sie soll nach Spezifikation da sein.
Und wieso? Ja steht im Datenblatt, aber was ist der Grund dafür? Ich
baue da auch gerne den Widerstand hin, ist schon dort, ich will aber
auch verstehen wieso der da hin soll und finde die Begründung mit dem
Datenblatt dafür nicht ausreichend. Vor allem weil das bei anderen
Herstellern wie AD anders gezeichnet wurde in Datenblättern.
1.) LVDS-Inputs am Spartan 7 sind nicht self-biasing.
2.) Die Input-common-mode voltage muß im Bereich von 300mV ... 1,5V
liegen.
3.) Die interne Terminierung von LVDS-Inputs steht nur in 2,5V-Bänken
zur Verfügung.
LVDS Signale müssen am Input terminiert werden.
-> da die bei dir in einer 1,8V-Bank liegen, mußt du wegen 3.) einen
externen Abschlußwiderstand möglichst nah an den Eingangsanschlüssen
vorsehen.
Ob du eine Kondensatorkopplung brauchst, oder das Quellsignal direkt ans
FPGA anschließen kannst, hängt von der Quelle ab! Wenn die
Output-common-mode voltage der LVDS-Quelle zwischen 300mV und 1,5V
liegt, kannst du die direkt anschließen.
Falls nicht, brauchst du Koppelkondensatoren zur Quelle hin und wg. 1.)
ein Bias-Netzwerk dahinter.
Siehe XILINX UG471 Fig. 1-72:
https://www.xilinx.com/support/documentation/user_guides/ug471_7Series_SelectIO.pdf
Das das im Datenblatt vom AD9650 anders beschrieben ist, liegt halt
daran,
daß dessen Clock-Input self biasing ist. Der braucht hinter
Koppelkondensatoren also kein Bias-Netzwerk, weil er das integriert hat.
Und die Taktquelle in diesem Datenblatt ist explizit ein AD951x
LVDS-Ausgang, daher muß für den der Abschlußwiderstand vor den
Koppelkondensatoren liegen, weil Clockbuffer aus der AD951x-Serie keinen
'echten' LVDS-Ausgang haben, sondern eine Stromquellenschaltung, die
3,5mA treibt und daher einen DC-Pfad benötigt.
Deine Schaltung muß immer die Anforderungen sowohl der Eingangsseite als
auch der Ausgangsseite erfüllen!
Daraus resultieren auch die Unterschiede in den Applikationsschaltungen,
weil auch bei der Eingangsbeschaltung bestimmte Annahmen uber den
treibenden Ausgang berücksichtigt wurden.
Der Abschluß dient definitionsgemäß zur Vermeidung von Reflexionen auf
der Leitung (die daher ebenso als differenzielle Leitung mit definierter
Impedanz geroutet werden sollte) und gehört soweit wie irgend möglich
ans Ende jener Leitung.
Wenn aber der hauseigene Treiber einen DC-Pfad benötigt, wandert der
Abschlußwiderstand schonmal vor die Koppelkondensatoren...
Thosch schrieb:> LVDS Signale müssen am Input terminiert werden.
Warum eigentlich? Genau danach hatte ich gefragt. Ist das:
Gustl B. schrieb:> a) Damit keine Reflexionen entstehen oder> b) damit über dem Widerstand eine definierte Spannung abfällt weil der> LVDS Treiber eine Stromquelle ist.Thosch schrieb:> 1.) LVDS-Inputs am Spartan 7 sind nicht self-biasing.> 2.) Die Input-common-mode voltage muß im Bereich von 300mV ... 1,5V> liegen.> 3.) Die interne Terminierung von LVDS-Inputs steht nur in 2,5V-Bänken> zur Verfügung.
Ist mit mittlerweile klar. Halte ich auch alles ein.
Thosch schrieb:> Der Abschluß dient definitionsgemäß zur Vermeidung von Reflexionen auf> der Leitung (die daher ebenso als differenzielle Leitung mit definierter> Impedanz geroutet werden sollte) und gehört soweit wie irgend möglich> ans Ende jener Leitung.
OK, also geht es nur um Reflexionen und nicht daraum, dass über dem
Widerstand eine definierte Spannung abfällt.
Thosch schrieb:> Und die Taktquelle in diesem Datenblatt ist explizit ein AD951x> LVDS-Ausgang, daher muß für den der Abschlußwiderstand vor den> Koppelkondensatoren liegen, weil Clockbuffer aus der AD951x-Serie keinen> 'echten' LVDS-Ausgang haben, sondern eine Stromquellenschaltung, die> 3,5mA treibt und daher einen DC-Pfad benötigt.Thosch schrieb:> Wenn aber der hauseigene Treiber einen DC-Pfad benötigt, wandert der> Abschlußwiderstand schonmal vor die Koppelkondensatoren...
Gut, wenn der Widerstand vor den Kondensatoren ist, dann bräuchte ich
dahinter den DC-Bias. Oder ich lasse eben die Kondensatoren weg und habe
DC-Kopplung.
Helmut S. schrieb:> Has du auch die Bias-Widerstände drin?> Die Bias-Widerstände und Termination(100Ohm) müssen direkt am Empfänger> sein.
Nein. Ich verwende als Quelle einen AD9508https://www.analog.com/media/en/technical-documentation/data-sheets/AD9508.pdf
und der gibt "LVDS" aus. Ob das jetzt "richtiges" LVDA ist weiß ich
nicht. Was ist das überhaupt? Eine Stromquelle, eine Spannungsquelle?
Wikipedia schreibt zwar was von Spannungspegeln, aber auch von 3,5 mA.
Daher kommt ja überhaupt erst meine (Fehl)verständnis davon, dass der
Terminierungswiderstand dazu dient, dass bei 3,5 mA die definierte
Spannung abfällt.
Jedenfalls ... im Datenblatt des Taktteilers
https://www.analog.com/media/en/technical-documentation/data-sheets/AD9508.pdf
auf Seite 5 stehen die Eigenschaften der LVDS Ausgänge. Das hat einen
DC-Offset von 1.18 V. Sprich das ist also völlig OK wenn ich es ohne AC
Kopplung direkt anschließe.
Ich habe die Terminierung drinnen, knapp vor oder eher unter dem FPGA,
habe auch jetzt mehrfach gelesen, dass man die haben sollte, weiß aber
noch nicht ob wegen der Reflexionen oder damit eine definierte Spannung
abfällt.
> dass man die haben sollte, weiß aber
noch nicht ob wegen der Reflexionen oder damit eine definierte Spannung
abfällt.
Die 100Ohm sind sowohl wegen den Reflexionen als auch wegen dem
definierten Signalhub da.
Das ist doch mal eine Antwort aus der ich lernen kann. Danke!
Denn wäre es nur wegen der Reflexion könnte ich den Widerstand bei
kurzen Leitungen weglassen und wäre es wegen der Spannung müsste ich den
immer hin bauen egal wie lang oder kurz das Kabel ist. Wenn das also
auch wegen der Spannung ist werde ich den also immer verbauen.
Gustl B. schrieb:> a) Damit keine Reflexionen entstehen oder> b) damit über dem Widerstand eine definierte Spannung abfällt weil der> LVDS Treiber eine Stromquelle ist.
Dieser Spannungsabfall IST die Terminierung. Das ist sie aber nicht aus
der Gleichstromsicht heraus (von wegen I*R), sondern der
"Wechselstromsicht", wegen Z (Impedanz und Belastung).
Die Leitung hat doch eine Induktivität und Kapazität und diese sind für
hohe Frequenzen wirksam.
Das Rechteck, dass du auf die Leitung gibst, produziert eine Welle, die
ohne Verluste sogar ewig schwingen würde - zuzüglich des Gleichstromes,
der fließt. Das kann man mathematisch prima zeigen, oder auch mit einem
Synthesizer.
Man kann es sogar mit Wasserwellen darstellen, wenn man schlagartig
einen Vorschub anwendet: Das Wasser fließt dann gleichmäßig und die
Welle saust hin und her.
Diese Welle produziert ständig Spannungen, wenn sie an der Quelle und
der Senke ankommt und läuft sich nur langsam tot. Daher schaltet man
eine "Abflussmöglichkeit" hinzu, die gerade so dimensioniert ist, dass
der Druck eine Strömung produziert, welche den Impuls (Kraft x Zeit)
aufnimmt. In der Akustik sind das die Lochplatten in Tonstudios, an
denen sich die Luft einströmend torreibt und zwar eben so, dass es
passt. Zu viel Widerstand produziert wieder ein Appprallen = Reflektion,
zu wenig einen Sog, der die folgenden Luftteilchen nachrücken lässt
(mehr nachrücken lässt, als sie gleichmäßig fließen).
Jetzt ersetzen wir sinngemäß Luftteilchen durch Elektronen.
Das einzige, was nun anders ist, sind die Sondereffekte wie skin, welche
dazu führen, es keine gleichmäßigen Spektralverlauf der Wellen gibt. In
grober Näherung ist die Elektronenwelle aber eine solche "mechanische"
Schubschwingung. Dasselbe haben wir im Übrigen auch in Getrieben, wenn
eine Schubstange angeschoben wird und im Wasser, wenn ein Tsunami läuft.
Das Wasser fließt langsam vor sich hin, aber die Druckwelle rauscht mit
Wellenfortpflanzunggeschwindigkeit.
Ich habe eine nette Simulation für das System am Beispiel einer
Klaviersaite / Gitarrensaite, wenn sie angezogen ist und losgelassen
wird. Die Spannungswelle läuft entlang der Saite und überträgt die
Energie = Information auf die Aufhängung, wird reflektiert und läuft hin
und her. Nimmt man keine Dämpfung in die Simulation, rennt die ewig.
OK, danke! Da hatte ich mich zu sehr an den beiden
Gleichspannungszuständen festgebissen. Ich hatte das so betrachtet:
Einmal fließen 3,5 mA in die eine Richtung und danach in die andere
Richtung. Und dann habe ich den Widerstand über dem die vom Empfänger zu
messende Spannung abfällt.
Übrigens darf dieses Video an der Stelle nicht fehlen:
https://www.youtube.com/watch?v=DovunOxlY1k