Tutki, kuinka Python mullistaa FPGA-kehityksen. Tämä opas kattaa Python-pohjaiset HDL:t kuten MyHDL ja Amaranth, niiden integroinnin Verilogin/VHDLin kanssa, sekä kuinka aloittaa ensimmäinen projektisi.
Siltojen rakentaminen: Syväluotaus Pythoniin ja laitteistokuvauskieliin FPGA-ohjelmointia varten
Teknologian laajassa maisemassa ohjelmistoinsinööritaidon ja laitteistosuunnittelun alueet ovat usein tuntuneet kahdelta erilliseltä mantereelta, jotka puhuvat eri kieliä ja toimivat eri periaatteilla. Ohjelmistokehittäjät menestyvät abstraktiolla, nopealla iteroinnilla ja laajalla kirjastoekosysteemillä. Laitteistoinsinöörit työskentelevät fysikaalisten lakien, ajoitusrajoitusten ja logiikkaporttien kuvaamisen tarkalla prosessilla. Vuosikymmeniä silta näiden maailmojen välillä on ollut kapea ja haastava ylittää, päällystettynä monimutkaisilla laitteistokuvauskielillä (HDL) kuten VHDL ja Verilog.
Mutta entä jos tuo silta voitaisiin leventää? Entä jos ohjelmistoinsinöörit voisivat hyödyntää olemassa olevia taitojaan suunnitellakseen mukautettua laitteistoa? Entä jos laitteistoinsinöörit voisivat hyödyntää korkean tason, ilmaisukykyistä kieltä rakentaakseen ja tarkistaakseen järjestelmiä nopeammin kuin koskaan ennen? Tämä ei ole hypoteettinen tulevaisuus; se on todellisuus, jota rakennetaan tänään Pythonilla. Tämä kattava opas tutkii Pythonin ja FPGA-ohjelmoinnin jännittävää leikkauspistettä, osoittaen kuinka se laskee esteitä, nopeuttaa innovaatioita ja muuttaa perusteellisesti tapaa, jolla suunnittelemme digitaalista laitteistoa.
Perusteiden ymmärtäminen: Mitä ovat FPGA:t ja HDL:t?
Ennen kuin sukellamme Python-lähestymistapaan, on välttämätöntä luoda vankka perusta. Jos olet ohjelmistokehittäjä, nämä käsitteet saattavat olla uusia, mutta ne ovat perusta, jolle keskustelumme rakentuu.
FPGA:iden (Field-Programmable Gate Arrays) perusteet
Kuvittele, että sinulla on laaja kokoelma elektronisia peruskomponentteja – logiikkaportteja (JA, TAI, EI), muistilohkoja ja ohjelmoitavia yhteyksiä – jotka kaikki on aseteltu piisirulle. Tämä on FPGA:n ydin. Toisin kuin suoritin tai GPU, jonka sisäinen arkkitehtuuri on kiinnitetty tehtaalla, FPGA on tyhjä kangas. Se on kentällä ohjelmoitava, mikä tarkoittaa, että sinä, suunnittelija, voit määrittää tarkat digitaaliset piirit, jotka ovat sirulla sen jälkeen, kun se on valmistettu.
- Verrattuna suorittimeen: Keskusprosessointiyksikkö (CPU) on suunniteltu sarjamuotoiseen tehtävien suorittamiseen. Se hakee ohjeet yksitellen ja käsittelee ne kiinteällä joukolla laitteistoyksiköitä (kuten ALU tai FPU). FPGA voidaan konfiguroida suorittamaan monia toimintoja rinnakkain, mikä tekee siitä poikkeuksellisen tehokkaan tehtäville, jotka voidaan jakaa samanaikaisiin putkiin.
- Verrattuna GPU:hun: Grafiikkaprosessointiyksikkö (GPU) on erikoistunut rinnakkaisprosessori, joka on optimoitu tietyntyyppiselle datalle (grafiikka, matriisimatematiikka). FPGA on yleiskäyttöisempi; voit rakentaa täysin mukautetun käsittelyarkkitehtuurin, joka on räätälöity tarkasti algoritmiisi ilman mitään yleiskustannuksia.
Tämä uudelleenkonfiguroitavuus tekee FPGA:ista uskomattoman monipuolisia sovelluksille, kuten:
- ASIC-prototyyppien luonti: Piirisuunnittelun testaaminen FPGA:lla ennen sitoutumista sovelluskohtaisen integroidun piirin (ASIC) kalliiseen valmistusprosessiin.
- Korkeataajuuskaupankäynti: Rahoitusalgoritmien suorittaminen mikrosekuntien tasoisella viiveellä.
- Digitaalinen signaalinkäsittely (DSP): Mukautetut suodattimet ja prosessorit radio-, ääni- ja videovirroille.
- Mukautettu laitteistokiihdytys: Laskennallisesti intensiivisten tehtävien siirtäminen pois suorittimesta datakeskuksissa ja sulautetuissa järjestelmissä.
Laitteistokuvauskielten (HDL) rooli
Et piirrä piirejä käsin konfiguroidaksesi FPGA:n. Sen sijaan kuvaat ne erikoiskielellä – HDL:llä. Tämä on kriittinen ero ohjelmistokehittäjille: HDL ei kuvaile vaiheiden sarjaa; se kuvailee fyysistä rakennetta ja sen käyttäytymistä ajan kuluessa.
Kun kirjoitat `c = a + b` ohjelmointikielellä, olet antamassa ohjeen. Kun kirjoitat vastaavan HDL:ssä, kuvaat lisäyspiirin olemassaolon, jossa on syötteet `a` ja `b` ja lähtö `c`. Tämä piiri on olemassa pysyvästi ja toimii jatkuvasti. Tämä luontainen rinnakkaisuus on sekä laitteistosuunnittelun voiman että monimutkaisuuden lähde.
Vuosikymmeniä teollisuutta ovat hallinneet kaksi ensisijaista HDL:ää:
- VHDL (VHSIC Hardware Description Language): Yhdysvaltain puolustusministeriön sopimuksesta peräisin oleva VHDL tunnetaan vahvasta tyypityksestään ja sanavalmiista, mutta selkeästä syntaksistaan. Se on usein suosittu ilmailu- ja avaruusteollisuudessa, puolustuksessa ja muilla korkean luotettavuuden aloilla.
- Verilog: C-ohjelmointikieltä muistuttavalla syntaksilla Verilogia pidetään usein ytimekkäämpänä ja se on laajalti suosittu kaupallisessa puolijohdeteollisuudessa. SystemVerilog on moderni laajennus, joka lisää tehokkaita ominaisuuksia suunnitteluun ja tarkistukseen.
Perinteinen HDL-työnkulku: haasteet ja rajoitukset
Vakio prosessi suunnitella Verilogilla tai VHDL:llä on tiukka ja aikaa vievä. Se sisältää monivaiheisen prosessin, joka voi olla turhauttava niille, jotka ovat tottuneet moderneihin ohjelmistokehityssykleihin.
- Suunnittelun syöttö: Kirjoita HDL-koodi, joka kuvaa halutut laitteistomoduulit.
- Simulaatio: Kirjoita erillinen HDL-testipenkki luodaksesi ärsykkeitä ja tarkistaaksesi suunnittelusi lähdöt simulaattorissa. Tämä on usein monimutkainen tehtävä itsessään.
- Synteesi: Käytä synteesityökalua kääntääksesi HDL-kuvauksesi matalan tason esitykseksi logiikkaporteista ja yhteyksistä, joka tunnetaan verkkolistana.
- Sijoittelu ja reititys: Tämä automatisoitu prosessi ottaa verkkolistan ja kartoittaa sen kohde-FPGA:n tiettyihin resursseihin, määrittäen kunkin logiikkaelementin fyysisen sijainnin ja reitittämällä niiden väliset yhteydet.
- Bittivirran generointi ja ohjelmointi: Lopputulos on bittivirratiedosto, binäärinen konfiguraatiotiedosto, joka ladataan FPGA:lle suunnittelusi toteuttamiseksi.
Tämä työnkulku asettaa useita haasteita, erityisesti tulokkaille:
- Jyrkkä oppimiskäyrä: HDL:ien syntaksi ja, mikä vielä tärkeämpää, samanaikainen ajattelutapa eivät ole intuitiivisia ohjelmistoinsinööreille.
- Sanallinen ja toistuva koodi: Monimutkaisten, mutta säännöllisten rakenteiden, kuten suuren rekisteritiedoston, kuvaaminen voi vaatia satoja riviä mallikoodia.
- Rajoitettu abstraktio: Vaikka moduulisuunnittelu on mahdollista, korkean tason, parametroivan ja uudelleenkäytettävien komponenttien luominen on huomattavasti hankalampaa kuin kielellä kuten Python.
- Fragmentoituneet työkaluketjut: Suunnittelu- ja verifiointiprosessi luottaa usein kalliisiin, omistusoikeudellisiin ja GUI-pohjaisiin työkaluihin FPGA-toimittajilta, kuten Xilinx (nyt AMD) ja Intel (entinen Altera).
- Vaikea verifiointi: Kattavien testipenkkien kirjoittaminen perinteisillä HDL:illä on itsessään oma tieteenalansa. Suurien suunnitelmien simulointi voi olla erittäin hidasta, mikä johtaa pitkiin virheenkorjausjaksoihin.
Pythonin vallankumous: Korkean tason HDL:t ja verifiointikehykset
Tässä Python astuu lavalle. Sen sijaan, että kirjoittaisit suoraan Verilogia tai VHDL:ää, voit käyttää Python-kirjastoa kuvaamaan laitteistosi paljon korkeammalla abstraktiotasolla. Tämä lähestymistapa, jota kutsutaan usein korkean tason HDL:ksi tai laitteistorakennuskirjastoksi, käyttää Pythonin tehokkaita ominaisuuksia luomaan perinteistä HDL-koodia tuloksena.
Hyödyt ovat muuttavia:
- Lisääntynyt tuottavuus: Kirjoita vähemmän koodia saavuttaaksesi saman tuloksen. Hyödynnä tuttuja ohjelmointirakenteita, kuten silmukoita, funktioita ja luokkia, kuvaillaksesi laitteistoa intuitiivisemmalla tavalla.
- Tehokas metaprogrammointi: Koska käytät Pythonia, voit kirjoittaa ohjelmia, jotka kirjoittavat laitteistosuunnitelmia. Tarvitsetko prosessorin, jossa on konfiguroitava määrä putkivaiheita tai viestintäydin, jossa on muuttuva määrä kanavia? Voit määrittää sen muutamilla parametreilla Python-skriptissä sen sijaan, että kirjoittaisit manuaalisesti uudelleen satoja rivejä Verilogia.
- Edistynyt verifiointi: Tämä on kiistatta merkittävin etu. Voit käyttää koko Python-ekosysteemiä laitteistosuunnittelusi testaamiseen. Kehyksiä kuten pytest voidaan käyttää puhtaiden, tehokkaiden yksikkötestien kirjoittamiseen. Voit mallintaa osia järjestelmästäsi Pythonissa, syöttää dataa tiedostoista tai verkkopistokkeista ja analysoida tuloksia kirjastoilla kuten NumPy ja Matplotlib – kaikki yhdessä yhtenäisessä testausympäristössä.
- Koodin uudelleenkäyttö ja abstraktio: Luo hienostuneita, parametrisoitavia laitteistokomponentteja käyttämällä Python-luokkia. Tämä mahdollistaa luotettavien IP-ydinten (Intellectual Property) kirjastojen rakentamisen, jotka on helppo konfiguroida ja integroida.
- Yhdennetty ympäristö: Laitteistosimulaation ja ohjelmistomallinnuksen raja hämärtyy. Voit kehittää ja testata laitteistologiikkaasi ja ohjelmistoa, joka ohjaa sitä samassa ympäristössä, mikä virtaviivaistaa koko järjestelmäsuunnitteluprosessia.
Katsaus Python-pohjaisiin HDL- ja verifiointikehyksiin
Pythonin laitteistoekosysteemi on kypsynyt merkittävästi ja tarjoaa useita erinomaisia avoimen lähdekoodin työkaluja. Tutkitaan joitain merkittävimmistä.
Amaranth HDL: Moderni työkalupakki
Amaranth (aiemmin nimellä nMigen) on moderni Python-pohjainen HDL, joka on saavuttanut merkittävää vetovoimaa puhtaasta suunnittelustaan ja tehokkaista ominaisuuksistaan. Se käsittelee laitteistosuunnittelua digitaalisen piirin mallin rakentamisen ongelmana, joka sitten kehitetään lopulliseksi esitykseksi. Tämä lähestymistapa välttää monia yrityksen epäonnistumisia kartoittaa imperatiivisia ohjelmointikonsepteja laitteistoon.
Keskeiset ominaisuudet:
- Selkeä semantiikka: Selkeä erottelu Python-koodin, joka luo suunnittelun, ja itse laitteistologiikan välillä.
- Kombinatorinen ja synkroninen logiikka: Selkeä ja turvallinen tapa kuvailla kahta digitaalisen logiikan perusluokkaa.
- Integroitu simulaattori: Sisäänrakennettu simulaattori mahdollistaa nopean testauksen suoraan Pythonissa.
- Elaboration-Time Python: Käytä Pythonin täyttä tehoa laitteiston luomisvaiheessa monimutkaisten, parametroitavien suunnitelmien rakentamiseen.
Esimerkki: Yksinkertainen vilkkuva LED Amaranthissa
Tämä esimerkki esittelee yleisen "Hello, World!" -esimerkin FPGA:ille. Se luo laskurin, joka kasvaa jokaisella kellojaksolla. Kun laskuri saavuttaa maksimiarvon, se vaihtaa LED:in tilaa ja nollaa.
# Huom: Tämä on käsitteellinen esimerkki. Olettaa kortin, jossa on 12 MHz kello.
from amaranth import *
from amaranth.build import Platform
class Blinky(Elaboratable):
def elaborate(self, platform: Platform) -> Module:
m = Module()
# Hae LED-pinni kortin alustamäärityksestä
led = platform.request("led", 0)
# Määritä laskurirekisteri. Koko on valittu noin 1 sekunnin vilkuntaan.
# 12 000 000 jaksoa / 2 = 6 000 000 jaksoa puoliperiodille.
# 2**22 on n. 4.2 miljoonaa, 2**23 on n. 8.4 miljoonaa.
# Käytämme 23-bittistä laskuria.
counter = Signal(23)
# Määritä kellotusalue (yleensä "sync" pääkellolle)
with m.Domain("sync"):
# Kun laskuri saavuttaa 6 000 000 - 1, vaihda LED ja nollaa laskuri
with m.If(counter == 6000000 - 1):
m.d.sync += led.o.eq(~led.o)
m.d.sync += counter.eq(0)
# Muussa tapauksessa lisää vain laskuria
with m.Else():
m.d.sync += counter.eq(counter + 1)
return m
MyHDL: Veteraani
MyHDL on yksi varhaisimmista ja vakiintuneimmista Python HDL -kehyksistä. Se ottaa erilaisen lähestymistavan kuin Amaranth, käyttämällä Pythonin generattoreita ja dekoraattoreita matkiakseen Verilogin `always`-lohkojen rakennetta. Tämä voi saada sen tuntumaan tutummalta insinööreille, joilla on perinteinen HDL-tausta.
Keskeiset ominaisuudet:
- VHDL- ja Verilog-muunnos: MyHDLin päätehtävä on muuntaa Python-kuvaus vastaavaksi, ihmisen luettavissa olevaksi VHDL- tai Verilog-koodiksi.
- Ko-simulaatio: Mahdollistaa MyHDL-suunnittelun simuloinnin yhdessä Verilog-moduulin kanssa käyttämällä ammattimaisia simulaattoreita kuten Icarus Verilog.
- Proseduraalinen tyyli: Generaattoreiden (`yield`) käyttö luo prosessiorientoituneen mallinnustyylin, joka on samanlainen kuin perinteiset HDL:t.
Esimerkki: Laskuri MyHDL:ssä
from myhdl import block, Signal, intbv, always, always_comb, instance
@block
def counter(clk, reset, count_out):
""" Yksinkertainen 8-bittinen synkroninen laskuri """
# Määritä 8-bittinen signaali (rekisteri) lasku-arvolle
# intbv:tä käytetään bittivektorityypeille
count = Signal(intbv(0)[8:])
# Tämä dekoraattori kuvaa sekvenssistä (kellotettua) prosessia
@always(clk.posedge)
def seq_logic():
if reset == 1:
count.next = 0
else:
count.next = count + 1
# Tämä dekoraattori kuvaa kombinatorista (välitöntä) prosessia
# Se määrittää sisäisen laskurekisterin lähtöporttiin
@always_comb
def comb_logic():
count_out.next = count
# Palauta määritellyt logiikka-instanssit
return seq_logic, comb_logic
Cocotb: Verifiointimaailman mestari
Cocotb (COroutine COsimulation TestBench) ei ole HDL laitteiston suunnitteluun, mutta se on kiistatta vaikutusvaltaisin Python-työkalu FPGA-alalla. Se on kehys testipenkkien kirjoittamiseen Pythonilla olemassa olevien VHDL- tai Verilog-suunnitelmien varmentamiseksi.
Sen sijaan, että kirjoittaisit monimutkaisen Verilog-testipenkin, instansioit suunnittelusi ("Device Under Test" tai DUT) simulaattorissa ja olet vuorovaikutuksessa sen kanssa suoraan Python-skriptistä. Tämä avaa koko Python-ekosysteemin verifiointia varten.
Miksi tämä on niin tehokasta?
- Lue ja kirjoita dataa: Lue helposti testivektoreita CSV-tiedostosta, luo monimutkaisia ärsykkeitä NumPy:lla tai jopa suoratoista dataa verkkopistorasiasta DUT:llesi.
- Edistyneet tarkistukset: Käytä Pythonin tehokkaita väitteiden ominaisuuksia ja data-analyysikirjastoja monimutkaisten tulosten varmistamiseen.
- Väylätoiminnalliset mallit (BFM): Luo uudelleenkäytettäviä Python-luokkia mallintamaan standardeja viestintäprotokollia, kuten AXI, I2C tai SPI, mikä tekee testeistäsi puhtaampia ja vankempia.
- Integraatio Pytestin kanssa: Cocotb integroituu saumattomasti `pytest`:in kanssa, jolloin voit ottaa käyttöön moderneja ohjelmistotestauskäytäntöjä, kuten parametroituja testejä ja fixtureja.
Monille tiimeille `cocotb` on ensimmäinen ja arvokkain askel Pythonin käyttämiseen laitteistokehitykseen. Se mahdollistaa niiden verifiointiprosessin dramaattisen parantamisen muuttamatta niiden ydinsuunnittelukieltä.
Käytännön työnkulku: Pythonista ohjelmoituun FPGA:han
Joten, kuinka tämä kaikki tulee yhteen? Hahmotellaan tyypillinen kehitystyönkulku käyttämällä modernia Python HDL:ää, kuten Amaranth.
- Suunnittele Pythonissa: Kirjoita laitteistomoduulisi Python-luokkina, aivan kuten yllä oleva `Blinky`-esimerkki. Käytä Pythonin ominaisuuksia tehdäksesi suunnittelustasi konfiguroitava ja puhdas.
- Simuloi ja varmenna Pythonissa: Kirjoita testiskripti käyttämällä Amaranthin sisäänrakennettua simulaattoria ja Pythonin `unittest` tai `pytest` -kehyksiä. Tämä mahdollistaa erittäin nopean iteraation, sillä löydät ja korjaat virheet poistumatta koskaan Python-ympäristöstäsi.
- Luo Verilog (kehittäminen): Kun olet varma suunnittelustasi, suoritat komentosarjan, joka kertoo Python HDL -kehyksellesi "kehittää" suunnittelusi ja tuottaa sen standardina Verilog-tiedostona. Esimerkiksi: `amaranth.cli.main(Blinky(), ports=[led])`.
- Synteesaa, sijoittele ja reititä: Tämä vaihe käyttää toimittajan tai avoimen lähdekoodin työkaluketjuja. Syötät edellisessä vaiheessa luodun Verilog-tiedoston työkaluihin kuten Xilinx Vivado, Intel Quartus tai avoimen lähdekoodin Yosys/nextpnr -työnkulku. Tämä prosessi on usein automatisoitu rakennusjärjestelmillä kuten `edalize` tai Makefiles.
- Ohjelmoi FPGA: Työkaluketju tuottaa lopullisen bittivirratiedoston. Käytät toimittajan ohjelmointiohjelmaa ladataksesi tämän tiedoston FPGA:llesi, ja Pythonilla kuvattu laitteistosi herää henkiin.
Python ja perinteiset HDL:t: Symbioottinen suhde
On tärkeää nähdä Python ei täydellisenä korvaajana Verilogille ja VHDL:lle, vaan tehokkaana kumppanina. Digitaalisen suunnittelun tulevaisuus on hybridi, jossa insinöörit käyttävät parasta työkalua työhön. Tässä joitain yleisiä skenaarioita:
- Full-Stack Python-suunnittelu: Uusille projekteille, erityisesti tutkimuksessa, startup-yrityksissä tai harrastajakonteksteissa, koko järjestelmän suunnittelu kehyksessä kuten Amaranth tarjoaa maksimaalisen tuottavuuden.
- Cocotb vanhalle IP:lle: Jos sinulla on suuri, olemassa oleva VHDL- tai Verilog-koodikanta, sinun ei tarvitse kirjoittaa sitä uudelleen. Voit saada välittömästi arvoa kirjoittamalla testipenkkisi Pythonissa `cocotb`:lla luodaksesi vankemman verifiointympäristön.
- Python järjestelmäintegraatiolle: Käytä Pythonia luomaan "liimalogiikkaa", muistikarttoja ja väyläyhteyksiä, jotka sitovat yhteen jo olemassa olevat, manuaalisesti kirjoitetut IP-ytimet. Tämä automatisoi yhden SoC (System-on-Chip) -suunnittelun työläimmistä ja virheille alttiista osista.
- Korkean tason algoritmin mallintaminen: Kehitä ja tarkenna monimutkainen algoritmi Pythonissa. Kun se on todistettu oikeaksi, käytä Python HDL:ää kääntääksesi sen systemaattisesti laitteistototeutukseksi käyttämällä alkuperäistä Python-mallia kultaisena referenssinä verifioinnissa.
Kuka kannattaa harkita Pythonia FPGA-kehitykseen?
Tällä modernilla lähestymistavalla laitteistosuunnitteluun on laaja vetovoima eri rooleissa ja teollisuudenaloilla:
- Ohjelmistoinsinöörit: Niille, jotka haluavat nopeuttaa sovelluksiaan mukautetulla laitteistolla, Python tarjoaa tutun lähtökohdan, abstrahoimalla pois suuren osan perinteisten HDL:ien matalan tason monimutkaisuudesta.
- Tutkijat ja tiedemiehet: Prototyyppi ja testaa nopeasti uusia laskenta-arkkitehtuureja tai signaalinkäsittelyalgoritmeja joutumatta jumiin täyteen laitteistoinsinöörikoulutukseen.
- Harrastajat ja tekijät: Edulliset FPGA-kortit ovat nyt laajasti saatavilla. Python tekee alasta paljon helpomman henkilöille, jotka haluavat kokeilla digitaalisen logiikan suunnittelua.
- Laitteistoinsinöörit: Kokeneet digitaaliset suunnittelijat voivat hyödyntää Pythonia automatisoimaan tylsiä tehtäviä, rakentamaan tehokkaampia ja uudelleenkäytettäviä komponenttikirjastoja ja luomaan verifiointympäristöjä, jotka ovat suuruusluokkaa tehokkaampia kuin mitä on mahdollista perinteisillä HDL-testipenkeillä.
Johtopäätös: Tulevaisuus on hybridi ja tuottava
Ohjelmiston ja laitteiston suunnittelun lähentyminen kiihtyy, ja Python on tämän liikkeen eturintamassa. Tarjoamalla korkean tason, tuottavan ja tehokkaan ympäristön digitaalisen logiikan kuvaamiseen ja varmentamiseen, Python-pohjaiset työkalut demokratisoivat FPGA-kehityksen. Ne antavat uuden sukupolven kehittäjille mahdollisuuden rakentaa mukautettuja laitteistoratkaisuja ja antavat kokeneille asiantuntijoille mahdollisuuden työskennellä tehokkaammin kuin koskaan ennen.
Kysymys ei ole enää "Python vs. Verilog." Kysymys on siitä, miten niitä yhdistetään älykkäästi. Olipa kyseessä Verilogin luominen korkean tason Amaranth-kuvauksesta, VHDL:n testaaminen `cocotb`:llä tai koko työkaluketjun skriptaaminen yhdestä Python-tiedostosta, hyödynnät molempien maailmojen parasta. Rakennet ensinnäkin leveämmän, vahvemman sillan ohjelmiston mantereen ja laitteiston mantereen välillä, ja innovaatiot, jotka ylittävät tuon sillan, ovat vasta alkamassa.
Jos olet ohjelmistokehittäjä, joka on kiinnostunut metallista, tai laitteistoinsinööri, joka etsii parempaa työnkulkua, ei ole koskaan ollut parempaa aikaa tutustua Python FPGA -ohjelmoinnin maailmaan. Valitse kehys, nappaa edullinen FPGA-kortti ja aloita tulevaisuuden rakentaminen.