Kosketus FPGA:n maailmaan Quartus II -ohjelmistolla ja Verilog-ohjelmoitikielellä.

15/11/2018

Oletko koskaan harkinnut logiikkapiirien käyttämistä? Kun mikrokontrollerista loppuu tehot, niin ajatukset saattavat siirtyä perinteisten logiikkapiirien puoleen. Niiden huonona puolena tulee vain niiden kallis hinta ja muokattavuuden vaikeus.

Hiljattain markkinoilla on alkanut yleistymään FPGA:n nimellä kulkeva piiri. Olet ehkä kuullut siitä aikaisemmin, mutta sen hankkiminen on päässyt lipsumaan niiden kalliiden hintojen takia. FPGA:n suosio on kuitenkin yleistynyt räjähdysmäisesti tuoden hintaa alas. Jo tälläkin hetkellä on mahdollista saada riittävän tehokas FPGA-kehitysalusta ohjelmointilaitteella jopa alle 15€ hintaan. Kannattaa kuitenkin harkita, haluatko lisätä hintaan toiset 15€ ja ostaa kehitysalustan, jossa on erilaisia sisään- ja ulostuloja. Ne kuitenkin rajoittavat FPGA-piirin käyttöä, mutta mahdollistavat nopean ja helpon kehityksen.

Itse päädyin halpaan Cyclone II -kehitysalustaan. Kehitysalustassa voimanpesänä toimii EP2C5T144C8N FPGA-piiri. Kyseinen piiri on halvimmasta päästä, joka tarkoittaa pientä muistia ja vähäistä logiikkamäärää. Suosittelen ostamaan kehitysalustan ALTERA USB Blasterilla varustettuna. USB Blasteri on JTAG-ohjelmointilaite, jolla käännetyn "logiikan" saa lähetettyä ohjelmointialustalle. Kannattaa toki varmistaa ensin, että kyseinen ohjelmointilaite toimii valitsemallasi kehitysalustalla. Joissakin kehitysalustoissa ohjelmointilaite on sisäänrakennettu, jolloin erillistä ei tarvita.

Jos päädyt samaan kehitysalustaa, suosittelen tätä sivustoa: https://land-boards.com/blwiki/index.php?title=Cyclone_II_EP2C5_Mini_Dev_Board

Tuolta sivustolta FPGA-kehitysalustan kellopinnin, sekä ledien kytkennät.

Niin miten se sitten ohjelmoidaan, jos se on logiikkaa?

Tässä tulee hyvin mielenkiintoinen kysymys. Tuntuu hyvin järjenvastaiselta, että olisi ohjelmointikieli jolla voisi toteuttaa laitteistosuunnittelua. Itse iskin silmäni Verilog-nimiseen ohjelmointikieleen kuultuani sen suosiosta. VHDL on myös yksi vaihtoehto. Verilog-kieli on enemmän painottunut C-kielen rakenteeseen, kun taas VHDL muistuttaa huomattavasti Ada-ohjelmointikieltä.

Verilog on kuitenkin huonosti dokumentoitu kieli. Ainakin oma kokemus oli sellainen. Yritin etsiä internetistä sivuja, joissa käsiteltäisiin verilogia, mutta niitä on hyvin niukasti. Löysin kuitenkin useita englanninkielisiä videoita, jotka käsittelivät Verilogin perusteita. Tässä on muutama linkki joita löysin:

Intelin tekemä video:
https://www.youtube.com/watch?v=PJGvZSlsLKs&index=3&list=PLIa253VHLIEvwmdvdYXg_bNuI_D-eKQxF

Trey Dahlbergin tekemä video (käyttöohje EP2C5 kehitysalustalle, ei Verilogia):
https://www.youtube.com/watch?v=le6Jo5DpLao&index=2&list=PLIa253VHLIEvwmdvdYXg_bNuI_D-eKQxF


Kun tiedät kielen, valitse ohjelmisto joka kääntää logiikkaa.

Nyt kun tiedämme, mitä kieliä voimme käyttää laitteiston kuvaamiseen, täytyy löytää ohjelma, joka kääntää sen ymmärrettävään muotoon FPGA-piirille. Quartus II -ohjelmisto näyttäisi olevan hyvin suosittu ohjelma ainakin Cyclone-piirien ohjelmoimiseen. Itse latasin Quartus II 12.1 Web Edition (64-Bit), joka tuntuu toimivan moitteettomasti.

Ja sittenkö vain koodaamaan?

Siinäpä se. Eikun koodia kehiin. Mutta mihin sitä koodia oikein laitetaan? Quartus II -ohjelmisto tuo hyvin jyrkän oppimiskäyrän mukanaan. Itse sain vain ohjelmiston avattua, painoin "new project" ja päädyin hakemaan Quartus II käyttöopasta googlesta. 

Tässä on vaihe vaiheelta, kuinka saat uuden projektin luotua. Pidä vain huoli, että valitset oikean FPGA-piirin.

1. Anna projektille nimi.

2. Lisää tiedostot. Tähän ei tarvitse laittaa mitään, sillä tiedostot voi lisätä jälkikäteen.

3. Valitse oikea FPGA-piiri.

4. Paina Finish. En tiedä vieläkään mitä nuo tekee, mutta luultavasti ovat vain jotain simulaatiotyökaluja.


Seuraavaksi tätyy luoda Block Diagram / Schematic File. Ei taida olla välttämätön, mutta saat graafisen käyttöliittymän käyttämiesi moduulien välillä. Itse ainakin tykkäsin. Painat vain vasemmasta yläkulmasta File -> New -> Design Files -> Block Diagram / Schematic File. Voit myös painaa vasemmasta ylälaidasta tyhjän paperin kuvaketta.

Seuraavaksi pitäisi ikkunaan ilmestyä valkoinen tausta, jossa on mustia pisteitä. Saat lisättyä siihen elementtejä tuplaklikkaamalla sitä. Tällä hetkellä emme tarvitse vielä mitään elementtejä, vaan on meidän luotava koodi, joka kuvailee logiikkaa. Elementeissä on valmiiksi jo monia hyödyllisiä funktioita, jolloin niitä ei tarvitse luoda uudestaan.

Luodaksesi Verilog-tiedoston, paina taas vasemmasta yläkulmasta ja valitse File -> New -> Design Files -> Verilog HDL File. Nyt pitäisi ilmestyä tyhjä tekstitiedosto, jonka pääte on .v. Voit myös käyttää SystemVerilogia, joka pohjautuu Verilogiin. SystemVerilog on ilmeisesti kykeneväinen olio-ohjelmointiin, joka on tärkeä ominaisuus modulaarisuuden kannalta. Verilogia ja SystemVerilogia ei kuitenkaan tule kutsua samaksi kieleksi!


Tässä on esimerkkikoodi siitä, kuinka Verilogilla voidaan luoda vilkkuva ledi. Koodi ei todellakaan noudata mitään suosituksia, vaan on ensimmäinen Verilog-koodi jonka olen koskaan kirjoittanut.


//Vilkkuva LED-valo

module binky(input clk, output reg led);

reg [63:0] counter;

always @ (posedge clk) begin // Kun kellolta tulee nouseva signaali

counter <= counter + 1'b1; // Lisää laskuriin 1

if (counter >= 50000000) begin //Jos rekisteri ylittää 50 miljoonaa (1 sekunti)

led <= ~led; // Aseta ledin tilaksi negaatio edellisestä tilasta

counter <= 0; // Nollaa laskuri

end

end

endmodule

Lopuksi muista vielä painaa CTRL+S tallentaaksesi Verilog-tiedoston. Samalla voit nimetä tiedoston haluamallasi tavalla.


Kun Verilog koodi on luotu, on siitä tehtävä symbolinen tiedosto. Tämä tapahtuu painamalla File -> Create / Update -> Create Symbol Files From Current File. Tämä luo koodista elementin, jota voimme käyttää .bdf-tiedostossa. Tuplaklikkaa valkoista taustaa, jossa on mustia pisteitä ja avaa projektisi tiedostot. Sieltä pitäisi löytyä blinky-elementti. Tuplaklikkaa sitä ja klikkaa kohtaa johon haluat sen.

Tämän jälkeen on luotava sisääntulo kellosignaalille ja ulostulo ledille. Tuplaklikkaa taustaa ja kirjoita input. Paina Enter-painiketta ja klikkaa sisääntulopinni haluamaasi kohtaan. Yhdistä CLK ja input vetämällä. Viet vain hiiren binky-elementin CLK-portista tulevan johdon päähän ja vedät sen INPUT-elementin päästä tulevaan johtoon. Sama homma ulostulolle. Tuplaklikkaa taustaa, kirjoita output, paina Enter-painiketta ja klikkaa kohtaa johon sen haluat. Tämän jälkeen yhdistä vielä led ja output.

Muista painaa CTRL+S myös .bdf tiedostossa tallentaaksesi tekemät muutokset.

Seuraavaksi laitteisto pitäisi kääntää. Pinnejä ei tarvitse määrittää vielä. Ennen kääntämistä on kuitenkin määriteltävä "päätiedosto", josta kääntäjä aloittaa selvittämään logiikan rakennetta.

Kun päätiedosto on valittu, käännä koodi violetista nuolesta. Kun kääntäminen on valmis, avaa Pin Planner muuttaaksesi sisään- ja ulostulopinnejä.

Tuossa vielä uudestaan linkki EP2C5T144C8-kehitysalustalle, jos haluat katsoa pinnejä itse: land-boards.com/blwiki/index.php?title=Cyclone_II_EP2C5_Mini_Dev_Board

Seuraava vaihe onkin koodin lähettäminen. Tämä tapahtuu tuplaklikkaamalla vasemmasta laidasta Program Device. Joudut mahdollisesti asentamaan USB-blasterin ohjainohjelmistot (ajurit). Löydät ne kansiosta Altera\quartus\drivers. Huomaa, että Altera kansio on samassa kansiossa kuin Quartus II -ohjelman kansio, eikä Quartus-kansion sisällä. Jos ylälaidassa näkyy No Hardware, paina Hardware Setup ja valitse käyttämäsi ohjelmointilaite. Lopuksi paina vain Start ja syntesisoidun logiikan pitäisi siirtyä FPGA-piiriin.