Innholdsfortegnelse:

Lag en sensor ut av en FPGA: 4 trinn
Lag en sensor ut av en FPGA: 4 trinn

Video: Lag en sensor ut av en FPGA: 4 trinn

Video: Lag en sensor ut av en FPGA: 4 trinn
Video: Raptoreum AMA for November 26, 2023 (Chapters in Description) 2024, Juli
Anonim
Image
Image
FPGA
FPGA

De fleste produsenter prøvde å bygge et termometer minst en gang i livet, kanskje det som de har hjemme ikke er smart nok, eller kanskje tror de at de kan bygge neste NEST. Likevel hadde de på et tidspunkt en mikrokontroller med sin topp moderne programvare koblet til en temperatursensor (og kanskje andre sensorer: trykk, lys). Inntil nå er alt perfekt, programvaren kjører og sensoren registrerer. La oss teste det!

Hmmmm … kanskje han burde varme opp sensoren med en hårføner og kjøle den ned med is, det fungerer en stund. Men det virker ikke profesjonelt, sensoren endrer verdier for fort hvis du varmer den opp, den varmes ikke opp mer enn et par grader. Prosjektet er en byste! Men algoritmen er ny, tar hensyn til mange faktorer, så synd at han ble sittende fast på denne dumt mindre tingen.

Min løsning er denne: få en FPGA til å fungere som en sensor med verdier streamet fra en PC (eller lagret i minnet, eller opprettet ad-hoc inne i FPGA). Så for din dyrebare MCU ser FPGA ut som en sensor, men ikke hvilken som helst sensor: hvilken sensor du liker. Kanskje du bestemmer deg for at du trenger mer oppløsning eller raskere responstid enn forventet, du må bytte sensor. Bestill den online, den kommer om et par dager, om et par måneder, hvem vet. Svar på kretskortet eller bestill en modul med den nye sensoren. Eller … et par klikk og FPGA er konfigurert som din splitter nye sensor, og den kan etterligne den eksakte interne konfigurasjonen.

I skrivende stund kan FPGA fungere som en LM75 med temperaturdata lagret i BRAM (på FPGA).

Trinn 1: MCU

Mitt valgfrie MCU er en LPC4337 på en LPCXpresso. På toppen av det har jeg et skjold (LPC General Purpose Shield) med et display og en ekte LM75 -sensor. LPC4337 er en ARM Cortex M4 som kjører på 200MHz og en mindre Cortex M0 (brukes ikke her). Den virkelige sensoren er koblet til I2C1 perifer, og vår virtuelle vil bli koblet til I2C0. Kilden er tilgjengelig på min GitHub.

Hvordan bygge den? Last ned LPCXpresso IDE sammen med LPCOpen bibliotek. Importer det biblioteket til IDE og åpne også prosjektet fra GitHub. Alt bør konfigureres, og du kan klikke på "Debug" i nedre venstre hjørne.

Hele prosjektet er basert på et av NXPs eksempler (for å vise at prosjektet mitt simulerer en ekte sensor og ikke trenger spesiell kode på MCU -siden). I hovedfilen (kalt iox_sensor.cpp) ligger denne koden:

#define SENSORS_ON_SHIELD

#if definert (SENSORS_ON_SHIELD) #definer SHIELD_I2C I2C1 #elif definert (SENSORS_ON_FPGA) #definer SHIELD_I2C I2C0 #endif

Ved å endre SENSOR_ON_SHIELD og SENSOR_OR_FPGA kan brukeren på kompileringstidspunktet bytte til hvilken sensor som skal snakkes, den virkelige eller den virtuelle, som de er på forskjellige I2C -pinner.

Trinn 2: FPGA

Mitt FPGA -kort er et Artix 7 laget av Digilent, som har et Xilinx Arty 7. To av PMod -kontaktene brukes, en for feilsøking og en for den virkelige nyttelasten, forbindelsen til MCU -kortet.

Igjen er kildekoden for FPGA tilgjengelig på min GitHub (fpgaSide -mappe).

Hvordan bygge den? Last ned, kjøp eller åpne Xilinx Vivado IDE. Importer prosjektfilene fra GitHub. En av filene (content.coe) er temperaturdataene i råformat som skal streames til den falske sensoren. Det er også en Excel -fil med samme navn som hjelper med å konvertere menneskelige lesbare temperaturdata til rå LM75 -data. Jeg planlegger å endre dette til en automatisert prosess med et programvare skrevet i Java, men til da fungerer denne løsningen. Syntese og implantasjon bør ta en stund, ta dette i betraktning.

Trinn 3: Hvordan fungerer det?

Hvordan virker det?
Hvordan virker det?
Hvordan virker det?
Hvordan virker det?

Som jeg sa, for MCU, ser FPGA ut som en sensor, nærmere bestemt en I2C -sensor. Utgangen fra I2C -periferienheten er koblet til FPGAs inngang. Inne i FPGA er det 3 hovedkomponenter:- I2C-kontroller- I2C-enhetsdata I2C-kontrolleren mottar I2C-data fra FPGAs pinner og sender dem til resten av FPGA og gjør det samme i motsatt rekkefølge. Den opprettholder en intern tilstandsmaskin for I2C -protokollen (forresten, her er dokumentasjonen for den). Hva sender denne komponenten til I2C -enheten? Den nåværende mottatte byten, posisjonen til den byten i den nåværende kommunikasjonen og om MCU skriver til eller leser fra FPGA. I2C -enheten mottar de sendte byte og oppdaterer den simulerte interne strukturen til sensoren. Det kan bare oppdatere registerpekeren eller be om nye data fra datakilden. Datakomponenten strømmer nye datapunkter. Foreløpig er det bare et ROM -minne hvis adresse økes (omtrent) to ganger i sekundet.

Hva er sluttmålet mitt? Det er vist på det andre bildet. Det vil si: gjør det mulig for flere I2C -enheter (sensorer og andre) å være simulerbare samtidig inne i FPGA. Dataene på baksiden av sensoren som skal bufres i FPGA og streames fra PC via USB eller Ethernet. Støtt mer avanserte sensorer og andre I2C -enheter (minne, LED -drivere osv.).

Trinn 4: Sett alt sammen

Sette alt sammen
Sette alt sammen
Sette alt sammen
Sette alt sammen

Nå er det på tide å koble alt sammen. Teoretisk sett er det enkelt: mcu -kortet har en PMod -kontakt (I2C0 og SSP0 (kan fungere som SPI)). Artix -kortet har 4 PMod -kontakter som kan brukes som du vil. Jeg velger kontakt D for å snakke med MCU og kontakt B for å koble til min Logic Analyzer.

Advarsel

Du kan ikke bare koble de to brettene sammen. Hvorfor? PMod ble bygget for å lette tilkoblingen av et Master/Host -kort (som gir strøm) til et Slave/Sensor -kort (som mottar strøm). Men i dette prosjektet gir begge kortene strøm, og hvis du kobler 3.3V -utgangen fra det ene kortet til 3.3V -utgangen på det andre kortet, kan det skje dårlige ting. Men de gjør det kanskje ikke, og du kan bare endre parametrene for kraftskinnene til FPGA (de er veldig nøye designet). Så ikke ta denne risikoen, og flytt kontakten en pinne til venstre (og snu også FPGA -kortet) som vist på bildene ovenfor. Her er PMod -spesifikasjonen, du kan studere den. Det jeg gjorde i korte ord er å ikke koble VCC -ene til de to kortene.

Anbefalt: