Spieluhr und Drehgeber auf FPGA-Karte

Einführung


Wir sind die ersten Studenten der Informatik an der Innopolis University und möchten unsere Erfahrungen bei der Entwicklung eines Verilog-Programms teilen, um den coolsten (zumindest den lautesten) Drehgeber aller Zeiten auf einem FPGA-Board zu entwickeln.

In diesem Artikel finden Sie eine wunderbare Geschichte über unser Projekt, die von uns verwendete Hardware, Software und einige Hintergrundtheorien zum Drehgeber und zum Erstellen von Sounds im FPGA-Summer. Schließlich werden wir einen Link zu einem Github-Repository bereitstellen, über das ein Leser auf den Quellcode zugreifen kann. Wir hoffen, dass Ihnen das Projekt gefallen wird und es Sie dazu inspirieren wird, etwas Ähnliches zu machen.
Also fangen wir an!

Hardware und Software



Bild

  • Cyclone IV FPGA-Geräteunterstützung für Quartus Prime

  • Quartus Prime Lite Edition

  • Ein Drehgeber aus dem Arduino-Kit

  • ModelSim * -Intel FPGA (nur zum Debuggen)

  • Drähte aus dem Arduino Kit

Eine kurze Geschichte


Vor langer Zeit hat eine Gruppe von Studenten (uns) in einer weit entfernten Galaxie beschlossen, sich einer Hardware zu nähern. Der Kurs Computerarchitektur bot uns die großartige Gelegenheit, ein Projekt auf FPGA-Karten zu erstellen. Nach einigen Diskussionen haben wir uns entschieden, ein System mit einem Drehgeber zu implementieren. Wir haben die Aufgabe erfüllt, aber es war nicht genug, um unsere Wünsche zu erfüllen. Deshalb haben wir beschlossen, unser Projekt zu verbessern, indem wir es mit einem Keyboard und einem Summer eines Boards in ein Musikinstrument verwandelten, um verschiedene Noten zu spielen. Es stellte sich jedoch heraus, dass der PS / 2-Port des FPGA tot ist.

Schließlich schreiben wir eine einfache Melodie, die abgespielt wird, wenn die Taste gedrückt wird.

Spieluhr


Wir können eine Note von einer anderen durch die Frequenzen ihrer Schallwellen unterscheiden. Damit ein Summer unterschiedliche Noten spielt, müssen Schallwellen mit unterschiedlichen Frequenzen erzeugt werden.

Wir haben uns für Rechteckwellen entschieden, da diese recht einfach zu implementieren sind.

Eine Rechteckwelle ist ein Signal, das seinen Zustand zwischen hoch und niedrig ändert. Die Hauptidee einer Rechteckwelle ist, dass die Zeit, zu der das Signal im hohen Zustand ist, und die Zeit, zu der das Signal im niedrigen Zustand gleich ist. Um eine Rechteckwelle zu erzeugen, müssen Sie eine E / A einschalten, x-mal warten, die E / A ausschalten, x-mal warten und diese Aktionen so oft wiederholen, wie Sie möchten.

Bild

Dieses Bild wurde von hier aufgenommen .

Der Zyklon IV verfügt über einen Taktgenerator mit einer Frequenz von 50 MHz. Mit der Definition einer Rechteckwelle ist es nicht so schwer, die folgende Formel abzuleiten:

x = (50 · 10 & supmin; & sup6;) / (2 · n )

Dabei ist n die gewünschte Frequenz in Hz und x eine Anzahl von Taktzyklen, die wir abwarten müssen, bevor wir den Zustand von hoch nach niedrig und umgekehrt ändern.

Damit ein Summer Wellen mit der Frequenz n Hz erzeugt, haben wir einen Taktteiler implementiert.
Mehr über Uhrenteiler und Rechteckwellen können Sie hier lesen.

Ein anderer aber :
Aufgrund der geringen Qualität der Summer ist es nicht möglich, Noten mit niedrigen Frequenzen zu spielen. Also haben wir diejenigen von F # der 4. Oktave bis C # der 5. Oktave verwendet.

Es ist ein Flussdiagramm, das eine Logik der Spieluhr zeigt.

Bild

Drehgeber


Wie funktioniert der Drehgeber?

Es besteht aus einem Kreis mit Leiterplatten und zwei analogen Sensoren.

Wie Sie auf einem Bild sehen können, wenn Sie den Drehgeber drehen, berührt einer der Sensoren zuerst die Platte und wechselt von niedrig nach hoch. In diesem Moment können wir also wissen, ob wir den Encoder im oder gegen den Uhrzeigersinn drehen. Die Idee ist folgende: Wir werden Sensor B jedes Mal betrachten, wenn Sensor A von niedrig nach hoch wechselt. Wenn in diesem Moment B aktiviert ist, wurde der Encoder im Uhrzeigersinn gedreht, andernfalls gegen den Uhrzeigersinn. Mit dem Wort Drehung meinen wir nun das Drehen des Encoders in einem Abschnitt.

Bild

(Das Bild wurde von howtomechatronics.com gestohlen.)

Es ist ein Flussdiagramm, das eine Logik des Drehgebers zeigt

Bild

Außerdem möchten wir den Drehwinkel auf der 8-Segment-Anzeige ausgeben. Unser Encoder hat 20 Segmente, sodass die Drehung um ein Segment einer Drehung um den Winkel von 18 entspricht. Die von uns verwendete Formel lautet:

Winkel = ( Anzahl der Umdrehungen mod 20) * 18

Materialien


Der Code unseres Projekts ist hier .

Hier und hier sind die Videos des Drehgebers und der Spieluhr.

Autoren : Amina Miftahova, Kamil Kamaliev, Lev Svalov.

Source: https://habr.com/ru/post/de431612/


All Articles