Forum: FPGA, VHDL & Co. CPLD defekt?


von Jojo (Gast)


Lesenswert?

Ich wollte mich an die CPLD und habe nach einem ersten Erfolg wohl 
meinen XC9572XL zerstört, zwischen einem GND und VCCInt Paar messe ich 
nur noch 3 Ohm, das Paar GND VCCIO hat ca. 20 MOhm.
Bevor ich einen neuen CPLD einsetze und mir das nochmal passiert, wäre 
es toll wenn jemand mir erklären könnte wieso es passiert ist...

Schaltung:
Die im pdf vorliegende Schaltung ist bis auf das SRAM vollständig 
aufgebaut.
Am AVR (eingesetzt) messe ich 5V und am PLCC Sockel 3.3V - der "defekte" 
XC9572XL zieht leider die 3.3V auf 0.7V runter und die Schaltregler 
werden heiß.

1. erfolgreicher Versuch (VDHL) zu Testzwecken
Invertiert das SDATA Signal und gibt es auf MATCH wieder aus. Außerdem 
erfolgt eine CLK Auswahl zwischen zwei Taktgebern.
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
use IEEE.STD_LOGIC_UNSIGNED.ALL;
5
6
---- Uncomment the following library declaration if instantiating
7
---- any Xilinx primitives in this code.
8
--library UNISIM;
9
--use UNISIM.VComponents.all;
10
11
entity test_1 is
12
  port(
13
      clk_1        : in STD_LOGIC;
14
      clk_2        : in STD_LOGIC;
15
      clk_src      : in STD_LOGIC;      
16
      s_data       : in STD_LOGIC;    
17
    );
18
end test_1;
19
20
architecture Behavioral of test_1 is
21
signal clk        : STD_LOGIC;
22
begin
23
main : process(clk)
24
begin
25
if (rising_edge(clk)) then                        -- on edge go
26
  match <= NOT (s_data);
27
  
28
end if;
29
end process;
30
31
clock_source : process(clk_1, clk_2, clk_src)
32
begin
33
  if (clk_src = '1') then
34
    clk <= clk_1;
35
  else
36
     clk <= clk_2;
37
  end if;
38
end process;
39
40
41
end Behavioral;
42
[/pre]
43
44
2. erfolgreicher Programmierversuch, danach habe ich die Spannung unterbrochen und wieder angelegt, dabei wurden die Spannungsregler heiß.
45
46
Das Programm soll das SRAM als Speicher steuern (ADDR, WE, OE) und dessen beschreiben bei einem Triggerereigniss beenden.
47
48
Was könnte ich falsch gemacht haben? Nicht verbundene Ausgänge? Elektrostatik? Über einen Hinweis bin ich dankbar.
49
50
[pre]
51
library IEEE;
52
use IEEE.STD_LOGIC_1164.ALL;
53
use IEEE.STD_LOGIC_ARITH.ALL;
54
use IEEE.STD_LOGIC_UNSIGNED.ALL;
55
56
---- Uncomment the following library declaration if instantiating
57
---- any Xilinx primitives in this code.
58
--library UNISIM;
59
--use UNISIM.VComponents.all;
60
61
62
63
entity trigger is
64
  port(
65
      clk_1        : in STD_LOGIC;
66
      clk_2        : in STD_LOGIC;
67
      clk_src      : in STD_LOGIC;
68
      
69
      
70
      s_data       : in STD_LOGIC;        -- go = '0' -> configuration data (serial)
71
                                  -- go = '1' -> external trigger - 1 match; 0 no match
72
                                  --         without external trigger - value must be 1
73
                                  --         to trigger Din
74
      go          : in STD_LOGIC;
75
      match        : out STD_LOGIC;        --  forward trigger 1
76
      OE          : out STD_LOGIC;
77
      WE          : out STD_LOGIC;
78
      
79
      Din        : in STD_LOGIC_VECTOR(7 downto 0);
80
      
81
      count        : out STD_LOGIC_VECTOR(17 downto 0)
82
    );
83
    
84
end trigger;
85
86
architecture Behavioral of trigger is
87
signal DMask, DComp, DBuf   : STD_LOGIC_VECTOR(7 downto 0);
88
signal Mode        : STD_LOGIC_VECTOR(3 downto 0);
89
signal clk        : STD_LOGIC;
90
signal Din0_1, Din0_2: STD_LOGIC;
91
signal counter      : STD_LOGIC_VECTOR(18 downto 0);
92
signal trigger1    : STD_LOGIC;
93
94
shared variable rising   : boolean;
95
shared variable falling  : boolean;
96
shared variable edge    : boolean;
97
shared variable save    : boolean;
98
99
begin
100
101
main : process(clk)
102
103
begin
104
if (rising_edge(clk)) then                        -- on edge go
105
  if (go = '0') then
106
                                        -- config via serial data
107
      for i in 3 downto 1 loop
108
        Mode(i) <= Mode(i-1);
109
      end loop;
110
      Mode(0) <= DComp(7);
111
      for i in 7 downto 1 loop
112
        DComp(i) <= DComp(i-1);
113
      end loop;
114
      DComp(0) <= DMask(7);
115
      for i in 7 downto 1 loop
116
        DMask(i) <= DMask(i-1);
117
      end loop;
118
      DMask(0) <= to_X01(s_data);
119
  else
120
    -- Statemachine
121
    case Mode is 
122
      when "0001" =>                           -- general reset set to default values
123
                DMask <= "11111111";
124
                DComp <= "00000000";
125
                trigger1 <= '0';
126
                counter <= "0000000000000000000";
127
                --counter <= "111111111111111000";
128
                --WE <= '1';
129
                OE <= '1';
130
                Mode  <= "0000";
131
                
132
                
133
      when "0010" =>                           -- Count till memory ist full
134
                counter <= to_X01(counter + 1);
135
                --WE <= '0' after 2 ns, '1' after 16 ns;
136
                if (counter = "1111111111111111111") then
137
                  trigger1 <= '1';
138
                  Mode <= "0111";
139
                end if;
140
                
141
      when "0011" =>                          -- Posttrigger
142
                if (trigger1 = '0') then
143
                  counter <= to_X01(counter + 1);
144
                  --WE <= '0' after 2 ns, '1' after 16 ns;
145
                end if;
146
                if ((DComp = (to_X01(DIn) AND DMask)) AND s_data = '1') then
147
                  trigger1 <= '1';
148
                  Mode <= "0111";                  
149
                end if;
150
      
151
      when "0100" =>                          -- Pretrigger    
152
                if (DComp = (to_X01(DIn) AND DMask) AND trigger1 = '1' AND s_data = '1') then
153
                  counter <= "0000000000000000000";
154
                  trigger1 <= '0';
155
                end if;
156
                
157
                counter <= to_X01(counter + 1);
158
                --WE <= '0' after 20 ns, '1' after 60 ns;
159
                
160
                if (counter = "1111111111111111111") then
161
                  trigger1 <= '1';
162
                  Mode <= "0111";
163
                end if; 
164
      
165
      when "0101" =>                          -- Pretrigger Reset
166
                trigger1 <= '1';
167
                --WE <= '1';      -- todo
168
                OE <= '1';
169
                Mode  <= "0000";
170
                
171
      when "0110" =>                          -- edge trigger on Din(0)
172
                if (trigger1 = '0') then
173
                  counter <= to_X01(counter + 1);
174
                  --WE <= '0' after 20 ns, '1' after 60 ns;
175
                end if;
176
                if ((DComp = (DBuf AND DMask)) AND s_data = '1' and edge) then
177
                  trigger1 <= '1';
178
                  Mode <= "0111";
179
                end if;  
180
                
181
      when "0111" =>                         -- WE on '1';
182
                counter <= to_X01(counter + 1);
183
                Mode <= "0000";
184
                
185
      when "1000" =>                          -- read sram content - count increment
186
                counter <= to_X01(counter + 1);    
187
                OE <= '0' after 20 ns, '1' after 60 ns;
188
                  
189
      when OTHERS => Mode <= Mode;
190
    end case;
191
   end if;    
192
  
193
end if;
194
end process;
195
196
clock_source : process(clk_1, clk_2, clk_src)
197
begin
198
  if (clk_src = '1') then
199
    clk <= clk_1;
200
  else
201
     clk <= clk_2;
202
  end if;
203
end process;
204
205
Edge_Trigger : process(clk)          -- Flankentrigger
206
begin
207
  Din0_1 <= to_X01(Din(0));
208
  Din0_2 <= Din0_1;
209
  DBuf <= Din;  -- after 100 ns
210
211
  rising  := Din0_1='1' and Din0_2='0';
212
  falling := Din0_1='0' and Din0_2='1';
213
                  
214
  if (DComp(0) = '1') then
215
    edge := rising;
216
  else
217
    edge := falling;
218
  end if;   
219
end process;
220
221
outsignals : process(clk)
222
begin
223
  match <= trigger1;
224
  WE <= not(counter(0));
225
  count <= counter(18 downto 1);
226
end process;
227
228
end Behavioral;

  

von Klaus Falser (Gast)


Lesenswert?

Mit einem "falschen" Programm kann man ein CPLD nicht kaputt machen.
Mit einer falschen Pin Zuweisung, kann man vielleicht das eine oder 
andere Port kaputt machen, aber wohl kaum das ganze CPLD.
Elektrostatik? Möglich, aber unwahrscheinlich.
Du hast wahrscheinlich bei der Stromversorgung einen Hund drinnen.
Leider fehlt das PDF mit der Schaltung, aber hast Du VCCIO mit ja mit 
3,3 V und nicht mit 5 V verbunden?
Die Pins sind 5 V tolerant, aber VCCIO darf nur 3,3V oder 2,5 V sein.

Klaus

von Null (Gast)


Lesenswert?

Die Frage ist weniger was das CPLD macht, sondern was es nicht macht. 
Ganz schlimm sind zb offene Eingaenge. Die koennen in die Mitte zwischen 
Vcc und GND floaten, oder gleich zu schwingen beginnen. Beides aeussert 
sich darin, dass, das Teil sehr schnell sehr heiss wird - und  tschuess. 
Dabei muss man auch bedenken, dass es einen nicht programmierten Zustand 
gibt. Daher sollte man das CPLD schon fuer den unprogrammierten Zustand 
richtig beschalten.

von Jojo (Gast)


Angehängte Dateien:

Lesenswert?

Habe übersehen, dass der Schaltplan nicht mitkommt. Jetzt sollte er hier 
sein!

Kann jemand bitte zur Feststellung im 1. Post - nur geringer Widerstand 
zw. VCCInt und GND - Stellung nehmen.

Danke schon mal für die vorläufige Fehleranalyse!

von Falk B. (falk)


Lesenswert?

@ Jojo

>Kann jemand bitte zur Feststellung im 1. Post - nur geringer Widerstand
>zw. VCCInt und GND - Stellung nehmen.

Misst du das in der Schaltung? Da kann alles mögliche bei rauskommen. 
Vielleicht ein Kurzschluss auf der Platine?

In deiner Schaltung solltest du für jedes VCC/GND Päärchen einen 100nF 
Kondensator einsetzen.

MFG
Falk

von Jojo (Gast)


Lesenswert?

Den geringen Widerstand zw. VCCInt und GND messe ich direkt am Chip - 
losgelöst von der Schaltung.
Allerdings habe ich nur einen 100nF Kondensator (direkt an GND VCCIO) in 
der Versorgung - à la Fischl (Vorlage) - da die anderen Versorgungspins 
sehr weit auseinanderliegen.

von Ulrich (Gast)


Lesenswert?

Ich habe gerade meine erste XC9572XL Schaltung in Betrieb genommen. Da 
ich so motiviert und überzeugt von mir war, habe ich die Schaltung ohne 
Strombegrenzung angeschlossen. Dat Ding zog 2 Ampere. Nun stelle ich 
fest, dass:
1. Ich den Sockel um 180° verdreht festgelötet habe
2. Ich nur noch 3Ohm messe
3. Dat Ding keinen Muxer mehr macht.

Kann es sein dass der nun kaputt ist?

Das ist ws ganz neues für mich.  Ein Atmega8 hat sowas immer überlebt 
;-(

Und Tschüss ;-)

von Sven S. (Gast)


Lesenswert?

@ Ulrich du hast ja irgendwie recht mit deinem Zynismus. aber mann muss 
doch nicht immer gleich jeden anfänger verschrecken.

was das mit dem riesen code als anfäger zum testen soll hab ich aber 
auch nicht verstanden.

von Jojo (Gast)


Lesenswert?

@ Falk

Wenn ich dich richtig verstanden habe, kann es durch das floaten von 
Signalen und dem dadurch stark angestiegenem Stromfluss zum Hitzetod des 
Chips kommen.
Heißt das im Umkehrschluss, dass ich z.B. keinen 16 bit Eingang 
programmieren darf, falls ich an diesen in der Regel nur 8 bit beschalte 
und die anderen - quasi im stand-by - offen lasse, bis ich sie brauche?

von Rick Dangerus (Gast)


Lesenswert?

@Jojo:

Genau dafür wurden die Pull-up bzw. Pull-down erfunden. Bei einigen IC's 
gibt es interne, die man aktivieren kann (FPGA, AVR).

Die XC9500XL haben m.E. keine. Es wird aber in einer AppNote empfohlen 
keine Pull-down zu verwenden.

Rick

von Chris (Gast)


Lesenswert?

Das ist zwar richtig, dennoch ist mir das, in über 2 Jahren noch nicht 
mit der XC95...-Serie passiert, obwohl ich regelmäßig ca. die Hälfte der 
Pins unbeschaltet lasse.

von Εrnst B. (ernst)


Lesenswert?

Legt das ISE nicht automatisch Unbenutzte PINs auf Masse? Dachte da gäbs 
irgendwo so eine Option dafür...

Edit:
Nicht Masse, aber in den Fitter-Properties kann man die unused Pins 
zwischen "Keeper" und "Float" umschalten, "Keeper" als default.

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.