|
|
Glitchoder Warum man besser die Grundregeln für Synchrones Design beachtet
[Bearbeiten] EinleitungHeutzutage enthält fast jedes Ding im täglichen Leben ein Stück Elektronik, und fast überall ist auch digitale Elektronik dabei. Diese Digitalschaltungen werden von Ingenieuren entworfen. Vor 30 Jahren wurde diese Aufgabe mit Standard TTL Logik gelöst. Komplexe Funktionen füllten Dutzende von Platinen, jede mit hunderten von IC gefüllt, welche alle verbunden waren. Später gab es programmierbare ICs (PAL, GAL), welche durch den Anwender programmiert werden konnten und deutlich komplexere, problembezogene Funktionen mit deutlich weniger Platzbedarf erfüllen konnten. Heute sind die am weitesten entwickelten ICs die FPGAs. Diese sind in der Lage, Daten mit mehreren hundert MHz Taktfrequenz zu verarbeiten, enthalten 10.000 und mehr FlipFlops, Funktionsgeneratoren (LUTs, Look Up Table) und spezielle Funktionsblöcke ( RAM, DLLs, spezielle IO-Zellen etc.). [Bearbeiten] Das ProblemWenn man ein digitales System mit FPGAs entwirft, müssen ein paar grundlegende Regeln eingehalten werden, um ein stabiles Ergebnis zu erhalten. Im Allgemeinen sind FPGAs und die zugehörigen Synthesewerkzeuge auf synchrone Schaltungen ausgelegt. Aber es gibt ein paar schmutzige Tricks, welche in der guten, alten TTL-Zeit funktionierten, weil die relativ langsamen ICs und die großflächige Verkabelung als Tiefpassfilter wirkten und einige Dreckeffekte versteckten. Mit modernen FPGAs, dessen FlipFlops und LUTs mit einigen hundert MHz laufen, werden diese bösen Tricks nicht mehr gefiltert, genauer gesagt können und werden diese Tricks Probleme machen. Ein erfahrener Ingenieur wird diese Probleme von vorn herein vermeiden, aber ein Anfänger, welcher durch ein Zeitfenster aus der TTL-Zeit direkt in die FPGA-Ära hereinspringt hat diese Erfahrung (=erlebtes Leid?) nicht. [Bearbeiten] Die Grundlagen eines GlitchDas hier diskutierte Problem sind Glitches von digitalen Signalen. Ein Glitch ist ein sehr kurzer Puls (nur ein paar Nanosekunden lang), verursacht durch einen Dekoder. Ein Dekoder ist im Allgemeinen ein ROM, welcher einen Eingangscode (ein Vektor aus Bits) in einen Ausgangscode übersetzt. Die meisten FPGAs haben LUTs mit 4-6 Eingängen, was ganz einfach ein ROM mit 16-64 Bit darstellt, dessen Inhalt vom Entwickler festgelegt werden kann. Wenn man einen großen Dekoder mit mehr Eingängen benötigt, als eine einzelne LUT zur Verfügung stellt, dann muss man mehrere LUTs zusammenschalten bis die gewünschte Funktion erreicht ist. Im Allgemeinen ist aber die Durchlaufzeit von allen Eingängen zum Ausgang unterschiedlich, sowohl bei einer einzelnen LUT als auch bei mehreren zusammengeschalteten. D.h., wenn mehrere Eingangsbits gleichzeitig ihren Pegel wechseln, sind einige Bits schneller als andere. Das kann und wird dazu führen, dass der Ausgang des Dekoders vom aktuellen Zustand auf einen Zwischenzustand springt und nach wenigen Nanosekunden erst auf den richtigen, dauerhaften Zustand. Wenn so ein "verglitschtes" Signal als Takt oder asynchroner Reset benutz wird, verursacht das viele Probleme. Schauen wir uns die Logik an. Das ist ein einfaches 2-Bit Schieberegister, welches nur zwischen den zwei Zuständen "01" und "10" wechselt.
Wenn man die Schaltung statisch betrachtet, wird der Ausgang E immer 1 sein. Aber dynamisch ist das nicht der Fall. Wir nehmen an.
Diese Zahlen sind realistisch. Jetzt schauen wir uns den Übergang des Schieberegisters von "10" aud "01" genau an.
Ein guter, alter TTL-IC würde da nicht mal blinzeln, aber heutige FPGAs sind sauschnell. Nicht nur die LUTs, auch die FlipFlips können höllisch schnell schalten. [Bearbeiten] MessaufbauDie Messungen wurden mit einem Spartan-II Evaluationboard von Insight Electronics durchgeführt. Es enthält einen XC2S100-5PQ208. Die Testschaltung wurde durch einen 36 MHz Quarz getaktet, der Wert ist aber vollkommen unwichtig, 1 MHz würde genauso funktionieren. Die Testausgänge wurden mit selbstgebauten High Speed Tastköpfen gemessen, wie sie im Buch "High speed digital Design - A Handbook of Black Magic" empfohlen werden. Die Anstiegszeit dieser Tastköpfe liegt irgendwo bei 200ps. Das Oszilloskop, mit welchen die Screenshots gemacht wurden, ist ein Tektronix TDS 3034 mit 300 MHz Bandbreite. Einige Zusatzmessungen wurden mit einem Tektronix CSA 404 mit einem 11A34 Verstärker gemacht, welcher 1 GHz Bandbreite hat. Leider konnten damit keine Screenshots gemacht werden (Softwareprobleme). Man beachte, dass die Leitungen nicht terminiert sind. Reflektionen und Überschwinger sind für diesen Test unkritisch.
Die Testlogik wurde in VHDL definiert. Sie enthält zwei FlipFlops, welche mit jedem Takt gleichzeitig umschalten. Da sie immer entgegengesetzte Pegel haben, sollte der Ausgang des XOR immer auf '1' liegen. Aber auf Grund der ungleichen Durchlaufverzögerung der zwei Eingangsbits wird der Ausgang des XOR einen Glitch erzeugen. Dieser Glitch taktet ein drittes FlipFlop. Der "verglitchte" XOR-Augang sowie der Ausgang des 3. FlipFlops sind zur Messung auf Ausgangspins geroutet.
Die Grundelemente wurden mittels Constraints auf definierte Plätze im FPGA platziert, um deterministische Ergebnisse zu erreichen. Auch die IO-Zellen wurden auf maximale Geschwindigkeit konfiguriert.
NET "glitch_detect" LOC = "P42";
NET "clk_in" LOC = "P80";
NET "bad_clk" LOC = "P41";
INST s1 LOC = "CLB_R15C1.S0"; # place FF2 close to XOR LUT (C37)
INST s3 LOC = "CLB_R15C1.S1"; # place FF3 close to XOR LUT (C37)
INST l_xor LOC = "CLB_R15C1.S1"; # XOR LUT
INST s2 LOC = "CLB_R15C30.S0"; # place FF1, FAR from FF2, so the glitch will be VERY big
# modify the column C30 to set routing delay
NET "bad_clk" drive=24;
NET "bad_clk" FAST;
NET "glitch_detect" drive=6;
NET "glitch_detect" SLOW;
[Bearbeiten] MessergebnisseAuf Kanal 1 wird das Signal bad_clk angezeigt, auf Kanal 2 glitch_detect.
[Bearbeiten] Siehe auch[Bearbeiten] Weblinks
|