Forum: FPGA, VHDL & Co. CPLD lässt sich nicht "im Betrieb" programmieren


von Simon K. (simon) Benutzerseite


Lesenswert?

Hallo,
Ich habe hier Probleme damit einen XC9572XL zu programmieren. Am 
"Anfang" des Designs ging das noch problemlos.
Aber sobald das Design jetzt größer wurde*, schlagen längere Befehle, 
wie Erase, Program, Verify oder Readback im iMPACT fehl. "Get Device Id" 
funktioniert hingegen problemlos.

Als Programmierkabel kommt ein USB-JTAG Programming Cable von Digilent 
zum Einsatz. Die Kabellänge beträgt ca. 5cm.

Das Problem äußert sich wie folgt: Klicke ich auf "Erase", dann versucht 
iMPACT den CPLD zu löschen, hängt sich dabei aber auf. Auch nach einem 
Klick auf "Abort" will es unbedingt die Operation abschließen. Nur ein 
Neustart und Neu-Einstecken des USB Kabels hilft.

Mein Design hat eine 33kHz Taktquelle, die mit einem 74HC14 als 
Relaxation Oscillator ausgeführt ist.

Die Versorgungsspannung direkt am CPLD mit Ground Spring sieht exzellent 
aus. Mit AC-Kopplung sehe ich ein Ringing im 33kHz Takt von ca +/- 20mV 
im Betrieb.

Daraufhin fand ich folgendes in einer Xilinx Appnote:
----
In some cases, XC9500/XL/XV designs appear to experience erase time or 
programming time
extension as the design progresses — particularly for long chains. This 
extension is probably
due to the fact that parts being reprogrammed have a large number of 
switching signals arriving
at its inputs, which differs from the initial case where a blank part is 
being programmed.
[...]
• If free running clocks are delivered into the ISP CPLD, it might be 
necessary to disconnect
or disable the clocks in order to avoid clock noise during CPLD 
programming.
----

Und tatsächlich, sobald ich den 74HC14 mal aus der Fassung herausnehme, 
funktioniert das Programmieren wieder.

Der CPLD steuert insgesamt 4 IR2110 Halbbrückentreiber, die mit 15V 
versorgt werden. Hinter den Treibern sind MOSFET Brücken, an die aber 
keinerlei Last angeschlossen ist.
Während des Betriebs bricht die 15V Versorgungsspannung ungefähr um 
+40mV/-180mV ein (kommt aus einem Schaltregler).

Ein Test ohne Halbbrückentreiber (MOSFETs haben Pulldown am Gate) ergab, 
dass sich das Gerät ebenfalls wieder programmieren lässt.

Jetzt stellt sich mir die Frage, warum der CPLD sich nicht mehr 
"gescheit" programmieren lässt. Die Versorgungsspannung ist nach wie vor 
sehr ripple-frei.

Hat jemand Erfahrung mit solchen Problemen? Wie siehts aus mit externen 
JTAG Pull-Up/Down Widerständen? Muss man hier was optimieren?

Vielen Dank schon mal. Auch in der Erwartung, dass da wohl so niemand 
was zu sagen kann ;-)

Nachtrag: Das verwendete WebPack ist 13.1. Aber auch mit dem iMPACT aus 
14.1. erhalte ich die gleichen Symptome.

Ich habe auch einen IDCODE-Looping Test ausgeführt. Dabei gibt es 
keinerlei Problem:
'1': IDCODE loop completed successfully 10000 times.
PROGRESS_END - End Operation.
Elapsed time =      5 sec.

*
41/72 Macrocells Used
147/360 Pterms Used
25/72 Registers Used
26/34 Pins Used
56/216 Function Block Inputs Used

von user (Gast)


Lesenswert?

hast du mal versucht eine kleinere JTAG frequenz einzustellen?

von Simon K. (simon) Benutzerseite


Lesenswert?

Habe ich versucht und es gibt teilweise eine subjektive Verbesserung. 
Aber bei voll bestückten Gate-Treibern bringt auch 750kHz (Minimum 
Takt?) das oben genannte Verhalten.

von Ernst Gemeint (Gast)


Lesenswert?

Wie sieht denn Deine Versorgungsspannung waehrend dem Programmieren aus?

von Uwe (Gast)


Lesenswert?

Versuch bei dem 74hc14 doch die Oszillation durch das TMS Signal zu 
sperren (z.B. durch zusätzlichen Transistor der von TMS gesteuert wird).

von Simon K. (simon) Benutzerseite


Lesenswert?

Ernst Gemeint schrieb:
> Wie sieht denn Deine Versorgungsspannung waehrend dem Programmieren aus?

Muss ich mal versuchen zu messen. Da der Löschvorgang ja (zumindest laut 
iMPACT) nicht fortschreitet, fragt sich, wie ich das messen soll. Hm.

Uwe schrieb:
> Versuch bei dem 74hc14 doch die Oszillation durch das TMS Signal zu
> sperren (z.B. durch zusätzlichen Transistor der von TMS gesteuert wird).

Auf so "krude" Methoden wollte ich erst mal verzichten. Möglicherweise 
befindet sich ja tatsächlich irgendwo noch ein Problem auf dem Layout.
Ich weiß nur nicht so recht, wo ich anfangen soll zu suchen.

Komisch finde ich, dass Xilinx den IDCODE-Loop Test vorschlägt um 
herauszufinden, wie viel System Noise so vorhanden ist. Selbst mit 
100.000 Iterationen (Knapp 53 Sekunden) ist der Test erfolgreich.
Also vermute ich mal nicht, dass hier das Problem liegt.

Möglicherweise ist das USB Programming Cable von Digilent da etwas 
anfällig gegen Störungen? Oder vielleicht der USB vom PC zum Gerät.

von Uwe (Gast)


Lesenswert?

This
extension is probably
due to the fact that parts being reprogrammed have a large number of
switching signals arriving
at its inputs, which differs from the initial case where a blank part is
being programmed.
[...]
• If free running clocks are delivered into the ISP CPLD, it might be
necessary to disconnect
or disable the clocks in order to avoid clock noise during CPLD
programming.

Sagt doch alles oder :

frei Übersetzt:
Dies kommt warscheinlich daher, daß der Takt auf zu viele interne inputs 
geht. Das gleichzeitige Umschalten dieser scheint den 
Konfigurationsprozes zu stören.
Wenn frei laufende Takte ins ISP CPLD gehen, könnte es erforderlich sein 
diese zu deaktivieren oder zu entfernen um Takt Störungen zu verhindern 
wärend der Programmierung.

von Uwe (Gast)


Lesenswert?

Man könnte eventuell ein "Clock enable" im internen Clock tree einbauen 
(also direkt nach dem 74hc14), der alle clock inputs vom Pin trennt. 
Dann braucht man nichts im Layout zu verändern.

von Simon K. (simon) Benutzerseite


Lesenswert?

Uwe schrieb:
> Dies kommt warscheinlich daher, daß der Takt auf zu viele interne inputs
> geht. Das gleichzeitige Umschalten dieser scheint den
> Konfigurationsprozes zu stören.

Hmm, okay. Also exakt so habe ich es noch nicht gesehen. Daher halte ich 
deine Lösung:

Uwe schrieb:
> Man könnte eventuell ein "Clock enable" im internen Clock tree einbauen
> (also direkt nach dem 74hc14), der alle clock inputs vom Pin trennt.
> Dann braucht man nichts im Layout zu verändern.

... für praktikabel. Das werde ich mal testen. Ein ENABLE Pin hat mein 
Layout sowieso

Aber ich finde es schon komisch, dass der JTAG Reset nicht sowieso alle 
Eingänge von der internen Logik trennt. Einen Mikrocontroller kann ich 
doch auch im RESET halten, damit er sich programmieren lässt.

Deshalb auch meine Frage: Gibts Leute, die das Problem schon mal hatten?

von Simon K. (simon) Benutzerseite


Lesenswert?

Also funktionieren tut der Hack mit dem internen Clock-Gating. Aber ich 
finde es trotzdem irgendwie sehr unschön.

Komisch ist, dass ich im Netz überhaupt nichts zu dem Problem gefunden 
habe, außer eben diese AppNote. Woran das wohl liegt?

Vielleicht kann jemand noch etwas Licht ins Dunkle bringen?

von W.S. (Gast)


Lesenswert?

Versuch doch mal, dir ein grottenaltes "Parallelkabel-3" zu bauen und zu 
benutzen. Ist im Prinzip nur ein simpler Bustreiber und funktioniert 
zumindest bis zur ISE Version 10 problemlos. Welche ISE Version hast du 
denn?

Mit so einem Ding (an ner Netmos-Multi-IO Karte) werkele ich und hab 
bislang noch nie damit Probleme gehabt. Kabellänge vom Bustreiber zur 
Leiterplatte so etwas 20..25 cm und dort nochmal ca. 5..10 cm 
Leiterzüge.

Allerdings werkeln die  XC95..XL bei meinen Anwendungen mit Takten im 
Bereich von 10..50 MHz.

Ach nochwas: Die Netmos-Karten arbeiten auf 3.3Volt. Also sollte man dem 
Bustreiber aka "Parallelkabel" auch nur so viel als Vcc geben.

W.S.

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.