Forum: FPGA, VHDL & Co. CPLD ATF1504 sporadisch seltsames Verhalten nach Einschalten


von Alex (johnrambo86)


Lesenswert?

Hallo zusammen,

Ich habe mit diesem CPLD das Problem dass er sehr selten (geschätzt 1-2% 
aller Fälle) nach dem Einschalten nicht richtig funktioniert.
Konkret ist er zwar am Leben, einfache Zuweisungen wie Ausgang = Eingang 
funktionieren aber getaktete FlipFlops werden einfach nicht mehr 
gesetzt.

Der Code ist ziemlich simpel, kann ich bei Bedarf posten. Im Prinzip 
soll einfach nur der Ausgang auf 0 gehen und auf 0 bleiben wenn einer 
der vier einzeln aktivierbaren Eingänge abfällt. Per Reset Taster kann 
das ganze quittiert werden. Darüber hinaus wird ausgegeben welcher 
Eingang der erste war der abgefallen ist.

Wenn der Fehlerfall eintritt bleibt der Ausgang einfach für immer 1 egal 
was die Eingänge machen.
Ansonsten funktioniert das Ganze ohne Probleme.


Im Datenblatt habe ich was über "Power-up reset" gefunden.
Wenn ich diesen Satz
1
After reset occurs, all input and feedback setup times must be met before driving the clock pin high, and

richtig interpretiere, darf der Takt erst loslegen wenn der Kollege mit 
initialisieren fertig ist.
Habe ich das richtig verstanden und kann das die Ursache für mein 
Problem sein?

Vielen Dank schonmal

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Alex schrieb:
> darf der Takt erst loslegen wenn der Kollege mit initialisieren fertig ist.
Ist an der Taktgenerierung ein Taktmanger beteiligt?

> nach dem Einschalten nicht richtig funktioniert.
Wie sieht die Versorgungsspanunng beim Einschalten aus? steigt die in 
vernünftiger Zeit stetig an? Oder sind da irgendwelche Stufen und Zacken 
drin?

> Habe ich das richtig verstanden
Ich sehe es so, dass allgemein immer alle Setup- und Hold-Zeiten 
eingehalten sein müssen, bevor die aktive Taktflanke kommt. Und eben 
natürlich auch beim ersten Taktimpuls.

> Der Code ist ziemlich simpel, kann ich bei Bedarf posten.
Mach mal.

> dass er sehr selten (geschätzt 1-2% aller Fälle)
Wenn du mal 10000 Geräte draußen hast, dann starten täglich mindestens 
100 davon nicht. Ich hätte da ein Problem, denn der Kundendienst würde 
meinen, das wäre durchaus "sehr häufig"...  ;-)

: Bearbeitet durch Moderator
von DSGV-Violator (Gast)


Angehängte Dateien:

Lesenswert?

Alex schrieb:

> Im Datenblatt habe ich was über "Power-up reset" gefunden.
> Wenn ich diesen Satz
>
>
1
> After reset occurs, all input and feedback setup times must be met 
2
> before driving the clock pin high, and
3
>
>
> richtig interpretiere, darf der Takt erst loslegen wenn der Kollege mit
> initialisieren fertig ist.

Ist das nicht ein klassisches PLD, das garnicht initialisiert im 
FPGA-Sinne?
Da heisst es lediglich, das der Reset resp. Global clear GCLR (pin 89) 
sauber und lang genug sein muss. Ist das Programmierinterface sauber 
deaktiviert oder kann sich da ein floatender Input "was einfangen"?

Da ein Datenblatt aus der Familie (kann natürlich das falsche sein, 
falls dein chip anderes Gehäuse/Spannungsbereiche hat)
https://ww1.microchip.com/downloads/en/DeviceDoc/ATF1504ASV-ATF1504ASVL-Data-Sheet-20006185A.pdf

Das "clock stable" im angehangenen schnipsel würde ich jetzt so lesen, 
das der Takt eingeschwunken ist, also schon mit der richtigen Frequenz 
schwingt. Aber nicht, das garnichts auf der Leitung passiert.

PS:
aus den Forumsarchiven:
Beitrag "Problem mit CPLD ATF1504"
Beitrag "ATF15xx Programmer"
Beitrag "[CPLD] Brauche Empfehlung für CPLDs / Software"

von Alex (johnrambo86)


Angehängte Dateien:

Lesenswert?

Also Danke schonmal für die Antworten, hier noch der Code :
1
PROPERTY ATMEL {TDI_pullup = ON};
2
PROPERTY ATMEL {TMS_pullup = ON};
3
/*PROPERTY ATMEL {power_reset = ON};*/
4
/*PROPERTY ATMEL {pin_keep OFF};*/
5
6
ar = 'b'0 ;
7
8
/* inputs */
9
PIN 43 = clk;
10
11
PIN 40 = I1;
12
PIN 4 = I2;
13
PIN 5 = I3;
14
PIN 6 = I4;
15
16
PIN 8 = M1;
17
PIN 9 = M2;
18
PIN 12 = M3;
19
PIN 14 = M4;
20
21
PIN 17 = XLOCK;
22
PIN 16 = RST;
23
24
25
PIN 36 = EXPANDIN;
26
PIN 39 = FVLOCKIN;
27
PIN 41 = FVLOCKOUT;
28
29
30
31
/* outputs */
32
PIN 29 = FV1n;
33
PIN 31 = FV2n;
34
PIN 33 = FV3n;
35
PIN 34 = FV4n;
36
37
PIN 24 = S1n;
38
PIN 26 = S2n;
39
PIN 27 = S3n;
40
PIN 28 = S4n;
41
42
PIN 18 = ST1;
43
PIN 19 = ST2;
44
PIN 20 = ST3;
45
PIN 21 = ST4;
46
47
PIN 37 = INTERLOCK;
48
49
NODE Reset;
50
NODE S5;
51
Node MS1;
52
Node MS2;
53
Node MS3;
54
Node MS4;
55
Node EXP;
56
57
58
/* sequential logic */
59
60
Reset = RST & (( MS1 & I1) # !MS1) & (( MS2 & I2) # !MS2) & (( MS3 & I3) # !MS3) & (( MS4 & I4) # !MS4) & XLOCK;
61
62
FV1n.D = ((!FV1n & !FV2n & !FV3n & !FV4n & !I1 & MS1)) & !FVLOCKIN # (FV1n & !Reset);
63
FV1n.ck = clk;
64
FV1n.ar = ar ;
65
FV2n.D = ((!FV1n & !FV2n & !FV3n & !FV4n & !I2 & MS2)) & !FVLOCKIN # (FV2n & !Reset);
66
FV2n.ck = clk;
67
FV2n.ar = ar ;
68
FV3n.D = ((!FV1n & !FV2n & !FV3n & !FV4n & !I3 & MS3)) & !FVLOCKIN # (FV3n & !Reset);
69
FV3n.ck = clk;
70
FV3n.ar = ar ;
71
FV4n.D = ((!FV1n & !FV2n & !FV3n & !FV4n & !I4 & MS4)) & !FVLOCKIN # (FV4n & !Reset);
72
FV4n.ck = clk;
73
FV4n.ar = ar ;
74
S1n.D = (!I1 & MS1 & !S1n) # (!Reset & S1n);
75
S1n.ck = clk;
76
S1n.ar = ar ;
77
S2n.D = (!I2 & MS2 & !S2n) # (!Reset & S2n);
78
S2n.ck = clk;
79
S2n.ar = ar ;
80
S3n.D = (!I3 & MS3 & !S3n) # (!Reset & S3n);
81
S3n.ck = clk;
82
S3n.ar = ar ;
83
S4n.D = (!I4 & MS4 & !S4n) # (!Reset & S4n);
84
S4n.ck = clk;
85
S4n.ar = ar ;
86
87
MS1.D = M1;
88
MS1.ck = clk;
89
MS1.ar = ar;
90
91
MS2.D = M2;
92
MS2.ck = clk;
93
MS2.ar = ar;
94
95
MS3.D = M3;
96
MS3.ck = clk;
97
MS3.ar = ar;
98
99
MS4.D = M4;
100
MS4.ck = clk;
101
MS4.ar = ar;
102
103
/* CHANNEL 5 (EXTERNAL INTERLOCK) */
104
S5.D = (!XLOCK & !S5) # (!Reset & S5);
105
S5.ck = clk;
106
S5.ar = ar ;
107
108
109
ST1 = I1;
110
ST2 = I2;
111
ST3 = I3;
112
ST4 = I4;
113
114
FVLOCKOUT = (FV1n # FV2n # FV3n # FV4n # S5 # FVLOCKIN) & !RST;
115
116
/* combinatorial logic */
117
INTERLOCK = !FV1n & !FV2n & !FV3n & !FV4n & !S5 & EXPANDIN;

Anbei noch ein Screenshot vom Oszi (Einschaltmoment)
Grün: Versorgungsspannung
Gelb: Takt

von Johann K. (klammerj)


Lesenswert?

Da ist dann halt die Frage wo die Schaltschwellen liegen. Evtl einen 
cmos buffer davor um den Hub zu erhöhen. Oder gleich einen schaltbaren
clock buffer, und erst einschalten nachdem es eingeschwungen ist.

: Bearbeitet durch User
von DSGV-Violator (Gast)


Lesenswert?

Falls es an Spannungseinbrücjen auf  der mistigen Stromversorgung liegt, 
kannste durch Aktivierung der Zeile 3 mglw. Erfolg haben.

https://www.microchip.com/content/dam/mchp/documents/FPGA/pld-design-resources/Atmel-8989-CPLD-ATF15-POR-Hysteresis_Application-Note.pdf

Die Masseanbindung am Osszilator scheint nicht besonders gut zu sein 
(scope).

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Alex schrieb:
> Anbei noch ein Screenshot vom Oszi (Einschaltmoment)
> Grün: Versorgungsspannung
> Gelb: Takt
Welche analoge Bandbreite hat das Oszi (die Zacke beim Einschalten lässt 
"ausreichend" vermuten)? Warum rappelt die Versorgung so stark und hat 
nur wenig mehr als 4V? Welche Frequenz hat der Oszillazor und welche 
Zeitbasis der "Screenshot"? Sind das 1komma000 oder 1tausend ms/div? 
Sehen wir da nur Aliasing?

Wenn das wirklich das echte Taktsignal ist, dann solltest du das 
unbedingt mal gegen die Anforderungen im Dstenblatt vergleichen.

von Alex (johnrambo86)


Lesenswert?

Lothar M. schrieb:
> Alex schrieb:
>> Anbei noch ein Screenshot vom Oszi (Einschaltmoment)
>> Grün: Versorgungsspannung
>> Gelb: Takt
> Welche analoge Bandbreite hat das Oszi (die Zacke beim Einschalten lässt
> "ausreichend" vermuten)? Warum rappelt die Versorgung so stark und hat
> nur wenig mehr als 4V? Welche Frequenz hat der Oszillazor und welche
> Zeitbasis der "Screenshot"? Sind das 1komma000 oder 1tausend ms/div?
> Sehen wir da nur Aliasing?
>
> Wenn das wirklich das echte Taktsignal ist, dann solltest du das
> unbedingt mal gegen die Anforderungen im Dstenblatt vergleichen.

Taktfrequenz sind 50 MHz. Keine Ahnung warum das da nur 4V sind wundert 
mich auch grad, es sind definitiv stabile 5.
Die Messung hat der Kollege zuhause gemacht ich mach das heute hier 
nochmal und poste einen Screenshot.


DSGV-Violator schrieb:
> Falls es an Spannungseinbrücjen auf  der mistigen Stromversorgung liegt,
> kannste durch Aktivierung der Zeile 3 mglw. Erfolg haben.
>
> 
https://www.microchip.com/content/dam/mchp/documents/FPGA/pld-design-resources/Atmel-8989-CPLD-ATF15-POR-Hysteresis_Application-Note.pdf

Hatte damit mal experimentiert und konnte das Verhalten danach nicht 
mehr beobachten (kommt ja aber auch sehr selten vor). Habe es aber 
wieder deaktiviert da das laut dem Dokument nur für die 3.3V Version 
empfohlen wird. So ganz kapiert hab ich auch nicht was das genau 
bewirkt?

Lothar M. schrieb:
>> Habe ich das richtig verstanden
> Ich sehe es so, dass allgemein immer alle Setup- und Hold-Zeiten
> eingehalten sein müssen, bevor die aktive Taktflanke kommt. Und eben
> natürlich auch beim ersten Taktimpuls.

Könnte das dann schon die Lösung sein? werde mal versuchen den 
Taktgenerator separat zu versorgen und dann erst den CPLD. wenn der 
Fehler dann immer oder zumindest häufig vorkommt war es das wohl

von Thorsten S. (thosch)


Lesenswert?

Alex schrieb:
> werde mal versuchen den
> Taktgenerator separat zu versorgen und dann erst den CPLD. wenn der
> Fehler dann immer oder zumindest häufig vorkommt war es das wohl

Es ist allerdings gar keine gute Idee, schon irgendwelche 
Eingangssignale (egal ob dynamisch oder statisch) an ein CPLD anzulegen, 
bevor dessen Betriebsspannung anliegt.
Die Datenblätter verbieten dass üblicherweise auch.
Kann im ungünstigsten Fall zum Latchup und darüber zur Zerstörung 
führen.
Moderne ICs sind zwar nicht mehr so empfindlich dafür, aber riskieren 
würde ich das nicht.

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Alex schrieb:
> Taktfrequenz sind 50 MHz.
Also Aliasing.

> Keine Ahnung warum das da nur 4V sind wundert mich auch grad, es sind
> definitiv stabile 5.
Also Messfehler.

> Die Messung hat der Kollege zuhause gemacht ich mach das heute hier
> nochmal und poste einen Screenshot.
Aber wenn das Screenshot-Tool auf dem PC nicht funktioniert, dann bitte 
wenigstens ohne Blitz... :-/

Alex schrieb:
> werde mal versuchen den Taktgenerator separat zu versorgen und dann erst
> den CPLD.
Das ist allerdings ungünstig, weil du damit die "Absolute Maximum 
Ratings" des CPLDs sicher verletzt. Denn im ausgeschalteten Zustand ist 
Vcc des CPLDs 0V, und du darfst aber nicht mehr als Vcc+0,3V am 
irgendeinem Pin anlegen. Wenn dein Oszillator dann also dauernd 
wiederholt 0V-5V-0V-5V-usw ausgibt, dann sind diese 5V mehr als die 
erlaubten 0,3V. Was dabei dann passiert, nennt sich "parasitäre 
Versorgung über Schutzdioden":
- https://www.google.com/search?q=parasitäre+Versorgung+über+Schutzdiode

: Bearbeitet durch Moderator
von DSGV-Violator (Gast)


Angehängte Dateien:

Lesenswert?

>> Falls es an Spannungseinbrücjen auf  der mistigen Stromversorgung liegt,
>> kannste durch Aktivierung der Zeile 3 mglw. Erfolg haben.
>>
>>
> 
https://www.microchip.com/content/dam/mchp/documents/FPGA/pld-design-resources/Atmel-8989-CPLD-ATF15-POR-Hysteresis_Application-Note.pdf
>
> Hatte damit mal experimentiert und konnte das Verhalten danach nicht
> mehr beobachten (kommt ja aber auch sehr selten vor). Habe es aber
> wieder deaktiviert da das laut dem Dokument nur für die 3.3V Version
> empfohlen wird. So ganz kapiert hab ich auch nicht was das genau
> bewirkt?

Ich verstehe es so, das mit der Einstellung die Versorgungsspannung 
stärker (<0.7V) sinken kann bevor ein reset im Chip ausgelöst wird.
Das kann man mit einem externen Labornetzteil gut testen.
Damit bleiben aber zwei problem:

* Warum sinkt die Spannungsversorgung so stark ab? (ein CPLD zieht recht 
viel strom, vielleicht hilf ein C nah am CPLD.

* Warum kommt die Logik nicht aus dem Resetzustand raus

* Und dann frage ich mich ,ob es bei der Beschreibung der internen 
reset-leitung im Code vor den Klammern nicht  '|' statt '&' heissen 
sollte weil der reset high-aktiv ist.

von Alex (johnrambo86)


Lesenswert?

Hallo nochmal,

habe das ganze jetzt komplett anders gelöst bzw. umgangen.
Da ja scheinbar nur getaktete Variablen / FlipFlops betroffen sind, hab 
ich den Code so umgeschrieben, dass der Takt komplett überflüssig wird.
Im Prinzip wollte ich ja von Anfang an SR FlipFlops, das hat aber 
irgendwie nicht funktioniert bzw. wurde vom Compiler nicht akzeptiert.

So sieht ein FF jetzt exemplarisch aus:

FV1.D = false;
FV1.ck = false;
FV1.ar = Reset ;
FV1.ap = (!FV1 & !FV2 & !FV3 & !FV4 & !I1 & MS1) & !FVLOCKIN;

also die D und Takt Eingänge einfach fest auf 0, .ap (asynchronous 
Preset) zum setzen und .ar (asynchronous Reset) zum rücksetzen. 
funktioniert wunderbar und meine Probleme sind hoffentlich Geschichte.

Danke nochmal an alle.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

50 MHz ist schon recht viel für die ATF15xx. Die "Properties" sind 
leider nirgends komplett aufgelistet.
In der Fitter-Beschreibung heissen sie "strategy"

Ich habe mal einen ATF1508AS in WinCUPL abgeändert, der machte mit einer 
neueren Charge plötzlich Probleme:

Device    f1508ispqfp100;
//Compiliere mit folgenden Einstellungen :
//Minimation = None, Optimation = Nichts
Property Atmel {Preassign = Keep};
PROPERTY ATMEL {pin_keep = OFF} ;
PROPERTY ATMEL {JTAG = ON};
PROPERTY ATMEL {TDI_PULLUP = ON};
PROPERTY ATMEL {TMS_PULLUP = ON};
PROPERTY ATMEL {OUTPUT_FAST ON};
PROPERTY ATMEL {MC_POWER = ON};

Speziell OUTPUT_FAST könnte noch helfen. Der lässt sich im Gegensatz zu 
den Beschreibungen nicht für jeden Pin individuell einstellen.

: Bearbeitet durch User
von Christoph db1uq K. (christoph_kessler)


Angehängte Dateien:

Lesenswert?

Hier vier alte Beschreibungen der Atmel-Property-Einstellungen.

Es gab anscheinend auch einen eigenständigen "Fitter" unabhängig vom 
CUPL oder anderen Hardware-Programmiersprachen. Nach dem Compilieren 
erhält man einen .FIT-Report, in dem man die tatsächlich eingestellten 
Properties sieht. Beschreibung dazu ab S. 43 der fit_app0.pdf 
"Interpreting the Fitter Log File". Das mit "slow" oder "fast" hat mit 
Wincupl nicht einzeln funktioniert, der Schalter FAST stellt alle 
identisch um.

In den Release notes sind die "strategies" gelistet, hier soll man 
angeblich Pins einzeln schalten können:
-strategy output_fast [ on | OFF | = pin1, pin2, ..]

: Bearbeitet durch User
von Christoph db1uq K. (christoph_kessler)


Lesenswert?

In meinem Fall war ein PLL-Oszillator für 20-40 MHz an einem Eingang des 
ATF1508 angeschlossen, durchlief darin nur etwa drei Gatter und sollte 
dann unverändert wieder herauskommen. Von 20-35 MHz funktionierte das 
immer noch, aber darüber gab es (auch temperaturabhängig) Probleme. Die 
Triggerschwelle des Eingangs war kritisch, auch weil der PLL-Oszillator 
nicht ganz die gewünschten 5V-Rechtecke liefert. Am Ausgang kam dann nur 
noch eine zu kleine Amplitude heraus.

Versuche mit AC-Kopplung und Einstellung des DC-Arbeitspunkts mit 
"Klemmdiode" waren auch nicht zuverlässig. Erfolg brachte erst eine 
zwischengeschaltete Platine mit zwei TTL-Einzelgattern, die den Pegel 
anhob. Viel Arbeit sollte nicht mehr reingesteckt werden, das Produkt 
war sowieso am Auslaufen.

Die drei Gatter im CPLD (was der Fitter tatsächlich draus macht habe ich 
nicht näher angeschaut) verursachten schon eine Verzögerung um etwa eine 
Periode der 40 MHz. Daher auch mein Tipp oben, die 50 MHz könnten schon 
das eigentliche Problem sein.

von Alex (johnrambo86)


Lesenswert?

Christoph db1uq K. schrieb:
> Daher auch mein Tipp oben, die 50 MHz könnten schon
> das eigentliche Problem sein.

Danke für deinen Tipp, werde versuchen dran zu denken wenn ich nochmal 
den Takt brauche. Im Moment bin ich aber froh dass ich ihn komplett 
wegrationalisieren konnte (-;

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.