Zum Inhalt springen

FPGA meets uC

Inhaltsverzeichnis

Dieses Projekt wurde auf der MakerFaire 2018 in Berlin ausgestellt

Mikrocontroller sind das Herzstück vieler Projekte. Sie ermöglichen die Aufnahme und Auswertung von Sensoren, die Kommunkation mit anderen Geräten und Weiteres. Allerdings sind Sie keine Allzweckwerkzeuge und insbesondere parallele und zeitkritische Prozesse lassen sich nur in Grenzen umsetzen. Hier sind programmierbare Schaltungen (FPGAs/Field Programmable Gate Arrays) den Mikrocontrollern überlegen.

Was sind FPGAs?

FPGAs sind Hardwarebausteine, welche aus einer Vielzahl kleiner Zellen bestehen. Diese einzelnen Zellen besitzen mehrere Ein- und Ausgänge, wobei der Zusammenhang zwischen diesen frei programmiert werden kann. Die Verknüpfung der Ein- und Ausgänge wird über eine Tabelle definiert, daher werden die Zellen auch als Look-Up-Tables oder LUTs bezeichnet. Ein einzelner FPGA-Baustein kann hierbei mehrere tausend dieser LUTs enthalten.

Neben diesen einfachen Logikeinheiten enthalten FPGAs zusätzlich Speicherblöcke, eine Schaltmatrix zur Verbidung der einzelnen Einheiten und diverse komplexere Funktionseinheiten wie Addierer oder Multiplizierer.

Der für viele Anwendungen relevante Unterschied zu einem Mikrocontroller ist, dass die oben genannten Einheiten im unabhängig voneinander agieren können. Will man zum Beispiel drei Sensoren abfragen, so kann dies im FPGA durch drei separate Einheiten erfolgen. Ein Mikrocontroller müsste hier die Sensoren nacheinander abfragen, da das Programm nur sequenziell abgearbeitet werden kann.

Die Flexibilität der FPGAs führt jedoch auch dazu, dass man die meisten Funktionen neu implementieren muss. Ein Mikrocontroller besitzt in den meisten Fällen eine UART-Einheit, welche zum Senden und Empfangen von Daten verwendet werden kann, ohne dass man die genaue Funktionsweise des dahinterliegenden Protokolls kennen muss. Bei einem FPGA hingegen, muss diese Hardware neu implementiert werden und ein genaues Verständnis des Übertragsungssystem ist unabdinglich.

Vor diesem Hintergrund ist das Ziel des Projektes, dem FPGA einen Mikrocontroller zur Seite zu stellen um den Einstieg in die FPGA-Entwicklung zu vereinfachen.

Was tut das Projekt?

Das Projekt soll dazu dienen, einen angenehmen Einstieg in die Welt der FPGAs zu ermöglichen. Das Projekt wurde um eins der billigsten, derzeit erhältlichen FPGA-Boards entwickelt. Für 14-20€ erhält man hier einen Cyclone II EP2C5T144 FPGA samt grundlegender Hardware (Konfigurationsspeicher, 50 MHz Quarz, Spannungsversorgung) sowie den zugehörigen Programmer. Dieses Board wird durch ein selbst entwickeltes Zusatzboard ergänzt, welches einen ATmega8515 sowie diverse Schnittstellen bereitstellt.

Die Ausstattung des Zusatzboards fokussiert sich hierbei auf die Nutzung des FPGAs zu Klangerzeugung, entsprechend ist eine Klinkenbuchse, Lautstärkeregler und ein MIDI-Stecker vorhanden.

Mikrocontroller

Anmerkung: Das Speicherinterface wehrt sich derzeit noch etwas, der Zugriff auf die FPGA-Hardware muss daher über Makros zum lesen/schreiben erfolgen

Um den FPGA von einigen aufgaben zu entlasten, wird diesem ein Mikrocontroller an die Seite gestellt. Es handelt sich hierbei um den ATmega8515, welcher über ein externes Speicherinterface verfügt. Dieses soll es ermöglichen, die Hardware im FPGA einfach aus dem Programm heraus zu steuern, indem die relevanten Register über spezifische Adressen angesprochen werden können. So ist aus Programmierersicht keine Unterscheidung zwischen der Hardware im FPGA und der Hardware im Mikrocontroller nötig.

Weiterhin kann der Mikrocontroller MIDI-Signale empfangen und eine SD-Karte verwenden.

FPGA

Das FPGA ist das Herzstück des Projektes, hier soll einmal ein MIDI-Synthesizer entstehen. Derzeit implementiert ist das Interface zum Mikrocontroller, welches die Steuerung der Komponenten im FPGA erlaubt, sowie ein Teil des Audio-Signalpfades.

Mikrocontroller Interface und Bus

Die Verbindung zu dem Mikrocontroller wird über das asynchrone Speicherinterface des ATmegas hergestellt. Der FPGA dekodiert die empfangenen Daten-, Steuer- und Adresssignale und übersetzt diese zu entsprechenden Signalen für den internen Bus (nachfolgend YAIC - Yet another Interconnect genannt).

Jeder von außen Programmierbare Block ist an den YAIC-Bus angeschlossen und kann so gesteuert werden. Weiterhin kann der YAIC-Bus zum Auslesen interner Register genutzt werden.

Klangerzeugung

Das das Projekt einen Synthesizer bilden soll muss es eine Möglichkeit zur Audio-Ausgabe geben. Da das FPGA nur digitale Ein- und Ausgänge besitzt wurde ein Sigma-Delta-Wandler im FPGA implementiert, welcher eine Bitfolge erzeugt die durch einfache Filterung in ein analoges Signal umgewandelt werden kann.

I2S-Interface

Die erste nutzbare Audioquelle ist der I2S-Eingang. Der I2S-Bus ist ein einfaches serielles Interface für Audio Daten. Die Spezifikation kann zum Beispiel hier heruntergeladen werden. Die Implementation orientiert sich streng an Figure 6 der Spezifikation.

Zum Test des I2S-Interfaces wurde eine USB-I2S-Wandler auf Basis des PCM2705 von Texas Instruments verwendet.

Mixer

Da mit dem I2S-Interface und dem Synthesizer mindestens 2 mögliche Audioquellen vorhanden sind, musste eine Umschaltmöglichkeit zwischen Diesen geschaffen werden. Hierzu wird ein 4-Kanal Mixer verwendet, welcher es ermöglicht zwischen 4 Kanälen nicht nur umzuschalten, sondern diese auch verschieden laut einspielen zu lassen. Über einen der Kanaäle kann der Mikrocontroller auch direkt Audiodaten einspeisen.

Debug LEDs

LEDs machen jedes Projekt besser, außerdem ermöglichen sie die Ausgabe einfacher Fehlercodes. Der Mikrocontroller kann die LEDs einzeln setzen und ihre Helligkeit kontrollieren. Weiterhin ist in Hardware ein Lauflich implementiert, welches das vorgegebene Muster mit einstellbarer Geschwindigkeit in eine Richtung laufen lässt.