Cuprins:

Realizați orice senzor dintr-un FPGA: 4 pași
Realizați orice senzor dintr-un FPGA: 4 pași

Video: Realizați orice senzor dintr-un FPGA: 4 pași

Video: Realizați orice senzor dintr-un FPGA: 4 pași
Video: Cum scrii când începi un caiet nou 2024, Noiembrie
Anonim
Image
Image
FPGA
FPGA

Majoritatea factorilor de decizie au încercat să construiască cel puțin o dată în viață un termometru, poate cel pe care îl au acasă nu este suficient de inteligent sau poate cred că pot construi următorul NEST. Cu toate acestea, la un moment dat au avut un microcontroler cu software-ul lor de ultimă generație conectat la un senzor de temperatură (și poate la alți senzori: presiune, lumină). Până acum totul este perfect, software-ul funcționează și senzorul detectează. Să-l testăm!

Hmmmm … poate ar trebui să încălzească senzorul folosind un uscător de păr și să-l răcească cu gheață, funcționează o perioadă. Dar nu pare profesional, senzorul schimbă valorile prea repede dacă îl încălzești, nu se încălzește mai mult de câteva grade. Proiectul este un bust! Dar algoritmul este nou, ia în considerare o mulțime de factori, ce păcat că a rămas blocat la acest lucru prostesc minor.

Soluția mea este următoarea: faceți ca un FPGA să acționeze ca un senzor cu valori transmise de pe un PC (sau stocate în memorie sau create ad-hoc în interiorul FPGA). Deci, pentru prețioasa dvs. MCU, FPGA arată ca un senzor, dar nu orice senzor: oricare dintre senzori doriți. Poate decideți că aveți nevoie de mai multă rezoluție sau timp de răspuns mai rapid decât era de așteptat, trebuie să schimbați senzorul. Comandați-l online, va ajunge în câteva zile, de câteva luni, cine știe. Montați din nou PCB-ul sau comandați un modul cu noul senzor. Sau … câteva clicuri și FPGA este configurat ca senzorul dvs. nou-nouț și poate emula configurația internă exactă.

În momentul scrierii acestui lucru, FPGA ar putea acționa ca un LM75 cu date de temperatură stocate în BRAM (pe FPGA).

Pasul 1: MCU

MCU-ul meu ales este un LPC4337 pe un LPCXpresso. Deasupra lui am un scut (LPC General Purpose Shield) cu afișaj și un senzor LM75 real. LPC4337 este un ARM Cortex M4 care rulează la 200MHz și un Cortex M0 mai mic (neutilizat aici). Senzorul real este conectat la perifericul I2C1, iar cel virtual al nostru va fi conectat la I2C0. Sursa este disponibilă pe GitHub.

Cum să-l construiești? Descărcați LPCXpresso IDE împreună cu biblioteca LPCOpen. Importați acea bibliotecă în IDE și, de asemenea, deschideți proiectul din GitHub. Totul ar trebui să fie configurat și puteți face clic pe „Depanare” în colțul din stânga jos.

Întregul proiect se bazează pe unul dintre exemplele NXP (pentru a arăta că proiectul meu simulează un senzor real și nu are nevoie de cod special pe partea MCU). În fișierul principal (numit iox_sensor.cpp) se află acest cod:

#define SENSORS_ON_SHIELD

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

Prin schimbarea SENSOR_ON_SHIELD și SENSOR_OR_FPGA, utilizatorul poate comuta la momentul compilării la ce senzor să vorbească, cel real sau virtual, deoarece sunt pe pini I2C diferiți.

Pasul 2: FPGA

Placa mea FPGA la alegere este un Artix 7 realizat de Digilent, având un Xilinx Arty 7. Se folosesc doi dintre conectorii PMod, unul pentru depanare și unul pentru sarcina utilă reală, conexiunea cu placa MCU.

Din nou, codul sursă pentru FPGA este disponibil pe GitHub (folderul fpgaSide).

Cum să-l construiești? Descărcați, cumpărați sau deschideți Xilinx Vivado IDE. Importați fișierele proiectului din GitHub. Unul dintre fișiere (content.coe) este datele de temperatură în format brut care vor fi transmise în flux către senzorul fals. Există, de asemenea, un fișier Excel cu același nume care ajută la convertirea datelor de temperatură lizibile de om în date brute LM75. Am de gând să schimb acest lucru într-un proces automat cu o bucată de software scrisă în Java, dar până atunci această soluție funcționează. Sinteza și Implemantarea ar trebui să dureze ceva timp, ținând cont de acest lucru.

Pasul 3: Cum funcționează?

Cum functioneazã?
Cum functioneazã?
Cum functioneazã?
Cum functioneazã?

După cum am spus, pentru MCU, FPGA arată ca un senzor, mai exact un senzor I2C. Ieșirea perifericului I2C este conectată la intrarea FPGA. În interiorul FPGA există 3 componente principale: - Controler I2C - Dispozitiv I2C - Date Controlerul I2C primește date I2C de la pinii FPGA și le trimite către restul FPGA și face același lucru în ordine inversă. Acesta menține o mașină de stare internă pentru protocolul I2C (apropo, iată documentația pentru acesta). Ce trimite această componentă dispozitivului I2C? Octetul primit în prezent, poziția acelui octet în comunicarea curentă și dacă MCU scrie sau citește de pe FPGA. Dispozitivul I2C primește octeții trimiși și actualizează structura internă simulată a senzorului. S-ar putea doar să actualizeze indicatorul de înregistrare sau să solicite date noi de la sursa de date. Componenta Data transmite noi puncte de date. În prezent este doar o memorie ROM a cărei adresă este incrementată (aproximativ) de două ori pe secundă.

Care este scopul meu final? Este afișat în a doua imagine. Adică: face posibil ca mai multe dispozitive I2C (senzori și altele) să poată fi simulate în același timp în interiorul FPGA. Datele de pe backend-ul senzorului vor fi stocate în cache în FPGA și transmise în flux de la PC prin USB sau Ethernet. Acceptă senzori mai avansați și alte dispozitive I2C (memorie, drivere LED etc.).

Pasul 4: Puneți totul împreună

Punând totul împreună
Punând totul împreună
Punând totul împreună
Punând totul împreună

Acum este momentul să conectăm totul împreună. Teoretic, este simplu: placa mcu are un conector PMod (I2C0 și SSP0 (poate funcționa ca SPI)). Placa Artix are 4 conectori PMod care pot fi folosiți după cum doriți. Aleg conectorul D pentru a vorbi cu MCU și conectorul B pentru a mă conecta la analizorul meu logic.

Avertizare

Nu puteți conecta cele două plăci împreună la fel. De ce? PMod a fost construit pentru a ușura conectarea unei plăci Master / Host (care dă putere) la o placă Slave / Sensor (care primește energie). Dar în acest proiect ambele plăci oferă putere și dacă conectați ieșirea de 3,3V de la o placă la ieșirea de 3,3V a celeilalte plăci s-ar putea întâmpla lucruri rele. Dar s-ar putea să nu facă acest lucru și s-ar putea să schimbați doar parametrii șinelor de alimentare ale FPGA (sunt foarte atent proiectați). Așadar, nu vă asumați acest risc și mutați conectorul un pin spre stânga (și, de asemenea, întoarceți placa FPGA) așa cum se vede în imaginile de mai sus. Iată specificația PMod, o puteți studia, ceea ce am făcut în cuvinte scurte este să nu conectați VCC-urile celor două plăci.

Recomandat: