Lav enhver sensor ud af en FPGA: 4 trin

Lav enhver sensor ud af en FPGA: 4 trin

Indholdsfortegnelse:

Anonim

De fleste beslutningstagere forsøgte at bygge mindst en gang i deres liv et termometer, måske er den, de har hjemme, ikke smart nok, eller måske tror de at de kan bygge det næste NEST. Ikke desto mindre havde de på et tidspunkt mikrocontroller med deres state-of-the-art software forbundet med en temperatursensor (og måske andre sensorer: tryk, lys). Indtil nu er alt perfekt, softwaren kører, og sensoren sensorerer. Lad os teste det!

Hmmmm … måske skal han opvarme sensoren ved hjælp af en hårtørrer og køle den ned ved hjælp af is, det virker for en tid. Men det virker ikke professionelt, sensoren ændrer værdierne for hurtigt, hvis du opvarmer det, det opvarmer ikke mere end et par grader. Projektet er en byste! Men algoritmen er ny, tager højde for mange faktorer, hvilken skam, at han fik fast ved denne dumme mindre ting.

Min løsning er dette: Lav en FPGA-handling som en sensor med værdier streamet fra en pc (eller gemt i hukommelse eller oprettet ad hoc i FPGA). Så for din dyrebare MCU ser FPGA'en ud som en sensor, men ikke nogen sensor: hvilken sensor du vil. Måske bestemmer du, at du har brug for mere opløsning eller hurtigere svartid end forventet, du skal ændre sensoren. Bestil det online, det kommer frem til et par dage, om et par måneder, hvem ved det. Svar på dit printkort eller bestil et modul med den nye sensor. Eller … et par klik, og FPGA'en er konfigureret som din helt nye sensor, og den kan efterligne den nøjagtige interne konfiguration.

I øjeblikket skriver dette, kunne FPGA fungere som en LM75 med temperaturdata lagret i BRAM (på FPGA).

forsyninger:

Trin 1: MCU

Min valgte MCU er en LPC4337 på en LPCXpresso. På toppen af ​​det har jeg et skjold (LPC General Purpose Shield) med en skærm og en ægte LM75 sensor. LPC4337 er en ARM Cortex M4 kører ved 200MHz og en mindre Cortex M0 (ikke brugt her). Den ægte sensor er forbundet til I2C1 perifer og vores virtuelle bliver tilsluttet til I2C0. Kilden er tilgængelig på min GitHub.

Hvordan man opbygger det? Download LPCXpresso IDE sammen med LPCOpen bibliotek. Import det bibliotek til IDE og også åbne projektet fra GitHub. Alt skal konfigureres, og du kan klikke på "Debug" i nederste venstre hjørne.

Hele projektet er baseret på et af NXPs eksempler (for at vise, at mit projekt simulerer en ægte sensor og ikke har brug for speciel kode på MCU-siden). I hovedfilen (kaldet iox_sensor.cpp) ligger denne kode:

#define SENSORS_ON_SHIELD #if defineret (SENSORS_ON_SHIELD) #define SHIELD_I2C I2C1 #lif defined (SENSORS_ON_FPGA) #define SHIELD_I2C I2C0 #endif

Ved at skifte SENSOR_ON_SHIELD og SENSOR_OR_FPGA kan brugeren skifte på kompileringstid til hvilken sensor til at tale, den rigtige eller den virtuelle, som de er på forskellige I2C-ben.

Trin 2: FPGA

Mit FPGA bestyrelsesvalg er en Artix 7 lavet af Digilent, der har en Xilinx Arty 7. To af PMod-stikkene bruges, en til debuging og en til den rigtige nyttelast, forbindelsen med MCU board.

Igen er kildekoden til FPGA tilgængelig på min GitHub-mappe (fpgaSide-mappen).

Hvordan man opbygger det? Download, køb eller åben Xilinx Vivado IDE. Importer projektfilerne fra GitHub. En af filerne (content.coe) er temperaturdataene i råformat, der skal streames til den falske sensor. Der er også en Excel-fil med samme navn, der hjælper med at konvertere menneskelige læsbare temperaturdata til rå LM75-data. Jeg planlægger at ændre dette til en automatiseret proces med et softwareprogram skrevet i Java, men indtil da fungerer denne løsning. Syntese og implemantation bør tage et stykke tid, tage dette i betragtning.

Trin 3: Hvordan virker det?

Som sagt, for MCU'en ser FPGA'en ud som en sensor, mere præcis en I2C-sensor. Udgangen af ​​I2C-periferien er forbundet til FPGA's input. Inde i FPGA er der 3 hovedkomponenter: - I2C Controller-I2C Device-DataThe I2C Controller modtager I2C-data fra FPGA-stifterne og sender dem til resten af ​​FPGA'en og gør det samme i omvendt rækkefølge. Den opretholder en intern state-maskine til I2C-protokollen (forresten, her er dokumentationen til den). Hvad sender denne komponent til I2C-enheden? Den for øjeblikket modtagne byte, position af den byte i den aktuelle meddelelse og om MCU skriver til eller læser fra FPGA. I2C-enheden modtager de sendte bytes og opdaterer sensorens simulerede interne struktur. Det kan muligvis bare opdatere registermarkøren eller anmode om nye data fra datakilden. Datakomponenten streamer nye datapunkter. I øjeblikket er det kun en ROM-hukommelse, hvis adresse øges (ca.) to gange per sekund.

Hvad er mit mål? Det vises i det andet billede. Det vil sige: gøre det muligt for flere I2C-enheder (sensorer og andre) at simulere samtidig i FPGA'en. Dataene på bagsiden af ​​sensoren, der skal caches i FPGA'en og streames fra pc via USB eller Ethernet. Støtte mere avancerede sensorer og andre I2C-enheder (hukommelse, LED-drivere osv.).

Trin 4: Sæt det hele sammen

Nu er det tid til at forbinde alt til hende. Teoretisk er det simpelt: mcu-kortet har en PMOD-stik (I2C0 & SSP0 (kan fungere som SPI)). Artix bordet har 4 PMod stik, der kan bruges, men du vil. Jeg vælger stik D for at tale med MCU og stik B for at oprette forbindelse til min Logic Analyzer.

Advarsel

Du kan ikke forbinde de to boards sammen lige sådan. Hvorfor? PMod blev bygget for at lette forbindelsen mellem en Master / Host board (der giver strøm) til en slave / sensor bord (der modtager strøm). Men i dette projekt giver begge tavler strøm, og hvis du tilslutter 3.3V-udgangen fra et bord til 3.3V-udgangen på den anden plade dårlige ting kunne ske. Men de måske ikke, og du kan bare ændre parametrene for FPGA's strømskinner (de er meget omhyggeligt designet). Så tag ikke denne risiko, og flyt kontakten en pin til venstre (og også flip FPGA board) som set i ovenstående billeder. Her er PMod specifikationen, du cand studere det, hvad jeg gjorde i korte ord er at ikke forbinde VCCs af de to boards.