www.mikrocontroller.net

Forum: FPGA, VHDL & Co. CPLD defekt?


Autor: Jojo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity test_1 is
  port(
      clk_1        : in STD_LOGIC;
      clk_2        : in STD_LOGIC;
      clk_src      : in STD_LOGIC;      
      s_data       : in STD_LOGIC;    
    );
end test_1;

architecture Behavioral of test_1 is
signal clk        : STD_LOGIC;
begin
main : process(clk)
begin
if (rising_edge(clk)) then                        -- on edge go
  match <= NOT (s_data);
  
end if;
end process;

clock_source : process(clk_1, clk_2, clk_src)
begin
  if (clk_src = '1') then
    clk <= clk_1;
  else
     clk <= clk_2;
  end if;
end process;


end Behavioral;
[/pre]

2. erfolgreicher Programmierversuch, danach habe ich die Spannung unterbrochen und wieder angelegt, dabei wurden die Spannungsregler heiß.

Das Programm soll das SRAM als Speicher steuern (ADDR, WE, OE) und dessen beschreiben bei einem Triggerereigniss beenden.

Was könnte ich falsch gemacht haben? Nicht verbundene Ausgänge? Elektrostatik? Über einen Hinweis bin ich dankbar.

[pre]
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;



entity trigger is
  port(
      clk_1        : in STD_LOGIC;
      clk_2        : in STD_LOGIC;
      clk_src      : in STD_LOGIC;
      
      
      s_data       : in STD_LOGIC;        -- go = '0' -> configuration data (serial)
                                  -- go = '1' -> external trigger - 1 match; 0 no match
                                  --         without external trigger - value must be 1
                                  --         to trigger Din
      go          : in STD_LOGIC;
      match        : out STD_LOGIC;        --  forward trigger 1
      OE          : out STD_LOGIC;
      WE          : out STD_LOGIC;
      
      Din        : in STD_LOGIC_VECTOR(7 downto 0);
      
      count        : out STD_LOGIC_VECTOR(17 downto 0)
    );
    
end trigger;

architecture Behavioral of trigger is
signal DMask, DComp, DBuf   : STD_LOGIC_VECTOR(7 downto 0);
signal Mode        : STD_LOGIC_VECTOR(3 downto 0);
signal clk        : STD_LOGIC;
signal Din0_1, Din0_2: STD_LOGIC;
signal counter      : STD_LOGIC_VECTOR(18 downto 0);
signal trigger1    : STD_LOGIC;

shared variable rising   : boolean;
shared variable falling  : boolean;
shared variable edge    : boolean;
shared variable save    : boolean;

begin

main : process(clk)

begin
if (rising_edge(clk)) then                        -- on edge go
  if (go = '0') then
                                        -- config via serial data
      for i in 3 downto 1 loop
        Mode(i) <= Mode(i-1);
      end loop;
      Mode(0) <= DComp(7);
      for i in 7 downto 1 loop
        DComp(i) <= DComp(i-1);
      end loop;
      DComp(0) <= DMask(7);
      for i in 7 downto 1 loop
        DMask(i) <= DMask(i-1);
      end loop;
      DMask(0) <= to_X01(s_data);
  else
    -- Statemachine
    case Mode is 
      when "0001" =>                           -- general reset set to default values
                DMask <= "11111111";
                DComp <= "00000000";
                trigger1 <= '0';
                counter <= "0000000000000000000";
                --counter <= "111111111111111000";
                --WE <= '1';
                OE <= '1';
                Mode  <= "0000";
                
                
      when "0010" =>                           -- Count till memory ist full
                counter <= to_X01(counter + 1);
                --WE <= '0' after 2 ns, '1' after 16 ns;
                if (counter = "1111111111111111111") then
                  trigger1 <= '1';
                  Mode <= "0111";
                end if;
                
      when "0011" =>                          -- Posttrigger
                if (trigger1 = '0') then
                  counter <= to_X01(counter + 1);
                  --WE <= '0' after 2 ns, '1' after 16 ns;
                end if;
                if ((DComp = (to_X01(DIn) AND DMask)) AND s_data = '1') then
                  trigger1 <= '1';
                  Mode <= "0111";                  
                end if;
      
      when "0100" =>                          -- Pretrigger    
                if (DComp = (to_X01(DIn) AND DMask) AND trigger1 = '1' AND s_data = '1') then
                  counter <= "0000000000000000000";
                  trigger1 <= '0';
                end if;
                
                counter <= to_X01(counter + 1);
                --WE <= '0' after 20 ns, '1' after 60 ns;
                
                if (counter = "1111111111111111111") then
                  trigger1 <= '1';
                  Mode <= "0111";
                end if; 
      
      when "0101" =>                          -- Pretrigger Reset
                trigger1 <= '1';
                --WE <= '1';      -- todo
                OE <= '1';
                Mode  <= "0000";
                
      when "0110" =>                          -- edge trigger on Din(0)
                if (trigger1 = '0') then
                  counter <= to_X01(counter + 1);
                  --WE <= '0' after 20 ns, '1' after 60 ns;
                end if;
                if ((DComp = (DBuf AND DMask)) AND s_data = '1' and edge) then
                  trigger1 <= '1';
                  Mode <= "0111";
                end if;  
                
      when "0111" =>                         -- WE on '1';
                counter <= to_X01(counter + 1);
                Mode <= "0000";
                
      when "1000" =>                          -- read sram content - count increment
                counter <= to_X01(counter + 1);    
                OE <= '0' after 20 ns, '1' after 60 ns;
                  
      when OTHERS => Mode <= Mode;
    end case;
   end if;    
  
end if;
end process;

clock_source : process(clk_1, clk_2, clk_src)
begin
  if (clk_src = '1') then
    clk <= clk_1;
  else
     clk <= clk_2;
  end if;
end process;

Edge_Trigger : process(clk)          -- Flankentrigger
begin
  Din0_1 <= to_X01(Din(0));
  Din0_2 <= Din0_1;
  DBuf <= Din;  -- after 100 ns

  rising  := Din0_1='1' and Din0_2='0';
  falling := Din0_1='0' and Din0_2='1';
                  
  if (DComp(0) = '1') then
    edge := rising;
  else
    edge := falling;
  end if;   
end process;

outsignals : process(clk)
begin
  match <= trigger1;
  WE <= not(counter(0));
  count <= counter(18 downto 1);
end process;

end Behavioral;


  

Autor: Klaus Falser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Null (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jojo (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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!

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jojo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Sven S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jojo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rick Dangerus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.