Dans un premier journal je décrivais le «core» de TapTempoChisel. Passons maintenant à l'intégration sur un vrai FPGA physique.
J'ai choisi pour cela une carte APF27 de chez armadeus. Cette carte possède un FPGA Spartan3A de chez Xilinx mais elle possède également un microprocesseur i.MX27 permettant de faire tourner Linux. La philosophie de la carte étant d'avoir une zone «en friche» avec le FPGA permettant d'ajouter des périphériques sur mesure.
Périphérique que nous allons construire avec le projet TapTempo. Le détail pas à pas de la construction de ce «périphérique» est donné sur le dernier article du front de libération des FPGA. Je vais juste me contenter ici de donner les grandes lignes de l'architecture.
Le signal d'entrée (bouton) est synchronisé par deux bascules D au moyen d'un simple registre à décalage :
val button_s = ShiftRegister(io.button, 2)
Puis on filtre les rebonds au moyen d'un compteur remis à zéro sur front montant ou descendant :
when(debcounter =/= MAX_COUNT.U) {
debcounter := debcounter + 1.U
}.otherwise {
when(risingedge(button_s) || fallingedge(button_s)){
debcounter := 0.U
button_deb := button_s
}
}
La valeur de sortie est sur 9 bits, nous y ajoutons donc des pins à zéro pour avoir un bus de données de 16bits correspondant au bus «WEIM» du processeur i.MX27 connecté au FPGA :
io.data := Cat("b0000000".U, tap_tempo.io.bpm)
On générera le verilog au moyen de la commande sbt de scala :
sbt 'runMain taptempo.APF27TapTempoDriver'
Qui nous permettra de récupérer des sources Verilog APF27TapTempo.v permettant de synthétiser avec ISE (le logiciel de synthèse de xilinx).
On y ajoutera un fichier de description du pinout au format ucf.
Puis on génére le bitstream du projet pour ensuite le télécharger sur la carte :
BIOS> tftpboot ${loadaddr} APF27TapTempo.bit
Et configurer le fpga :
BIOS> fpga load 0 ${loadaddr}
La valeur du tempo sera ensuite lisible sous U-Boot (mon design un peu trop vite fait bloque le bus de la flash empêchant Linux de démarrer …) en lisant dans l'espace mémoire du bus FPGA :
BIOS> md.w C8000000
c8000000: 007b 007b 007b 007b 007b 007b 007b 007b {.{.{.{.{.{.{.{.
c8000010: 007b 007b 007b 007b 007b 007b 007b 007b {.{.{.{.{.{.{.{.
c8000020: 007b 007b 007b 007b 007b 007b 007b 007b {.{.{.{.{.{.{.{.
c8000030: 007b 007b 007b 007b 007b 007b 007b 007b {.{.{.{.{.{.{.{.
c8000040: 007b 007b 007b 007b 007b 007b 007b 007b {.{.{.{.{.{.{.{.
c8000050: 007b 007b 007b 007b 007b 007b 007b 007b {.{.{.{.{.{.{.{.
c8000060: 007b 007b 007b 007b 007b 007b 007b 007b {.{.{.{.{.{.{.{.
c8000070: 007b 007b 007b 007b 007b 007b 007b 007b {.{.{.{.{.{.{.{.
C'est le tempo du très mauvais «début de soirée» mesuré en live ici. La valeur est lue en hexadécimal ce qui nous donne donc un tempo de 123 bpm.
# clic clac
Posté par mzf (site web personnel) . Évalué à 2.
Super la démo vidéo !
D'ailleurs on entend 2 sons quand le bouton est pressé. J'imagine que c'est l'appui puis le relâchement. Lequel est pris en compte ?
Du coup ça ressemble à une partie de Dance Dance Révolution ton installation ;-)
[^] # Re: clic clac
Posté par martoni (site web personnel, Mastodon) . Évalué à 3.
C'est ça ;)
D'après la datasheet de la carte de développement, le bouton est branché via une résistance de «pull-up». La valeur est donc à '1' par défaut et à '0' quand on appuie dessus. Comme TapTempo déclenche sur front montant du signal bouton, c'est au relâchement que le comptage est pris en compte.
J'ai plus qu'une balle
[^] # Re: clic clac
Posté par martoni (site web personnel, Mastodon) . Évalué à 1.
Par contre je me suis vautré pour le lien de la vidéo. Le vrai lien vers la vidéo est celui-ci.
J'ai plus qu'une balle
# xkcdify ?
Posté par BAud (site web personnel) . Évalué à 2.
Tu l'as fait avec quel outil ton diagramme à la xkcd ?
[^] # Re: xkcdify ?
Posté par martoni (site web personnel, Mastodon) . Évalué à 1.
Comparer mon diagramme à xkcd est un grand honneur ! Mais je ne pense pas lui arriver à la cheville ;)
Je débute avec ma tablette wacom et j'utilise MyPaint pour gribouiller.
J'ai plus qu'une balle
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.