Sisukord:

Arduino odava leivaplaadina FPGA: 5 sammu (piltidega)
Arduino odava leivaplaadina FPGA: 5 sammu (piltidega)

Video: Arduino odava leivaplaadina FPGA: 5 sammu (piltidega)

Video: Arduino odava leivaplaadina FPGA: 5 sammu (piltidega)
Video: CS50 Live, серия 003 2024, Detsember
Anonim
Arduino odava leivaplaadina FPGA
Arduino odava leivaplaadina FPGA

Riistvara loogikalülituste kujundamine võib olla lõbus. Vana kooli viis seda teha oli NAND -väravatega, leivaplaadil, mis oli ühendatud hüppajajuhtmetega. See on endiselt võimalik, kuid ei lähe palju aega, enne kui väravate arv käest ära läheb. Uuem võimalus on kasutada FPGA (Field Programmable Gate Array). Need kiibid võivad end ümber kujundada mis tahes digitaalseks loogikaahelaks, mille saate kujundada, kuid pole odavad ja kergesti kättesaadavad. Näitan, kuidas seda FPGA -d saab asendada odava Atmega kiibiga Arduino UNO -lt, pannes digitaalse vooluahela tõhusalt DIP -paketti, mis on väga leivasõbralik.

Samm: kujundage vooluring, mida "FPGA" esindab

Kujundage vooluring, mis
Kujundage vooluring, mis
Kujundage vooluring, mis
Kujundage vooluring, mis
Kujundage vooluring, mis
Kujundage vooluring, mis

Ma ehitan 2 -bitise + 2 -bitise liitja. See võtab kaks paari loogilisi sisendnööpe ja väljastab ühe tripleti väljundnööpnõela.

Selleks, et seda teha NAND -väravatega, vaadake joonisel olevat skeemi. See vajab 14 NAND väravat. Ma kasutasin 4 quad NAND gate TTL kiipi ja ühendasin need leivalauaga.

Lisasin mõned valgusdioodid (ärge unustage voolu piiravaid takisteid), et näidata, millal sisend- ja väljundpoldid olid sisse lülitatud (kõrge) ja millal need olid väljas (madal). Sisendtihvtide juhtimiseks hüppasin need kas maapealsele rööpale või positiivse võimsusega rööpale.

See vooluring töötab, kuid võtab juba 4 TTL -kiipi ja on rottide juhtmete pesa. Kui oleks vaja rohkem juppe, oleks rohkem leivalaudu ja rohkem hüppajaid. Väga kiiresti läks ahela suurus käest.

Vahemärkusena tuleb märkida, et TTL -väravatega töötades ei väljasta need täpselt 0 V ega 5 V, nagu võiks eeldada. Sageli väljastavad nad "kõrge" jaoks umbes 3 V, kuid täpne pinge on väga laias vahemikus. Sama skeem, mis kasutab CMOS -i samaväärseid kiipe, oleks parem täpselt 0V kuni täpselt 5V kiikudega.

Samm: sisestage FPGA

Sisestage FPGA
Sisestage FPGA
Sisestage FPGA
Sisestage FPGA

FPGA on fantastiline kiip, millest võib sõna otseses mõttes saada mis tahes kombinatsioon loogikaväravast, mis on ühendatud mis tahes kombinatsiooniga. Üks kujundab "vooluringi" riistvara disainikeeles (HDL). Selliseid keeli on mitu, millest üks kannab nime Verilog. Pildil olev.v -fail on kahe bitise liitja Verilogi ekvivalent. Selle all olevat.pch -faili on vaja ka verilog -failis nimetatud sisend- ja väljundpistikute määramiseks kiibil olevatele riistvarapistikutele.

Sel juhul kasutan Lattice Semiconductors iCEsticki arendusplaati (https://www.latticesemi.com/icestick). Tegelik FPGA kiip on iCE40HX-1k, millel on veidi üle 1000 värava, millest igaüks võib muutuda mis tahes loogikaväravaks. See tähendab, et iga värav võib olla NAND -värav või VÕI -värav, MITTE -värav, NOR, XOR jne. Lisaks saab iga värav käsitseda rohkem kui kahte sisendit. See on iga tootja jaoks spetsiifiline, kuid iCE40 puhul saab iga värav hakkama 4 sisendiga. Seega on iga värav tunduvalt võimekam kui 2 sisend -NAND -väravat.

Pidin 4 sisendmänni ja 3 väljundnõela määrama vastavalt füüsilistele tihvtidele 91, 90, 88, 87, 81, 80 ja 79. See on spetsiifiline fpga kiibi ja selle vahekaardil ning sellel, kuidas need tihvtid PMOD -pordiga ühendatakse. See on saadaval selle FPGA plaadi andmelehtedel.

Lattice pakub oma tööriistaketti, et sünteesida (protsessorite kompileerimiseks FPGA) ahelaid Verilogist, kuid ma kasutasin tasuta avatud lähtekoodiga tööriistaketi icestorm (https://www.clifford.at/icestorm/). Paigaldusjuhised on sellel saidil saadaval. Kui icestorm on installitud ning verilog ja pcf -fail, on selle vooluahela FPGA -le laadimise käsud järgmised:

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

See töötab suurepäraselt, kuid selle iCEsticki saatmine maksab umbes 30 dollarit. See ei ole odavaim viis digitaalahela ehitamiseks, kuid see on võimas. Sellel on üle 1000 värava ja selle väikese vooluringi jaoks kasutab see ainult 3 neist. NAND värava ekvivalentis kasutati 14 väravat. See on tingitud asjaolust, et igast väravast võib saada ükskõik milline värav ja iga värav on tegelikult 4 sisendvärav. Iga värav suudab rohkem. Kui vajate rohkem väravaid, on iCEstickil suurem vend 8000 väravaga, mis maksab umbes kaks korda. Teistel tootjatel on muid pakkumisi, kuid hind võib olla üsna järsk.

Samm: FPGA -lt Arduinole

Alates FPGA -st kuni Arduino -ni
Alates FPGA -st kuni Arduino -ni

FPGA -d on suurepärased, kuid võivad olla kallid, raskesti kättesaadavad ja ei ole väga leibade jaoks sõbralikud. Leivaplaadisõbralik ja odav kiip on Atmega 328 P, mis on saadaval korralikus DIP -pakendis, mis sobib ideaalselt leivalauale. Seda saab ka umbes 4 dollari eest. See on Arduino UNO süda. Loomulikult võiksite kasutada kogu UNO -d, kuid olge odav, saame Atmega 328 P UNO -lt maha tõmmata ja kasutada seda iseenesest. Kuid ma kasutasin UNO plaati Atmega programmeerijana.

Sel hetkel vajate

1. Arduino UNO koos eemaldatava Atmega 328P protsessoriga.

2. Teine Atmega 328P, millel on eelpõletatud Arduino alglaadur, et asendada see, mille kavatseme UNO-st välja võtta. (Valikuline, eeldades, et soovite siiski kasutada kasutatavat UNO -d).

Eesmärk on muuta verilogi fail arduino projektiks, mida saab laadida 328P -sse. Arduino põhineb C ++ -l. Mugavalt on olemas tõlkija Verilogist C ++ keelde, nimega Verilator (https://www.veripool.org/wiki/verilator). Verilator on mõeldud kasutamiseks riistvara disaineritele, kes peavad enne nende disainilahenduste kasutamist kallile riistvarale oma disaini simuleerima. Verilator cross kompileerib verilogi väärtuseks C ++, seejärel annab kasutaja testrakmed simuleeritud sisendsignaalide edastamiseks ja väljundsignaalide salvestamiseks. Kasutame seda verilogi kujunduse toppimiseks Atmega 328P -sse, kasutades Arduino tööriistaketti.

Esmalt installige Verilator. Järgige juhiseid aadressil

Installige ka Arduino IDE ja kontrollige, kas see saab USB kaudu Arduino UNO -ga ühenduse luua.

Kasutame sama verilogi faili nagu FPGA puhul, välja arvatud see, et tihvtide nimesid tuleb muuta. Lisasin igale allakriipsutuse (_). Seda on vaja, sest arduino teegid sisaldavad päisefaili, mis tõlgib näiteks B0, B001 jne kahendarvudesse. Teised sisendpinna nimed oleksid olnud kenad, kuid B0 ja B1 oleksid ehituse ebaõnnestumise põhjustanud.

Käivitage kataloogis, mis sisaldab twoBitAdder.v ja iCEstick.pcf järgmist:

verilaator -sein --cc twoBitAdder.v

See loob alamkataloogi nimega obj_dir, mis sisaldab mitmeid uusi faile. Vajame ainult päise- ja cpp -faile VtwoBitAdder.h, VtwoBitAdder.cpp, VtwoBitAdder_Syms.h ja VtwoBitAdder_Syms.cpp.

Looge Arduino IDE -s uus visand nimega twoBitAdder.ino. See loob ino -faili uude kataloogi, mida nimetatakse ka twoBitAdderiks, teie Arduino visandiraamatu kataloogi. Kopeerige oma failid VtwoBitAdder.h ja VtwoBitAdder.cpp sellesse Arduino kausta kausta twoBitAdder.

Nüüd kopeerige päisefailid verilaatori installist.

cp/usr/local/share/verilator/include/verilated*.

kopeerige lõpuks std c ++ raamatukogusse aadressilt https://github.com/maniacbug/StandardCplusplus. Nende installimisjuhiste kohaselt "See on installitud nagu tavaline Arduino raamatukogu. Pakkige levitamise sisu oma visandiraamatu all olevasse kausta" teegid ". Näiteks minu visandiraamat asub aadressil/home/maniacbug/Source/Arduino, seega on see raamatukogu on kataloogis/home/maniacbug/Source/Arduino/libraries/StandardCplusplus.

Pärast selle installimist lähtestage kindlasti Arduino IDE."

Asendage nüüd saidi twoBitAdder.ino sisu sellel etapil pakutavaga. See on testija, mida verilaator ootab ja mis seadistab sisendi/väljundi nööpnõelad, seejärel tsüklisse, loeb sisendpoldid, toidab need VtwoBitAdderile (meie vooluahela tõlgitud versioon), seejärel loeb VtwoBitAdderi väljundeid ja rakendab need väljundtihvtidele.

See programm peaks kompileerima ja käivitama Arduino UNO -s.

Samm 4: Arduinost DIP -kiibini leivalaual

Arduinost DIP -kiibini leivalaual
Arduinost DIP -kiibini leivalaual

Nüüd, kui programm Arduinos töötab, ei vaja me enam Arduino tahvlit ennast. Kõik, mida vajame, on protsessor.

Eemaldage Atmega 328P ettevaatlikult Arduino UNO pesast ja sisestage valikuliselt selle asendaja.

Asetage Atmega 328P leivaplaadile. Pange ots leivalauale nii, et dott oleks ülespoole suunatud. Tihvt 1 on ülemine vasak tihvt. Tihvt 2 on järgmine allapoole ja nii edasi nööpnõelale 14, mis asub all vasakul. Seejärel on tihvt 15 all paremal ja tihvtid 16 kuni 28 loendavad kiibi paremat külge üles.

Ühendage tihvtid 8 ja 22 maandusega.

Ühendage tihvt 7 VCC -ga (+5V).

Ühendage 16Mhz kvartskristall tihvtide 9 ja 10 vahele. Samuti väike kondensaator (22pF) tihvti 9 ja maa vahele ning tihvti 10 ja maa vahele. See annab Atmega 328P 16Mhz taktsagedusele. Mujal on juhiseid 328P õpetamiseks selle asemel kasutama oma sisemist 8Mhz kella, mis säästaks paar osa, kuid see aeglustaks protsessorit.

Arduino GPIO pordid 5, 6, 7 ja 8, mida kasutasime sisendnööpide jaoks, on tegelikult Atmega 328P füüsilised nööbid 11, 12, 13, 14. See oleks vasakul neli alumist tihvti.

Arduino GPIO pordid 11, 10 ja 9, mida kasutasime väljundnõelte jaoks, on tegelikult Atmega 328P füüsilised nööbid 17, 16, 15. See oleks paremal kolm alumist tihvti.

Ma ühendasin LED -id nende tihvtidega nagu varem.

5. samm: järeldus

Järeldus
Järeldus

TTL -kiibid töötavad, kuid millegi ehitamiseks kulub neid palju. FPGA -d töötavad tõesti hästi, kuid pole odavad. Kui suudate elada vähemate IO -tihvtide ja madalama kiirusega, võib Atmega 328P olla teie jaoks kiip.

Mõned asjad, mida meeles pidada:

FPGA:

Pro

- Saab hakkama suure kiirusega signaalidega. Kuna puudub protsessor, mis kitsendab töötlemist kuni ühe käsuni korraga, on piiravaks teguriks vooluahela väravate kaudu levimise viivitus. Paljudel juhtudel võib see olla palju kiirem kui kiibiga kaasas olev kell. Minu disaini puhul oleks arvutatud viivitus võimaldanud twoBitAdderil reageerida umbes 100 miljonile muutusele sisendväärtustes sekundis (100 MHz), kuigi pardal olev kell on vaid 12 MHz kristall.

- Kuna disain muutub keerulisemaks, ei halvene olemasolevate vooluahelate jõudlus (palju). Kuna ahelate lisamine kangale lihtsalt paneb kasutamata kinnisvarasse midagi uut, ei mõjuta see olemasolevat vooluringi.

- Sõltuvalt FPGA -st võib saadaolevate IO -tihvtide arv olla väga suur ja üldiselt ei ole need mingil konkreetsel eesmärgil lukustatud.

Con

- See võib olla kallis ja/või raskesti kättesaadav.

- Tavaliselt on see saadaval BGA -pakendis, mis nõuab mis tahes amatöörprojektis kiibiga töötamiseks mingit purunemisplaati. Kui ehitate selle disainiks kohandatud mitmekihilise SMT-trükkplaadiga, pole see probleem.

- Enamik FPGA tootjaid pakub oma suletud lähtekoodiga projekteerimistarkvara, mis võib mõnel juhul maksta raha või mille litsentsi aegumiskuupäev on kehtiv.

Arduino kui FPGA:

Pro

- Odav ja lihtne saada. Lihtsalt otsige Amazonist atmega328p-pu. Need peaksid olema umbes 4 dollarit tükk. Paljud müüjad müüvad neid 3 või 4 kaupa.

- See on DIP -pakett, mis sobib ideaalselt leivaplaadile koos väliste tihvtidega.

- See on 5 V seade, mis muudab teiste 5 V seadmetega liidestamise lihtsaks.

Con

- ATMEGA328P -l on piiratud arv IO -kontakte (23) ja mitmed neist on reserveeritud konkreetsete ülesannete jaoks.

- Ahela keerukuse kasvades suureneb Arduino silmuse meetodil käivitatud koodi hulk, mis tähendab, et iga tsükli kestus on pikem.

- Isegi kui vooluahela keerukus on väike, nõuab iga tsükkel sisendpinna väärtuste toomiseks ja väljundpinge väärtuste kirjutamiseks ning ahela algusesse naasmiseks palju protsessori juhiseid. 16Mhz kristalli korral ei tööta tsükkel isegi ühe käsutsükli kohta tsükli jooksul rohkem kui miljon korda sekundis (1Mhz). Enamiku amatöör -elektroonika projektide puhul on see siiski palju kiirem kui vaja.

Soovitan: