URL: https://linuxfr.org/users/martoni/journaux/integration-de-taptempo-chisel-sur-apf27 Title: Intégration de TapTempo-Chisel sur APF27 Authors: martoni Date: 2018年05月23日T22:28:45+02:00 License: CC By-SA Tags: taptempo, chisel, fpga, apf27 et armadeus Score: 23 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](http://www.fabienm.eu/flf/integration-de-taptempo-chisel-sur-apf27/). 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](http://www.fabienm.eu/flf/wp-content/uploads/2018/05/taptempoapf27.png). 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](http://www.fabienm.eu/flf/integration-de-taptempo-chisel-sur-apf27/). La valeur est lue en hexadécimal ce qui nous donne donc un tempo de 123 bpm.