Innholdsfortegnelse:
- Trinn 1: Utform kretsen som "FPGA" vil representere
- Trinn 2: Skriv inn FPGA
- Trinn 3: Fra FPGA til Arduino
- Trinn 4: Fra Arduino til DIP Chip på et brødbrett
- Trinn 5: Konklusjon
Video: Arduino som et billig brødbrett FPGA: 5 trinn (med bilder)
2024 Forfatter: John Day | [email protected]. Sist endret: 2024-01-30 11:24
Å designe maskinvarelogikkretser kan være morsomt. Den gamle skolemåten for å gjøre dette var med NAND -porter, på et brødbrett, kablet med hoppetråder. Dette er fortsatt mulig, men det skal ikke så mye til før antall porter går ut av hånden. Et nyere alternativ er å bruke en FPGA (Field Programmable Gate Array). Disse sjetongene kan omkoble seg selv til å bli en hvilken som helst digital logikkrets du kan designe, men er ikke billige og lett tilgjengelige. Jeg vil vise hvordan denne FPGA kan erstattes med en billig Atmega -brikke fra en Arduino UNO, og effektivt sette den digitale kretsen inn i en DIP -pakke, som er veldig brødbrettvennlig.
Trinn 1: Utform kretsen som "FPGA" vil representere
Jeg skal bygge en 2 bit + 2 bit adder. Den tar to par logiske inngangspinner, og sender ut en triplett utgangspinner.
For å gjøre dette med NAND -porter, se skjemaet på bildet. Den trenger 14 NAND -porter. Jeg brukte 4 quad NAND gate TTL -chips, og koblet dem til brødbrettet.
Jeg la til noen lysdioder (ikke glem de nåværende begrensningsmotstandene) for å vise når inngangs- og utgangspinnene var på (høye) og når de var av (lave). For å drive inngangspinnene, hoppet jeg dem enten til bakkeskinnen eller den positive kraftskinnen.
Denne kretsen fungerer, men den tar allerede opp 4 TTL -brikker, og er en rotterede av ledninger. Hvis det var behov for flere biter, ville det være flere brødbrett og flere hoppere. Veldig raskt ville størrelsen på kretsen gått ut av hånden.
På en side notat, når de arbeider med TTL -porter, sender de ikke ut akkurat 0V eller 5V som man kunne forvente. De sender ofte rundt 3V for "høy", men den eksakte spenningen er i et veldig bredt område. Den samme kretsen som bruker CMOS -ekvivalente chips ville ha bedre nøyaktig 0V til nøyaktig 5V svinger.
Trinn 2: Skriv inn FPGA
En FPGA er en fantastisk brikke, som bokstavelig talt kan bli hvilken som helst kombinasjon av logiske porter, koblet sammen i en hvilken som helst kombinasjon. Den ene designer "kretsen" på et hardware design -språk (HDL). Det er flere slike språk, hvorav det ene heter Verilog.. V -filen på bildet er Verilog -ekvivalenten til to -bits -addereren.. Pch -filen under den er også nødvendig for å tilordne inngangs- og utgangspinnene som er nevnt i verilog -filen til ekte maskinvarepinner på brikken.
I dette tilfellet bruker jeg et Lattice Semiconductors iCEstick utviklingstavle (https://www.latticesemi.com/icestick). Selve FPGA-brikken er en iCE40HX-1k, med litt over 1000 porter, som hver kan bli en hvilken som helst logisk gate. Det betyr at hver gate kan være en NAND -gate, eller en OR -gate, IKKE gate, NOR, XOR, etc. I tillegg kan hver gate håndtere mer enn to innganger. Dette er spesifikt for hver produsent, men på iCE40 kan hver port håndtere 4 innganger. Dermed er hver port langt mer i stand enn de 2 inngang NAND -portene.
Jeg måtte tildele de fire inngangspinnene og de tre utgangspinnene til de fysiske pinnene 91, 90, 88, 87, 81, 80 og 79. Dette er spesifikt for fpga -brikken og utbruddskortet den er på, og hvordan disse pinnene er koblet til PMOD -porten. Dette er tilgjengelig i databladene for dette FPGA -kortet.
Lattice gir sin egen verktøykjede for å syntetisere (FPGA -ekvivalenten til kompilering for CPUer) kretser fra Verilog, men jeg brukte gratis åpen kildekode -verktøykjede isstorm (https://www.clifford.at/icestorm/). Installasjonsinstruksjonene er tilgjengelige på dette nettstedet. Med isstorm installert, og verilog- og pcf -filen, er kommandoene for å laste denne kretsen til FPGA:
yosys -p "synth_ice40 -blif twoBitAdder.v" twoBitAdder.blif
arachne -pnr -d 1k -p iCEstick.pcf twoBitAdder.blif -o twoBitAdder.asc
icepack twoBitAdder.asc twoBitAdder.bin
iceprog twoBitAdder.bin
Dette fungerer bra, men inkludert levering av denne iCEstick vil koste omtrent $ 30. Dette er ikke den billigste måten å bygge en digital krets på, men den er kraftig. Den har over 1000 porter, og for denne lille kretsen bruker den bare 3 av dem. NAND -portekvivalenten brukte 14 porter. Dette skyldes det faktum at hver gate kan bli hvilken som helst port, og hver gate er faktisk en 4 inngangsport. Hver port kan gjøre mer. Hvis du trenger flere porter, har iCEstick en større bror med 8000 porter, som koster omtrent det dobbelte. Andre produsenter har andre tilbud, men prisen kan bli ganske bratt.
Trinn 3: Fra FPGA til Arduino
FPGA -er er flotte, men kan være dyre, vanskelig å få tak i, og er ikke veldig brødbrettvennlige. En brødbrettvennlig og billig brikke er Atmega 328 P, som kommer i en pen DIP -pakke, perfekt for brødbrett. Den kan også fås for rundt $ 4. Dette er hjertet i Arduino UNO. Du kan selvfølgelig bruke hele UNO, men vær billig, vi kan trekke Atmega 328 P av UNO, og bruke den selv. Jeg brukte imidlertid UNO -kortet som programmerer for Atmega.
På dette tidspunktet trenger du
1. En Arduino UNO, med den flyttbare Atmega 328P CPU.
2. En annen Atmega 328P med Arduino bootloader forhåndsbrent, for å erstatte den vi skal ta ut av UNO. (Valgfritt forutsatt at du fortsatt vil ha en brukbar UNO).
Målet er å konvertere verilog -filen til et arduino -prosjekt som kan lastes inn i 328P. Arduino er basert på C ++. Det er praktisk en oversetter fra Verilog til C ++, kalt Verilator (https://www.veripool.org/wiki/verilator). Verilator er ment å brukes av maskinvaredesignere som trenger å simulere designene sine før de overfører disse designene til dyr maskinvare. Verilator -kryss kompilerer veriloggen til C ++, deretter gir brukeren en testsele for å gi simulerte inngangssignaler og registrere utgangssignalene. Vi kommer til å bruke den til å stappe verilog -designen inn i Atmega 328P ved hjelp av Arduino -verktøykjeden.
Installer først Verilator. Følg instruksjonene på
Installer også Arduino IDE, og test at den kan koble til Arduino UNO via USB.
Vi bruker den samme verilog -filen som for FPGA, bortsett fra at navnene på pinnene må endres. Jeg la til en understreking (_) i begynnelsen av hver. Dette er nødvendig fordi arduino -bibliotekene inneholder en topptekstfil som oversetter ting som B0, B001, etc, til binære tall. De andre inndatapinnnavnene ville ha vært fine som de er, men B0 og B1 ville ha forårsaket at bygningen mislyktes.
Kjør følgende i katalogen som inneholder twoBitAdder.v og iCEstick.pcf:
verilator -Wall --cc twoBitAdder.v
Dette vil opprette en underkatalog kalt obj_dir som inneholder flere nye filer. Vi trenger bare topp- og cpp -filene, VtwoBitAdder.h, VtwoBitAdder.cpp, VtwoBitAdder_Syms.h og VtwoBitAdder_Syms.cpp.
I Arduino IDE lager du en ny skisse som heter twoBitAdder.ino. Dette vil opprette ino -filen i en ny katalog, også kalt twoBitAdder, inne i Arduino -skissebokskatalogen. Kopier VtwoBitAdder.h- og VtwoBitAdder.cpp -filene til denne twoBitAdder -mappen i Arduino -mappen.
Kopier nå topptekstfilene fra verilator -installasjonen.
cp/usr/local/share/verilator/include/verilated*.
kopier endelig til biblioteket std c ++ fra https://github.com/maniacbug/StandardCplusplus. I henhold til installasjonsinstruksjonene "Dette er installert akkurat som et vanlig Arduino -bibliotek. Pakk inn innholdet i distribusjonen i" biblioteker "-mappen under skisseboken din. For eksempel er skisseboken min på/home/maniacbug/Source/Arduino, så dette biblioteket er i/home/maniacbug/Source/Arduino/libraries/StandardCplusplus.
Sørg for å tilbakestille Arduino IDE etter at du har installert den."
Nå erstatt innholdet i twoBitAdder.ino med det som er gitt på dette trinnet. Dette er en testsele som verilator forventer, som setter opp inngangs-/utgangspinnene, deretter i sløyfen, leser inngangspinnene, mater dem til VtwoBitAdder (den oversatte versjonen av kretsen vår), leser deretter utgangene fra VtwoBitAdder og bruker dem til utgangspinnene.
Dette programmet skal kompilere og kjøre på Arduino UNO.
Trinn 4: Fra Arduino til DIP Chip på et brødbrett
Nå som programmet kjører på Arduino, trenger vi ikke lenger selve Arduino -brettet. Alt vi trenger er CPU.
Fjern Atmega 328P forsiktig fra Arduino UNO -kontakten, og sett eventuelt inn erstatningen.
Sett Atmega 328P på brødbrettet. Legg enden med divoten pekende opp på brødbrettet. Pin 1 er den øverste venstre pinnen. Pin 2 er den neste ned, og så videre til pin 14 som er nederst til venstre. Deretter er pinne 15 nederst til høyre, og pinner 16 til 28 teller tilbake på høyre side av brikken.
Koble pinnene 8 og 22 til bakken.
Koble pinne 7 til VCC (+5V).
Koble en 16Mhz kvartskrystall mellom pinnene 9 og 10. Også en liten kondensator (22pF) mellom pinne 9 og bakken, og mellom pinne 10 og bakken. Dette gir Atmega 328P 16Mhz klokkehastighet. Det er instruksjoner andre steder om hvordan man lærer 328P i stedet å bruke den interne 8Mhz -klokken, noe som ville spare et par deler, men det ville bremse prosessoren.
Arduino GPIO -portene 5, 6, 7 og 8, som vi brukte for inngangspinnene, er faktisk de fysiske pinnene 11, 12, 13, 14 på Atmega 328P. Det ville være de fire nederste pinnene til venstre.
Arduino GPIO -portene 11, 10 og 9, som vi brukte for utgangspinnene, er faktisk de fysiske pinnene 17, 16, 15 på Atmega 328P. Det ville være de tre nederste pinnene til høyre.
Jeg koblet LED -lampene til disse pinnene som før.
Trinn 5: Konklusjon
TTL -chips fungerer, men det tar mange av dem å bygge noe. FPGAer fungerer veldig bra, men er ikke billige. Hvis du kan leve med færre IO -pinner og lavere hastighet, kan en Atmega 328P være brikken for deg.
Noen ting å huske på:
FPGA:
Pro
- Kan håndtere høyhastighets signaler. Fordi det ikke er noen CPU for flaskehalsbehandling ned til en instruksjon om gangen, er den begrensende faktoren forplantningsforsinkelsen gjennom portene på den gitte kretsen. I mange tilfeller kan dette være mye raskere enn klokken som følger med brikken. For mitt design ville den beregnede forsinkelsen ha tillatt for twoBitAdder å svare på omtrent 100 millioner endringer i inngangsverdier per sekund (100Mhz), selv om den innebygde klokken bare er en 12Mhz krystall.
- Etter hvert som designet blir mer komplekst, forringes ikke ytelsen til de eksisterende kretsene (mye). Fordi det å legge kretser til stoffet ganske enkelt setter noe nytt i ubrukt eiendom, påvirker det ikke eksisterende kretser.
- Avhengig av FPGA kan antallet tilgjengelige IO -pinner være veldig høyt, og de er vanligvis ikke låst til et bestemt formål.
Lure
- Kan være dyrt og/eller vanskelig å få tak i.
- Vanligvis kommer den i en BGA -pakke som krever et slags breakout -bord for å jobbe med brikken i ethvert amatørprosjekt. Hvis du bygger det inn i et design med en tilpasset flerlags SMT-PCB, er dette ikke et problem.
- De fleste FPGA -produsenter tilbyr sin egen programvare for lukket kildekode, som i noen tilfeller kan koste penger, eller har en lisensutløpsdato.
Arduino som en FPGA:
Pro
- Billig og lett å få. Bare søk etter atmega328p-pu på Amazon. De bør være omtrent $ 4/stk. Flere selgere selger dem i massevis av 3 eller 4.
- Dette er en DIP -pakke, noe som betyr at den passer perfekt på et brødbrett med sine ytre pinner.
- Dette er en 5V -enhet, som kan gjøre grensesnittet til andre 5V -enheter enkelt.
Lure
- ATMEGA328P har et begrenset antall IO -pinner (23), og flere av dem er reservert for spesifikke oppgaver.
- Etter hvert som kretskompleksiteten øker, øker mengden kodekjøring i Arduino loop -metoden, noe som betyr at varigheten av hver syklus er lengre.
- Selv om kompleksiteten til kretsen er lav, krever hver syklus mange CPU -instruksjoner for å hente inngangs -pin -verdiene og skrive utgangs -pin -verdier og gå tilbake til toppen av løkken. Med en 16Mhz krystall, selv ved en instruksjon per klokkesyklus, løper sløyfen ikke mer enn kanskje 1 million ganger per sekund (1Mhz). For de fleste amatørelektronikkprosjekter er det imidlertid mye raskere enn nødvendig.
Anbefalt:
En liten og billig lommecomputer som kan programmeres hvor som helst: 5 trinn
En liten og billig lommecomputer som kan programmeres hvor som helst.: Du kan gjøre CardKB til en lommedatamaskin! Komplett lommecomputer for CardKB ved hjelp av ArduinoBaisc, CardKB, I2C OLED -skjerm. Siden BASIC bruker ArduinoBasic (https://github.com/robinhedwards/ArduinoBASIC), støtter den nesten alle normale funksjoner som
PIC & AVR -moduler fra SMD -brikker som passer for brødbrett: 7 trinn
PIC & AVR-moduler fra SMD-brikker som passer for brødbrett: Noen ganger vil du støte på noen mikrokontrollere i Surface Mounted (SMD) -form, som du vil prøve på brødbrettet! Du ville prøve hardt for å få DIL -versjonen av den brikken, noen ganger ville den ikke være tilgjengelig. Siste v
Billig (som i gratis [som i øl]) Multi-meter stativ: 4 trinn
Billig (som i gratis [som i øl]) Multi-Meter stativ: Jeg har blitt irritert over å måtte kranere nakken eller på en ubalansert måte balansere den billige $ 4 multi-meteren et sted jeg faktisk kan lese skjermen. Så jeg bestemte meg for å ta saken i egne hender! Dette er også min første 'strukturerbare', så hvis noen har nyttig hjelp
Bruk et hvilket som helst 5.1 høyttalersystem med en hvilken som helst MP3 -spiller eller datamaskin, til en billig penge: 4 trinn
Bruk et hvilket som helst 5.1 høyttalersystem med hvilken som helst MP3 -spiller eller datamaskin, til en rimelig pris! Jeg brukte det med skrivebordet mitt som hadde et 5.1 lydkort (PCI). Deretter brukte jeg den sammen med min bærbare datamaskin som hadde en
Frittstående Arduino / ATMega Chip på brødbrett: 8 trinn (med bilder)
Frittstående Arduino / ATMega Chip på brødbrett: Hvis du er som meg, etter at jeg fikk min Arduino og utførte en siste programmering på min første brikke, ønsket jeg å trekke den av min Arduino Duemilanove og sette den på min egen krets. Dette vil også frigjøre min Arduino for fremtidige prosjekter. Problemet