<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=62.157.123.103</id>
	<title>Mikrocontroller.net - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=62.157.123.103"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/62.157.123.103"/>
	<updated>2026-04-10T23:46:17Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Richtiges_Designen_von_Platinenlayouts&amp;diff=85230</id>
		<title>Richtiges Designen von Platinenlayouts</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Richtiges_Designen_von_Platinenlayouts&amp;diff=85230"/>
		<updated>2014-10-14T07:24:04Z</updated>

		<summary type="html">&lt;p&gt;62.157.123.103: Typos&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Beim Erstellen von Platinenlayouts muss man vieles beachten. Dieser Artikel zählt auf, was man machen sollte (Dos), und was man keinesfalls machen sollte (Don&#039;ts).&lt;br /&gt;
Der Grund hierfür ist, dass die &amp;quot;Regeln&amp;quot; (besser eigentlich &amp;quot;Bedingungen&amp;quot;) sehr umfangreich und komplex sind. Dazu kommt, dass es eigentlich keine Regel ohne Ausnahme gibt, und zusätzlich zu den rein elektrotechnischen Anforderungen noch mechanische und chemische sowie betriebswirtschaftliche Anforderungen bestehen. Siehe dazu diesen [http://www.mikrocontroller.net/topic/305443#3280240 Diskussionsbeitrag (letzter Absatz)].&lt;br /&gt;
&lt;br /&gt;
== Gutes Platinenlayout (Dos) ==&lt;br /&gt;
&lt;br /&gt;
* Berechne nach dem Erstellen des Schaltplans, welche Ströme über die Leiterbahn fließen werden und bestimme anhand dessen deren minimale Breite. Faustformel: 0,35mm können ohne nennenswerte Erwärmung mit einem Ampere belastet werden. Kritische Leitungen sollten als Vorgabe für den Layouter in der Zeichnung vermerkt werden. Weiteres siehe unter [[Leiterbahnbreite]].&lt;br /&gt;
* Halte die Leiterplatte möglichst kurz. Jeder Leiterzug wirkt wie eine Antenne, welche Störungen aussendet und empfängt.&lt;br /&gt;
* Nutze die freien Flächen zwischen den Leiterzügen und verbinde sie mit einer Masse (Polygone). So kann man Strahlung von außen abschirmen und oft Abstrahlung minimieren. Vermeide aber freie Kupferflächen, die nicht an GND angeschlossen sind. &lt;br /&gt;
* Geize nicht mit [[Kondensator#Entkoppelkondensator | Blockkondensatoren]]. Für jeden VCC-Pin o.ä. ist mindestens ein 100nF Kondensator, bei schnelleren Sachen evtl. ein kleinerer (z.&amp;amp;nbsp;B. 10nF) einzusetzen. Ausserdem kann es meist notwendig sein, pro IC noch zusätzlich einen 10µF Kondensator und eine Ferritperle (engl. bead) zur Entkopplung von Vcc zu spendieren.&lt;br /&gt;
* Digitale und analoge Signale getrennt routen und nur in einem Punkt verbinden. Und zwar idealerweise am [[AD-Wandler]], falls dieser vorhanden ist, sonst in der Nähe des Spannungsreglers. Eine Massefläche für analoge und digitale Schaltungsteile sollte durchgängig sein, getrennte Masseflächen sind nur in sehr seltenen Fällen sinnvoll. &lt;br /&gt;
* Nutze die Anschlüsse der bedrahteten Bauelemente für Durchkontaktierungen.&lt;br /&gt;
* Wenn es sich nicht vermeiden lässt 230V (400V) Netzspannung auf die Platine zu führen, so trenne die Bereiche der Kleinspannung und Netzspannung deutlich voneinander und mit vieeel Platz. Dabei unterscheidet man zwischen Luft- und Kriechstrecken. Eine Kriechstrecke ist die Strecke auf der Oberfläche einer Leiterplatte oder eines Bauteils. Die Luftstrecke ist sozusagen die kürzeste Verbindung zwischen den beiden Potentialen. Die Luft- und Kriechstrecken betragen zwischen 3 und 8 mm. Maximale Spannung z.b. 3kV/cm, bei lackierten Platinen 1kv/mm. Der notwendige Abstand hängt von der Gefährdung ab, siehe auch [[Leiterbahnabstände]].&lt;br /&gt;
* Möglichst eine großflächige Ground-Plane für Masseverbindungen.&lt;br /&gt;
&lt;br /&gt;
== Schlechtes Platinenlayout (Don&#039;ts) ==&lt;br /&gt;
&lt;br /&gt;
* Analoge und digitale Schaltungsteile direkt ohne Filter aus der gleichen Stromquelle versorgen.&lt;br /&gt;
* Nicht beachtet, dass Ströme im Kreis fließen, und damit empfindliche Signale zusammen mit pulsierenden Versorgungsströmen über die gleichen Bahnen geleitet&lt;br /&gt;
* Digitale Signalleitungen in unmittelbarer Nachbarschaft analoger Signale&lt;br /&gt;
* Zu wenig Abstand zwischen Leiterplattenrand und Leiterzügen&lt;br /&gt;
* 90° oder spitze Winkel beim Routen von Leiterbahnen. Entgegen der weit verbreiteten Annahme hat das nur sehr wenig Auswirkungen auf die HF-Eigenschaften. Es sind mehr fertigungstechnische (Ablösung von Ecken, schlechteres Ätzen) und ästhetische Gründe (Aussehen, Packungsdichte der Leitungen). Mehr dazu im Artikel [[Wellenwiderstand#Leitungsf.C3.BChrung_und_Layout | Wellenwiderstand]].&lt;br /&gt;
* Durchkontaktierungen auf SMD-Pads. Beim maschinellen Löten läuft das Flussmittel bzw. das Lötzinn in die Bohrung ab, und fehlt auf dem Pad. Die Fehlerhäufigkeit steigt. Bei speziellen Footprints (große Ballgrid Arrays) oder thermal Vias geht es aber nicht anders, als Vias in Pads unterzubringen. In diesem Falle müssen die Vias &amp;quot;geplugged&amp;quot; oder &amp;quot;getented&amp;quot; werden. Eine weitere Möglichkeit ist es, einen Überschuss an Lötpaste auf das Pad aufzubringen (dickeren Siebdruckstencil), oder die Vias mit Barrieren aus Lötstopplack zu umgeben, aber nicht abzudecken&lt;br /&gt;
* Durchkontaktierungen von beiden Seiten mit Stopplack verschließen. Es könnten Feuchtigkeit oder gar Ätzrückstände darin zurückbleiben und beim Löten der Stopplack abplatzen oder Korrosion auftreten (ggf. Hersteller fragen)&lt;br /&gt;
* Bestückdruck auf Lötpads platziert&lt;br /&gt;
* Keine Testpunkte, keine Befestigungsbohrungen&lt;br /&gt;
* Zu wenig Durchkontaktierungen bei hohen Strömen&lt;br /&gt;
* Entkoppelkondensatoren über unnötig lange Leiterbahnen angebunden&lt;br /&gt;
* Keine Groundplane&lt;br /&gt;
&lt;br /&gt;
== Vorgehen bei der Layouterstellung ==&lt;br /&gt;
* Umrisse der Platine festlegen, dabei Bruchkanten eventueller Nutzen beachten&lt;br /&gt;
* Befestigungsbohrungen festlegen, dabei ausreichend Platz für Schraubenköpfe und Werkzeuge freihalten (Sperrflächen verlegen)&lt;br /&gt;
* Steckverbinder platzieren, dabei den 3D-Zusammenhang mit anderen Platinen im Bezug auf Kabeldrehung und  -knickung beachten, gfs Steckverbinder um 180 gedreht, um Sonderkabel zu vermeiden und auch nicht völlig am Rand, wegen Biegeradius von Flachbandkabeln / Zwischenraum zur Gehäusewand&lt;br /&gt;
* Bauteile platzieren, dabei möglichst zusammengehörige Bauteile nebeneinander platzieren. Die Verbindungen (Luftlinien, engl. air wires) möglichst kurz und kreuzungsarm halten. Idealerweise erst die grossen und hohen Bauteile festlegen, dabei Einbaumasse und -raum beachten, auch um Bezug auf Wärementwicklung&lt;br /&gt;
* Stromversorgung der ICs verlegen, dabei Abstand zu Kanten unn kritischen Signalen /-eingängen beachten. Ebenso Kriechstrecken beachten&lt;br /&gt;
* Kritische Signale wie Takte, Sensoreingänge etc ohne Lagewechsel verlegen, ggf. guard lines verwenden &lt;br /&gt;
* Restliche Signale verlegen&lt;br /&gt;
* Masseflächen füllen&lt;br /&gt;
** Masseflächen können eine Schaltung deutlich verbessern, wenn sie richtig benutzt werden. Sie können aber auch genau das Gegenteil bewirken, wenn sie als automatisches Wundermittel betrachtet werden.&lt;br /&gt;
** Die Masseverbindung aller ICs muss zunächst direkt verlegt werden.&lt;br /&gt;
** Erst wenn die Masse komplett layoutet ist, kann man die Massefläche auffüllen. Damit verhindert man, dass vielleicht ein IC nur über eine sehr dünne Verbindung angeschlossen wird, welche man in der Massefläche übersieht.&lt;br /&gt;
** Masseflächen sind nur dann wirklich wirksam, wenn sie möglichst durchgängig sind. Wenn sie durch viele Leitungen zerschnitten werden, sinkt ihre Wirksamkeit massiv und sie können sich zu einem EMV-Problem entwickeln (Abstrahlung von Energie, Streifen- und Schlitzantennen). Bei zweilagigen Platinen ist es aber kaum möglich, dass Masseflächen nicht zerstückelt werden. Auf jeden Fall darauf achten, das KEINE Zipfel oder Streifen Massefläche existieren, die nicht an mindestens beiden Enden mit anderen Masseflächen verbunden sind. Für &amp;quot;Systeme&amp;quot; aus solchen Masseflächen gilt gleiches, d.h. die Masseflächen müssen auch untereinander gut vernetzt werden. Wenn dieses nicht erreicht werden kann, so ist die Massefläche besser wegzulassen.&lt;br /&gt;
** Bei Platinen mit vier oder mehr Lagen wird meist eine Lage für die Masse (GND) verwendet. Hier hat man den Luxus, dass man GND nicht manuell layouten muss sondern einfach die ICs an die Massefläche anschließt. Aber Vorsicht! Bei Schaltreglern und Leistungsstufen für Motoren und Ähnlichem ist es oft besser bzw. notwendig, auf Masseflächen zu verzichten und statt dessen mit dicken Leitungen bzw. kleineren Polygonen die Ströme sternförmig zu führen.&lt;br /&gt;
** Des weiteren ergibt sich bei Platinen mit vier oder mehr Lagen die Möglichkeit, auch die Spannungsversorgung (&amp;quot;+ Leitung&amp;quot;) als Fläche auszuführen. Grundsätzlich gelten hierbei die gleichen Empfehlungen wie für die Masseflächen. Diese beiden Stromversorgungslagen sollten in dem Sinne, dass sie einen großen, verteilten Kondensator darstellen, der extrem impedanzarm ist, möglichst dicht zusammen liegen. Bei einem Multilayeraufbau mit vier Lagen wären das z.B. die beiden inneren Lagen. Zusätzlich sollten die beiden Lagen öfters mit keramischen Kondensatoren verbunden werden, mindestens an jedem IC zur Spannungsversorgung.&lt;br /&gt;
* Für die Bestückung und das Bedrucken mit Lotpaste sind Passermarken (engl. Fiducials) nötig. Diese Passermarken werden normalerweise als Kreuze oder besser als runde Pads (z.B 1mm) ausgeführt und von Kupfer freigestellt (2mm, Nicht in die Masseflächen einbeziehen). Die Passermarken werden dann von Lötstop freigegstellt und im Stencil/Lotpastensieb mit eingebracht. Auf jede zu bestückende Seite sollten zwei Passermarken diagonal auf den Boards eingebracht werden. Andere Vorschläge zielen darauf ab, die Passermarken nicht für das komplette Board, sondern immer extra für spezielle &amp;quot;kritische&amp;quot; Footprints einzusetzten. Passermarken zur Platinenfertigung setzten sich die Platinenfertiger selbstständig ausserhalb der Platinen nach ihren eigenen Bedürfnissen. Die Passermarken für die Bestücker werden voraussichtlich von den Bestückern auch noch adaptiert, so dass sie lediglich als Platzhalter zu verstehen sind, damit Raum beim routen dafür ausgespart bleibt.&lt;br /&gt;
*Der Bestückungsdruck wird am Ende ausgerichtet. Dazu sollte man nahezu alle Lagen ausblenden und nur die Lagen für Bestückungsdruck, Umrisse und Lötstopmaske anzeigen lassen. Dann richtet man die Beschriftungen so aus, dass sie neben den Bauteilen aber nicht auf den Flächen der Lötstopmaske liegen, denn dort gehört die Lotpaste und später der Anschluss der Bauteile hin. Bei sehr dicht bestückten Platinen muss man den Bestückungsdruck teilweise oder vollständig weglassen. Dort platziert man die Bauteilbezeichnung direkt auf dem Bauteil. Damit kann man den Bestückungsdruck wenigstens auf Papier drucken und somit indirekt nutzen. Eingige Profi-CAD-Programme haben dafür auch getrennte Ebenen (engl. Layer).&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[EMV]]&lt;br /&gt;
* [[Eagle im Hobbybereich]]&lt;br /&gt;
*[http://www.mikrocontroller.net/forum/read-6-178710.html#254235 Forumsbeitrag]: Regeln beim Platinenentwurf&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/93602#804338 Forumsbeitrag]: Vorschlag für Lötpads bei Hobbyeinsteigerplatinen&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/306233#new Forumsbeitrag]: Über spezielle Padformen (Teardrop, Snowman, Oktogon)&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/231263#new Forumsbeitrag]: Suche gutes Buch über Layout-Techniken (Literaturtipps und Links).&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/305443#3286008 Forumsbeitrag]: Tutorials zu Platinenlayout&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/310971#new Forumsbeitrag]: Tipps zum Routen und Entflechten von Platinen.&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/313990#3393319 Forumsbeitrag]: Das Routen von LVDS Signalen.&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [http://www.ilfa.de/design-optimierung.html Optimierung von Layouts]&lt;br /&gt;
*[http://www.ilfa.de/designrichtlinien Weitere Dokumente zum Thema professionelle Platinenherstellung]&lt;br /&gt;
* [http://www.analog.com/library/analogDialogue/Anniversary/12.html Grounding (Again)], Ask The Applications Engineer - 12, Fa. Analog Devices, (englisch)&lt;br /&gt;
&amp;lt;!-- * http://edaboard.com --&amp;gt;&lt;br /&gt;
* [http://www.sparkfun.com/commerce/tutorial_info.php?tutorials_id=115 Designing a Better PCB] von Sparkfun (engl.)&lt;br /&gt;
* [http://www.hottconsultants.com/tips.html Tech Tips] von Henry Ott (engl.)&lt;br /&gt;
* [http://www.ultracad.com/articles/90deg.pdf Messung] von verschiedenen Winkeln von Leiterbahnen mit 17ps TDR, keinerlei Unterschiede!&lt;br /&gt;
* [http://www.ilfa.de/absorptivesstromversorgungssysteminleiterplatten.html ILFA], Dämpfung von Resonanzen der Versorgungslagen durch Carbondruck&lt;br /&gt;
* [http://docs.toradex.com/101123-apalis-arm-carrier-board-design-guide.pdf Link]: Tipps zum erstellen von High Speed Platinen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Platinen]]&lt;br /&gt;
[[Kategorie:Schaltplaneditoren]]&lt;/div&gt;</summary>
		<author><name>62.157.123.103</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Stromversorgung_f%C3%BCr_FPGAs&amp;diff=81257</id>
		<title>Stromversorgung für FPGAs</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Stromversorgung_f%C3%BCr_FPGAs&amp;diff=81257"/>
		<updated>2014-01-31T08:42:09Z</updated>

		<summary type="html">&lt;p&gt;62.157.123.103: /* Erklärung */ typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In diesem Artikel soll eine kurze Erklärung zum Entwurfsproblem von Stromversorgungen für Hochleistungs-[[FPGA]]s gegeben werden. Ein neuer Ansatz zur Messung des Frequenzgangs wird dargestellt. Praktische Messungen werden gezeigt.&lt;br /&gt;
&lt;br /&gt;
FPGAs werden immer mehr Bestandteil moderner Elektronik. Die Bausteine werden größer, schneller und leistungsstärker mit jedem Tag. Und so steigt auch die Leistungsaufnahme. Obwohl die Leistung pro Gatter sich durch bessere Technologie und kleinere Geometrien verringert, steigt die Taktfrequenz und die Anzahl der Gatter pro Bauteil. Mit steigender Schaltgeschwindigkeit wird die Stromversorgung zu einem kritischen Teil im Systementwurf. Das Stromversorgungsnetz muss eine Quelle mit niedriger Impedanz über einen sehr weiten Frequenzbereich sein. Anderenfalls könnnen Überschwinger, Spannungsabfall oder Störpulse auf VCC/GND die Funktion des FPGAs stören, welche durch den schnell wechselnden Leistungsbedarf des FPGAs verursacht wird.&lt;br /&gt;
&lt;br /&gt;
== Breitbandentkopplung ist Teamwork ==&lt;br /&gt;
&lt;br /&gt;
Der Spannungsregler muss die Gleichstromkomponente für das Stromversorgungsnetzwerk liefern. Bei maximaler Leistung und Umgebungstemperatur muss er immer noch sauber funktionieren ohne zu überhitzen, Spannungseinbrüche etc. Seine Aufgabe ist es, auf niederfrequente Lastsprünge zu reagieren (ca. 0..30kHz).&lt;br /&gt;
&lt;br /&gt;
Im mittleren Frequenzbereich kann der Spannungsregler nicht mehr reagieren, er ist zu langsam. Der Strom muss dann von großen Elektrolytkondensatoren geliefert werden. Diese Kondensatoren können bis einige MHz Strom liefern, danach begrenzen der parasitäre Widerstand (ESR, engl. effective series resistance) bzw. die parasitäre Induktivität (ESL, engl. effective series inductance) die Stromlieferfähigkeit des Kondensators und machen ihn irgendwann bei höheren Frequenzen nutzlos.&lt;br /&gt;
&lt;br /&gt;
Jetzt kommt die Zeit der kleinen Keramikkondensatoren, typisch 10 oder 100nF. Sie gibt es in kleinen [[SMD]]-Gehäusen wie 0603 und kleiner mit sehr wenig parasitärer Induktivität. Sie können Strom bis einige hundert MHz liefern und sind damit eine niederohmige Quelle für Hochfrequenzströme.&lt;br /&gt;
&lt;br /&gt;
Aber für die &#039;&#039;&#039;wirklich&#039;&#039;&#039; schnell schaltenden ICs sind auch diese Keramikkondensatoren nicht ausreichend, um das Stromversorgungsnetzwerk ausreichend zu entkoppeln. Hier braucht man die Kapazität der Stromversorgungsflächen, welche duch VCC- und Masseflächen in mehrlagigen Platinen gebildet wird. Um ein Maximum an Kapazität zu erreichen sollte ein dünnes Dielektrikum mit einer hohen Dielektrizitätskonstante und niedrigen Verlusten benutzen. Außerdem sollte man ein VIA für jedes VCC/GND Pin benutzen, um die parasitären Induktivitäten zu minimieren, nicht ein VIA für mehrere Pins! [[IC-Gehäuseformen#BGA | BGA-Gehäuse]] bieten zusätzlich kürzere Verbindungen vom eigentlichen IC zur Platine, sie sind aber schwieriger zu handhaben (Layout und [[SMD Löten | Löten]]).&lt;br /&gt;
&lt;br /&gt;
== Der klassische Ansatz ==&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
* dem FPGA und dessen Leistungsaufnahme, welche von der Schaltfrequenz abhängt&lt;br /&gt;
* dem Layout der Platine mit der Platzierung der verschiedenen Kondensatoren&lt;br /&gt;
&lt;br /&gt;
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 Widerstand über die Frequenz auf. Diese Methode hat einige Nachteile.&lt;br /&gt;
&lt;br /&gt;
*Man braucht einen teuren Netzwerkanalysator&lt;br /&gt;
*Man benötigt eine zusätzliches Board, welches nur mit den Kondensatoren bestückt ist, welches nicht immer verfügbar ist&lt;br /&gt;
*Die Messung spiegelt nicht die wahren Bedingungen wieder, weil alle ICs und aktiven Teile fehlen. Ausserdem sind nur Punkt zu Punkt Messungen möglich, welche das reale Verhalten nicht korrekt wiedergeben.&lt;br /&gt;
&lt;br /&gt;
Die Methode in diesem Artikel versucht, die meisten Nachteile zu vermeiden.&lt;br /&gt;
&lt;br /&gt;
== Ein direkter Ansatz ==&lt;br /&gt;
&lt;br /&gt;
Da wir hier über FPGAs reden, haben wir die Möglichkeit, &#039;&#039;&#039;jede&#039;&#039;&#039; 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 [[FlipFlop]]s ihren Pegel gleichzeitig wechseln und dabei große Signalnetze treiben (parasitäre Kapazität). Also entwerfen wir die folgende Schaltung. &lt;br /&gt;
&lt;br /&gt;
[[bild:Schematic.gif|thumb|left|600px|Logik für Lasttest]]&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Steuerung der Testlogik&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! sel&amp;lt;1&amp;gt; || sel&amp;lt;0&amp;gt; || Modus&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || inaktiv&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || konstante Umschaltung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || Burstbetrieb&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== VHDL Code ==&lt;br /&gt;
&lt;br /&gt;
Wenn der Code synthetisiert wird, muss die Option &amp;quot;remove duplicate registers&amp;quot; in der Synthesesoftware ausgeschaltet werden. Es sollten zwei Dateien angelegt werden, top.vhd und row.vhd.&lt;br /&gt;
&lt;br /&gt;
Datei top.vhd&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
entity power is&lt;br /&gt;
    Port ( clk_in  : in std_logic;                      -- clock input&lt;br /&gt;
           sel     : in std_logic_vector(1 downto 0);   -- select modulation ON/OFF&lt;br /&gt;
           gnd     : out std_logic_vector(5 downto 0);  -- artificial gnd&lt;br /&gt;
           mod_out : out std_logic;                     -- modulation signal&lt;br /&gt;
           reset   : in std_logic;                      -- reset for DLL&lt;br /&gt;
           dummy   : out std_logic);                    -- dummy out, to fool the synthesizer&lt;br /&gt;
           &lt;br /&gt;
end power;&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of power is&lt;br /&gt;
&lt;br /&gt;
COMPONENT row&lt;br /&gt;
    PORT(&lt;br /&gt;
        clk  : IN std_logic;&lt;br /&gt;
        data : IN std_logic;    &lt;br /&gt;
        dout : OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
&lt;br /&gt;
-- DLL (Delay Locked Loop), a Virtex primitive&lt;br /&gt;
&lt;br /&gt;
component CLKDLL&lt;br /&gt;
    port (  &lt;br /&gt;
        CLKIN   : in    std_logic;&lt;br /&gt;
        CLKFB   : in    std_logic;&lt;br /&gt;
        RST     : in    std_logic;&lt;br /&gt;
        CLK0    : out   std_logic;&lt;br /&gt;
        CLK90   : out   std_logic;&lt;br /&gt;
        CLK180  : out   std_logic;&lt;br /&gt;
        CLK270  : out   std_logic;&lt;br /&gt;
        CLK2X   : out   std_logic;&lt;br /&gt;
        CLKDV   : out   std_logic;&lt;br /&gt;
        LOCKED  : out   std_logic);&lt;br /&gt;
end component;&lt;br /&gt;
&lt;br /&gt;
-- BUFG (Global Clock buffer), a Virtex  primitive&lt;br /&gt;
&lt;br /&gt;
component BUFG&lt;br /&gt;
    port (  I   : in    std_logic;&lt;br /&gt;
            O   : out   std_logic);&lt;br /&gt;
end component;&lt;br /&gt;
&lt;br /&gt;
-- IBUFG (Global Clock input buffer ), aa Virtex primitive&lt;br /&gt;
&lt;br /&gt;
component IBUFG&lt;br /&gt;
    port (  I   : in    std_logic;&lt;br /&gt;
            O   : out   std_logic);&lt;br /&gt;
end component;&lt;br /&gt;
&lt;br /&gt;
component SRL16     -- virtex primitive&lt;br /&gt;
  port (&lt;br /&gt;
        D    : in std_logic;        &lt;br /&gt;
        CLK  : in std_logic;&lt;br /&gt;
        A0   : in std_logic;&lt;br /&gt;
        A1   : in std_logic;&lt;br /&gt;
        A2   : in std_logic;&lt;br /&gt;
        A3   : in std_logic;        &lt;br /&gt;
        Q    : out std_logic&lt;br /&gt;
       ); &lt;br /&gt;
end component;&lt;br /&gt;
&lt;br /&gt;
constant rows: integer:=30;&lt;br /&gt;
&lt;br /&gt;
type flop_array is array (rows-1 downto 0) of std_logic_vector(49 downto 0);&lt;br /&gt;
&lt;br /&gt;
signal toggle   : std_logic;                            -- a toggle flipflop&lt;br /&gt;
signal ff_ar    : flop_array;&lt;br /&gt;
signal drive_ar : std_logic_vector (rows-1 downto 0);   -- driver array for toggeling rows&lt;br /&gt;
signal dout_ar  : std_logic_vector (rows-1 downto 0);   -- driver array for toggeling rows&lt;br /&gt;
signal or_ar    : std_logic_vector (rows-1 downto 0);   -- driver array for toggeling rows&lt;br /&gt;
signal cnt      : std_logic_vector (15 downto 0);       -- modulation divider&lt;br /&gt;
&lt;br /&gt;
signal CLKIN_w, RESET_w, CLK2X_dll, CLK2X_g, CLK4X_dll, CLK4X_g, CLK8X_dll, CLK8X_g: std_logic;&lt;br /&gt;
signal LOCKED2X, LOCKED2X_delay, RESET4X, RESET8X, LOCKED4X, LOCKED4X_delay, LOCKED8X : std_logic;&lt;br /&gt;
&lt;br /&gt;
signal logic1,clk : std_logic;&lt;br /&gt;
&lt;br /&gt;
signal clk2x,clk4x,clk8x, clkmux: std_logic;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
-- use two DLL to get 147 MHz&lt;br /&gt;
&lt;br /&gt;
logic1&amp;lt;=&#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
clkpad : IBUFG  port map (I=&amp;gt;CLK_IN, O=&amp;gt;CLKIN_w);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
dll2x  : CLKDLL port map (CLKIN=&amp;gt;CLKIN_w,   CLKFB=&amp;gt;CLK2X_g, RST=&amp;gt;RESET,&lt;br /&gt;
                          CLK0=&amp;gt;open,   CLK90=&amp;gt;open, CLK180=&amp;gt;open, CLK270=&amp;gt;open,&lt;br /&gt;
                          CLK2X=&amp;gt;CLK2X_dll, CLKDV=&amp;gt;open, LOCKED=&amp;gt;LOCKED2X);&lt;br /&gt;
&lt;br /&gt;
clk2xg : BUFG   port map (I=&amp;gt;CLK2X_dll,   O=&amp;gt;CLK2X_g);&lt;br /&gt;
&lt;br /&gt;
rstsrl : SRL16  port map (D=&amp;gt;LOCKED2X, CLK=&amp;gt;CLK2X_g, Q=&amp;gt;LOCKED2X_delay,&lt;br /&gt;
                          A3=&amp;gt;logic1, A2=&amp;gt;logic1, A1=&amp;gt;logic1, A0=&amp;gt;logic1);&lt;br /&gt;
&lt;br /&gt;
RESET4X &amp;lt;= not LOCKED2X_delay;&lt;br /&gt;
&lt;br /&gt;
dll4x  : CLKDLL port map (CLKIN=&amp;gt;CLK2X_g,  CLKFB=&amp;gt;CLK4X_g, RST=&amp;gt;RESET4X,&lt;br /&gt;
                          CLK0=&amp;gt;open,   CLK90=&amp;gt;open, CLK180=&amp;gt;open, CLK270=&amp;gt;open,&lt;br /&gt;
                          CLK2X=&amp;gt;CLK4X_dll, CLKDV=&amp;gt;open, LOCKED=&amp;gt;LOCKED4X);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
clk4xg : BUFG   port map (I=&amp;gt;CLK4X_dll,  O=&amp;gt;CLK4X_g);&lt;br /&gt;
&lt;br /&gt;
clk&amp;lt;=clk4x_g;&lt;br /&gt;
&lt;br /&gt;
-- the toggeling array&lt;br /&gt;
&lt;br /&gt;
l_rows: for i in 0 to rows-1 generate&lt;br /&gt;
    Inst_row: row PORT MAP(&lt;br /&gt;
        clk  =&amp;gt; clk,&lt;br /&gt;
        data =&amp;gt; drive_ar(i),&lt;br /&gt;
        dout =&amp;gt; dout_ar(i)&lt;br /&gt;
    );&lt;br /&gt;
  end generate;&lt;br /&gt;
&lt;br /&gt;
-- combine all douts via a BIG or-gate&lt;br /&gt;
&lt;br /&gt;
  process(dout_ar)&lt;br /&gt;
  variable tmp: std_logic;&lt;br /&gt;
  begin&lt;br /&gt;
    tmp:=&#039;0&#039;;&lt;br /&gt;
    l_or: for i in 0 to rows-1 loop&lt;br /&gt;
      tmp:=tmp or dout_ar(i);&lt;br /&gt;
    end loop;&lt;br /&gt;
    dummy&amp;lt;=tmp;&lt;br /&gt;
  end process;&lt;br /&gt;
&lt;br /&gt;
-- prescaler&lt;br /&gt;
&lt;br /&gt;
  process(clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if clk=&#039;1&#039; and clk&#039;event then&lt;br /&gt;
      cnt&amp;lt;=cnt+1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
&lt;br /&gt;
-- toggle fliplop and distribution&lt;br /&gt;
&lt;br /&gt;
  process(clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if clk=&#039;1&#039; and clk&#039;event then&lt;br /&gt;
      case sel is&lt;br /&gt;
        when &amp;quot;00&amp;quot;       =&amp;gt; toggle &amp;lt;= &#039;0&#039;;&lt;br /&gt;
        when &amp;quot;01&amp;quot;       =&amp;gt; toggle &amp;lt;= not toggle;&lt;br /&gt;
        when &amp;quot;10&amp;quot;       =&amp;gt; if cnt(15)=&#039;1&#039; then toggle &amp;lt;= not toggle; else toggle&amp;lt;=&#039;0&#039;; end if;&lt;br /&gt;
        when others     =&amp;gt; null;&lt;br /&gt;
      end case;&lt;br /&gt;
      drive_ar&amp;lt;=(others=&amp;gt;toggle);&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
&lt;br /&gt;
gnd&amp;lt;=(others=&amp;gt;&#039;0&#039;);&lt;br /&gt;
mod_out&amp;lt;=cnt(15);&lt;br /&gt;
&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei row.vhd&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
entity row is&lt;br /&gt;
    Port ( clk  : in std_logic;&lt;br /&gt;
           data : in std_logic;&lt;br /&gt;
           dout : out std_logic);&lt;br /&gt;
end row;&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of row is&lt;br /&gt;
&lt;br /&gt;
signal my_array: std_logic_vector (49 downto 0);&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
-- generate 50 FFs with clock enable&lt;br /&gt;
&lt;br /&gt;
  process (clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if clk=&#039;1&#039; and clK&#039;event then&lt;br /&gt;
      my_array&amp;lt;=(others=&amp;gt;data);     &lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
&lt;br /&gt;
-- combine all into a BIG OR&lt;br /&gt;
&lt;br /&gt;
  process(my_array)&lt;br /&gt;
  variable tmp: std_logic;&lt;br /&gt;
  begin&lt;br /&gt;
    tmp:=&#039;0&#039;;&lt;br /&gt;
    l: for i in 0 to 49 loop&lt;br /&gt;
      tmp:=tmp or my_array(i);&lt;br /&gt;
    end loop;&lt;br /&gt;
    dout&amp;lt;=tmp;&lt;br /&gt;
  end process;&lt;br /&gt;
&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Messungen ==&lt;br /&gt;
&lt;br /&gt;
[[bild:Term1.gif|thumb|right|220px|Terminierung 1: 50Ω vor dem Koppelkondensator, f&amp;lt;sub&amp;gt;g&amp;lt;/sub&amp;gt;&amp;amp;nbsp;=&amp;amp;nbsp;10&amp;amp;nbsp;Hz]]&lt;br /&gt;
[[bild:Term2.gif|thumb|right|220px|Terminierung 2: 50Ω nach dem Koppelkondensator, f&amp;lt;sub&amp;gt;g&amp;lt;/sub&amp;gt;&amp;amp;nbsp;=&amp;amp;nbsp;200&amp;amp;nbsp;kHz]]&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Während der Messung wurde festgestellt, dass es zwei verschiedene [[Wellenwiderstand | 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&amp;amp;Omega; Eingangsterminierung benutzt wurde. Das ist OK für die Messung niedriger Frequenzen (&amp;lt;10 MHz). Zur Messung der Hochfrequenzstörungen (Messung 4) ist die Grenzfrequenz von 200 kHz kein Problem.&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
== Messung 1 - FPGA unkonfiguriert ==&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Messung 2 - FPGA mit leerer Logik == &lt;br /&gt;
&lt;br /&gt;
Ein Design mit einer einfachen Schleife von einem Eingang auf einen Ausgang ist jetzt in das FPGA geladen. Nach der Konfiguration &#039;&#039;&#039;sinkt&#039;&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
== Messung 3 - FPGA konfiguriert ohne schaltende Logik ==&lt;br /&gt;
&lt;br /&gt;
Jetzt steigt die Leistungsaufnahme deutlich. Auf den ersten Blick ist das unerwartet, denn im FPGA werden keinerlei Signale geschaltet , die FlipFlips 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 [[Ultra low power | stromsparende ICs]] eine saubere Methode zur [[Taktung FPGA/CPLD | Taktabschaltung (clock gating)]], um die Leitungsaufnahme zu verringern. Aber das muss auf sichere Weise erfolgen.&lt;br /&gt;
&lt;br /&gt;
== Messung 4 - FPGA mit dauerhaft schaltenden Signalen ==&lt;br /&gt;
&lt;br /&gt;
Jetzt starten wir ein Feurwerk! Die Stromversorgung erfährt jetzt ihren schlimmsten Albtraum. 1500 FlipFlops die gleichzeitig mit 147 MHz umschalten (togglen)&lt;br /&gt;
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 &#039;&#039;&#039;wirklich&#039;&#039;&#039; 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 &#039;&#039;&#039;direkt&#039;&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
== Messung 5 - Burstbetrieb ==&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;140&amp;quot;&amp;gt;&lt;br /&gt;
bild:01.gif| Sprungantwort mit 10µF&lt;br /&gt;
bild:02.gif| Sprungantwort mit 110µF&lt;br /&gt;
bild:03.gif| Abschaltflanke 10µF&lt;br /&gt;
bild:04.gif| Abschaltflanke 110µF&lt;br /&gt;
bild:05.gif| Zoom, Abschaltflanke 110µF&lt;br /&gt;
bild:06.gif| Anschaltflanke 10µF&lt;br /&gt;
bild:07.gif| Anschaltflanke 110µF&lt;br /&gt;
bild:08.gif| Zoom, Anschaltflanke 110µF&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Erklärung ==&lt;br /&gt;
&lt;br /&gt;
Der Unterschwinger beim Einschalten wird verursacht durch unzureichende Entkopplung im mittleren Frequenzbereich. Der sprunghaft steigende Stromverbrauch kann nicht von den Mittelfrequenzkondensatoren 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.&lt;br /&gt;
&lt;br /&gt;
Der Überschwinger beim Abschalten ist ähnlich, aber hier ist der Spannungsregler ist zu langsam, den Ausgangsstrom herunterzuregeln. Der überschüssige Strom (Ladung) wird in den Mittelfrequenzkondensatoren 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.&lt;br /&gt;
&lt;br /&gt;
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&amp;amp;Omega; 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Messergebnisse&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Messung || FPGA-Inhalt                || Icc [mA] || Vcc [V] || P [mW]&lt;br /&gt;
|-&lt;br /&gt;
| 1 || keine Konfiguration              || 80 || 2.501 || 200&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Minimallogik                     || 40 || 2.502 || 100&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Testlogik, inaktiv               || 235 || 2.487 || 584&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Testlogik, konstantes Umschalten || 1147 || 2.433 || 2790&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Testlogik, Burstbetrieb           || 690 || 2.464 || 1700&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Zusammenfassung ==&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
*[http://processors.wiki.ti.com/index.php/General_hardware_design/BGA_PCB_design/BGA_decoupling General hardware design/BGA PCB design/BGA decoupling, Texas Instruments (engl.)]&lt;br /&gt;
*[http://www.signalintegrity.com/Pubs/pubsKeyword.htm#power%20system Signal integrity of power systems] by Howard Johnson (engl.)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Spannungsversorgung und Energiequellen]]&lt;br /&gt;
[[Kategorie:FPGA und Co]]&lt;br /&gt;
[[Kategorie:VHDL]]&lt;/div&gt;</summary>
		<author><name>62.157.123.103</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Stromversorgung_f%C3%BCr_FPGAs&amp;diff=81256</id>
		<title>Stromversorgung für FPGAs</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Stromversorgung_f%C3%BCr_FPGAs&amp;diff=81256"/>
		<updated>2014-01-31T08:39:16Z</updated>

		<summary type="html">&lt;p&gt;62.157.123.103: /* Messung 4 - FPGA mit dauerhaft schaltenden Signalen */ typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In diesem Artikel soll eine kurze Erklärung zum Entwurfsproblem von Stromversorgungen für Hochleistungs-[[FPGA]]s gegeben werden. Ein neuer Ansatz zur Messung des Frequenzgangs wird dargestellt. Praktische Messungen werden gezeigt.&lt;br /&gt;
&lt;br /&gt;
FPGAs werden immer mehr Bestandteil moderner Elektronik. Die Bausteine werden größer, schneller und leistungsstärker mit jedem Tag. Und so steigt auch die Leistungsaufnahme. Obwohl die Leistung pro Gatter sich durch bessere Technologie und kleinere Geometrien verringert, steigt die Taktfrequenz und die Anzahl der Gatter pro Bauteil. Mit steigender Schaltgeschwindigkeit wird die Stromversorgung zu einem kritischen Teil im Systementwurf. Das Stromversorgungsnetz muss eine Quelle mit niedriger Impedanz über einen sehr weiten Frequenzbereich sein. Anderenfalls könnnen Überschwinger, Spannungsabfall oder Störpulse auf VCC/GND die Funktion des FPGAs stören, welche durch den schnell wechselnden Leistungsbedarf des FPGAs verursacht wird.&lt;br /&gt;
&lt;br /&gt;
== Breitbandentkopplung ist Teamwork ==&lt;br /&gt;
&lt;br /&gt;
Der Spannungsregler muss die Gleichstromkomponente für das Stromversorgungsnetzwerk liefern. Bei maximaler Leistung und Umgebungstemperatur muss er immer noch sauber funktionieren ohne zu überhitzen, Spannungseinbrüche etc. Seine Aufgabe ist es, auf niederfrequente Lastsprünge zu reagieren (ca. 0..30kHz).&lt;br /&gt;
&lt;br /&gt;
Im mittleren Frequenzbereich kann der Spannungsregler nicht mehr reagieren, er ist zu langsam. Der Strom muss dann von großen Elektrolytkondensatoren geliefert werden. Diese Kondensatoren können bis einige MHz Strom liefern, danach begrenzen der parasitäre Widerstand (ESR, engl. effective series resistance) bzw. die parasitäre Induktivität (ESL, engl. effective series inductance) die Stromlieferfähigkeit des Kondensators und machen ihn irgendwann bei höheren Frequenzen nutzlos.&lt;br /&gt;
&lt;br /&gt;
Jetzt kommt die Zeit der kleinen Keramikkondensatoren, typisch 10 oder 100nF. Sie gibt es in kleinen [[SMD]]-Gehäusen wie 0603 und kleiner mit sehr wenig parasitärer Induktivität. Sie können Strom bis einige hundert MHz liefern und sind damit eine niederohmige Quelle für Hochfrequenzströme.&lt;br /&gt;
&lt;br /&gt;
Aber für die &#039;&#039;&#039;wirklich&#039;&#039;&#039; schnell schaltenden ICs sind auch diese Keramikkondensatoren nicht ausreichend, um das Stromversorgungsnetzwerk ausreichend zu entkoppeln. Hier braucht man die Kapazität der Stromversorgungsflächen, welche duch VCC- und Masseflächen in mehrlagigen Platinen gebildet wird. Um ein Maximum an Kapazität zu erreichen sollte ein dünnes Dielektrikum mit einer hohen Dielektrizitätskonstante und niedrigen Verlusten benutzen. Außerdem sollte man ein VIA für jedes VCC/GND Pin benutzen, um die parasitären Induktivitäten zu minimieren, nicht ein VIA für mehrere Pins! [[IC-Gehäuseformen#BGA | BGA-Gehäuse]] bieten zusätzlich kürzere Verbindungen vom eigentlichen IC zur Platine, sie sind aber schwieriger zu handhaben (Layout und [[SMD Löten | Löten]]).&lt;br /&gt;
&lt;br /&gt;
== Der klassische Ansatz ==&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
* dem FPGA und dessen Leistungsaufnahme, welche von der Schaltfrequenz abhängt&lt;br /&gt;
* dem Layout der Platine mit der Platzierung der verschiedenen Kondensatoren&lt;br /&gt;
&lt;br /&gt;
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 Widerstand über die Frequenz auf. Diese Methode hat einige Nachteile.&lt;br /&gt;
&lt;br /&gt;
*Man braucht einen teuren Netzwerkanalysator&lt;br /&gt;
*Man benötigt eine zusätzliches Board, welches nur mit den Kondensatoren bestückt ist, welches nicht immer verfügbar ist&lt;br /&gt;
*Die Messung spiegelt nicht die wahren Bedingungen wieder, weil alle ICs und aktiven Teile fehlen. Ausserdem sind nur Punkt zu Punkt Messungen möglich, welche das reale Verhalten nicht korrekt wiedergeben.&lt;br /&gt;
&lt;br /&gt;
Die Methode in diesem Artikel versucht, die meisten Nachteile zu vermeiden.&lt;br /&gt;
&lt;br /&gt;
== Ein direkter Ansatz ==&lt;br /&gt;
&lt;br /&gt;
Da wir hier über FPGAs reden, haben wir die Möglichkeit, &#039;&#039;&#039;jede&#039;&#039;&#039; 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 [[FlipFlop]]s ihren Pegel gleichzeitig wechseln und dabei große Signalnetze treiben (parasitäre Kapazität). Also entwerfen wir die folgende Schaltung. &lt;br /&gt;
&lt;br /&gt;
[[bild:Schematic.gif|thumb|left|600px|Logik für Lasttest]]&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Steuerung der Testlogik&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! sel&amp;lt;1&amp;gt; || sel&amp;lt;0&amp;gt; || Modus&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || inaktiv&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || konstante Umschaltung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || Burstbetrieb&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== VHDL Code ==&lt;br /&gt;
&lt;br /&gt;
Wenn der Code synthetisiert wird, muss die Option &amp;quot;remove duplicate registers&amp;quot; in der Synthesesoftware ausgeschaltet werden. Es sollten zwei Dateien angelegt werden, top.vhd und row.vhd.&lt;br /&gt;
&lt;br /&gt;
Datei top.vhd&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
entity power is&lt;br /&gt;
    Port ( clk_in  : in std_logic;                      -- clock input&lt;br /&gt;
           sel     : in std_logic_vector(1 downto 0);   -- select modulation ON/OFF&lt;br /&gt;
           gnd     : out std_logic_vector(5 downto 0);  -- artificial gnd&lt;br /&gt;
           mod_out : out std_logic;                     -- modulation signal&lt;br /&gt;
           reset   : in std_logic;                      -- reset for DLL&lt;br /&gt;
           dummy   : out std_logic);                    -- dummy out, to fool the synthesizer&lt;br /&gt;
           &lt;br /&gt;
end power;&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of power is&lt;br /&gt;
&lt;br /&gt;
COMPONENT row&lt;br /&gt;
    PORT(&lt;br /&gt;
        clk  : IN std_logic;&lt;br /&gt;
        data : IN std_logic;    &lt;br /&gt;
        dout : OUT std_logic&lt;br /&gt;
        );&lt;br /&gt;
END COMPONENT;&lt;br /&gt;
&lt;br /&gt;
-- DLL (Delay Locked Loop), a Virtex primitive&lt;br /&gt;
&lt;br /&gt;
component CLKDLL&lt;br /&gt;
    port (  &lt;br /&gt;
        CLKIN   : in    std_logic;&lt;br /&gt;
        CLKFB   : in    std_logic;&lt;br /&gt;
        RST     : in    std_logic;&lt;br /&gt;
        CLK0    : out   std_logic;&lt;br /&gt;
        CLK90   : out   std_logic;&lt;br /&gt;
        CLK180  : out   std_logic;&lt;br /&gt;
        CLK270  : out   std_logic;&lt;br /&gt;
        CLK2X   : out   std_logic;&lt;br /&gt;
        CLKDV   : out   std_logic;&lt;br /&gt;
        LOCKED  : out   std_logic);&lt;br /&gt;
end component;&lt;br /&gt;
&lt;br /&gt;
-- BUFG (Global Clock buffer), a Virtex  primitive&lt;br /&gt;
&lt;br /&gt;
component BUFG&lt;br /&gt;
    port (  I   : in    std_logic;&lt;br /&gt;
            O   : out   std_logic);&lt;br /&gt;
end component;&lt;br /&gt;
&lt;br /&gt;
-- IBUFG (Global Clock input buffer ), aa Virtex primitive&lt;br /&gt;
&lt;br /&gt;
component IBUFG&lt;br /&gt;
    port (  I   : in    std_logic;&lt;br /&gt;
            O   : out   std_logic);&lt;br /&gt;
end component;&lt;br /&gt;
&lt;br /&gt;
component SRL16     -- virtex primitive&lt;br /&gt;
  port (&lt;br /&gt;
        D    : in std_logic;        &lt;br /&gt;
        CLK  : in std_logic;&lt;br /&gt;
        A0   : in std_logic;&lt;br /&gt;
        A1   : in std_logic;&lt;br /&gt;
        A2   : in std_logic;&lt;br /&gt;
        A3   : in std_logic;        &lt;br /&gt;
        Q    : out std_logic&lt;br /&gt;
       ); &lt;br /&gt;
end component;&lt;br /&gt;
&lt;br /&gt;
constant rows: integer:=30;&lt;br /&gt;
&lt;br /&gt;
type flop_array is array (rows-1 downto 0) of std_logic_vector(49 downto 0);&lt;br /&gt;
&lt;br /&gt;
signal toggle   : std_logic;                            -- a toggle flipflop&lt;br /&gt;
signal ff_ar    : flop_array;&lt;br /&gt;
signal drive_ar : std_logic_vector (rows-1 downto 0);   -- driver array for toggeling rows&lt;br /&gt;
signal dout_ar  : std_logic_vector (rows-1 downto 0);   -- driver array for toggeling rows&lt;br /&gt;
signal or_ar    : std_logic_vector (rows-1 downto 0);   -- driver array for toggeling rows&lt;br /&gt;
signal cnt      : std_logic_vector (15 downto 0);       -- modulation divider&lt;br /&gt;
&lt;br /&gt;
signal CLKIN_w, RESET_w, CLK2X_dll, CLK2X_g, CLK4X_dll, CLK4X_g, CLK8X_dll, CLK8X_g: std_logic;&lt;br /&gt;
signal LOCKED2X, LOCKED2X_delay, RESET4X, RESET8X, LOCKED4X, LOCKED4X_delay, LOCKED8X : std_logic;&lt;br /&gt;
&lt;br /&gt;
signal logic1,clk : std_logic;&lt;br /&gt;
&lt;br /&gt;
signal clk2x,clk4x,clk8x, clkmux: std_logic;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
-- use two DLL to get 147 MHz&lt;br /&gt;
&lt;br /&gt;
logic1&amp;lt;=&#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
clkpad : IBUFG  port map (I=&amp;gt;CLK_IN, O=&amp;gt;CLKIN_w);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
dll2x  : CLKDLL port map (CLKIN=&amp;gt;CLKIN_w,   CLKFB=&amp;gt;CLK2X_g, RST=&amp;gt;RESET,&lt;br /&gt;
                          CLK0=&amp;gt;open,   CLK90=&amp;gt;open, CLK180=&amp;gt;open, CLK270=&amp;gt;open,&lt;br /&gt;
                          CLK2X=&amp;gt;CLK2X_dll, CLKDV=&amp;gt;open, LOCKED=&amp;gt;LOCKED2X);&lt;br /&gt;
&lt;br /&gt;
clk2xg : BUFG   port map (I=&amp;gt;CLK2X_dll,   O=&amp;gt;CLK2X_g);&lt;br /&gt;
&lt;br /&gt;
rstsrl : SRL16  port map (D=&amp;gt;LOCKED2X, CLK=&amp;gt;CLK2X_g, Q=&amp;gt;LOCKED2X_delay,&lt;br /&gt;
                          A3=&amp;gt;logic1, A2=&amp;gt;logic1, A1=&amp;gt;logic1, A0=&amp;gt;logic1);&lt;br /&gt;
&lt;br /&gt;
RESET4X &amp;lt;= not LOCKED2X_delay;&lt;br /&gt;
&lt;br /&gt;
dll4x  : CLKDLL port map (CLKIN=&amp;gt;CLK2X_g,  CLKFB=&amp;gt;CLK4X_g, RST=&amp;gt;RESET4X,&lt;br /&gt;
                          CLK0=&amp;gt;open,   CLK90=&amp;gt;open, CLK180=&amp;gt;open, CLK270=&amp;gt;open,&lt;br /&gt;
                          CLK2X=&amp;gt;CLK4X_dll, CLKDV=&amp;gt;open, LOCKED=&amp;gt;LOCKED4X);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
clk4xg : BUFG   port map (I=&amp;gt;CLK4X_dll,  O=&amp;gt;CLK4X_g);&lt;br /&gt;
&lt;br /&gt;
clk&amp;lt;=clk4x_g;&lt;br /&gt;
&lt;br /&gt;
-- the toggeling array&lt;br /&gt;
&lt;br /&gt;
l_rows: for i in 0 to rows-1 generate&lt;br /&gt;
    Inst_row: row PORT MAP(&lt;br /&gt;
        clk  =&amp;gt; clk,&lt;br /&gt;
        data =&amp;gt; drive_ar(i),&lt;br /&gt;
        dout =&amp;gt; dout_ar(i)&lt;br /&gt;
    );&lt;br /&gt;
  end generate;&lt;br /&gt;
&lt;br /&gt;
-- combine all douts via a BIG or-gate&lt;br /&gt;
&lt;br /&gt;
  process(dout_ar)&lt;br /&gt;
  variable tmp: std_logic;&lt;br /&gt;
  begin&lt;br /&gt;
    tmp:=&#039;0&#039;;&lt;br /&gt;
    l_or: for i in 0 to rows-1 loop&lt;br /&gt;
      tmp:=tmp or dout_ar(i);&lt;br /&gt;
    end loop;&lt;br /&gt;
    dummy&amp;lt;=tmp;&lt;br /&gt;
  end process;&lt;br /&gt;
&lt;br /&gt;
-- prescaler&lt;br /&gt;
&lt;br /&gt;
  process(clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if clk=&#039;1&#039; and clk&#039;event then&lt;br /&gt;
      cnt&amp;lt;=cnt+1;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
&lt;br /&gt;
-- toggle fliplop and distribution&lt;br /&gt;
&lt;br /&gt;
  process(clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if clk=&#039;1&#039; and clk&#039;event then&lt;br /&gt;
      case sel is&lt;br /&gt;
        when &amp;quot;00&amp;quot;       =&amp;gt; toggle &amp;lt;= &#039;0&#039;;&lt;br /&gt;
        when &amp;quot;01&amp;quot;       =&amp;gt; toggle &amp;lt;= not toggle;&lt;br /&gt;
        when &amp;quot;10&amp;quot;       =&amp;gt; if cnt(15)=&#039;1&#039; then toggle &amp;lt;= not toggle; else toggle&amp;lt;=&#039;0&#039;; end if;&lt;br /&gt;
        when others     =&amp;gt; null;&lt;br /&gt;
      end case;&lt;br /&gt;
      drive_ar&amp;lt;=(others=&amp;gt;toggle);&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
&lt;br /&gt;
gnd&amp;lt;=(others=&amp;gt;&#039;0&#039;);&lt;br /&gt;
mod_out&amp;lt;=cnt(15);&lt;br /&gt;
&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei row.vhd&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
library IEEE;&lt;br /&gt;
use IEEE.STD_LOGIC_1164.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_ARITH.ALL;&lt;br /&gt;
use IEEE.STD_LOGIC_UNSIGNED.ALL;&lt;br /&gt;
&lt;br /&gt;
entity row is&lt;br /&gt;
    Port ( clk  : in std_logic;&lt;br /&gt;
           data : in std_logic;&lt;br /&gt;
           dout : out std_logic);&lt;br /&gt;
end row;&lt;br /&gt;
&lt;br /&gt;
architecture Behavioral of row is&lt;br /&gt;
&lt;br /&gt;
signal my_array: std_logic_vector (49 downto 0);&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
-- generate 50 FFs with clock enable&lt;br /&gt;
&lt;br /&gt;
  process (clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if clk=&#039;1&#039; and clK&#039;event then&lt;br /&gt;
      my_array&amp;lt;=(others=&amp;gt;data);     &lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
&lt;br /&gt;
-- combine all into a BIG OR&lt;br /&gt;
&lt;br /&gt;
  process(my_array)&lt;br /&gt;
  variable tmp: std_logic;&lt;br /&gt;
  begin&lt;br /&gt;
    tmp:=&#039;0&#039;;&lt;br /&gt;
    l: for i in 0 to 49 loop&lt;br /&gt;
      tmp:=tmp or my_array(i);&lt;br /&gt;
    end loop;&lt;br /&gt;
    dout&amp;lt;=tmp;&lt;br /&gt;
  end process;&lt;br /&gt;
&lt;br /&gt;
end Behavioral;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Messungen ==&lt;br /&gt;
&lt;br /&gt;
[[bild:Term1.gif|thumb|right|220px|Terminierung 1: 50Ω vor dem Koppelkondensator, f&amp;lt;sub&amp;gt;g&amp;lt;/sub&amp;gt;&amp;amp;nbsp;=&amp;amp;nbsp;10&amp;amp;nbsp;Hz]]&lt;br /&gt;
[[bild:Term2.gif|thumb|right|220px|Terminierung 2: 50Ω nach dem Koppelkondensator, f&amp;lt;sub&amp;gt;g&amp;lt;/sub&amp;gt;&amp;amp;nbsp;=&amp;amp;nbsp;200&amp;amp;nbsp;kHz]]&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Während der Messung wurde festgestellt, dass es zwei verschiedene [[Wellenwiderstand | 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&amp;amp;Omega; Eingangsterminierung benutzt wurde. Das ist OK für die Messung niedriger Frequenzen (&amp;lt;10 MHz). Zur Messung der Hochfrequenzstörungen (Messung 4) ist die Grenzfrequenz von 200 kHz kein Problem.&lt;br /&gt;
{{Absatz}}&lt;br /&gt;
&lt;br /&gt;
== Messung 1 - FPGA unkonfiguriert ==&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Messung 2 - FPGA mit leerer Logik == &lt;br /&gt;
&lt;br /&gt;
Ein Design mit einer einfachen Schleife von einem Eingang auf einen Ausgang ist jetzt in das FPGA geladen. Nach der Konfiguration &#039;&#039;&#039;sinkt&#039;&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
== Messung 3 - FPGA konfiguriert ohne schaltende Logik ==&lt;br /&gt;
&lt;br /&gt;
Jetzt steigt die Leistungsaufnahme deutlich. Auf den ersten Blick ist das unerwartet, denn im FPGA werden keinerlei Signale geschaltet , die FlipFlips 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 [[Ultra low power | stromsparende ICs]] eine saubere Methode zur [[Taktung FPGA/CPLD | Taktabschaltung (clock gating)]], um die Leitungsaufnahme zu verringern. Aber das muss auf sichere Weise erfolgen.&lt;br /&gt;
&lt;br /&gt;
== Messung 4 - FPGA mit dauerhaft schaltenden Signalen ==&lt;br /&gt;
&lt;br /&gt;
Jetzt starten wir ein Feurwerk! Die Stromversorgung erfährt jetzt ihren schlimmsten Albtraum. 1500 FlipFlops die gleichzeitig mit 147 MHz umschalten (togglen)&lt;br /&gt;
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 &#039;&#039;&#039;wirklich&#039;&#039;&#039; 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 &#039;&#039;&#039;direkt&#039;&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
== Messung 5 - Burstbetrieb ==&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;140&amp;quot;&amp;gt;&lt;br /&gt;
bild:01.gif| Sprungantwort mit 10µF&lt;br /&gt;
bild:02.gif| Sprungantwort mit 110µF&lt;br /&gt;
bild:03.gif| Abschaltflanke 10µF&lt;br /&gt;
bild:04.gif| Abschaltflanke 110µF&lt;br /&gt;
bild:05.gif| Zoom, Abschaltflanke 110µF&lt;br /&gt;
bild:06.gif| Anschaltflanke 10µF&lt;br /&gt;
bild:07.gif| Anschaltflanke 110µF&lt;br /&gt;
bild:08.gif| Zoom, Anschaltflanke 110µF&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Erklärung ==&lt;br /&gt;
&lt;br /&gt;
Der Unterschwinger beim Einschalten wird verursacht durch unzureichende Entkopplung im mittleren Frequenzbereich. Der sprunghaft steigende Stromverbrauch kann nicht von den Mittelfrequenzkondensatoren 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, welche für so eine große Last viel zu klein ist. Durch Ergänzung eines 100µF Kondensatores kann der Unterschwinger deutlich verkleinert werden.&lt;br /&gt;
&lt;br /&gt;
Der Überschwinger beim Abschalten ist ähnlich, aber hier ist der Spannungsregler ist zu langsam, den Ausgangsstrom herunterzuregeln. Der überschüssige Strom (Ladung) wird in den Mittelfrequenzkondensatoren 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.&lt;br /&gt;
&lt;br /&gt;
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&amp;amp;Omega; 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.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Messergebnisse&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Messung || FPGA-Inhalt                || Icc [mA] || Vcc [V] || P [mW]&lt;br /&gt;
|-&lt;br /&gt;
| 1 || keine Konfiguration              || 80 || 2.501 || 200&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Minimallogik                     || 40 || 2.502 || 100&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Testlogik, inaktiv               || 235 || 2.487 || 584&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Testlogik, konstantes Umschalten || 1147 || 2.433 || 2790&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Testlogik, Burstbetrieb           || 690 || 2.464 || 1700&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Zusammenfassung ==&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
*[http://processors.wiki.ti.com/index.php/General_hardware_design/BGA_PCB_design/BGA_decoupling General hardware design/BGA PCB design/BGA decoupling, Texas Instruments (engl.)]&lt;br /&gt;
*[http://www.signalintegrity.com/Pubs/pubsKeyword.htm#power%20system Signal integrity of power systems] by Howard Johnson (engl.)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Spannungsversorgung und Energiequellen]]&lt;br /&gt;
[[Kategorie:FPGA und Co]]&lt;br /&gt;
[[Kategorie:VHDL]]&lt;/div&gt;</summary>
		<author><name>62.157.123.103</name></author>
	</entry>
</feed>