Table des matières:

Arduino en tant que FPGA de planche à pain bon marché: 5 étapes (avec photos)
Arduino en tant que FPGA de planche à pain bon marché: 5 étapes (avec photos)

Vidéo: Arduino en tant que FPGA de planche à pain bon marché: 5 étapes (avec photos)

Vidéo: Arduino en tant que FPGA de planche à pain bon marché: 5 étapes (avec photos)
Vidéo: Club des partenaires 2024, Novembre
Anonim
Arduino en tant que FPGA de planche à pain bon marché
Arduino en tant que FPGA de planche à pain bon marché

Concevoir des circuits logiques matériels peut être amusant. La méthode à l'ancienne consistait à utiliser des portes NAND, sur une planche à pain, câblées avec des câbles de démarrage. C'est encore possible, mais il ne faut pas grand-chose avant que le nombre de portes ne devienne incontrôlable. Une option plus récente consiste à utiliser un FPGA (Field Programmable Gate Array). Ces puces peuvent se recâbler pour devenir n'importe quel circuit logique numérique que vous pouvez concevoir, mais ne sont pas bon marché et facilement disponibles. Je vais montrer comment ce FPGA peut être remplacé par une puce Atmega bon marché à partir d'un Arduino UNO, en plaçant efficacement le circuit numérique dans un boîtier DIP, ce qui est très convivial pour la maquette.

Étape 1: Concevez le circuit que le « FPGA » représentera

Concevez le circuit que le
Concevez le circuit que le
Concevez le circuit que le
Concevez le circuit que le
Concevez le circuit que le
Concevez le circuit que le

Je vais construire un additionneur 2 bits + 2 bits. Il prend deux paires de broches d'entrée logique et produit un triplet de broches de sortie.

Pour ce faire avec des portes NAND, voir le schéma dans l'image. Il a besoin de 14 portes NAND. J'ai utilisé 4 puces TTL à porte NAND quadruple et les ai câblées sur la planche à pain.

J'ai ajouté des LED (n'oubliez pas les résistances de limitation de courant) pour indiquer quand les broches d'entrée et de sortie étaient allumées (haut) et quand elles étaient éteintes (bas). Pour piloter les broches d'entrée, je les ai reliées au rail de masse ou au rail d'alimentation positif.

Ce circuit fonctionne, mais il utilise déjà 4 puces TTL, et c'est un nid de rats de fils. S'il fallait plus de morceaux, il y aurait plus de planches à pain et plus de cavaliers. Très vite, la taille du circuit deviendrait incontrôlable.

Sur une note latérale, lorsque vous travaillez avec des portes TTL, elles ne produisent pas exactement 0V ou 5V comme on pourrait s'y attendre. Ils produisent souvent environ 3V pour "high", mais la tension exacte se situe dans une plage très large. Le même circuit utilisant les puces équivalentes CMOS aurait mieux des oscillations exactement de 0V à exactement 5V.

Étape 2: Entrez le FPGA

Entrez dans le FPGA
Entrez dans le FPGA
Entrez dans le FPGA
Entrez dans le FPGA

Un FPGA est une puce fantastique, qui peut littéralement devenir n'importe quelle combinaison de portes logiques, câblées ensemble dans n'importe quelle combinaison. On conçoit le "circuit" dans un langage de conception matérielle (HDL). Il existe plusieurs langages de ce type, dont l'un s'appelle Verilog. Le fichier.v dans l'image est l'équivalent Verilog de l'additionneur à deux bits. Le fichier.pch ci-dessous est également nécessaire pour affecter les broches d'entrée et de sortie nommées dans le fichier verilog aux broches matérielles réelles de la puce.

Dans ce cas, j'utilise une carte de développement iCEstick de Lattice Semiconductors (https://www.latticesemi.com/icestick). La puce FPGA actuelle est une iCE40HX-1k, avec un peu plus de 1000 portes, qui peuvent chacune devenir n'importe quelle porte logique. Cela signifie que chaque porte peut être une porte NAND, ou une porte OU, une porte NON, NOR, XOR, etc. De plus, chaque porte peut gérer plus de deux entrées. Ceci est spécifique à chaque fabricant, mais sur l'iCE40, chaque porte peut gérer 4 entrées. Ainsi, chaque porte est beaucoup plus performante que les 2 portes NAND d'entrée.

J'ai dû affecter les 4 broches d'entrée et les 3 broches de sortie aux broches physiques 91, 90, 88, 87, 81, 80 et 79 respectivement. Ceci est spécifique à la puce fpga et à la carte de dérivation sur laquelle elle se trouve, et à la façon dont ces broches sont câblées au port PMOD. Ceci est disponible dans les fiches techniques de cette carte FPGA.

Lattice fournit sa propre chaîne d'outils pour synthétiser (l'équivalent FPGA de la compilation pour CPU) des circuits de Verilog, mais j'ai utilisé la chaîne d'outils open source gratuite icestorm (https://www.clifford.at/icestorm/). Les instructions d'installation sont disponibles sur ce site. Avec icestorm installé, et les fichiers verilog et pcf, les commandes pour charger ce circuit sur le FPGA sont:

yosys -p "synth_ice40 -blif twoBitAdder.v" twoBitAdder.blif

arachne-pnr -d 1k -p iCEstick.pcf twoBitAdder.blif -o twoBitAdder.asc

icepack twoBitAdder.asc twoBitAdder.bin

iceprog twoBitAdder.bin

Cela fonctionne très bien, mais l'expédition de cet iCEstick coûtera environ 30 $. Ce n'est pas le moyen le moins cher de construire un circuit numérique, mais il est puissant. Il a plus de 1000 portes et pour ce petit circuit, il n'en utilise que 3. L'équivalent de la porte NAND utilisait 14 portes. Cela est dû au fait que chaque porte peut devenir n'importe quel type de porte, et chaque porte est en fait une porte à 4 entrées. Chaque porte peut faire plus. Si vous avez besoin de plus de portes, l'iCEstick a un grand frère avec 8000 portes, qui coûte environ le double. D'autres fabricants ont d'autres offres, mais le prix peut devenir assez élevé.

Étape 3: Du FPGA à Arduino

Du FPGA à l'Arduino
Du FPGA à l'Arduino

Les FPGA sont excellents, mais peuvent être chers, difficiles à trouver et ne sont pas très conviviaux. Une puce conviviale et bon marché est l'Atmega 328 P, qui est livrée dans un emballage DIP soigné, parfait pour la planche à pain. Il peut également être obtenu pour environ 4 $. C'est le cœur de l'Arduino UNO. Vous pouvez bien sûr utiliser l'ensemble UNO, mais pour être bon marché, nous pouvons retirer l'Atmega 328 P de l'UNO et l'utiliser seul. J'ai cependant utilisé la carte UNO comme programmeur pour l'Atmega.

À ce stade, vous aurez besoin

1. Un Arduino UNO, avec le processeur Atmega 328P amovible.

2. Un autre Atmega 328P avec le bootloader Arduino pré-gravé, pour remplacer celui que nous sommes sur le point de retirer de l'UNO. (Facultatif en supposant que vous souhaitiez toujours avoir un UNO utilisable).

L'objectif est de convertir le fichier verilog en un projet arduino pouvant être chargé dans le 328P. Arduino est basé sur C++. Idéalement, il existe un traducteur de Verilog vers C++, appelé Verilator (https://www.veripool.org/wiki/verilator). Verilator est destiné à être utilisé par les concepteurs de matériel qui doivent simuler leurs conceptions avant de les engager sur du matériel coûteux. Verilator cross compile le verilog en C++, puis l'utilisateur fournit un faisceau de test pour fournir des signaux d'entrée simulés et enregistrer les signaux de sortie. Nous allons l'utiliser pour intégrer la conception verilog dans l'Atmega 328P à l'aide de la chaîne d'outils Arduino.

Installez d'abord Verilator. Suivez les instructions sur

Installez également l'IDE Arduino et testez qu'il peut se connecter à l'Arduino UNO via USB.

Nous utiliserons le même fichier verilog que pour le FPGA, sauf que les noms des broches doivent être modifiés. J'ai ajouté un trait de soulignement (_) au début de chacun. Cela est nécessaire car les bibliothèques arduino incluent un fichier d'en-tête qui traduit des éléments tels que B0, B001, etc. en nombres binaires. Les autres noms de broches d'entrée auraient été corrects tels quels, mais B0 et B1 auraient provoqué l'échec de la construction.

Dans le répertoire contenant twoBitAdder.v et iCEstick.pcf, exécutez la commande suivante:

verilator -Wall --cc twoBitAdder.v

Cela créera un sous-répertoire appelé obj_dir contenant plusieurs nouveaux fichiers. Nous n'avons besoin que des fichiers d'en-tête et cpp, VtwoBitAdder.h, VtwoBitAdder.cpp, VtwoBitAdder_Syms.h et VtwoBitAdder_Syms.cpp.

Dans l'IDE Arduino, créez une nouvelle esquisse appelée twoBitAdder.ino. Cela créera le fichier ino dans un nouveau répertoire également appelé twoBitAdder, dans votre répertoire de carnet de croquis Arduino. Copiez vos fichiers VtwoBitAdder.h et VtwoBitAdder.cpp dans ce dossier twoBitAdder dans votre dossier Arduino.

Copiez maintenant les fichiers d'en-tête de l'installation du vérificateur.

cp /usr/local/share/verilator/include/verilated*.

enfin copier dans la bibliothèque std c++ depuis https://github.com/maniacbug/StandardCplusplus. Selon leurs instructions d'installation "Ceci est installé comme une bibliothèque Arduino ordinaire. Décompressez le contenu de la distribution dans le dossier "Bibliothèques" sous votre carnet de croquis. Par exemple, mon carnet de croquis se trouve dans /home/maniacbug/Source/Arduino, donc cette bibliothèque est dans /home/maniacbug/Source/Arduino/libraries/StandardCplusplus.

Assurez-vous de réinitialiser votre IDE Arduino après l'avoir installé."

Remplacez maintenant le contenu de twoBitAdder.ino par celui fourni à cette étape. Il s'agit d'un faisceau de test que le vérificateur attend, qui configure les broches d'entrée/sortie, puis dans la boucle, lit les broches d'entrée, les alimente au VtwoBitAdder (la version traduite de notre circuit), puis lit les sorties de VtwoBitAdder et applique les sur les broches de sortie.

Ce programme doit compiler et s'exécuter sur l'Arduino UNO.

Étape 4: D'Arduino à la puce DIP sur une planche à pain

De l'Arduino à la puce DIP sur une planche à pain
De l'Arduino à la puce DIP sur une planche à pain

Maintenant que le programme s'exécute sur l'Arduino, nous n'avons plus besoin de la carte Arduino elle-même. Tout ce dont nous avons besoin, c'est du CPU.

Retirez soigneusement l'Atmega 328P de la prise Arduino UNO et insérez éventuellement son remplacement.

Placez l'Atmega 328P sur la planche à pain. Mettez la fin avec le divot pointant vers le haut sur la planche à pain. La broche 1 est la broche en haut à gauche. La broche 2 est la suivante en bas, et ainsi de suite jusqu'à la broche 14 qui se trouve en bas à gauche. Ensuite, la broche 15 est en bas à droite et les broches 16 à 28 remontent le côté droit de la puce.

Connectez les broches 8 et 22 à la terre.

Connectez la broche 7 à VCC (+5V).

Connectez un cristal de quartz 16Mhz entre les broches 9 et 10. Également un petit condensateur (22pF) entre la broche 9 et la masse, et entre la broche 10 et la masse. Cela donne à l'Atmega 328P la vitesse d'horloge de 16Mhz. Il existe des instructions ailleurs pour apprendre au 328P à utiliser à la place son horloge interne de 8 MHz, ce qui économiserait quelques pièces, mais ralentirait le processeur.

Les ports Arduino GPIO 5, 6, 7 et 8, que nous avons utilisés pour les broches d'entrée, sont en fait les broches physiques 11, 12, 13, 14 sur l'Atmega 328P. Ce serait les quatre broches du bas à gauche.

Les ports Arduino GPIO 11, 10 et 9, que nous avons utilisés pour les broches de sortie sont en fait les broches physiques 17, 16, 15 sur l'Atmega 328P. Ce serait les trois broches du bas à droite.

J'ai branché les LED sur ces broches comme avant.

Étape 5: Conclusion

Conclusion
Conclusion

Les puces TTL fonctionnent, mais il en faut beaucoup pour construire quoi que ce soit. Les FPGA fonctionnent très bien, mais ne sont pas bon marché. Si vous pouvez vivre avec moins de broches IO et une vitesse inférieure, alors un Atmega 328P peut être la puce pour vous.

Quelques éléments à garder à l'esprit:

FPGA:

Pro

- Peut gérer les signaux à grande vitesse. Parce qu'il n'y a pas de CPU pour traiter les goulots d'étranglement jusqu'à une instruction à la fois, le facteur limitant est le délai de propagation à travers les portes sur le circuit donné. Dans de nombreux cas, cela peut être beaucoup plus rapide que l'horloge fournie avec la puce. Pour ma conception, le retard calculé aurait permis au twoBitAdder de répondre à environ 100 millions de changements de valeurs d'entrée par seconde (100Mhz) même si l'horloge embarquée n'est qu'un cristal de 12Mhz.

- Au fur et à mesure que la conception devient plus complexe, les performances des circuits existants ne se dégradent pas (beaucoup). Parce que l'ajout de circuits à la structure consiste simplement à mettre quelque chose de nouveau dans l'immobilier inutilisé, cela n'a pas d'impact sur les circuits existants.

- Selon le FPGA, le nombre de broches IO disponibles peut être très élevé et elles ne sont généralement pas verrouillées dans un but particulier.

Con

- Peut être cher et/ou difficile à trouver.

- Vient généralement dans un boîtier BGA qui nécessite une sorte de carte de dérivation pour fonctionner avec la puce dans n'importe quel projet amateur. Si vous l'intégrez dans une conception avec un PCB SMT multicouche personnalisé, ce n'est pas un problème.

- La plupart des fabricants de FPGA fournissent leur propre logiciel de conception à code source fermé, qui dans certains cas peut coûter de l'argent ou avoir une date d'expiration de licence.

Arduino en tant que FPGA:

Pro

- Pas cher et facile à obtenir. Recherchez simplement atmega328p-pu sur Amazon. Ils devraient être d'environ 4 $/pièce. Plusieurs vendeurs les vendent par lots de 3 ou 4.

- Il s'agit d'un boîtier DIP, ce qui signifie qu'il s'adapte parfaitement sur une planche à pain avec ses broches externes.

- Il s'agit d'un appareil 5V, ce qui peut faciliter l'interfaçage avec d'autres appareils 5V.

Con

- L'ATMEGA328P possède un nombre limité de broches IO (23), et plusieurs d'entre elles sont réservées à des tâches spécifiques.

- À mesure que la complexité du circuit augmente, la quantité de code exécuté dans la méthode de boucle Arduino augmente, ce qui signifie que la durée de chaque cycle est plus longue.

- Même si la complexité du circuit est faible, chaque cycle nécessite de nombreuses instructions CPU pour récupérer les valeurs des broches d'entrée, écrire les valeurs des broches de sortie et revenir en haut de la boucle. Avec un cristal de 16Mhz, même à une instruction par cycle d'horloge, la boucle ne s'exécutera pas plus d'un million de fois par seconde (1Mhz). Pour la plupart des projets électroniques amateurs, c'est bien plus rapide que nécessaire.

Conseillé: