Créer n'importe quel capteur d'un FPGA: 4 étapes

Créer n'importe quel capteur d'un FPGA: 4 étapes

Table des matières:

Anonim

La plupart des fabricants ont essayé de construire au moins une fois dans leur vie un thermomètre. Peut-être celui qu'ils ont chez eux n'est-il pas assez intelligent, ou peut-être pensent-ils pouvoir construire le prochain NEST. Néanmoins, à un moment donné, ils avaient un microcontrôleur avec son logiciel à la pointe de la technologie connecté à un capteur de température (et peut-être à d’autres capteurs: pression, lumière). Jusqu'à présent, tout était parfait, le logiciel fonctionnait et le capteur détectait. Testons-le!

Hmmmm … peut-être devrait-il chauffer le capteur avec un sèche-cheveux et le refroidir avec de la glace, cela fonctionne pendant un certain temps. Mais cela ne semble pas professionnel, le capteur change les valeurs trop rapidement si vous chauffez, il ne chauffe pas plus de quelques degrés. Le projet est un buste! Mais l'algorithme est nouveau, prend en compte de nombreux facteurs, quel dommage qu'il soit resté coincé dans cette chose bêtement mineure.

Ma solution est la suivante: faire en sorte qu'un FPGA agisse comme un capteur avec des valeurs diffusées depuis un PC (ou stockées en mémoire ou créées ad-hoc dans le FPGA). Donc, pour votre précieux MCU, le FPGA ressemble à un capteur, mais à n’importe quel capteur: celui que vous préférez. Peut-être décidez-vous qu'il vous faut plus de résolution ou un temps de réponse plus rapide que prévu, vous devez changer le capteur. Commandez-le en ligne, il arrivera dans quelques jours, dans quelques mois, qui sait. Respirez votre circuit imprimé ou commandez un module avec le nouveau capteur. Ou … en quelques clics, le FPGA est configuré comme votre tout nouveau capteur et il peut émuler la configuration interne exacte.

Au moment de l'écriture, le FPGA pouvait jouer le rôle d'un LM75 avec des données de température stockées dans BRAM (sur le FPGA).

Provisions:

Étape 1: le MCU

Mon MCU de choix est un LPC4337 sur un LPCXpresso. En plus, j'ai un bouclier (LPC General Purpose Shield) avec un écran et un vrai capteur LM75. Le LPC4337 est un ARM Cortex M4 fonctionnant à 200 MHz et un Cortex M0 plus petit (non utilisé ici). Le capteur réel est connecté au périphérique I2C1 et notre capteur virtuel sera connecté à I2C0. La source est disponible sur mon GitHub.

Comment le construire? Téléchargez l'IDE LPCXpresso avec la bibliothèque LPCOpen. Importez cette bibliothèque dans l'EDI et ouvrez également le projet à partir de GitHub. Tout doit être configuré et vous pouvez cliquer sur "Debug" dans le coin inférieur gauche.

L'ensemble du projet est basé sur l'un des exemples de NXP (pour montrer que mon projet simule un capteur réel et ne nécessite pas de code spécial du côté MCU). Dans le fichier principal (appelé iox_sensor.cpp) se trouve ce code:

#define SENSORS_ON_SHIELD #si défini (SENSORS_ON_SHIELD) #define SHIELD_I2C I2C1 #elif défini (SENSORS_ON_FPGA) #define SHIELD_I2C I2C0 #endif

En modifiant SENSOR_ON_SHIELD et SENSOR_OR_FPGA, l'utilisateur peut changer de compilateur au moment de la compilation, avec quel capteur parler, qu'il soit réel ou virtuel, car ils se trouvent sur différentes broches I2C.

Étape 2: le FPGA

Ma carte FPGA de choix est une Artix 7 de Digilent, dotée d’un Xilinx Arty 7. Deux connecteurs PMod sont utilisés, l’un pour le débogage et l’autre pour la charge utile réelle, la connexion avec la carte MCU.

De nouveau, le code source du FPGA est disponible sur mon GitHub (dossier fpgaSide).

Comment le construire? Téléchargez, achetez ou ouvrez Xilinx Vivado IDE. Importez les fichiers du projet depuis GitHub. L'un des fichiers (content.coe) contient les données de température au format brut qui seront transmises au faux capteur. Il existe également un fichier Excel portant le même nom qui facilite la conversion des données de température lisibles par l’homme en données LM75 brutes. Je prévois de changer cela en un processus automatisé avec un logiciel écrit en Java, mais jusque-là, cette solution fonctionnait. La synthèse et la mise en œuvre devraient prendre un certain temps, prenez cela en considération.

Étape 3: Comment ça marche?

Comme je l'ai dit, pour le MCU, le FPGA ressemble à un capteur, plus exactement à un capteur I2C. La sortie du périphérique I2C est connectée à l'entrée du FPGA. Le FPGA contient 3 composants principaux: - Contrôleur I2C - Périphérique I2C - DonnéesLe contrôleur I2C reçoit les données I2C des broches du FPGA et les envoie au reste du FPGA et procède de la même manière dans l'ordre inverse. Il maintient une machine à états interne pour le protocole I2C (en passant, voici la documentation correspondante). Qu'est-ce que ce composant envoie au périphérique I2C? Octet actuellement reçu, position de cet octet dans la communication en cours et indiquant si la MCU écrit ou lit sur le FPGA. Le périphérique I2C reçoit les octets envoyés et met à jour la structure interne simulée du capteur. Il peut simplement mettre à jour le pointeur de registre ou demander de nouvelles données à la source de données. Le composant Data diffuse de nouveaux points de données. Actuellement, il ne s'agit que d'une mémoire ROM dont l'adresse est incrémentée (environ) deux fois par seconde.

Quel est mon objectif final? Il est montré dans la deuxième image. C’est-à-dire: permettre à plusieurs dispositifs I2C (capteurs et autres) d’être simulés simultanément dans le FPGA. Les données sur le backend du capteur doivent être mises en cache dans le FPGA et diffusées depuis un PC via USB ou Ethernet. Prend en charge des capteurs plus avancés et d’autres périphériques I2C (mémoire, pilotes de DEL, etc.).

Étape 4: Tout mettre en place

Il est maintenant temps de tout connecter. Théoriquement, c’est simple: la carte MCU dispose d’un connecteur PMod (I2C0 et SSP0 (peut fonctionner comme SPI)). La carte Artix dispose de 4 connecteurs PMod qui peuvent être utilisés comme vous le souhaitez. Je choisis le connecteur D pour parler à la MCU et le connecteur B pour se connecter à mon analyseur logique.

Attention

Vous ne pouvez pas connecter les deux cartes ensemble comme ça. Pourquoi? PMod a été conçu pour faciliter la connexion d’une carte maître / hôte (qui fournit l’alimentation) à une carte esclave / capteur (qui reçoit l’alimentation). Mais dans ce projet, les deux cartes donnent du courant et si vous connectez la sortie 3.3V d’une carte à la sortie 3.3V de l’autre mauvaises choses pourrait se produire. Mais ils pourraient ne pas le faire et vous pourriez simplement changer les paramètres des rails d’alimentation du FPGA (ils sont très soigneusement conçus). Donc, ne prenez pas ce risque et déplacez le connecteur d'une broche vers la gauche (et retournez également la carte FPGA) comme indiqué dans les images ci-dessus. Voici la spécification PMod, vous pouvez l’étudier, ce que j’ai fait en peu de mots est de ne pas connecter les VCC des deux cartes.