Boîte à musique et encodeur rotatif sur carte FPGA

Présentation


Nous sommes les étudiants de première année en informatique à l'Université Innopolis et nous aimerions partager notre expérience dans le développement d'un programme Verilog pour créer le codeur rotatif le plus cool (enfin, au moins, le plus fort) jamais sur une carte FPGA.

Dans cet article, vous trouverez une merveilleuse histoire sur notre projet, le matériel, les logiciels que nous avons utilisés et une théorie de base concernant l'encodeur rotatif et la création de sons dans le buzzer de FPGA. Enfin, nous fournirons un lien vers un référentiel github où un lecteur pourra accéder au code source. Nous espérons que vous aimerez le projet et qu'il vous inspirera à faire quelque chose de similaire.
Alors commençons!

Matériel et logiciel



image

  • Prise en charge des périphériques FPGA Cyclone IV pour Quartus Prime

  • Édition Quartus Prime Lite

  • Un encodeur rotatif du kit Arduino

  • ModelSim * -Intel FPGA (pour le débogage uniquement)

  • Fils de kit Arduino

Une brève histoire


Il y a longtemps, dans une galaxie lointaine, un groupe d'étudiants (nous) a décidé de se rapprocher d'un matériel. Le cours d'architecture informatique nous a donné une excellente occasion de faire un projet sur des cartes FPGA. Après quelques discussions, nous avons choisi d'implémenter un système avec un encodeur rotatif. Nous avons accompli la tâche mais ce n'était pas suffisant pour satisfaire nos désirs, nous avons donc décidé de mettre à niveau notre projet en le transformant en un instrument de musique utilisant un clavier et un buzzer de planche pour jouer différentes notes. Cependant, il s'est avéré que le port PS / 2 du FPGA est mort.

Finalement, nous finissons par écrire une mélodie simple qui est jouée lorsque le bouton est enfoncé.

Boîte à musique


On peut distinguer une note d'une autre par les fréquences de leurs ondes sonores. Par conséquent, pour qu'un buzzer joue différentes notes, nous devons le faire générer des ondes sonores avec des fréquences différentes.

Nous avons décidé de travailler avec des ondes carrées car elles sont assez faciles à mettre en œuvre.

Une onde carrée est un signal qui change son état entre haut et bas. L'idée principale d'une onde carrée est que le moment où le signal à l'état haut et le moment où le signal à l'état bas sont les mêmes. Pour générer une onde carrée, vous devez activer une E / S, attendre x fois, désactiver les E / S, attendre x fois et répéter ces actions autant de fois que nécessaire.

image

Cette photo a été prise d' ici .

Le cyclone IV possède un générateur d'horloge avec une fréquence de 50 MHz. En utilisant la définition d'une onde carrée, il n'est pas si difficile de dériver la formule suivante:

x = (50 * 10 ^ 6) / (2 * n )

n est la fréquence souhaitée en Hz et x est un nombre de cycles d'horloge que nous devons attendre avant de changer l'état de haut en bas et vice versa.

Pour qu'un buzzer génère des ondes de fréquence n Hz, nous avons implémenté un diviseur d'horloge.
Plus d'informations sur le diviseur d'horloge et les ondes carrées, vous pouvez lire ici .

Un autre mais :
En raison de la faible qualité des buzzers, il n'est pas possible de jouer des notes avec des basses fréquences. Nous avons donc utilisé ceux de F # de la 4e octave à C # de la 5e octave.

Il s'agit d'un organigramme qui montre une logique de la boîte à musique.

image

Codeur rotatif


Comment fonctionne l'encodeur rotatif?

C'est une chose faite d'un cercle avec des plaques conductrices et deux capteurs analogiques.

Comme vous pouvez le voir sur une image lorsque vous tournez l'encodeur rotatif, l'un des capteurs touche d'abord la plaque et passe de bas en haut. Donc, à ce moment-là, nous pouvons savoir si nous tournons l'encodeur dans le sens horaire ou antihoraire. L'idée est la suivante: nous allons regarder le capteur B à chaque fois que le capteur A passe de bas en haut. Si à ce moment B est affirmé, l'encodeur a été tourné dans le sens horaire, sinon dans le sens antihoraire. Maintenant, par le mot rotation, nous entendons tourner l'encodeur sur une section.

image

(la photo a été volée sur howtomechatronics.com )

C'est un organigramme qui montre une logique de l'encodeur rotatif

image

De plus, nous voulons afficher l'angle de rotation sur l'affichage à 8 segments. Notre encodeur a 20 segments, donc la rotation sur un segment est égale à une rotation sur l'angle de 18 et la formule que nous utilisons est:

angle = ( nombre de rotations mod 20) * 18

Matériaux


Le code de notre projet est ici .

Ici et voici les vidéos de l'encodeur rotatif et de la boîte à musique.

Auteurs : Amina Miftahova, Kamil Kamaliev, Lev Svalov.

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


All Articles