Embedded Systems & Software

Elektronischer Wecker auf FPGA, Nios-II-Co-Design

FPGA
Co-design HW/SW
Nios II
Langage C
Quartus / Qsys

Hardware/Software-Co-Design eines vollständigen elektronischen Weckers auf einem DE10-Lite-FPGA, ein interrupt-gesteuerter Nios-II-Prozessor in C, der die Uhrzeit anzeigt, Melodien abspielt und sich im Betrieb einstellen lässt. Mini-Projekt im ersten Masterjahr (MESI, Straßburg).

KontextHW/SW-Co-Design, DE10-Lite
AnsatzNios II in C, Interrupts
ErgebnisKompletter Wecker, 8 Melodien

Kontext

Mini-Projekt „Eingebettete digitale Systeme“ im ersten Jahr des MESI-Masters (Fakultät für Physik & Ingenieurwesen, Universität Straßburg, betreut von Herrn F. Dadouche). Ziel war es, Co-Design zu üben, Hardware und Software gemeinsam zu entwerfen, für ein System-on-Programmable-Chip (SoPC) auf FPGA. Zielplattform war ein DE10-Lite-Board (Intel-MAX-10-FPGA), das zu einem vollständigen elektronischen Wecker wird.

Ansatz / Lösung

Auf der Hardware-Seite (Quartus Prime und Platform Designer/Qsys) habe ich ein System-on-Chip um einen mit 50 MHz getakteten Nios-II-Prozessor aufgebaut, mit On-Chip-Speicher, PIOs und zwei Timern. Jede Peripherie des DE10-Lite ist über einen bitgenau dimensionierten PIO mit dem Prozessor verbunden (sechs 7-Segment-Anzeigen, zehn Schalter, zwei Taster, LEDs, Lautsprecher). Eine Co-Design-Feinheit, ein im BDF-Schaltplan platzierter Inverter macht die Taster active-high, daher sind die PIOs auf Interrupt-Erkennung bei steigender Flanke konfiguriert. Auf der Software-Seite (C, Nios II SBT) liest eine Hauptschleife die Eingänge und aktualisiert die Anzeige, während zwei Interrupt-Routinen die Echtzeit verwalten. Der SYS_CLK_TIMER (1 ms) ist die Zeitbasis, der TONE_TIMER erzeugt das Rechtecksignal des Tons durch Umschalten eines Ausgangs. Für den Variablenaustausch zwischen ISRs und Schleife habe ich die Zugriffe mit kritischen Abschnitten geschützt (vorübergehendes Deaktivieren der Interrupts). Über das Pflichtenheft hinaus habe ich eine 12h/24h-Umschaltung ergänzt, 8 über Schalter wählbare Melodien (statt eines einfachen 500-Hz-Pieps), zwei Einstellmodi (Einzeldruck oder kontinuierlich, 0,5-s-Schritt), eine Anzeigesperre und die automatische Initialisierung auf die Kompilierzeit über das Makro __TIME__.

Ergebnisse

Ein voll funktionsfähiger Wecker auf FPGA mit allen geforderten Funktionen und mehreren Verbesserungen, Funktion für Funktion auf dem Board validiert. Zwei Erkenntnisse sind mir geblieben. • Die realen Beschränkungen eingebetteter Systeme. Zum Initialisieren der Uhr wollte ich zunächst sscanf nutzen, hier unmöglich, denn das BSP ist mit der Small C Library (-msmallc) konfiguriert, um die Binärdatei zu verkleinern, und sscanf (stdio.h) ist ausgeschlossen. Also habe ich eine manuelle ASCII-Dekodierung von __TIME__ geschrieben (ein paar Subtraktionen und Multiplikationen), leichter, schneller, ohne Abhängigkeit. Im Embedded-Bereich zählt jedes Byte. • Methodik. Ich habe den Wecker zuerst in einem Block geschrieben und mich zu stark auf Beispiele und KI gestützt, was viele schwer zu isolierende Fehler erzeugte. Auf Rat meines Betreuers bin ich zu inkrementeller Entwicklung übergegangen, die Logik zuerst auf Papier entwerfen, dann jede Teilfunktion einzeln codieren und testen, bevor sie integriert wird. Das ist die wichtigste Lehre des Projekts. Ausblick, ein externer RTC (Uhrzeit bei Stromausfall halten), eine Snooze-Funktion, ein LCD-/OLED-Display, ein DAC für reicheren Klang und eine reine Hardware-Portierung in VHDL zum Vergleich mit dem SoPC-Ansatz.

Tech-Stack

Quartus Prime
Platform Designer (Qsys)
Nios II (SoPC)
Langage C
DE10-Lite (Intel MAX 10)
Interruptions & timers

Galerie