Optisches Metronom Immer schön im Takt bleiben

Bild: PeopleImages, iStock
02.03.2015

Egal ob Profi- oder Hobbyband, für gute Musik kommt es darauf an, dass alle Musiker stets im gleichen Takt bleiben. Eine optimale Unterstützung hierfür würde ein optisches Metronom bieten. Ein solches gibt es aber nicht – so dass der Autor, ein Hobbymusiker, einfach eines selber entwickelt hat. Wie, schildert er hier.

Um guten Sound zu produzieren, darf eine Band nicht aus dem Takt kommen. Unterstützung bietet hier ein elektronisches Metronom. Dieses gibt dem Schlagzeuger über den Kopfhörer einen festen Takt vor, an dem sich wiederum die anderen Musiker orientieren. Doch es gibt auch Passagen, bei denen der Schlagzeuger Pause hat. Woran hält die Band sich dann? Der Autor dieses Artikels, selbst ein begeisterter Hobbymusiker, hat versucht, das Signal des elektronischen Metronoms über die Verstärkeranlage in den Band-Übungsraum zu senden. Das hat zwar funktioniert, aber das Signal musste schon sehr laut sein, damit es im Lärm der Instrumente noch zu hören ist. Ein Metronom, das keinen Ton sondern ein für alle sichtbares Lichtsignal aussendet, wäre eine bessere Lösung. Ein solches Gerät gibt es aber nicht. Da der Autor nun nicht nur Hobbymusiker ist, sondern auch Elektroniker, lag nichts näher, als sich so ein optisches Metronom selbst zu bauen.

Wahl des Boards

Als Steuerung, mit der man die Signale für den Leistungsteil erzeugt, kann man irgendein Evaluierungsboard eines Herstellers für Mikrocontroller oder FPGAs nehmen. Ein paar Taster und ein einfaches, numerisches Display für die Anzeige der Schlagzahl pro Minute, viel mehr braucht man nicht. Und getreu des Leitsatzes „Warum Aufgaben mit Software lösen, wenn man sie auch in Hardware lösen kann?“ fiel die Wahl auf das MachXO2 Pico Board von Lattice Semiconductor. Auf diesem Board ist ein kleines CPLD von Lattice mit 1.200 LUTs verbaut, was reichen sollte. Taster und eine Anzeige hat das Board auch.

Bei der Konzeption zeigte sich allerdings, dass ein CPLD scheinbar nicht das perfekte Mittel ist, wenn es um numerische Berechnungen geht. Denn die Periodendauer der Schläge muss ja aus der Taktfrequenz f des Systems und der gewünschten Schlagzahl S ermittelt werden. Wenn man für die Ausgabe des Schlagsignals einen einfachen Zähler mit variablem Überlauf verwendet, so muss man den Überlaufswert W berechnen. Die Formel hierfür ist:

Also zum Beispiel bei 100 Schlägen pro Minute und dem
12 MHz Systemtakt des Pico Boards:

So etwas in einem CPLD zu berechnen scheint zunächst unmöglich, denn zum einen sind da große Zahlen zu verarbeiten und zum anderen muss man eine Division durchführen. Die pure Größe der Zahlen lässt sich reduzieren, wenn man einen Vorteiler verwendet. Wählt man als Teiler etwa den Wert 16.000, dann bleibt der Zähler des obigen Bruchs unter 65.536, und dann reicht eine 16-Bit-Arithmetik für die Division aus.

Dennoch bleibt die Aufgabe, eine Division der Konstanten 45.000 durch die gewünschte Schlagzahl durchzuführen. Und das in einem CPLD, das noch nicht mal einen Multiplizierer hat. An dieser Stelle angekommen, fragt man sich, ob eine Lösung mit einem Mikrocontroller nicht doch besser wäre. Zwar haben kleine Cortexe unterhalb M3 auch keine Dividierer, aber das merkt man als Programmierer ja nicht. Man schreibt die Division einfach im Quellcode hin, und dass die Berechnung durch ein Unterprogramm mit fortgesetzter Subtraktion gemacht wird, ist dem durchschnittlichen Programmierer egal – oder unbekannt. Die fortgesetzte Subtraktion als Ersatz für eine fehlende Division funktioniert aber auch bei der Hardware-Lösung. Einziger Unterschied: Man muss die Logik selbst modellieren. Wenn man den Dividierer einmal geschrieben hat, dann kann man ihn leicht in andere Projekte übernehmen. So etwas ist ein klassisches Bibliotheksmodul, weswegen man es unbedingt parametrierbar modellieren sollte.

Sequenzielle Dividierlogik

Da die Rechenzeit in diesem Anwendungsfall keine Rolle spielt, bietet sich eine sequenzielle Dividierlogik an, die einen Taktzyklus pro Bit benötigt sowie einen weiteren Taktzyklus für die Vorbereitung der Operation. Gegenüber einer parallelen Logik, die das Ergebnis ein einem einzigen Takt berechnet, belegt ein sequenzieller Dividierer wesentlich weniger Ressourcen im CPLD. Und die 17 Taktzyklen Wartezeit sind immer noch um Größenordnungen weniger, als die Anzahl von Taktzyklen für die Ausführung des Unterprogramms bei einer Softwarelösung. Die Einstellung des Metronoms hinsichtlich Schlagzahl und „Schlag 1“-Betonung erfolgt über die vier CapSense-Flächen des Pico Boards. Die Signale „up“ und „down“ steuern dabei sowohl ein binäres Register als auch ein BDC-codiertes Register. Beide Register halten stets den gleichen Wert, nur eben in unterschiedlichen Repräsentationen. Nötig ist das, weil der LCD Controller einen binären Zahlenwert für jede einzelne Stelle benötigt, mithin eine BCD-codierte Zahl. Durch diese Doppelung des Registers erspart man sich die Umrechnung von der binären Darstellung nach BCD, die deutlich mehr Ressourcen im CPLD belegen würde, als die Verdoppelung des Registers.

Der Dividierer in der Mitte des Blockschaltbilds teilt die Zahl 45.000 durch die Schlagzahl. Das Ergebnis dient als Überlaufswert für den variablen Zähler, der mit einem vorgeteilten Takt betrieben wird. Wobei „vorgeteilt“ heißt, dass auch dieser Zähler, wie alle anderen Flipflops im Design, mit der Systemfrequenz von 12 MHz getaktet wird und nur in jedem 16.000-sten Takt ein Freigabesignal erhält. Regel Nummer Eins für FPGA-Designs lautet: Streng synchrones Design mit EINER Taktquelle. Der nachgeschaltete Zähler (pulse duration) legt die Leuchtdauer fest. Je nach verwendetem Leuchtmittel kann man hier Anpassungen vornehmen. Doch wie kommt man nun zur Dividierlogik? Der erste Versuch, das manuelle Dividieren direkt in eine Schaltung zu überführen, hat zwar funktioniert, belegte aber mit über 250 LUTs für eine 16/16-Division viele Ressourcen. Die Recherche im Internet brachte Hinweise auf einfache, kompakte, sequenzielle Rechenwerke für Multiplikation und Division binärer Zahlen. Das Divisionsrechenwerk ist im Quellcode keine 30 Zeilen lang. Es arbeitet mit einem Schieberegister, das zu Beginn mit dem Dividenden geladen wird und am Ende der Berechnung Quotient und Rest enthält.

Das Rechenwerk dividiert vorzeichenlose, ganze Zahlen. Es ist über einen Parameter an die aktuelle Verwendung anzupassen. Im Falle einer Operandengröße von 16 Bit belegt der Dividierer knapp 30 LUTs im FPGA sowie 35 Register. Das ist wirklich kompakt. Die anderen Schaltungsteile im Metronomdesign wie CapSense-Interface oder LCD-Controller sind wesentlich größer.

Bildergalerie

  • Blockschaltbild des Systems

    Blockschaltbild des Systems

    Bild: Arrow Electronics

  • Für seine Eigenentwicklung verwendete der Autor ein MachXO2 Pico Board von Lattice Semiconductor.

    Für seine Eigenentwicklung verwendete der Autor ein MachXO2 Pico Board von Lattice Semiconductor.

    Bild: Arrow Electronics

Firmen zu diesem Artikel
Verwandte Artikel