Taula de continguts:

Feu qualsevol sensor d'un FPGA: 4 passos
Feu qualsevol sensor d'un FPGA: 4 passos

Vídeo: Feu qualsevol sensor d'un FPGA: 4 passos

Vídeo: Feu qualsevol sensor d'un FPGA: 4 passos
Vídeo: CS50 Live, серия 003 2024, Desembre
Anonim
Image
Image
El FPGA
El FPGA

La majoria dels fabricants van intentar construir almenys una vegada a la vida un termòmetre, potser el que tenen a casa no és prou intel·ligent o potser pensen que poden construir el següent NEST. No obstant això, en algun moment tenien un microcontrolador amb el seu programari d’última generació connectat a un sensor de temperatura (i potser a altres sensors: pressió, llum). Fins ara tot era perfecte, el programari funciona i el sensor detecta. Anem a provar-ho!

Mmmmm … potser hauria d'escalfar el sensor amb un assecador de cabells i refredar-lo amb gel, funciona durant un temps. Però no sembla professional, el sensor canvia els valors massa ràpidament si l’escalfeu, no escalfa més d’un parell de graus. El projecte és un bust! Però l’algoritme és nou, té en compte molts factors, una llàstima que s’hagi quedat enganxat amb aquesta cosa estúpidament menor.

La meva solució és aquesta: fer que un FPGA actuï com un sensor amb valors transmesos des d’un PC (o emmagatzemats a la memòria o creats ad-hoc dins del FPGA). Per tant, per a la vostra preciosa MCU, el FPGA sembla un sensor, però no cap sensor: sigui el sensor que vulgueu. Potser decidiu que necessiteu més resolució o un temps de resposta més ràpid del previst, heu de canviar el sensor. Feu una comanda en línia, arribarà d'aquí a un parell de dies, d'un parell de mesos, qui sap. Torneu a fixar el vostre PCB o demaneu un mòdul amb el sensor nou. O … un parell de clics i el FPGA es configura com el vostre sensor completament nou i pot emular la configuració interna exacta.

En el moment d’escriure això, el FPGA podria actuar com un LM75 amb les dades de temperatura emmagatzemades a BRAM (al FPGA).

Pas 1: l'MCU

El meu MCU que trieu és un LPC4337 en un LPCXpresso. A sobre hi tinc un escut (LPC General Purpose Shield) amb pantalla i un sensor LM75 real. LPC4337 és un ARM Cortex M4 que funciona a 200 MHz i un Cortex M0 més petit (no s’utilitza aquí). El sensor real està connectat al perifèric I2C1 i el nostre virtual es connectarà a I2C0. La font està disponible al meu GitHub.

Com construir-lo? Descarregueu LPCXpresso IDE juntament amb la biblioteca LPCOpen. Importeu aquesta biblioteca a l'IDE i obriu també el projecte des de GitHub. Tot s'hauria de configurar i podeu fer clic a "Depurar" a l'extrem inferior esquerre.

Tot el projecte es basa en un dels exemples del NXP (per demostrar que el meu projecte simula un sensor real i no necessita cap codi especial al costat de la MCU). Al fitxer principal (anomenat iox_sensor.cpp) hi ha aquest codi:

#define SENSORS_ON_SHIELD

#if definit (SENSORS_ON_SHIELD) #define SHIELD_I2C I2C1 #elif definit (SENSORS_ON_FPGA) #define SHIELD_I2C I2C0 #endif

En canviar SENSOR_ON_SHIELD i SENSOR_OR_FPGA, l'usuari pot canviar en el moment de la compilació a quin sensor parlar, el real o el virtual, ja que es troben en diferents pins I2C.

Pas 2: el FPGA

La meva placa FPGA escollida és un Artix 7 fabricat per Digilent, que té un Xilinx Arty 7. S'utilitzen dos dels connectors PMod, un per a la depuració i un per a la càrrega útil real, la connexió amb la placa MCU.

Una vegada més, el codi font del FPGA està disponible al meu GitHub (carpeta fpgaSide).

Com construir-lo? Descarregueu, compreu o obriu Xilinx Vivado IDE. Importeu els fitxers del projecte des de GitHub. Un dels fitxers (content.coe) són les dades de temperatura en format cru que es transmetran al sensor fals. També hi ha un fitxer Excel amb el mateix nom que ajuda a convertir les dades de temperatura llegibles per humans en dades LM75 en brut. Estic planejant canviar-ho per un procés automatitzat amb un programari escrit en Java, però fins aleshores aquesta solució funciona. La síntesi i la implemantació haurien de trigar una mica, tenint-ho en compte.

Pas 3: Com funciona?

Com funciona?
Com funciona?
Com funciona?
Com funciona?

Com he dit, per a la MCU, el FPGA sembla un sensor, més exactament un sensor I2C. La sortida del perifèric I2C està connectada a l'entrada del FPGA. Dins del FPGA hi ha 3 components principals: - Controlador I2C - Dispositiu I2C - Dades El controlador I2C rep dades I2C dels pins del FPGA i els envia a la resta del FPGA i fa el mateix en ordre invers. Manté una màquina d’estat interna per al protocol I2C (per cert, aquí teniu la documentació). Què envia aquest component al dispositiu I2C? El byte rebut actualment, la posició d'aquest byte a la comunicació actual i si la MCU escriu o llegeix des de l'FPGA. El dispositiu I2C rep els bytes enviats i actualitza l'estructura interna simulada del sensor. És possible que només actualitzeu el punter del registre o sol·liciteu dades noves a la font de dades. El component de dades emet nous punts de dades. Actualment és només una memòria ROM l'adreça de la qual s'incrementa (aproximadament) dues vegades per segon.

Quin és el meu objectiu final? Es mostra a la segona imatge. És a dir: fer possible que més dispositius I2C (sensors i altres) siguin simulables alhora al FPGA. Les dades del fons del sensor es desaran a la memòria cau a l'FPGA i es transmetran des del PC mitjançant USB o Ethernet. Admet sensors més avançats i altres dispositius I2C (memòria, controladors LED, etc.).

Pas 4: ajuntar-ho tot

Posant-ho tot junt
Posant-ho tot junt
Posant-ho tot junt
Posant-ho tot junt

Ara és el moment de connectar-ho tot més. Teòricament, és senzill: la placa mcu té un connector PMod (I2C0 i SSP0 (pot funcionar com SPI)). La placa Artix té 4 connectors PMod que es poden utilitzar com vulgueu. Trio el connector D per parlar amb la MCU i el connector B per connectar-lo al meu analitzador lògic.

Advertiment

No podeu connectar les dues taules juntes així. Per què? PMod es va construir per facilitar la connexió d'una placa mestra / amfitrió (que dóna energia) a una placa esclau / sensor (que rep alimentació). Però en aquest projecte les dues plaques donen energia i, si connecteu la sortida de 3,3V d’una placa a la sortida de 3,3V de l’altra placa, podrien passar coses dolentes. Però potser no ho faran i és possible que només canvieu els paràmetres dels rails de potència del FPGA (estan dissenyats amb molta cura). Així que no prengueu aquest risc i moveu el connector un pin cap a l’esquerra (i també gireu la placa FPGA) tal com es veu a les imatges anteriors. Aquí teniu l’especificació de PMod, podeu estudiar-la, el que vaig fer en poques paraules és no connectar els VCC de les dues plaques.

Recomanat: