Stromversorgung für FPGAs

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

In diesem Artikel soll eine kurze Erklärung zum Entwurf von Stromversorgungen für Hochleistungs-FPGAs gegeben werden. Auch wird ein neuer Ansatz zur Messung des Frequenzgangs dargestellt und praktische Messergebnisse gezeigt.

Problemstellung

FPGAs werden immer öfter Bestandteil moderner Digitalelektronik. Die Bausteine selbst werden stetig größer, schneller und leistungsstärker und somit steigt auch die Stromaufnahme. Zwar verringert sich der Leistungsbedarf pro Gatter durch bessere Technologien und kleinere Geometrien, doch steigen die Taktfrequenz und die Anzahl der Gatter pro Bauteil überproportional an. Mit steigender Schaltgeschwindigkeit wird die Stromversorgung zu einem immer kritischeren Teil des Systementwurfs. Das Stromversorgungsnetz muss eine niedrige Impedanz besitzen und über einen sehr weiten Frequenzbereich stabil arbeiten. Anderenfalls können Überschwinger, Spannungseinbrüche oder Störpulse auf VCC/GND die Funktion des FPGAs beeinträchtigen.

Breitbandentkopplung ist Teamwork

Der Spannungsregler muss in erster Linie die Gleichstromkomponente für das Stromversorgungsnetzwerk liefern, d.h. er muss bei maximaler Leistung und höchster Umgebungstemperatur immer noch sauber funktionieren, ohne zu überhitzen oder unzulässige Spannungseinbrüche zu produzieren. Seine Aufgabe ist es damit, auf niederfrequente Lastsprünge (im Bereich von ca. 0..30kHz) zu reagieren und diese zu kompensieren.

Im mittleren Frequenzbereich kann der Spannungsregler nicht mehr schnell genug reagieren, da er zu langsam ist. Der Strom muss dann von ausreichend großen Elektrolytkondensatoren geliefert werden. Diese Kondensatoren können bis zu Frequenzen von einigen wenigen MHz Strom liefern, darüber begrenzen der parasitäre Widerstand (ESR, engl. equivalent series resistance) bzw. die parasitäre Induktivität (ESL, engl. equivalent series inductance) die Stromlieferfähigkeit des Kondensators und machen ihn so für höheren Frequenzen im Bereich der Schaltgeschwindigkeiten von FPGAs nutzlos.

Ab diesem Punkt gewinnen die kleinen Keramikkondensatoren, typisch 10 oder 100nF an Bedeutung. Diese gibt es in kleinen SMD-Gehäusen wie 0603 und kleiner. Sie besitzen eine sehr geringe parasitäre Induktivität und können Stromspitzen im Bereich von einigen hundert MHz liefern. Damit werden sie praktisch eine niederohmige Quelle für Hochfrequenzströme.

Für sehr schnell schaltende ICs sind diese Keramikkondensatoren aber immer noch nicht ausreichend, um das Stromversorgungsnetzwerk ausreichend zu stabilisieren und von Störungen zu entkoppeln. Hier braucht man zusätzlich die Kapazität der Stromversorgungsflächen, welche in mehrlagigen Platinen durch die VCC- und Masseflächen gebildet werden. Um hier ein Maximum an Kapazität zu erreichen, sollte ein dünnes Dielektrikum mit einer hohen Dielektrizitätskonstante und niedrigen Verlusten benutzt werden. Außerdem sollte man bezüglich der Durchkontaktierung jeweils ein einziges VIA für jeden VCC/GND Pin benutzen, um die parasitären Induktivitäten zu minimieren, nicht etwa ein VIA für mehrere Pins! BGA-Gehäuse bieten zusätzlich kürzere Verbindungen vom eigentlichen IC zur Platine, sie sind aber schwieriger zu handhaben (Layout und Löten).

Der klassische Ansatz

Es gibt viele Theorien und Application Notes zum Thema Entkopplung von Stromversorgungen. Einige nehmen einfach die Brechstange und bauen einen Friedhof für unzählige Kondensatoren, andere sind schlauer. Es gibt auch sehr viele Simulationen zu dem Thema. Aber am Ende sind die Eigenschaften des Stromversorgungsnetzes definiert duch das Zusammenspiel von

  • dem FPGA und dessen Leistungsaufnahme, welche von der Schaltfrequenz abhängt
  • dem Layout der Platine mit der Platzierung der verschiedenen Kondensatoren

Eine Möglichkeit zur Messung der Qualität des Stromversorgungsnetzwerkes ist die Nutzung eines Netzwerkanalysators. Dafür benötigt man eine Platine, welche nur mit den passiven Komponenten bestückt ist. Dabei wird ein Testsignal in das Netzwerk eingespeist (meist an Stelle des Spannungsreglers) und an einer anderen Stelle gemessen (meist an Stelle der ICs). Der Netzwerkanalysator variiert dann die Frequenz und zeichnet eine Kurve des Widerstands über die Frequenz auf. Diese Methode hat einige Nachteile.

  • Man braucht einen teuren Netzwerkanalysator.
  • Man benötigt ein zusätzliches Board, das nur mit den Kondensatoren bestückt ist.
  • Die Messung spiegelt nicht die wahren Bedingungen wieder, weil alle ICs und aktiven Teile fehlen. Außerdem sind nur Punkt zu Punkt Messungen möglich, welche das reale Verhalten nicht korrekt wiedergeben.

Die Methode in diesem Artikel versucht, die meisten Nachteile zu vermeiden.

Ein direkter Ansatz

Da wir hier über FPGAs reden, haben wir die Möglichkeit, jede beliebige digitale Funktion hineinzuprogrammieren. Also sollten wir eine digitale Funktion entwerfen, welche dem schlimmstmöglichen Fall der Belastung der Stromversorgung entspricht. Aus der Theorie der linearen Netzwerke wissen wir, dass der Frequenzgang eines linearen Systems aus der Sprungantwort am Eingang und der Reaktion am Ausgang gemessen werden kann. Für das Stromversorgungsnetzwerk funktioniert das sogar wenn es nicht vollständig linear ist, da wir ja die reale Reaktion auf konstante Last und Lastsprünge messen wollen. Was ist nun der schlimmste Belastungsfall für die Stromversorgung? Da fast alle ICs auf CMOS-Technologie beruhen, wird die meiste Leistung umgesetzt, wenn Signalnetze ihren Pegel wechseln. Bei einem FPGA heißt das, dass alle FlipFlops ihren Pegel gleichzeitig wechseln und dabei große Signalnetze treiben (parasitäre Kapazität). Also entwerfen wir die folgende Schaltung.

Logik für Lasttest


Der Kern besteht aus einer Matrix aus 30x50 FlipFlops, wobei jeweils 50 FlipFlops aus einem Puffer-FlipFlop gespeist werden, um die Ausgangslast relativ niedrig zu halten und damit eine hohe Taktfrequenz zu erreichen. Um etwas kombinatorische Logik zu erzeugen und um die HDL Compiler davon abzuhalten, die FlipFlops wegzuoptimieren, verbinden wir alle FlipFlops über ein gigantisches ODER-Gatter und leiten den Ausgang auf ein IO-Pad. Dieser Ausgang wird aber nicht weiter genutzt. Dann haben wir noch einen 16-Bit Zähler und etwas Steuerlogik, welche das Toggle-FlipFlop gemäß folgender Tabelle steuert.

Steuerung der Testlogik
sel<1> sel<0> Modus
0 0 inaktiv
0 1 konstante Umschaltung
1 0 Burstbetrieb

VHDL Code

Wenn der Code synthetisiert wird, muss die Option "remove duplicate registers" in der Synthesesoftware ausgeschaltet werden. Es sollten zwei Dateien angelegt werden, top.vhd und row.vhd.

Datei top.vhd

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity power is
    Port ( clk_in  : in std_logic;                      -- clock input
           sel     : in std_logic_vector(1 downto 0);   -- select modulation ON/OFF
           gnd     : out std_logic_vector(5 downto 0);  -- artificial gnd
           mod_out : out std_logic;                     -- modulation signal
           reset   : in std_logic;                      -- reset for DLL
           dummy   : out std_logic);                    -- dummy out, to fool the synthesizer
           
end power;

architecture Behavioral of power is

COMPONENT row
    PORT(
        clk  : IN std_logic;
        data : IN std_logic;    
        dout : OUT std_logic
        );
END COMPONENT;

-- DLL (Delay Locked Loop), a Virtex primitive

component CLKDLL
    port (  
        CLKIN   : in    std_logic;
        CLKFB   : in    std_logic;
        RST     : in    std_logic;
        CLK0    : out   std_logic;
        CLK90   : out   std_logic;
        CLK180  : out   std_logic;
        CLK270  : out   std_logic;
        CLK2X   : out   std_logic;
        CLKDV   : out   std_logic;
        LOCKED  : out   std_logic);
end component;

-- BUFG (Global Clock buffer), a Virtex  primitive

component BUFG
    port (  I   : in    std_logic;
            O   : out   std_logic);
end component;

-- IBUFG (Global Clock input buffer ), aa Virtex primitive

component IBUFG
    port (  I   : in    std_logic;
            O   : out   std_logic);
end component;

component SRL16     -- virtex primitive
  port (
        D    : in std_logic;        
        CLK  : in std_logic;
        A0   : in std_logic;
        A1   : in std_logic;
        A2   : in std_logic;
        A3   : in std_logic;        
        Q    : out std_logic
       ); 
end component;

constant rows: integer:=30;

type flop_array is array (rows-1 downto 0) of std_logic_vector(49 downto 0);

signal toggle   : std_logic;                            -- a toggle flipflop
signal ff_ar    : flop_array;
signal drive_ar : std_logic_vector (rows-1 downto 0);   -- driver array for toggeling rows
signal dout_ar  : std_logic_vector (rows-1 downto 0);   -- driver array for toggeling rows
signal or_ar    : std_logic_vector (rows-1 downto 0);   -- driver array for toggeling rows
signal cnt      : std_logic_vector (15 downto 0);       -- modulation divider

signal CLKIN_w, RESET_w, CLK2X_dll, CLK2X_g, CLK4X_dll, CLK4X_g, CLK8X_dll, CLK8X_g: std_logic;
signal LOCKED2X, LOCKED2X_delay, RESET4X, RESET8X, LOCKED4X, LOCKED4X_delay, LOCKED8X : std_logic;

signal logic1,clk : std_logic;

signal clk2x,clk4x,clk8x, clkmux: std_logic;

begin

-- use two DLL to get 147 MHz

logic1<='1';

clkpad : IBUFG  port map (I=>CLK_IN, O=>CLKIN_w);


dll2x  : CLKDLL port map (CLKIN=>CLKIN_w,   CLKFB=>CLK2X_g, RST=>RESET,
                          CLK0=>open,   CLK90=>open, CLK180=>open, CLK270=>open,
                          CLK2X=>CLK2X_dll, CLKDV=>open, LOCKED=>LOCKED2X);

clk2xg : BUFG   port map (I=>CLK2X_dll,   O=>CLK2X_g);

rstsrl : SRL16  port map (D=>LOCKED2X, CLK=>CLK2X_g, Q=>LOCKED2X_delay,
                          A3=>logic1, A2=>logic1, A1=>logic1, A0=>logic1);

RESET4X <= not LOCKED2X_delay;

dll4x  : CLKDLL port map (CLKIN=>CLK2X_g,  CLKFB=>CLK4X_g, RST=>RESET4X,
                          CLK0=>open,   CLK90=>open, CLK180=>open, CLK270=>open,
                          CLK2X=>CLK4X_dll, CLKDV=>open, LOCKED=>LOCKED4X);


clk4xg : BUFG   port map (I=>CLK4X_dll,  O=>CLK4X_g);

clk<=clk4x_g;

-- the toggeling array

l_rows: for i in 0 to rows-1 generate
    Inst_row: row PORT MAP(
        clk  => clk,
        data => drive_ar(i),
        dout => dout_ar(i)
    );
  end generate;

-- combine all douts via a BIG or-gate

  process(dout_ar)
  variable tmp: std_logic;
  begin
    tmp:='0';
    l_or: for i in 0 to rows-1 loop
      tmp:=tmp or dout_ar(i);
    end loop;
    dummy<=tmp;
  end process;

-- prescaler

  process(clk)
  begin
    if clk='1' and clk'event then
      cnt<=cnt+1;
    end if;
  end process;

-- toggle fliplop and distribution

  process(clk)
  begin
    if clk='1' and clk'event then
      case sel is
        when "00"       => toggle <= '0';
        when "01"       => toggle <= not toggle;
        when "10"       => if cnt(15)='1' then toggle <= not toggle; else toggle<='0'; end if;
        when others     => null;
      end case;
      drive_ar<=(others=>toggle);
    end if;
  end process;

gnd<=(others=>'0');
mod_out<=cnt(15);

end Behavioral;

Datei row.vhd

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity row is
    Port ( clk  : in std_logic;
           data : in std_logic;
           dout : out std_logic);
end row;

architecture Behavioral of row is

signal my_array: std_logic_vector (49 downto 0);

begin

-- generate 50 FFs with clock enable

  process (clk)
  begin
    if clk='1' and clK'event then
      my_array<=(others=>data);     
    end if;
  end process;

-- combine all into a BIG OR

  process(my_array)
  variable tmp: std_logic;
  begin
    tmp:='0';
    l: for i in 0 to 49 loop
      tmp:=tmp or my_array(i);
    end loop;
    dout<=tmp;
  end process;

end Behavioral;

Messungen

Terminierung 1: 50Ω vor dem Koppelkondensator, fg = 10 Hz
Terminierung 2: 50Ω nach dem Koppelkondensator, fg = 200 kHz

Die nachfolgenden Messungen wurden mit einem Spartan-II Demoboard von Insight Electronics durchgeführt. Es ist mit einem XC2S100-5 im PQ208 Gehäuse bestückt. Es nutzt eine Kernspannung von 2,5V und eine IO-Spannung von 3,3V. Beide Spannungen werden durch Linearregler geliefert. Ein 36.864 MHz Oszillator wurde hinzugefügt. Für die Messung wurde der Takt mittels DLL vervierfacht auf 147 MHz. Diese hohe Frequenz wurde gewählt, um die Effekte gut demonstrieren zu können. In einer praktischen Anwendung wird man diesen Test nur mit der normalen Frequenz betreiben, welche auch in der realen Anwendung genutzt wird. Das Board wird durch ein starkes Netzteil versorgt.

Die Kernspannung wird mit einem Stück Koaxialkabel vom Typ RG 174 gemessen, welches direkt an ein VCC/GND-Pin des FPGAs angelötet ist. Das Oszilloskop ist auf 50Ω Eingangsimpedanz mit AC-Kopplung geschaltet. Wir sind nicht an der absoluten Größe der Versorgungsspannung interessiert sind, nur an Wechselanteilen, welche hoffentlich deutlich kleiner sind. Mit AC-Kopplung kann man einen deutlich kleineren Messbereich für die vertikale Auflösung verwenden. Dieser Aufbau hat eine gute Abschirmung gegen Störungen und eine sehr hohe Bandbreite zur Messung der hochfrequenten Störungen.

Während der Messung wurde festgestellt, dass es zwei verschiedene Terminierungsmethoden in Oszilloskopen gibt. Das alte Tektronix CSA 404 mit einem 11A34 Verstärker nutzt Terminierung 1 am 50Ω Eingang. Daraus ergibt sich eine untere Grenzfrequenz des Hochpasses von ~10 Hz. Das zweite Oszilloskop, ein Tektronix TDS 3034, mit welchem die Screenshots gemacht wurden, nutz Terminierung 2, welche in einer unteren Grenzfrequenz von ~200 kHz resultiert. Das ist nicht akzeptabel für die Messung der Sprungantwort, weswegen die 1 MΩ Eingangsterminierung benutzt wurde. Das ist OK für die Messung niedriger Frequenzen (<10 MHz). Zur Messung der Hochfrequenzstörungen (Messung 4) ist die Grenzfrequenz von 200 kHz kein Problem.


Messung 1 - FPGA unkonfiguriert

Bei diesem Schritt können wir die Leistungsaufnahme in Ruhezustand messen, welche größtenteils durch Leckströme verursacht wird. Zu beachten ist auch, dass unser Oszilloskop mit Eingangsschaltung 1 viel Strom zieht (50Ω @ 2,5V = 50mA). Wir können mittles Multimeter messen, ob unsere Spannungsregler die korrekte Spannung liefern. Wir schreiben den aktuellen Stromverbrauch und Kernspannung auf. Dabei ist der Stromverbrauch der Eingangstermninierung nicht enthalten, weil für alle Messungen das zweite Oszilloskop mit Schaltung 2 verwendet wurde.

Messung 2 - FPGA mit leerer Logik

Ein Design mit einer einfachen Schleife von einem Eingang auf einen Ausgang ist jetzt in das FPGA geladen. Nach der Konfiguration sinkt der Stromverbrauch, weil die Konfigurationslogik im FPGA abgeschaltet wurde, welche permanant den Konfigurationsspeicher löscht. Die Leistungsaufnahme dieser Minimalschaltung wird als Kalibrierungspunkt für alle nachfolgenden Messungen verwendet.

Messung 3 - FPGA konfiguriert ohne schaltende Logik

Jetzt steigt die Leistungsaufnahme deutlich. Auf den ersten Blick ist das unerwartet, denn im FPGA werden keinerlei Signale geschaltet , die FlipFlops laden immer den gleichen Wert. Aber das ist nicht ganz korrekt. Das Taktnetzwerk läuft auf voller Leistung. Daran erkennt man, dass die Taktverteilung signifikant Leistung benötigt. Darum nutzen stromsparende ICs eine saubere Methode zur Taktabschaltung (clock gating), um die Leitungsaufnahme zu verringern. Aber das muss auf sichere Weise erfolgen.

Messung 4 - FPGA mit dauerhaft schaltenden Signalen

Jetzt starten wir ein Feurwerk! Die Stromversorgung erfährt jetzt ihren schlimmsten Albtraum. 1500 FlipFlops die gleichzeitig mit 147 MHz umschalten (togglen) ist kein Kindergeburtstag! Schau auf den Strommesser! Das FPGA wird schnell sehr heiß. Aber was sehen wir auf dem Oszilloskop? Da die Stromaufnahme konstant ist, können wir nur Hochfrequenzstörungen durch die schaltende Logik sehen, welche durch unzureichende Entkopplung der Keramikkondensatoren verursacht werden könnte. Mit einem schnellen Oszilloskop (1GHz++) und schlechten Versorgungslagen und Keramikkondensatoren, könnte man die wirklich hochfrequenten Störungen sehen. Mit dem 1 GHz-Oszilloskop sieht man in diesem Fall aber nichts, eben weil die Kondensatoren und Stromversorgungslagen gut funktionieren. Mit langsameren Oszilloskopen (300MHz oder weniger) sieht man nur den Effekt der Kondensatoren. Hier können wir auch die Kernspannung unter Volllast messen. Aber man muss sicherstellen, die Spannung zu messen, welche wirklich am FPGA ankommt, d.h. man muss direkt an den Pins des FPGA messen, nicht irgendwo auf dem Board! Denn das Stromversorgungsnetz hat einen endlichen Widerstand, welcher einen Spannungsabfall vom Spannungsregler bis zum FPGA verursacht. In einem guten Entwurf sollte der Spannungsabfall kleiner als 1% der Nennspannung sein.

Messung 5 - Burstbetrieb

Zum Schluß erreichen wir den interessantesten Punkt. Mit dem 16-Bit Zähler wird das Umschalten des FlipFlop-Arrays mit einer niedrigen Frequenz moduliert, die Modulationsfrequenz ist 1/65356 der Taktfrequenz, hier ~2,2 kHz. Das ist die Sprungfunktion, welche in den Abschnitten weiter oben genannt wurde. Und wir sehen die Reaktion des Stromversorgungsnetzes. Wenn es ideal wäre, würden wir nur eine gerade Linie auf dem Oszilloskop sehen. Aber da es numal keine Idealfälle gibt, sehen wir Überschwinger und einen verbleibenden Offset. Das nachfolgende Bild zeigt das deutlich. Der blaue Kanal ist das Modulationssignal des 16-Bit Zählers (MSB), der gelbe Kanal die Kernspannung.

Erklärung

Der Unterschwinger beim Einschalten wird durch die unzureichende Entkopplung im mittleren Frequenzbereich verursacht. Der sprunghaft steigende Stromverbrauch kann nicht von den Mittelfrequenz-Kondensatoren geliefert werden (zu wenig Kapazität), auch nicht vom Spannungsregler (er ist zu langsam dafür). Das originale Demoboard ist nur mit einem 10µF Tantalkondensator hinter dem Spannungsregler bestückt, welcher für so eine große Last viel zu klein ist. Durch Ergänzung eines 100µF Kondensatores kann der Unterschwinger deutlich verkleinert werden.

Der Überschwinger beim Abschalten ist ähnlich, aber hier ist der Spannungsregler zu langsam, um den Ausgangsstrom herunterzuregeln. Der überschüssige Strom (Ladung) wird in den Mittelfrequenz-Kondensatoren gespeichert, aber da dieser nur 10µF hat, steigt die Spannung schnell an. Ein einfacher Vergleich. Es ist genauso wie wenn man mit einem kleinen Fass das Regenwasser von einem großen Dach auffangen will, das Faß füllt sich schnell.

Was verursacht den verbliebenden Offset? Nun, das ist der Gleichstromwiderstand des Stromversorgungsnetzwerks vom Spannungsregler (wo dieser die Ausgangsspanung misst und regelt) bis zum VCC-Pin des FPGAs. Die Stromaufnahme des FPGAs schwankt zwischen Messung 3 (kein Umschalten) und Messung 4 (konstantes Umschalten). Auf dem Oszilloskop sehen wir eine Spannungsdifferenz von ~70mV bei einer Stromdifferenz von 912 mA, woraus ca. 76mΩ Widerstand resultieren. Die Schlußfolgerung daraus ist, dass die Verbindung zwischen dem Punkt der Spannungsmessung durch den Spannungsregler und den VCC-Pins einen möglichst niedrigen Widerstand haben muss. Das beste sind komplette Lagen für die Stromversorgung (Power Planes), aber kurze, dicke Leitungen sind meist auch OK. Es gibt auch Spannungsregler mit extra Messeingängen, welche den Spannungsabfall über der Zuleitung kompensieren können, weil sie direkt am Verbraucher die Spannung messen. Als weitere Möglichkeit werden heutzutage meist sog. Point of Load Module eingesetzt. Das sind Spannungsregler (Schaltregler), welche direkt am zu versorgenden FPGA sitzen und mit einer hohen Spannung von 5..48V über das Board versorgt werden.

Messergebnisse
Messung FPGA-Inhalt Icc [mA] Vcc [V] P [mW]
1 keine Konfiguration 80 2.501 200
2 Minimallogik 40 2.502 100
3 Testlogik, inaktiv 235 2.487 584
4 Testlogik, konstantes Umschalten 1147 2.433 2790
5 Testlogik, Burstbetrieb 690 2.464 1700

Zusammenfassung

In diesem Artikel wurde eine einfache aber leistungsfähige Methode zur Messung des Frequenzgangs des Stromversorgungsnetzwerks für FPGAs gezeigt. Die Messung kann deutlich einfacher und mit leicht verfügbaren Messgeräten unter realistischeren Bedingungen durchgeführt werden als eine klassische Messung mit einem Netzwerkanalysator. Es läßt viel Raum für Experimente mit der Entkopplung der Stromversorgung in Bezug auf die Platzierung und Werte der Kondensatoren.

Weblinks