Forum: FPGA, VHDL & Co. Problem mit Xilinx SERDES bei EMV Störung


von Andreas N. (poolspieler)


Lesenswert?

Hallo,
ich benutze das Modul serdes_1_to_n_data_s8_diff der XAPP1064 auf einem 
Spartan6 unter EDK14.2.
Ein 13-Bit-Bus mit 250MHz DDR wird in einen 91-Bit-Bus umgewandelt.
Soweit funktioniert das ganze sehr gut.
Bei mir auf dem Schreibtisch funktioniert es sogar BESTENS. Selbst wenn 
ich mit einem Störgenerator (mit kapazitiver Koppelstrecke von SCHLÖDER) 
Störungen von bis zu 2KV auf den Zuleitungen erzeuge, funktioniert alles 
gut --> irgendwann verabschiedet sich das Labornetzteil dann - aber das 
ist ein anderes Problem... :-)

Jetzt mein PROBLEM:
Beim Kunden (selbstverständlich über 1000km entfernt grrrrrr) scheint 
sich das SERDES-Modul nach kurzer Zeit aufzuhängen. Dann werden nur noch 
0-Werte ausgegeben.
Ich kann mir das überhaupt nicht erklären.
Wenn man den RESET des serdes_1_to_n_data_s8_diff kurz auf '0' zieht, 
dann geht es wieder.
Was noch sehr seltsam ist: Es gibt einige Geräte, bei denen tritt es 
innerhalb weniger Sekunden auf - bei anderen dauert es Tage, oder tritt 
nie auf.

Ich würde ja auf den 250MHz-Oszillator tippen --> kann es sein, wenn 
sich dieser durch irgendwelche EMV stören lassen würde, dass solch ein 
Verhalten auftritt?

Oder was könnte noch die Ursache sein, dass die SERDES auf einmal nur 
noch NULLEN ausgeben. Ich hätte halt erwartet, dass ein "aufgehängtes" 
SERDES gar nichts mehr ausgibt...???

Ich wäre für jede Hilfe oder Idee dankbar!

Viele Grüße,

Poolspieler

von Jürgen S. (engineer) Benutzerseite


Lesenswert?

Welcher Chip?

von Andreas N. (poolspieler)


Lesenswert?

Es ist ein XC6SLX150-3FGG484I auf einem Trenz Gigabee Modul 
TE0600-01IVF.
Angesteuert wird ein AD9613 auf einem EVA-Board: 
http://www.analog.com/en/evaluation/eval-ad9613/eb.html

von Andreas N. (poolspieler)


Lesenswert?

Mir fällt gerade auf, dass im Datenblatt Speed Grade 2 angegeben wurde, 
auf der Verpackung (und vor allem auch auf der Platine) ist aber ein 
Speed Grade 3 verbaut --> könnte dies eventuell die Ursache sein?

Eigentlich ja nicht, weil 3 ja besser ist als 2 --> ODER?

von Jürgen S. (engineer) Benutzerseite


Lesenswert?

Die Frage ist, was auf euren Modulen verbaut ist und ob die SERDES an 
sich die Probleme machen und nicht gfs die PLLs. Woher kommen die Takte?

Ich habe bereits SERDES mit dem Spartan6 gebaut, allerdings aus einem 
vormals funktionierenden Design eines V6, das spontan auf dem S6 nicht 
funktionierte. Ein Quell der Probleme ist die mangelnde Fähigkeit der 
Xilinx toolchain, cores von der einen zur anderen Core-Version zu 
übernehmen. In Einzelfällen klappt es nicht einmal ein Design innerhalb 
eines Chips auf eine neue Xilinx-Version upzudaten. Tipp: Immer alle 
Cores neu anlegen.

Wie sieht es denn mit Spannungsversorgungen aus? Kann da was kommen?

Laufen die Transceiver durch oder werden sie neu gestartet oder 
gesynched?

Werden sie initial oder permanent eintrainiert?

Sind die dynamic PLL-Eingänge und die IO-Delay configs belegt und/oder 
werden dort ändernde oder statische Werte eingeschrieben?

Ich habe kein vollständiges Bild der Wirkung solch radikaler 
EMV-Aktivitäten, kann mir vorstellen, dass sich die Inputs irgendwas 
ziehen und sich verstellen. Bei RAMs hat es jedenfalls geholfen, sie 
redundant zu überschreiben - man "weiss" also, was drinstehen muss und 
schreibt es öfters wieder rein. Kurzfristige Fehler sind dann 
unerheblich.

Wenn man es nicht in den Griff bekommt, alle Leitungen redundant 
ausführen und alternativ neu resetten und einstellen.

von Andreas N. (poolspieler)


Lesenswert?

Hallo Jürgen,
erstmal danke für Deine ausführliche Antwort!
> Die Frage ist, was auf euren Modulen verbaut ist und ob die SERDES an
> sich die Probleme machen und nicht gfs die PLLs. Woher kommen die Takte?
Die Takte kommen von einem 250MHz Quarzoszillator --> dieser betreibt 
den AD-Wandler. Vom AD-Wandler kommen Takt und 13-Bit Datenbus zu den 
ISERDES des Spartan6.
Wie gesagt: Der Oszillator auf einer kleinen Leiterplatte (ca. 2cm x 
3cm)platziert. Diese Leiterplatte ist auf dem EVA-Board aufgeklebt und 
mit Fädeldrähten angeschlossen. Ich weiß, dass dies nicht schön ist, für 
die Prototypen war es aber (aus Zeitgründen) nötig...
Nun ist halt die dicke Frage: Wenn der 250MHz-Clock wirklich ab und zu 
eine Störung hätte --> also irgend ein Spike auf dem Clock wäre: KÖNNTE 
dies dann dazu führen, dass die ISERDES zwar noch Daten ausgeben - aber 
eben nur noch NULLEN?

> Ich habe bereits SERDES mit dem Spartan6 gebaut, allerdings aus einem
> vormals funktionierenden Design eines V6, das spontan auf dem S6 *nicht*
> funktionierte. Ein Quell der Probleme ist die mangelnde Fähigkeit der
> Xilinx toolchain, cores von der einen zur anderen Core-Version zu
> übernehmen. In Einzelfällen klappt es nicht einmal ein Design innerhalb
> eines Chips auf eine neue Xilinx-Version upzudaten. Tipp: Immer alle
> Cores neu anlegen.
Das musste ich bei diversen Xilinx-Updates auch schon feststellen:
Ein Update von z.B. EDK13 auf EDK14 kannst Du praktisch vergessen. Da 
ist der komplette Neuaufbau um einiges schneller und vor allem 
nervenschonender :-)
Ich kann mir vorstellen, dass das Portieren zwischen verschiedenen 
Architekturen ähnlich problematisch ist...

> Wie sieht es denn mit Spannungsversorgungen aus? Kann da was kommen?
Naja, die sind halt vom EVA-Board.
Tests beim Kunden haben aber gezeigt, dass die Störung wohl über die 
analogen Leitungen zum EVA-Board gelangen.
Wenn die analogen Leitungen (SMA-Leitungen) nicht angeschlossen sind, 
dann tritt der Fehler NICHT auf.
Schließt der Kunde aber eine 30cm kurze Leitung an, ohne das zweite Ende 
mit irgendwas in Verbindung zu bringen, dann tritt der Fehler auf.
Die Coax-Leitung ist also eine Art Antenne, über die irgendwelche 
Störungen in mein Gerät kommen.
Seltsamer Weise konnte ich es aber mit meiner kapazitiven Koppelstrecke 
NICHT reproduzieren. Ich habe mein Gerät damit gequält, bis das 
Labornetzteil abgeschmiert ist --> einen Fehler konnte ich nicht 
reproduzieren... :-(


> Laufen die Transceiver durch oder werden sie neu gestartet oder
> gesynched?
Die laufen endlos.

> Werden sie initial oder permanent eintrainiert?
Einmal beim Systemstart wird eine komplette Rampe durch das Signal 
gefahren, um die Datenaugen einzulernen. Da hatte ich am Anfang auch 
Probleme mit korrupten Daten. Diese sind jetzt aber behoben. Ich habe 
keine einzelnen Ausreisser bzw. Datenfehler.
Wenn der Fehler auftritt, dann kommt einfach nur noch NULL...

> Sind die dynamic PLL-Eingänge und die IO-Delay configs belegt und/oder
> werden dort ändernde oder statische Werte eingeschrieben?
Ich nutze einen PLL von 2 weil die 250MHz ja mit DDR kommen - also bei 
der steigenden UND der fallenden Flanke kommen Daten.

> Ich habe kein vollständiges Bild der Wirkung solch radikaler
> EMV-Aktivitäten, kann mir vorstellen, dass sich die Inputs irgendwas
> ziehen und sich verstellen. Bei RAMs hat es jedenfalls geholfen, sie
> redundant zu überschreiben - man "weiss" also, was drinstehen muss und
> schreibt es öfters wieder rein. Kurzfristige Fehler sind dann
> unerheblich.
>
> Wenn man es nicht in den Griff bekommt, alle Leitungen redundant
> ausführen und alternativ neu resetten und einstellen.
Das wäre nun mein Workaround:
Ich habe relativ kurze Messzeiten und relativ lange Wartezeiten. Die 
Wartezeiten könnte ich dazu nutzen, die SERDES zu Resetten - schön ist 
das nicht, würde aber wahrscheinlich helfen.
Nur dann habe ich lediglich die Auswirkung bekämpft, ohne die Ursache zu 
kennen.

Viele Grüße,

Andreas

von Christian R. (supachris)


Lesenswert?

Andreas N. schrieb:
> Ich nutze einen PLL von 2 weil die 250MHz ja mit DDR kommen - also bei
> der steigenden UND der fallenden Flanke kommen Daten.

Di Spartan 6 ISERDES können das doch auch ohne PLL. Welcher AD Wandler 
ist das? Liefert der den schnellen Takt synchron zu den Daten mit? Ich 
hab an mein SP605 den LTC2175 angeschlossen, mit eigener 4-Lagen Platte, 
das funktioniert sehr gut. Anfangs hatte ich ab und zu je nach Routing 
Durchlauf mal seltene korrupte Daten, aber wenn man die Constraints 
bissl anzieht, klappts. Core Generator braucht man da nicht mal, der 
erzeugt ja eh nur VHDL Code bei den SERDES. Ich hab dort ohne das 
IODELAY gearbeitet, das hat nur Stress gemacht, der Phasendetector ging 
überhaupt nicht, und fixes Delay ist auch Murks am Spartan 6. Der LTC 
liefert die Daten aber so dass man sie direkt mit dem Takt abtasten 
kann, also 90° verschoben, damit gehts prima.

von Lattice User (Gast)


Lesenswert?

Andreas N. schrieb:
> Ein 13-Bit-Bus mit 250MHz DDR wird in einen 91-Bit-Bus umgewandelt.

Das ist ein 1:7 Gearing, warum das denn?

Ich habe mir Datenblatt des AD9613 mal angeschaut. Der kann wie 
Christian es für den LTC2175 tut ohne PLL verwendet werden.

Als DDR-Inputclock in den FPGA dient DCO vom ADC. Das ist Laut 
Datenblatt gegenüber den Daten 0.4 - 1.0 (Typ 0.7) ns verschoben. Nicht 
gerade Centeraligned sollte aber gut genug sein.

von Christian R. (supachris)


Lesenswert?

Lass mich raten: Du hast den DCO nicht an einem GCLK in der gleichen 
halben Bank liegen wie alle Daten und Frame und daher der Umweg über 
PLL?

von Andreas N. (poolspieler)


Lesenswert?

Christian R. schrieb:
> Lass mich raten: Du hast den DCO nicht an einem GCLK in der gleichen
> halben Bank liegen wie alle Daten und Frame und daher der Umweg über
> PLL?

Hallo Christian,
Das ist richtig. Wobei es bei dem eingesetzten Modul gar nicht anders 
möglich war...

> Ich habe mir Datenblatt des AD9613 mal angeschaut. Der kann wie
> Christian es für den LTC2175 tut ohne PLL verwendet werden.
Dafür müßte ich aber den Input-Clock von 250MHz auf 500MHz erhöhen.
Das wäre eine Hardwareänderung, die ich schon vermeiden möchte.

> Di Spartan 6 ISERDES können das doch auch ohne PLL. Welcher AD Wandler
> ist das? Liefert der den schnellen Takt synchron zu den Daten mit? Ich
> hab an mein SP605 den LTC2175 angeschlossen, mit eigener 4-Lagen Platte,
> das funktioniert sehr gut. Anfangs hatte ich ab und zu je nach Routing
> Durchlauf mal seltene korrupte Daten, aber wenn man die Constraints
> bissl anzieht, klappts. Core Generator braucht man da nicht mal, der
> erzeugt ja eh nur VHDL Code bei den SERDES. Ich hab dort ohne das
> IODELAY gearbeitet, das hat nur Stress gemacht, der Phasendetector ging
> überhaupt nicht, und fixes Delay ist auch Murks am Spartan 6. Der LTC
> liefert die Daten aber so dass man sie direkt mit dem Takt abtasten
> kann, also 90° verschoben, damit gehts prima.
Wenn ich "nur" korrupte Daten hätte, dann würde ich das ja verstehen, 
und man müßte halt am Phasendetector (den ich erfolgreich verwende) 
schrauben - oder wo auch immer...
ABER: Ich bekommen ja ENTWEDER korrekte Daten ODER lauter NULLEN!
Wenn das Problem am PLL hinge, dann würde ich ja gar keine Daten mehr 
bekommen. Die Clocks kommen aber noch. Oder seht ihr das anders?

aktuelle Fragen zum jetzigen Stand:
1. Könnte das Problem an dem falschen Speed Grade liegen (ich hatte 
Speed Grade 2 im EDK eingestellt - verbaut ist aber ein Speed Grade 3)?
  --> wird morgen getestet...
2. Was könnte bei den SERDES dazu führen, dass ausschließlich NULLEN 
kommen? (ist vielleicht wirklich der Phase detector daran schuld?)
3. Welche Möglichkeiten gäbe es, hier Debugging zu betreiben?
  - meine jetzigen Ansätze zum Debugging:
  a) Wenn der Fehler auftritt, dann kann ich über einen speziellen 
Befehl das SERDES-Modul dazu bewegen, definierte konstanten auszugeben 
(z.B. lauter FFs oder AAs) --> so kann ich alles was dahinter ist 
(DualportRAM, etc.) ausschließen
  b) Wenn bei a) rauskommt, dass es an den SERDES direkt liegt, dann bin 
ich erstmal mit meinem Latein am Ende --> WIE/WO kann ich weitere 
Debugings einfügen...???

Viele Grüße,

Andreas

von Lattice User (Gast)


Lesenswert?

Andreas N. schrieb:
>
>> Ich habe mir Datenblatt des AD9613 mal angeschaut. Der kann wie
>> Christian es für den LTC2175 tut ohne PLL verwendet werden.
> Dafür müßte ich aber den Input-Clock von 250MHz auf 500MHz erhöhen.
> Das wäre eine Hardwareänderung, die ich schon vermeiden möchte.
>

Nein. Auf der positiven Flanke von DCO kommen die Daten von Cannel A, 
auf der negativen Flanke die Daten von Channel B. Eine ganz normale DDR 
Anwendung, die jeder moderne FPGA out of the Box ohne zusätzliche Logik 
kann.
Vorrausgetzt man verwendet die vorgesehenen Clockpins.

Nochmal die Frage, warum 1:7 Gearing?
Ich wette du bekommst nullen weil die dazugehörige Statemachine in einen 
nicht erlaubten Zustand gerät.

Bei 1:2, 1:4, 1:8 ist alles was du brauchts eine passende 
Phasenverschiebung deiner falsch angeschlossenen Clock, die obendrein 
auch fest einstellbar sein kann.

von Andreas N. (poolspieler)


Lesenswert?

Lattice User schrieb:
> Andreas N. schrieb:
>>
>>> Ich habe mir Datenblatt des AD9613 mal angeschaut. Der kann wie
>>> Christian es für den LTC2175 tut ohne PLL verwendet werden.
>> Dafür müßte ich aber den Input-Clock von 250MHz auf 500MHz erhöhen.
>> Das wäre eine Hardwareänderung, die ich schon vermeiden möchte.
>>
>
> Nein. Auf der positiven Flanke von DCO kommen die Daten von Cannel A,
> auf der negativen Flanke die Daten von Channel B. Eine ganz normale DDR
> Anwendung, die jeder moderne FPGA out of the Box ohne zusätzliche Logik
> kann.
> Vorrausgetzt man verwendet die vorgesehenen Clockpins.
Du meinst also, dass es ein Vorteil sein könnte, darauf umzustellen?
Aber wenn ich Christian richtig verstanden habe, dann müssten alle Pins 
(Clock und Daten) auf der selben Bankhälfte sein --> und das ist bei mir 
halt leider nicht der Fall und vor allem mit dem verwendeten Modul auch 
nicht möglich... :-(

> Nochmal die Frage, warum 1:7 Gearing?
> Ich wette du bekommst nullen weil die dazugehörige Statemachine in einen
> nicht erlaubten Zustand gerät.
Naja, wenn man jetzt mal annehmen würde, dass aufgrund von EMV zwischen 
steigender und fallender Flanke des Clocks anstatt 2ns nur 1ns mal 
vorhanden ist, dann würde es sicherlich zu Problemen kommen können.
Bleibt die Frage: wie will man das verhindern?
Durch den Reset der Statemachine würde sie zumindest immer wieder in 
einen definierten Zustand gebracht.
Im zweiten Schritt werde ich (was sowieso geplant ist) den "gefädelten" 
Oszillator auf ein ordentliches Layout bringen. Dann sollte das Problem 
ja eigentlich nicht mehr auftreten...

> Bei 1:2, 1:4, 1:8 ist alles was du brauchts eine passende
> Phasenverschiebung deiner falsch angeschlossenen Clock, die obendrein
> auch fest einstellbar sein kann.
Hier muss ich gestehen, habe ich eine falsche Information weiter 
gegeben. SORRY!
Mit 1:7 hatte ich mal angefangen. Später habe ich es auf 1:8 umgestellt.
Das Problem tritt also mit 1:8 auf - und nicht mit 1:7.

Viele Grüße,

Andreas

von Christian R. (supachris)


Lesenswert?

Andreas N. schrieb:
> Aber wenn ich Christian richtig verstanden habe, dann müssten alle Pins
> (Clock und Daten) auf der selben Bankhälfte sein --> und das ist bei mir
> halt leider nicht der Fall und vor allem mit dem verwendeten Modul auch
> nicht möglich...

Genau so ist es. Wenn du den CLK direkt über den BUFIO2 verwenden 
willst, muss der an einem GCLK liegen, und alle Daten und Frame in der 
gleichen halbe Bank, weil die BUFIO2 auf die Bankhälfte beschränkt sind. 
Bei meinem SP605 ist das auch beknackt gelöst, das LTM9011 Board passt 
überhaut nicht dran, deswegen musste wir auch eine eigene Platine machen 
und erst mal nur den LTC2175 nehmen. Das läuft aber prima. Bei deinem 
Aufbau wirds wohl wirklich nur über die PLL gehen, wenn die Pins so 
verstreut liegen. Am SpeedGrade liegts sicher nicht, erst recht wenn der 
Chip die 3 hat (schneller) und in den Tools die 2 eingestellt war. Was 
bei mir noc für Datensalat gesorgt hat, war die Terminierung, ich musste 
den ADC auch intern terminiren, also beide Seiten, erst dann liefs 
sauber.

von AHED (Gast)


Lesenswert?

Sind die ARs zu den ISERDES (bzw. IODELAY, PHASE DETECTOR) bekannt:

http://www.xilinx.com/support/answers/34856.htm ( Design Advisory Master 
Answer Record for Spartan-6 FPGA )

http://www.xilinx.com/support/answers/38408.htm
http://www.xilinx.com/support/answers/41083.htm

(da gibt es auch noch Unterschiede zwischen den Masken Revisionen!)

Für die alten gilt zumindest:

"IDELAY_TYPE=DIFF_PHASE_DETECTOR - The data rate must not exceed 400 
Mb/s"

zugegebenermaßen wird dort allerdings nur von "single bit errors" 
geredet.



Ist der Aufbau der IODELAYS bekannt:

Figure 2-20:   Using Two Delay Lines Per Delay Block
in Spartan-6 FPGA SelectIO Resources UG381 (v1.5) February 7, 2013


Könnte mir durchaus vorstellen, dass da etwas empfindlich auf Störungen 
im Eingangssignal reagiert.

Stichwort "Ringoszillator", "Counter", unabhängige Behandlung von 
steigender und fallender Flanke.


Bei solchen Problemen gehe ich üblicherweise nach der divide and conquer 
Methode vor, also Problem lokalisieren:

- Wenn der Fehler auftritt, tritt er dann bei allen Inputs, sogar bei 
allen gleichzeitig oder nur bei einigen auf?
Wenn immer alle gleichzeitig betroffen wären, sollte man annehmen, dass 
eine "gemeinsame" Komponente (wie Oszillator, PLL) betroffen ist, da 
Störungen sich eigentlich immer irgendwie stochastisch verhalten und es 
unwahrscheinlich, wäre, dass wenn die IODELAYS betroffen wären, dies bei 
allen immer identisch auftreten würde.

- Auch wenn ich nicht dran glaube würde ich eine Abhängigkeit von der 
speed-grade Einstellung durch Erzeugen eines Bitstreams für den 
richtigen speed-grade ausschließen.

- Eine Beteiligung der IODelays oder PDs könnte man relative einfach 
ausschließen, indem man sie einfach weglässt. Wenn die PLL auf 1GHz 
läuft müsste man die Phase des 250 MHz Ausgangstaktes auf 1ns einstellen 
können. Auch wenn dann noch ab und zu ein bit kippt, wäre das gut vom 
vollständigen Funktionsausfall (nur noch Nullen zu unterscheiden).

Grundsätzlich muss ich sagen, dass ich mit den ISERDES + IODELAY + PD 
ganz gut zurecht komme.
Unter Laborbedingungen läuft das auch mit 1Gbit/s ( 1:8 )  für Stunden 
ohne einen einzigen Bitfehler (bei mir ohne PLL mit 500 MHz source 
synchronous clock über die IOBUFs ).

von Lattice User (Gast)


Lesenswert?

Wie ist jetzt eigentlich was angeschlossen?

Korrekt ist meiner Ansicht:
Oscillator -> ADC CLK In
ADC DCO -> FPGA Clock In

Ich bin gerade an etwas ähnlichem, allerdings mit Lattice. Wie Christian 
fand ich es leichet und zuverlässiger das Interface mit den 
Grundprimitiven selber aufzubauen, statt den von IPExpress (aka CoreGen 
bei Xilinx) generierten zu verwenden. Braucht halt ausgiebigen 
Datenblatt Studium.

bei 1:8 wird vermutlich ein Framesync Module vom CoreGen eingebaut, das 
du bei der vorliegenden Anwendung gar nichts brauchst. Und dieses Module 
ist vermutlich der Teil der durch die Störung ausser Tritt gerät und ein 
Reset braucht.

von Lattice User (Gast)


Lesenswert?

Christian R. schrieb:
> Andreas N. schrieb:
>> Aber wenn ich Christian richtig verstanden habe, dann müssten alle Pins
>> (Clock und Daten) auf der selben Bankhälfte sein --> und das ist bei mir
>> halt leider nicht der Fall und vor allem mit dem verwendeten Modul auch
>> nicht möglich...
>
> Genau so ist es. Wenn du den CLK direkt über den BUFIO2 verwenden
> willst, muss der an einem GCLK liegen, und alle Daten und Frame in der
> gleichen halbe Bank, weil die BUFIO2 auf die Bankhälfte beschränkt sind.


Ich bin Lattice User, d.h. ich kenne mich mit dem Spartan über das 
Datenblatt hinaus nicht aus, folgendes ist daher eventuell nicht gültig:

Bei 250 MHz werden die schnellen EdgeClocks bei Lattice noch nicht 
gebraucht, d.h. es möglich eine globale Clock für alle Inputs zu 
verwenden. Max gearing ist aber dann 1:2, aber 125 MHz sollte im FPGA 
noch beherrschbar sein. man kann ausserdem intern in Logik mochmal mit 
1:2 auf 62.5 MHz runtergehen.

von Lattice User (Gast)


Lesenswert?

Lattice User schrieb:
> verwenden. Max gearing ist aber dann 1:2, aber 125 MHz sollte im FPGA
> noch beherrschbar sein. man kann ausserdem intern in Logik mochmal mit
> 1:2 auf 62.5 MHz runtergehen.

Da habe ich mich vertan, interne Clock ist mit 1:2 250 MHz ist aber 
beherschbar, vorallem wenn man nichmal 1:2 nachschaltet.

von Andreas N. (poolspieler)


Lesenswert?

Hallo zusammen,
erstmal danke für Eure Antworten!

> Wie ist jetzt eigentlich was angeschlossen?
> Korrekt ist meiner Ansicht:
> Oscillator -> ADC CLK In
> ADC DCO -> FPGA Clock In
Genau so ist es angeschlossen.
Und die Fädelleitung ist zwischen Oscillator und ADC CLK In. Ich weiß, 
dass das nicht schön ist, aber es ging halt vorerst nicht anders...

Ich habe jetzt mal versucht, eine "Störung" des Clocks zu simulieren 
(mit Modelsim).
Dabei habe ich gesehen, dass tatsächlich Nullen für eine gewisse Zeit 
nach der Störung ausgegeben werden.
Der PLL erkennt wohl, dass es nicht mehr im Takt ist und gibt 
rx_bufpll_lckd=0 aus.
rx_bufpll_lckd geht auf den Reset des datain:serdes_1_to_n_data_s8_diff:
1
  clkin : serdes_1_to_n_clk_pll_s8_diff
2
  generic map(
3
    CLKIN_PERIOD  => 4.0,
4
    PLLD       => 1,
5
    PLLX      => 2,      
6
    S        => S,
7
    BS         => FALSE      -- Parameter to enable bitslip TRUE or FALSE (has to be true for video applications)
8
  )
9
  port map (
10
    clkin_p        => clkin_p,
11
    clkin_n        => clkin_n,
12
    rxioclk        => rx_bufpll_clk_xn,
13
    pattern1    => "00100001",      -- default values for 7:1 video applications
14
    pattern2    => "00100011",
15
    rx_serdesstrobe => rx_serdesstrobe,
16
    rx_bufg_pll_x1   => rx_bufg_x1,
17
    bitslip       => bitslip,
18
    reset         => reset,
19
    datain      => clk_iserdes_data,
20
    rx_bufpll_lckd  => rx_bufpll_lckd
21
  );
22
23
  not_bufpll_lckd <= not rx_bufpll_lckd ;
24
25
  datain : serdes_1_to_n_data_s8_diff
26
  generic map(
27
    S      => S,
28
    D      => D
29
  )
30
  port map (
31
    use_phase_detector  => '1',
32
    datain_p        => datain_p,
33
    datain_n        => datain_n,
34
    rxioclk          => rx_bufpll_clk_xn,
35
    rxserdesstrobe     => rx_serdesstrobe,
36
    gclk          => rx_bufg_x1,
37
    bitslip         => bitslip,
38
    reset         => not_bufpll_lckd,
39
    debug_in        => "00",
40
    data_out        => rxd,
41
    debug          => open
42
  );
Nun könnte ich mir gut vorstellen, dass sich was in der Statemachine 
aufhängt, wenn dies an einer ungünstigen Stelle passiert - oder es kommt 
zu irgend einem deadlock oder so...
Da müßte ich mich mal noch tiefer in das Template von Xilinx 
reinarbeiten.
Bisher habe ich es "nur benutzt" bzw. konfiguriert, wie es in der 
XAPP1064 beschrieben ist.

Morgen werden einige Tests beim Kunden vor Ort durchgeführt (bereits mit 
korrekt eingestelltem Speed Grade...).
Mal sehen, was diese Tests zeigen.
Ich habe auch noch einige Debug-Möglichkeiten eingebaut, mit denen ich 
von dem MicroBlaze aus an einigen Reset-Leitungen ziehen kann. Ich bin 
gespannt, welches Modul konkret zurück gesetzt werden muss, damit es 
wieder läuft...

Falls Ihr noch Ideen habt: bitte mitteilen. DANKE!

Ansonsten melde ich mich wieder, wenn ich mehr weiß

Viele Grüße,

Andreas

von SuperWilly (Gast)


Lesenswert?

Hast du bei dir im Labor einen Temperatur-Test gemacht?

von Andreas N. (poolspieler)


Lesenswert?

SuperWilly schrieb:
> Hast du bei dir im Labor einen Temperatur-Test gemacht?

Hallo SuperWilly,
danke für Deine Antwort!

Ja, ich habe die ganze Leiterplatte und vor allem natürlich das FPGA 
sowohl mit Kältespray, als auch mit einem Heißluftfön gequält.
--> leider konnte ich auch so den Fehler nicht reproduzieren...

Viele Grüße,

Andreas

von SuperWilly (Gast)


Lesenswert?

OK, wie sieht es mit der Spannungsversorgung (vor allem 
FPGA-Core-Spannung) aus? Kann die u.U. einen kritischen Wert 
unterschreiten?

von Andreas N. (poolspieler)


Lesenswert?

SuperWilly schrieb:
> OK, wie sieht es mit der Spannungsversorgung (vor allem
> FPGA-Core-Spannung) aus? Kann die u.U. einen kritischen Wert
> unterschreiten?

Naja, "eigentlich" würde ich das ausschliessen.
Die Spannungen werden auf dem Modul generiert:
http://www.trenz-electronic.de/fileadmin/docs/Trenz_Electronic/TE0600-GigaBee_series/TE0600/documents/SCH-TE0600-01.pdf
Versorgt wird es über 3,3V, die von einem DC/DC Wandler kommen.
Bei meinen EMV-Tests im Labor, ist hier keine Auffälligkeit aufgetreten.
Im Gegenteil: Selbst massive Spannungsschwankungen (verursacht durch das 
Labornetzteil) führten zu keinen Fehlern im FPGA.

Es ist wirklich seltsam.
Da läuft ein Frequenzumrichter in der Nähe meines Geräts. Wenn dieser an 
ist und ein Förderband mitläuft (welches wahrscheinlich zu 
elektrostatischen Entladungen neigt...), dann tritt der Fehler auf.
ABER: Mein Gerät ist NICHT elektrisch mit dem Förderband o.ä. verbunden.
Wenn überhaupt, dann kommt die Störung über die Luft, oder über die 
Masse rein. :-(

Viele Grüße,

Andreas

von ♪Geist (Gast)


Lesenswert?

Wo kommt der Takt her? Wenn der von der DCM kommt, kann sein, dass DCM 
sich aufhängt. Da hilft mit einem "langsamen" Takt "locked"-Signal zu 
überwachen.

von Andreas N. (poolspieler)


Lesenswert?

♪Geist schrieb:
> Wo kommt der Takt her? Wenn der von der DCM kommt, kann sein, dass DCM
> sich aufhängt. Da hilft mit einem "langsamen" Takt "locked"-Signal zu
> überwachen.

Hallo,
der Clock kommt (indirekt) von einem Quarzoszillator von KYOCERA 
KC7050Y250.000P30EZU.
Der Quarzoszillator geht auf den A/D-Wandler.
Und vom A/D-Wandler kommen dann sowohl Clock, als auch die Daten zum 
FPGA.

Viele Grüße,

Andreas

von SuperWilly (Gast)


Lesenswert?

Kannst du vor Ort ein Augendiagramm aufnehmen?
Vielleicht ist es schon relativ geschlossen, so dass es in einer rauhen 
Umgebung kurzzeitig "geschlossen" wird.
(Hilft es die "pre-emphasis" zu ändern?)

Kannst Du die Auswirkungen von Ground-Bouncing schaltungstechnisch 
reduzieren?

von SuperWilly (Gast)


Lesenswert?

Andere SMA-Kabel ausprobiert? :-)

von Christian R. (supachris)


Lesenswert?

Der Spartan 6 DCM/PLL ist ja etwas eigenwillig im Reset-Verhalten, 
vielleicht liegts daran? Da gibts im Clocking User Guide ein Kapitel 
über das richtige zurücksetzen bei Störung...

von Andreas N. (poolspieler)


Lesenswert?

SuperWilly schrieb:
> Kannst du vor Ort ein Augendiagramm aufnehmen?
> Vielleicht ist es schon relativ geschlossen, so dass es in einer rauhen
> Umgebung kurzzeitig "geschlossen" wird.
> (Hilft es die "pre-emphasis" zu ändern?)
>
> Kannst Du die Auswirkungen von Ground-Bouncing schaltungstechnisch
> reduzieren?

Hallo SuperWilly,
wenn ich KURZZEITIG keine oder korrupte Daten bekommen würde, dann wäre 
alles plausibel und verständlich.
Problem ist aber, dass ich nach der Störung ausschließlich Nullen 
bekommen - bis ich das SERDES-Modul zurück setze.
Vor Ort kann ich das Augendiagramm leider nicht aufnehmen (lassen)...

> Andere SMA-Kabel ausprobiert? :-)
Das wirklich "magische" ist ja, dass es reicht, eine 30cm kurze 
SMA-Leitung anzuschließen, die auf der anderen Seite OFFEN ist.

> Der Spartan 6 DCM/PLL ist ja etwas eigenwillig im Reset-Verhalten,
> vielleicht liegts daran? Da gibts im Clocking User Guide ein Kapitel
> über das richtige zurücksetzen bei Störung...
Ich werde mir das Kapitel mal anschauen.
Was denkst Du:
Wäre es möglich, dass ein gestörter DCM/PLL den SERDES so 
"durchschütteln" kann, dass nur noch Nullen kommen?
--> Ich hätte halt erwartet, dass in so einem Fall GAR KEINE Daten mehr 
kommen...

Viele Grüße,

Andreas

von Christian R. (supachris)


Lesenswert?

Andreas N. schrieb:
> Was denkst Du:
> Wäre es möglich, dass ein gestörter DCM/PLL den SERDES so
> "durchschütteln" kann, dass nur noch Nullen kommen?

Wenn der in den "Nicht-Locked" Zustand geht und dann dort verharrt, ja.

Andreas N. schrieb:
> Das wirklich "magische" ist ja, dass es reicht, eine 30cm kurze
> SMA-Leitung anzuschließen, die auf der anderen Seite OFFEN ist.

Hast du denn die DIFFTERM an den Eingängen auf TRUE gesetzt? Beim Clock 
auch?

von hans (Gast)


Lesenswert?

Andreas N. schrieb:
> Das wirklich "magische" ist ja, dass es reicht, eine 30cm kurze
> SMA-Leitung anzuschließen, die auf der anderen Seite OFFEN ist.

hi andreas, ohne von dem, was du da treibst, irgendeine ahnung zu haben: 
ein 30 cm langes leitungsstück ohne abschluss (also "offen") kann auf 
jeden fall bei den genannten frequenzen einen satten kurzschluss 
bewirken und ist ein absolutes no-no an den daten- oder clk leitungen. 
das musst du auch deinem klienten verklickern.
hol dir input von einem HF- spezialisten zu diesem problem, stichwörter 
sind "wellenwiderstand", "stichleitung". das ist nix magisches, das ist 
einfach nur hochfrequenztechnik ;o)
viel glück!
hans

von Weltbester FPGA Pongo (Gast)


Lesenswert?

Nun, da die 30cm Leitung wohl das Problem darstellt, kann es nur etwas 
Analoges sein. Ich sehe das auch kritisch, dass dort "offene" Leitungen 
angeschlossen werden, ...

.. aber ist das überhaupt so? Die Leitung wird doch sicher niederohmig 
getrieben, nehme ich mal an.

Wenn die umgeschaltet, umgesteckt oder oder sind wie kurz offen ist, 
wäre das ein klassisches hot plug Problem und damit nicht das Deinige 
:-)

von Andreas N. (poolspieler)


Lesenswert?

hans schrieb:
> Andreas N. schrieb:
>> Das wirklich "magische" ist ja, dass es reicht, eine 30cm kurze
>> SMA-Leitung anzuschließen, die auf der anderen Seite OFFEN ist.
>
> hi andreas, ohne von dem, was du da treibst, irgendeine ahnung zu haben:
> ein 30 cm langes leitungsstück ohne abschluss (also "offen") kann auf
> jeden fall bei den genannten frequenzen einen satten *kurzschluss*
> bewirken und ist ein absolutes no-no an den daten- oder clk leitungen.
> das musst du auch deinem klienten verklickern.
> hol dir input von einem HF- spezialisten zu diesem problem, stichwörter
> sind "wellenwiderstand", "stichleitung". das ist nix magisches, das ist
> einfach nur hochfrequenztechnik ;o)
> viel glück!
> hans

Hallo Hans,
vielen Dank für Deine Antwort.
Gaaaanz so schlimm ist es nicht.
Ein wenig weiß ich schon über Termination, Wellenwiderstand und 
Reflexionen auf Leitungen Bescheid... Wenn mein Wissen dazu auch gerne 
mehr sein dürfte... :-)

Zu Deinem Hinweis:
Die 30cm Leitung ist der ANALOGE Eingang des A/D-Wandlers. Dort liegt 
normalerweise das analoge Signal an.
Intern habe ich diese Leitung (Eingangsseitig) mit 100 Ohm 
abgeschlossen.

Die digitalen Leitungen des Datenbusses vom A/D-Wandler zum FPGA sind 
mit relativ schönen, möglichst gleich langen (inkl. Meander) 
differentiellen LVDS-Pärchen auf der Leiterplatte geroutet.

zu den "offenen Leitungen":
Dieser Test wurde AUSSCHLIEßLICH zur Fehlereingrenzung gemacht.
Ich habe zuerst veranlasst, dass alle 24V-Signale von der SPS entfernt 
werden. --> Problem trat trotzdem auf.
Dann die digitalten Ausgänge von meinem Gerät. --> Problem trat trotzdem 
auf.
Erst dann wurden TESTWEISE die SMA-Leitungen der Analogeingänge 
entfernt.
Nachdem diese Leitungen (inklusive dem Treiber auf der anderen Seite...) 
nicht an meinem Gerät angeschlossen waren, trat das Problem nicht mehr 
auf.
Dann hat man TESTWEISE eine offene SMA-Leitung angeschlossen --> und das 
Problem tritt immer noch auf --> es hätte ja auch sein können, dass der 
Treiber auf der anderen Seite der SMA-Leitung die Ursache ist --> das 
ist aber nicht der Fall.
Es tritt AUCH auf, wenn die 30cm SMA-Leitung auf der zweiten Seite mit 
75Ohm (ein anderer Abschlusswiderstand ist gerade nicht verfügbar...) 
abgeschlossen wird.
Und wie gesagt: es ist ja intern immernoch ein 100 Ohm Widerstand gegen 
Masse angeschlossen.

Viele Grüße,

Andreas

von Andreas N. (poolspieler)


Angehängte Dateien:

Lesenswert?

Heute wurden weitere Tests gemacht.
Ergebnis:
1. Der Speed Grade war NICHT die Ursache (wie weiter oben schon 
erwartet).
2. Wenn ich die SERDES vor jeder Messung automatisch Resette, dann tritt 
das Problem nicht auf. Bzw.: Wenn es auftritt, dann ist nur eine einzige 
Messung betroffen. Bei der nächsten Messung (nach dem nächsten Reset) 
ist dann wieder alles OK. --> Als Workaround kann ich nun die 
Plausibilität der Messung überprüfen und ggf. Fehlmessungen ignorieren.

Als nächster Schritt wird dann wohl eine saubere Entflechtung anstehen. 
Ich hoffe, dass dann die Probleme behoben sind.
Die Reset-Lösung werde ich dann trotzdem noch aktiv lassen --> so kann 
ich ausschließen, dass das System in einen "Deadlock" kommt.

Ich habe Euch auch ein Bild der wahrscheinlichen Quelle des Irrsinns 
angehängt. Also ich meine natürlich den 250MHz Oszillator, der zu dem 
A/D-Wandler gefädelt ist.
Und bevor jemand schreit: Ich weiß, dass das ganz schlimm ist und man 
das nicht machen darf. Aber es ging halt in der kürze der Zeit nicht 
anders...
Und auch wie gesagt: Ich hätte halt mit irgendwelchen Bitfehlern 
gerechnet - aber nicht mit solch einem "gemeinen" Verhalten...


Viele Grüße,

Andreas

von Weltbester FPGA Pongo (Gast)


Lesenswert?

(Wie) ist dein 250MHz Oszillator terminiert, der in den FPGA geht?

Sind die anlogen Leitungen differenziell oder single ended mit GND, dann 
kann sich der was "ziehen".

Kann es sein, dass dein ADC eine eigene PLL hat und die kurzzeitg 
ausfällt?

Dass der SERDES garnichts liefert, ist komisch. Wenn, dann läuft da ein 
bit über und fällt über den overflow oder es klappt der bit slip nicht.

Ist das ein automatisch generierter SERDES? Dort gab es ja schon öfters 
mal Probleme, wenn das mit CoreGEn gemacht wurde. Besser ist es per Hand 
die Master-Slave-Kombi zu setzen.

von Andreas N. (poolspieler)



Lesenswert?

Weltbester FPGA Pongo schrieb im Beitrag #3102585:
> (Wie) ist dein 250MHz Oszillator terminiert, der in den FPGA geht?
Der ist über die im FPGA integrierten 100 Ohm Widerstände terminiert.
Alle differentiellen LVDS Pärchen habe ich so terminiert.
In der UCF-Datei:
DIFF_TERM = TRUE | IOSTANDARD = LVDS_33

> Sind die anlogen Leitungen differenziell oder single ended mit GND, dann
> kann sich der was "ziehen".
Die kommen single ended über eine Coax-Leitung an --> das war (leider) 
eine Vorgabe des Kunden.

> Kann es sein, dass dein ADC eine eigene PLL hat und die kurzzeitg
> ausfällt?
Soweit ich weiß, hat der kein PLL.

> Dass der SERDES garnichts liefert, ist komisch. Wenn, dann läuft da ein
> bit über und fällt über den overflow oder es klappt der bit slip nicht.
Das ist nicht ganz richtig:
Der SERDES liefert ja Daten - aber halt nur Nullen.

> Ist das ein automatisch generierter SERDES? Dort gab es ja schon öfters
> mal Probleme, wenn das mit CoreGEn gemacht wurde. Besser ist es per Hand
> die Master-Slave-Kombi zu setzen.
Ich habe den nicht über den CoreGen generiert.
Ich habe die templates von der XAPP1064 verwendet.
Ich habe die zwei Dateien für clk und data mal angehängt.

Viele Grüße,

Andreas

von Christian R. (supachris)


Lesenswert?

Andreas N. schrieb:
> Als nächster Schritt wird dann wohl eine saubere Entflechtung anstehen.
> Ich hoffe, dass dann die Probleme behoben sind.

Dann aber möglichst gleich so, dass du die PLL rauswerfen kannst und wie 
oben geschrieben alles auf einer halbe Bank hast, DCO auf einen GCLK. 
Dann hast du die wenigsten Probleme und brauchst den ganzen 
Kladderadatsch nicht.

von Andreas N. (poolspieler)


Lesenswert?

Hallo Christian,
ich befürchte, das ich (aus Zeitgründen) bei dem Xilinx-Modul bleiben 
werde. Ich werde also "nur" das EVA-Board von ANALOG neu entflechten.
Das heißt, ich werde wohl oder übel auch bei dem PLL bleiben müssen. :-(

Ich habe mir die Konfiguration (per SPI-Bus) des A/D-Wandlers nochmal 
angeschaut.
Der hat einen DCS (Duty cycle stabilizer) --> dieser ist standardmäßig 
aktiviert.

Auszug aus dem Datenblatt:
1
A wait time of 1.5 μs to 5 μs is required after a dynamic clock frequency increase or decrease before the DCS loop is relocked to the input signal.
2
During the period that the loop is not locked, the DCS loop is bypassed, and internal device timing is dependent on the duty cycle of the input clock signal.
3
In such applications, it may be appropriate to disable the duty cycle stabilizer.
4
In all other applications, enabling the DCS circuit is recommended to maximize ac performance.

Ich könnte mal probieren, den DCS zu deaktivieren...

Viele Grüße,

Andreas

von Lattice User (Gast)


Lesenswert?

Ich bin nicht davon überzeugt, dass es da überhaupt eine PLL brauchst, 
trotz der ungünstigen Pinverteilung. Letztendlich sind 250 MHz noch 
nicht so viel, und ausserdem hast du wegen dem ADC Timing fast 0.5 ns 
Luft, die die Clock im FPGA verzögert sein darf. (Vorrausgesetzt durch 
das Boardlayout gibt es keinen Skew)
Auch 1:8 Gearing ist deswegen Overkill.

Auf der Analog webseite gibt es für den AD9643 Sample code (na gut in 
Verilog statt VHDL).

ftp://ftp.analog.com/pub/HSSP_SW/fpga/AD9643_data_capture_rtl.zip

Da wird direkt ein IDDR instanziert, wie das in VHDL geht siehst du 
hier:
Beitrag "Generic Map IDDR"

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.