Taktung FPGA/CPLD

Wechseln zu: Navigation, Suche

Einleitung

Von den vier Signalgruppen

  • interne Signale
  • IO Signale
  • Reset
  • Takt (Clock)

ist letztere die mit den höchsten Anforderungen an externer Signalqualität und interner Laufzeit. Fehler im Taktnetzwerk führen zu ungewolltem, ja oft katastrophalem Verhalten der Schaltung. Um dies zu vermeiden, sind besondere Aufbauregeln verfasst- und Komponenten für die Taktverteilung in digitalen ICs entwickelt worden.

Grundanforderungen Taktnetzwerk

Der Takt muss möglichst störungsfrei an alle getakteten Bauelemente (FlipFlops, RAMs) im IC geführt werden. Das Taktnetzwerk muss damit sehr viele Gatter-Eingänge treiben (einige Dutzend bis einige Hunderttausend!). Dazu wird ein spezieller Takttreiber genutzt (Xilinx: BUFG). Die Laufzeit vom Eingang des Takttreibers zu jedem Endpunkt des Netzes muss idealerweise exakt gleich sein. Nur so ist gewährleistet, dass alle FlipFlops zum gleichen Zeitpunkt schalten und die Synchronität gewährleistet ist. Auftetende Differenzen, die unvermeidlich sind, werden von den Tools dahingehend berücksichtigt, dass genügend Zeitreserven vorgesehen wird.

Der Laufzeitunterschied zwischen verschiedenen Endpunkten des Taktnetzes wird Skew genannt und muss sehr klein gehalten werden (bei modernen Digitalschaltkreisen kleiner 100 ps). Dazu wird das Taktnetzwerk als Baumstruktur gestaltet (gleiche Länge von der Baumwurzel zu jeder Astspitze). Man nennt diese Schaltungstechnik "Clock Tree".

Clock tree.png

Man beachte, dass ein Clock-Netzwerk physikalisch über Inverter weitergeschaltet wird, wodurch partiell negierte Takte entstehen. In ASICS und einigen FPGAs wird dies berücksichtigt, indem FFs verwendet werden, die mit negierter Flanke arbeiten. Heute geht man dazu über differenzielle Taktnetze zu verwenden.

Taktdomänen

In fast jeder Digitalschaltung kommt es nun vor, dass verschiedene Bereiche nicht bei jedem Takt eine Aktion ausführen sollen. Einige laufen sogar mit einer erheblich geringeren Taktrate als der Rest der Schaltung. Dazu muss aus dem relativ schnellen Systemtakt ein langsamer Takt gewonnen werden. Was auf den ersten Blick recht einfach aussieht, wird im Detail oft falsch gemacht.

Geschaltete Takte (Gated Clock)

Dieser Begriff bezieht sich auf geschaltete, also unterbrochene (engl. "gate"), Taktleitungen. Dies kann durch die Verwendung von:

  • Multiplexern (Auswahl zwischen Taktquelle 1 und 2)

oder

  • kombinatorischer Logik (Schaltungsteile werden unter bestimmten Bedingungen vom Takt getrennt)

geschehen.

Taktmultiplexer

Falls ein völliges Abschalten des Taktes wirklich erforderlich ist, z. B. um den Leistungsbedarf zeitweilig zu drosseln, sollte der Takttreiber selbst abgeschaltet werden. Bei Xilinx würde man statt eines BUFG einen BUFGMUX einsetzen. Dieser garantiert durch seinen speziellen Aufbau, daß während des Umschaltens keine Glitches entstehen.

Kombinatorik im Taktpfad

Ein solches Design ist aus zwei Gründen problematisch:

  • es entstehen neben den gewünschten Schaltflanken zusätzliche, ultrakurze Flanken (->Glitches)
  • bei CLK-Teilern hat der langsame Takt eine Phasenverschiebung zum schnellen Takt (-> Skew).
  • bei "gegateten" Takten besitzt der erzeugte Takt eine Phasenverschiebung zum Quell-Takt (-> Skew).

Im ersten Fall können durch die Glitches unerwünschte Schaltaktivitäten an FlipFlops in folgenden Schaltungsteilen ausgelöst werden. Das ist fatal! Schon deshalb ist diese Variante nicht brauchbar. Sie wurde dennoch oft in der Vergangenheit angewendet, weil die relativ langsamen ICs die Glitches gefiltert bzw. ignoriert haben. Doch heute sind CPLDs und FPGAs extrem schnell, dass man mit dieser Methode schnell scheitert.

Im zweiten Fall erfolgt durch Skew eine Verschiebung der Schaltzeiten im anderen Schaltungsteil, die insgesamt weniger Zeitreserve für Signale lässt, die aus dem anderen Schaltungsteil wieder in den ersten Schaltungsteil übergeben werden sollen. In der Vorwärtsrichtung bestehen sogannnte race conditions, d.h. Daten innerhalb der Quelltaktdomäne gelangen eher an FlipFlops der Zieldomäne als Daten, die innerhalb der Zieldomäne erzeugt wurden. Sind Signale zu früh, werden sie gfs. vom falschen Takt übernommen, wodurch das design "komisch" arbeitet, weil scheinbar ein Takt fehlt. Diese Methodik ist ohne Behandlung oder besondere Betrachtung der möglichen Fälle nicht zuverlässig und damit allgemeinen nicht akzeptabel.

In Sonderfällen kann durch einen ausreichende Verschiebung dafür gesorgt werden, daß die Schaltungsteile zueinander korrekt laufen und stabil arbeiten. Dies ist dann einfach zu erreichen, wenn kein Rückwärtspfad der Daten benötigt wird, der im selben Taktzyklus agieren muss.

Asynchrone Taktleitung

Durch diese Methodik der verschobenen Takte kann jedoch auch eine Geschwindigkeitssteigerung erreicht werden, wenn der Takt quasi wie ein Lauffeuer durch den Chip läuft und bei korrektem Timing der Daten (kurze Kombinatorik), jene aus der zukünftigen Zeitebene nie einholt. Damit sind asynchron gepipelinete Architekturen bildbar, die unterhalb der Taktebene arbeiten und lokal die typischen setup-hold-Bedingungen einhalten.

Dies wird üblicherweise aber nur bei ASICs eingesetzt, bei denen ohnehin die Takte und Daten passend lokal optimiert werden. Im Bereich des typischen FPGA-Designs findet man hierzu jedoch bislang nur akademische Lösungen und manuell plazierte Teildesigns bei Sonderlösungen, z.B. auf dem Gebiet der TDC (Time to Digital Converter, schnelle PMW-Generierung z.B. im PICCOLO von TI), da die Tools allesamt auf einem FPGA-weit synchronen Takt und Design aufbauen, dies nicht automatisiert unterstützen und folglich ein Design extrem aufwändig und schwer zu testen ist. Geschwindigkeitssteigerungen lassen sich bei FPGAs daher meist einfacher, sicherer und billiger erreichen, wenn man stärker Pipelining oder Parallelisierung nutzt, ggf. unter Nutzung von mehreren FPGAs.

Derived Clock

Eine geringfügige Verbesserung des Gated Clock erreicht man durch das Anfügen eines FlipFlops hinter den kombinatorischen Dekoder. Durch diese Zwischenspeicherung wird der Takt zumindest frei von Glitches. Wenn im FPGA/CPLD nur ein langsamer Takt gebraucht wird, oder der langsame Schaltungsteil keine logische Verbindung zum schnellen Schaltungsteil hat, dann ist diese Lösung akzeptabel und sicher. Wenn jedoch zwischen dem langsamen Schaltungsteil und schnellen Schaltungsteil Daten oder Steuersignale ausgetauscht werden, dann muss man zu einer anderen Entwurfsmethode greifen.

Clock Enable

Jedes FlipFlop in FPGAs/CPLDs hat einen synchronen Steuereingang namens CE (Clock Enable). Damit kann man festlegen, ob das FlipFlop bei der nächsten Taktflanke neue Daten speichern oder die alten behalten soll. Da es sich um einen synchronen Eingang handelt, ist es vollkommen unkritisch, wenn diese Signal Glitches enthält. Es muss nur im Zeitraum beginnend kurz vor der Taktflanke (Setup Time, Aufbauzeit) bis kurz danach (Hold Time, Haltezeit) stabil anliegen. Eine Verschiebung dieses Signals zum Takt ist auch unkritisch, denn jedes normale Steuersignal ist phasenverschoben zum Takt (Schaltzeit der FlipFlops, Durchlaufzeit der Logik, Laufzeit der Verdrahtung (Routing)). Das CE-Signal kann von der Entwurfssoftware wie ein normales Steuersignal behandelt werden und vereinfacht damit erheblich die automatische Analyse der maximalen Schaltfrequenz (Timing Analyses).

Beispiele

Im nachfolgenden Bild sind alle drei Typen von Takt kurz skizziert. Der schnelle Takt treibt einen 4Bit Zähler (CNT1). Dessen Ausgänge werden über eine UND-Gatter (Gate1) kombinatorisch verknüpft. Der Ausgang des UND-Gatters ist nur dann HIGH, wenn alle Eingänge HIGH sind. Das ist nur einmal alle 16 Takte der Fall, wenn der Zählerstand binär 1111 erreicht ist. Dieses Signal als Takt zu verwenden wäre sträflich, denn es ist ein Gated Clock. Wenn er jedoch noch einmal mittels FlipFlop (FF1) zwischengespeichert wird ist es ein Derived Clock. Der beste und sinnvollste Weg ist jedoch die Verwendung des CE-Eingangs der FlipFlops (FF2) wie es ganz unten im Bild dargestellt ist.

verschiedene Taktteiler


Umsetzung in VHDL

-- Die Verwendung von "Clock Enable" in VHDL
-- die Signale clk und ce sind hier natürlich nur Beispiele
-- es kann dafür jeder beliebige Signalname verwendet werden

-- Das hier muss in die Signaldeklaration zwischen
-- achitecture ...   und  begin

constant cnt_div: integer:=16;                  -- Teilerverhältnis
signal   cnt:     integer range 0 to cnt_div-1; -- Zähler für Teiler
signal   ce:      std_logic;

-- die Prozesse logischerweise nach begin der Architecture

-- Prozess mit langsamen Clock Enable

process(clk)
begin
  if rising_edge(clk) then
    if ce='1' then

    -- Aktionen hier einfügen, welche mit langsamen Takt laufen    

    end if;
  end if;
end process;

-- Clock Enable Generator

process(clk)
begin
  if rising_edge(clk) then
    if cnt=cnt_div-1 then
      ce  <= '1';
      cnt <= 0;
    else
      ce  <= '0';
      cnt <= cnt +1 ;
    end if;
  end if;
end process;

Clock Skew

Mithilfe der clock skew Einstellung kann ein Synthesewerkzeug angewiesen werden, den Zeitpunkt der Taktflanke entsprechend den Erfordernissen der Schaltungsverzögerungen einzustellen. Dies schafft mehr Reserven. Üblicherweise werden die Takte im FPGA so hingeschoben, dass sie synchron mit dem Erzeugertakt liegt, weil die damit erzeugten Daten am Ausgang ebenfalls wieder zur Taktphase passen und in der Regel auf diese Weise auch synchrone Datenbusse, die mit diesem Takt ankommen, leicht eingesampelt werden können.

Phase Shift

Innerhalb der FPGA-PLLs können mehrere Takte von demselben Eingangstakt abgeleitet werden, die eine feste Verschiebung aufweisen.