Obtenir FPGA en Python

La technologie FPGA (FPGA) gagne actuellement en popularité. Le nombre d'applications augmente: en plus du traitement des signaux numériques, les FPGA sont utilisés pour accélérer le machine learning, dans les technologies blockchain, le traitement vidéo et l'IoT.

Cette technologie a un inconvénient important: pour la programmation, des langages de description assez complexes et spécifiques des équipements numériques Verilog et VHDL sont utilisés. Cela complique l'entrée d'un nouveau venu dans le FPGA et il est difficile pour un employeur de trouver un spécialiste possédant ces connaissances spécifiques sur le marché du travail. D'autre part, le langage de programmation Python de haut niveau populaire avec le cadre MyHDL rend la programmation FPGA simple et agréable. De plus, les gens qui connaissent Python sont un ordre de grandeur plus spécialisés avec Verilog / VHDL. Avec une série d'articles, je veux montrer à quel point il est facile d'entrer dans le domaine du FPGA connaissant Python et de commencer à réaliser de véritables projets FPGA complexes dans ce langage. Je note que python n'est pas directement exécuté sur le FPGA, mais est un outil pour générer un firmware.

Tout d'abord, nous avons besoin de python version 3.6 lui-mĂȘme (ci-aprĂšs, toutes les opĂ©rations sont effectuĂ©es sur le systĂšme d'exploitation Ubuntu 18.04).

Installez myhdl:

pip3 install myhdl 

Comme "Bonjour tout le monde!" Nous allons Ă©crire un programme simple qui fera s'allumer les LED lorsqu'un bouton est enfoncĂ©. Dans le monde des microprocesseurs "Hello World!" Il s'agit d'un programme qui clignote avec une seule LED; dans le monde FPGA, Hello World est le clignotement d'un millier de LED. Il n'y a que quatre LED sur la carte, nous ne les ferons donc clignoter qu'en fonction de la pression sur le bouton. Il est important de noter que tout le code en FPGA, contrairement aux microcontrĂŽleurs, est exĂ©cutĂ© en mĂȘme temps, toutes les diodes s'allument et s'Ă©teignent en mĂȘme temps. Et pas sĂ©quentiellement dans le cas des microcontrĂŽleurs. Le test utilise la carte WaveShare OpenEPM1270 avec des cartes Altera Max II EPM1270T144C5 Ă  bord.



Créez un nouveau fichier python:

 from myhdl import * from random import randrange def led_blinker(input1, led1, led2, led3, led4): @always_comb def on_off_led(): if input1 == 1: led1.next = 1 led2.next = 1 led3.next = 0 led4.next = 0 else: led1.next = 0 led2.next = 0 led3.next = 1 led4.next = 1 return on_off_led 

Pour savoir si notre code fonctionne correctement, vous avez besoin d'un outil de vérification. En fait, tout programme pour FPGA est un processeur de signal numérique, donc le développeur doit s'assurer qu'il a correctement indiqué quoi faire avec la puce. Cela se fait par simulation, pour cela, vous devez installer un programme qui affichera les signaux traités. Il existe de nombreux programmes de ce type, mais à mon avis, le meilleur GTKWave gratuit pour le moment. Il est mis depuis le terminal:

 sudo apt-get install gtkwave 

Ensuite, dans le fichier avec le firmware, l'environnement de test doit ĂȘtre dĂ©crit. C'est aussi une fonction python:

 def test(): input1, led1, led2, led3, led4 = [Signal(bool(0)) for i in range(5)] test = led_blinker(input1, led1, led2, led3, led4) @always(delay(10)) def gen(): input1.next = randrange(2) return test, gen 

Ici, l'environnement de test génÚre une séquence aléatoire de zéros et de uns (le module Python random est utilisé).

 def simulate(timesteps): tb = traceSignals(test) sim = Simulation(tb) sim.run(timesteps) 

Et nous initialisons le simulateur, en y faisant glisser la fonction d'environnement test_inverter. Ainsi, nous obtenons la poupĂ©e russe inverter → test_inverter → simulate (temps en unitĂ©s arbitraires).

AprÚs avoir exécuté le script dans le dossier de travail, créez un fichier .vcd et exécutez-le via gtkwave, dans le terminal: gtkwave test_invereter.vcd.



En conséquence, une séquence aléatoire de signaux d'entrée input1 a été générée, et comment la fonction led_blinker a traité ces signaux.

AprĂšs nous ĂȘtre assurĂ©s que la logique fonctionnait exactement comme nous le voulions, nous devrions ensuite lancer cette fonction dans FPGA. J'ai l'habitude de travailler avec des puces d'Intel (anciennement Altera), cette sĂ©quence d'opĂ©rations est similaire pour les puces d'autres fabricants avec des systĂšmes de CAO appropriĂ©s. Un fichier binaire est créé sur la puce FPGA, qui est créé par le compilateur du fabricant de puces, pour Intel c'est Quartus, pour Xilinx Vivado. Les compilateurs ne peuvent travailler qu'avec du code en VHDL / Verilog, donc le code Python doit ĂȘtre traduit dans n'importe laquelle de ces langues (peu importe lequel).

 def convert(): input1, led1, led2, led3, led4 = [Signal(bool(0)) for i in range(5)] toVerilog(led_blinker, input1, led1, led2, led3, led4) convert() 

Dans cet exemple, le code est traduit en Verilog. Le résultat est dans le fichier led_blinker.v, et Quartus devra le donner pour générer le firmware FPGA:

 module led_blinker ( input1, led1, led2, led3, led4 ); input input1; output led1; reg led1; output led2; reg led2; output led3; reg led3; output led4; reg led4; always @(input1) begin: LED_BLINKER_ON_OFF_LED if ((input1 == 1)) begin led1 = 1; led2 = 1; led3 = 0; led4 = 0; end else begin led1 = 0; led2 = 0; led3 = 1; led4 = 1; end end endmodule 

Dans cette approche du développement du firmware FPGA, vous pouvez ignorer ce fichier et le déposer simplement dans Quartus.

Vous pouvez télécharger Quartus depuis fpgasoftware.intel.com , nous avons besoin d'une version gratuite de Lite, cela nous suffira. Téléchargez la version de base de 9 Go.

L'installation de Quartus ne devrait pas ĂȘtre un problĂšme pour l'utilisateur Linux moyen. AprĂšs l'installation, vous devez dĂ©finir certains paramĂštres dans le systĂšme afin que vous puissiez utiliser l'appareil pour flasher le programme FPGA - le programmeur:

1. Créez une rÚgle udev. Pour ce faire, créez un nouveau fichier /etc/udev/rules.d/51-altera-usb-blaster.rules avec le contenu suivant:

 # USB-Blaster SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6001", MODE="0666" SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6002", MODE="0666" SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6003", MODE="0666" # USB-Blaster II SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6010", MODE="0666" SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6810", MODE="0666" 

Redémarrez udev à l'aide d'udevadm:

 sudo udevadm control --reload 

2. Autorisez l'accÚs non root au périphérique USB-Blaster. Pour ce faire, créez le fichier /etc/udev/rules.d/altera-usb-blaster.rules avec la ligne:

 ATTR{idVendor}=="09fb", ATTR{idProduct}=="6001", MODE="666" 

Cela donne rw-rw-rw- accĂšs au programmeur.

3. Configurez jtagd. Quartus utilise le démon jtagd pour fonctionner, qui associe un logiciel à un appareil de programmation. Copiez la description de votre répertoire avec Quartus:

 sudo mkdir /etc/jtagd sudo cp <Quartus install path>/quartus/linux64/pgm_parts.txt /etc/jtagd/jtagd.pgm_parts 

Exécutez Quartus et créez un nouveau projet «Fichier» - «Assistant de nouveau projet», saisissez le nom du projet.

Ensuite, cliquez sur Suivant. Et dans le menu Ajouter des fichiers, nous connectons le fichier verilog généré avec l'extension .v. Ainsi, si le fichier verilog est édité à partir d'un fichier python, il sera automatiquement récupéré par Quartus. Ensuite, nous arrivons au menu de sélection de l'appareil, dans notre cas, il s'agit de MAX II EMP1270T144C5 et des prochaines fois. Le projet est créé.

Dans le Navigateur du projet, allez dans le menu fichier et faites un clic droit sur notre fichier verilog «Définir comme entité de niveau supérieur».

Nous compilons le projet. Maintenant, dans le menu "Assignments-Pin Planner", configurez les broches sur la puce:



Compilez Ă  nouveau. Maintenant, tout est prĂȘt pour la programmation: Tools-Programmer. Nous connectons le programmateur et l'alimentation Ă  la carte, dans la configuration matĂ©rielle, nous sĂ©lectionnons notre USB-Blaster, dĂ©finissez les cases Ă  cocher comme indiquĂ© sur la figure et dĂ©marrez.



AprÚs que le programmeur a signalé le succÚs. Vous pouvez voir le résultat au tableau:



Conclusion


Cette leçon décrit comment créer un environnement de travail et le premier projet FPGA simple dans le langage de programmation Python.

Considéré:

  • comment installer:
    • myHDL;
    • GTKWave;
    • Quartus;
  • Programmeur USB Blaster configurĂ© dans Ubuntu;
  • FPGA Projet FPGA dĂ©veloppĂ©;
  • Test et vĂ©rification du projet;
  • CompilĂ© un projet pour FPGA;
  • Projet tĂ©lĂ©chargĂ© sur FPGA.

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


All Articles