Bruchteile von Bits gibt es wirklich, nur nicht in der Informatik, sondern in der von Claude Shannon begründeten Informationstheorie. Dort ist das Bit eine Einheit für eine Größe, wie das Kilogramm oder die Sekunde in der Physik. Es ist die Einheit für den Informationsgehalt einer Nachricht – und die Maßzahl des Informationsgehalts kann alle möglichen positiven, realen Werte inklusive der Null annehmen. Die internationale Organisation für Standards (ISO) hat versucht, das „Bit nach der Definition von Claude Shannon“ in Shannon (Sh) umzubenennen, hatte damit aber keinen Erfolg.
Doch was ist ein Bit nach Shannon? Wenn man annimmt, dass aus einer Menge von 256 Lottokugeln alle mit gleicher Wahrscheinlichkeit (1/256) gezogen werden, so hat eine durchgeführte erste Ziehung den Informationsgehalt von
I = –log2 (1/256) = 8 Bit.
Genauso viele Bits braucht man in der Informatik, um anzuzeigen, welche Kugel gezogen wurde. Bei einer Menge von 49 Kugeln hätte eine erste Ziehung einen Informationsgehalt von ca. 5,615 Bit. Bei so viel Theorie fragt man sich zu Recht, ob es für Bruchteile von Bits reale Anwendungen gibt oder ob das nur eine Haarspalterei (bzw. Bitspalterei) ist. Solche Anwendungen gibt es sehr wohl, wie die hier vorgestellte Schaltung zeigt.
A/D-Wandler in einem FPGA
Schon seit einigen Jahren ist die Methode bekannt, in einem rein digitalen FPGA einen A/D-Wandler unterzubringen. Man macht sich dabei die Erkenntnisse der A/D-Wandlertechnik zunutze und implementiert einen Sigma/Delta-Wandler mit ein paar Logikzellen eines FPGAs und einem einfachen, externen RC-Glied. Alle drei großen Anbieter von FPGAs (Xilinx, Altera und Lattice) haben für diese Methode Referenzdesigns oder Applikationsberichte veröffentlicht und auch unabhängige Stellen haben sich dem Thema zugewendet. Zielanwendung ist dabei meist die digitale Signalverarbeitung von Audiosignalen.
Doch es gibt auch andere sinnvolle Anwendungen solcher Wandler. Ein FPGA kommuniziert ja im Allgemeinen über eine Vielzahl von digitalen Signalen mit seiner Umgebung, wobei jeder Pin immer nur eine binäre Information übertragen kann. Wenn in einem FPGA aber nicht nur eine einfache 0/1-Information gebraucht wird sondern ein mehr oder weniger analoger Wert, so sind dafür schnell viele Pins nötig.
Dabei werden analoge Signale extern digitalisiert und parallel über mehrere Pins in das FPGA gegeben. Seit der Veröffentlichung der Referenzdesigns ist es ein Leichtes, analoge Werte ohne Verwendung externer A/D-Wandler in ein FPGA hineinzugeben. Pro analoges Signal benötigt man dabei drei Pins des FPGAs, von denen zwei zu einem LVDS-Empfänger gehören müssen.
8-Bit-A/D-Wandler mit 3,3 V Referenzspannung
Mit diesen Kenntnissen lässt sich ein einfaches Voltmeter mit einem FPGA bauen. Lattice bietet ein Entwicklungsboard an, auf dem sich ein FPGA der MachXO2-Familie befindet. An das FPGA ist ein einfaches, numerisches LCD mit vier Stellen angeschlossen. Diese beiden Komponenten sowie ein RC-Glied für den analogen Teil des Sigma/Delta-Wandlers reichen bereits für ein Voltmeter aus. Der Spannungsregler für die Core-Spannung des FPGAs, der Flash-Speicher für die Konfigurationsdaten und ein Oszillator sind alle im FPGA integriert, was den Aufbau stark vereinfacht.
Bild 1: Blockschaltbild des Delta-Sigma-Wandlers in einem FPGA
Wenn man nun einen 8-Bit-A/D-Wandler mit einer Referenzspannung von 3,3 V im FPGA implementiert, dann führt das dazu, dass der Zahlenwert 0 der Spannung 0 V entspricht und der Zahlenwert FF der Spannung 3,3 V. Für die Anzeige einer Spannung auf einem Display ist ein „FF“ aber ein ungeeignetes Format; eine dezimale Anzeige ist hier absolut notwendig. Den dafür nötigen Umsetzer kann man entweder in einer Gatterlogik oder als kleinen Mikrocontroller im FPGA realisieren, der die Wandlung in Software macht.
Dann führt die Spannung 0 V zur Anzeige 00.00 und die Spannung 3,3 V zur Anzeige 02.55, was allerdings auch noch nicht das gewünschte Ergebnis ist. Um zur korrekten Anzeige von 03.30 zu kommen, muss man den vom A/D-Wandler ausgegeben Wert umrechnen in den Wert, der auf dem Display ausgegeben werden soll. Das ist zwar mit ein wenig Rechenaufwand in Software möglich, aber es gibt auch einen einfacheren Weg: Einen mit einer rationalen Anzahl von Bits.
Einfacher Aufbau mit Referenzdesign
Integrierte A/D-Wandler haben im Allgemeinen eine feste Auflösung von n Bits und 2n Quantisierungsstufen, die gleichmäßig über den gesamten Messbereich verteilt sind. Um zu glatten dezimalen Stufen zu kommen gibt es z.B. A/D Wandler mit einer Referenzspannung von 2,048 V, dem 211-fachen von 10 mV. Doch wenn, wie in dem Fall des Entwicklungsboards von Lattice, die Referenzspannung auf 3,3 V festgelegt ist und man eine Auflösung vom 10 mV haben möchte, dann braucht man eben einen A/D-Wandler mit 330 Stufen, also einer Auflösung von 8,366 Bit.
Bild 2: Blockschaltbild zur Dezimierung des LVDS-Komparatorausgangs
Ein solcher Wandler ist einfacher aufzubauen als man vielleicht denkt. Bei einem Sigma/Delta-Wandler einfacher Bauart, wie er in den Referenzdesigns der FPGA-Hersteller beschrieben ist, wird das abzutastende analoge Signal an den Plus-Eingang eines LVDS-Eingangspaars angeschlossen und das mittels RC-Glied gefilterte Sigma/Delta-Signal an den Minus-Eingang des LVDS-Eingangspaars. Im Digitalteil des Wandlers wird der Ausgang des LVDS-Komparators „dezimiert“. Dabei wird innerhalb einer vorgegebenen Anzahl von Takten diejenige Anzahl gezählt, in denen der Komparator eine 1 ausgegeben hat.
Um zu einem Wandler mit 8,336 Bit Auflösung zu kommen, muss man eben nicht nur 256 Takte lang die Einsen zählen, sondern 330 Takte lang. Der vom A/D-Wandler ausgegebene Wert benötigt dann 9 binäre Signale, bleibt aber stets im Wertebereich {0 ≤ x ≤ 330}.
Eine Vergleichsmessung des selbstgebauten Voltmeters mit einem handelsüblichen Multimeter hat ergeben, dass das selbstgebaute Voltmeter zwar sehr linear arbeitet, aber einen kleinen Fehler aufweist. Dieser beträgt im Bereich der unteren Messwertgrenze (0 V) 20 mV und in Bereich der oberen Messwertgrenze (3,3 V) 50 mV. Hierfür gibt es zwei Fehlerquellen.
Zum einen sind die LVDS-Eingänge des FPGAs für diese Anwendung eigentlich nicht gedacht. Für diese Eingänge schreiben die Datenblätter üblicherweise eine Differenzspannung von mindestens ±100 mV vor. Kleinere Differenzspannungen, die sich bei dieser Anwendung zwangsläufig ergeben, sind eigentlich „verbotene Zone“. So gesehen ist ein Offset von 20 mV ein überraschend geringer Wert.
Bild 3: MachXO2-FPGA und Pico-Board von Lattice (Bild: Arrow)
Zum andern ist die I/O-Spannung auf dem Entwicklungsboard zwar mit einem hochwertigen linearen Spannungsregler geregelt, weist aber dennoch eine gewisse Toleranz auf. Solange man nur digitale Signale an die I/O-Pins anlegt, ist eine Toleranz von ±5% kein Problem. Doch wenn man mit einem I/O-Pin und dem RC-Glied eine analoge Spannung erzeugt, wirkt sich ein Fehler der I/O-Spannung proportional auf die erzeuge Analogspannung aus. Der Regler auf dem für die Messung verwendeten Board hatte eine gemessene Ausgangsspannung von 3,266 V, also eine Abweichung von etwa 1%. Damit ist zu erwarten, dass die vom A/D-Wandler ausgegeben Werte zur oberen Messwertgrenze hin tendenziell um ca. 1% zu groß sind, was durch die Messung bestätigt wurde.
Wie die vorgestellte Schaltung und die Referenzdesigns der FPGA-Hersteller zeigen, sind A/D-Wandler im FPGA für einfache Anforderungen ohne großen Bauteil- und Ressourcenaufwand leicht zu realisieren. Und außergewöhnliche Auflösungen stellen kein Problem dar.