Ohjelman kehitys NIOS II prosessorille



Samankaltaiset tiedostot
TIETOKONETEKNIIKAN LABORAATIOT V2.0 VHDL ohjelmoinnin perusteet

TKT-1220 Tietokonearitmetiikka I PC-harjoitus 3

VHDL-piirikuvaus ja simulointi Quartus II ja ModelSim Altera Edition -ohjelmilla

TTY TKT-1110 Mikroprosessorit TKT. HEW-ohjeet ver 1.0

MPCC-työkalua voidaan käyttää yhden laitteen valvontaan ja yhden tai useamman laitteen konfigurointiin (Modbus broadcast, osoite 0).

Machine Control Studio - Kuinka päästä alkuun. Ohjelmointiympäristö Unidrive M ja MCi2x0 laitteille

Viva-16. Käyttöohje Veikko Nokkala Suomen Videovalvonta.com

Keskellä ruutua kuvan yläpuolella linkki on call diabeteksen hallintaohjelmisto. Klikkaa sitä

Pika-asennusohjeet Suomeksi

Jypelin käyttöohjeet» Ruutukentän luominen

Mainosankkuri.fi-palvelun käyttöohjeita

Tikon Ostolaskujenkäsittely/Web-myyntilaskutus versio 6.4.0

BlueJ ohjelman pitäisi löytyä Development valikon alta mikroluokkien koneista. Muissa koneissa BlueJ voi löytyä esim. omana ikonina työpöydältä

MASSER Loader V2.00. käyttö- ja asennusohje

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

Videokuvan siirtäminen kamerasta tietokoneelle Windows Movie Maker -ohjelman avulla

Eclipse 3.2 pikku opas versio 1.0. Esittely Uuden projektin perustaminen Sovelluksen luominen Koodin siistiminen Vinkkejä

Väylään liitettävä laite: Pheonix Contact ILB PB DI8 DIO8

AUTOCAD-TULOSTUSOHJE. Tällä ohjeella selitetään Autocadin mittakaavatulostuksen perusasiat (mallin mittayksikkönä millimetrit)

Ohjeisto Trimble Pro 6H yhdistämisestä Juno 5:een

Pedacode Pikaopas. Java-kehitysympäristön pystyttäminen

Tikon Ostolaskujenkäsittely/Web-myyntilaskutus versio 6.3.0

Internet Explorer 7 & 8 pop-up asetukset

LIITE 1 1. Tehtävänä on mallintaa kitara ohjeiden mukaan käyttäen Edit Poly-tekniikkaa.

Ohjeet e kirjan ostajalle

Kieliversiointityökalu Java-ohjelmistoon. Ohje

Ennen varmenteen asennusta varmista seuraavat asiat:

Aditro Tikon ostolaskujen käsittely versio 6.2.0

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

Mikäli olet saanut e-kirjan latauslinkin sähköpostilla, seuraa näitä ohjeita e-kirjan lataamisessa.

1. NetBeans-ohjelman asennus ja käyttöönotto pva

Henkilö- ja koulutusrekisterin asennusohje

KÄYTTÖOHJE PEL 2500 / PEL 2500-M

Luento 1 (verkkoluento 1) Tietokonejärjestelmä

TW-LTE 4G/3G. USB-modeemi (USB 2.0)

Student Engeering & Design Community

Arduino ohjelmistokehitys

5. HelloWorld-ohjelma 5.1

Näin asennat MS-DOS käyttöjärjestelmän virtuaalikoneeseen

Verilogvs. VHDL. Janne Koljonen University of Vaasa

SSH Secure Shell & SSH File Transfer

Mathcad 14.0 Single User -asennus

1. Adobe Digital Editions ohjelman käyttöönotto

6.3. AVR_rauta. EEPROM-muisti pva

KIITOS RICA OPTIMOINTIOHJELMAN VALITSEMISESTA

KÄYTTÖOHJE PEL / PEL-M

JOVISION IP-KAMERA Käyttöohje

Lumon tuotekirjaston asennusohje. Asennus- ja rekisteröintiohje

Flowcode 6 Omien komponenttien luonti 3D- tilassa Ledi

Selvitysraportti. MySQL serverin asennus Windows ympäristöön

Fluke-VR1710. Pikakäyttöopas. Häiriöjännitetallennin. Tämä opas on vain ohjeellinen. Tarkemmat ohjeet löydät englanninkielisestä User Manual-ohjeesta

HAMINETTI WLAN LIITTYMÄN KÄYTTÖÖNOTTO-OHJE

Aditro Tikon ostolaskujen käsittely versio SP1

Visma Fivaldi. Ohjeet Java web startin ja HTML5-työkalun aktivointiin

Moottorin kierrosnopeus Tämän harjoituksen jälkeen:

Luento 1 Tietokonejärjestelmän rakenne

Luento 1 Tietokonejärjestelmän rakenne. Järjestelmän eri tasot Laitteiston nopeus

Luento 1 Tietokonejärjestelmän rakenne

Ohjeita Siemens Step7, Omron CX Programmer käyttöön

BL40A17x0 Digitaalielektroniikka A/B: Ohjelmoitavat logiikkapiirit

Javan asennus ja ohjeita ongelmatilanteisiin

USB-siirto-ohjelman ja ajurin asentaminen

Luento 1 Tietokonejärjestelmän rakenne. Järjestelmän eri tasot Laitteiston nopeus

TW- LTE 4G/3G. USB- sovitin (USB 2.0)

ALTERA DE2 KEHITYS- JA OPETUSALUSTA

Luento 1 (verkkoluento 1) Ohjelman sijainti Ohjelman esitysmuoto Laitteiston nopeus

Arduino. Kimmo Silvonen (X)

CEM DT-3353 Pihtimittari

LUSAS tiedosto-opas. Matti Lähteenmäki

1. Luo tunnus Autodeskin opiskelijasivustoon oppilaitoksen antamalla sähköpostiosoitteella -

MALLIN RENDERÖINTI KUVAKSI TAI VIDEOKSI SOLIDWORKS 2012 VERSIOLLA

MEM-O-MATIC järjestelmä

ArcGIS Pro -ohjelmiston käyttöönotto. Ohje /

GPRS-lisäpalvelu INTERNET-ASETUKSET

Moottorin kierrosnopeus Tämän harjoituksen jälkeen:

Laskuharjoitus 9, tehtävä 6

TeleWell TW-LTE/4G/3G USB -modeemi Cat 4 150/50 Mbps

Novapoint Lisensiointi. Copyright 2006, ViaNova IT AS. All rights reserved 1

Aditro Tikon ostolaskujen käsittely versio SP1

Liikennevalot. Arduino toimii laitteen aivoina. Arduinokortti on kuin pieni tietokone, johon voit ohjelmoida toimintoja.

Eclipse 3.1 Pikaopas versio 1.0

1. Luo tunnus Autodeskin opiskelijasivustoon oppilaitoksen antamalla sähköpostiosoitteella -

NetBeans asennus ja etäkäyttö C-kielen opiskeluun, Windows

ArcGIS Pro -ohjelmiston käyttöönotto. Ohje /

Tällä ohjelmoitavalla laitteella saat hälytyksen, mikäli lämpötila nousee liian korkeaksi.

padvisor - pikaohje - työkalu SATRON Smart/Hart dp- ja painelähettimiä varten

Solve ja Nordean verkkopankki

Febdok 6.0 paikallisversion asennus OHJEISTUS

Tuplaturvan tilaus ja asennusohje

Epson EMP-765 langaton käyttö

Projektin luonti LPCXpressolla

CipherLab CPT-8001L -tiedonkeruupäätteen käyttö Ecomin kanssa

Lab A1.FARM_Hyper-V.v3

Sähköpostitilin luonti

Autentikoivan lähtevän postin palvelimen asetukset

6 XML-työkalut 1. 6 XML-työkalut

1 Kirjautuminen ja Käyttöliittymä Kirjautuminen Käyttöliittymä Uuden varauksen tekeminen Normaali varaus...

FinFamily PostgreSQL installation ( ) FinFamily PostgreSQL

WCONDES OHJEET ITÄRASTEILLE (tehty Condes versiolle 8)

KÄYTTÖOHJE PEL 1000 / PEL 1000-M

Transkriptio:

1 Ohjelman kehitys NIOS II prosessorille

2 Sisällys Sisällys...2 1. Johdanto...3 1.1 Teknologiat...3 1.2 Suunnitteluvuo ja työkalut...4 1.3 Kehitysalusta...6 2. Quartus II:n käyttö...7 2.1 Käynnistys...7 2.2 Projektin määrittely...7 2.3 Piirikaavion luonti...9 3. Prosessorin ja oheispiirien konfigurointi...11 3.1 SOPC Builder ja NIOS II konfigurointi...11 3.2 Prosessorin oheislaitteiden konfigurointi...14 3.2.1 Järjestelmän oheislaitteet...14 3.2.2 Digitaalinen I/O (Input/Output)...15 3.2.3 Keskeytyspyyntölinjat...17 3.2.4 Piirin sisäisen muistin käyttö...17 3.3 Komponenttien osoitealueet ja keskeytyspyyntöjen prioriteetit...18 4. NIOS II prosessori Quartus II:ssa...22 4.1 NIOS II komponentti piirikaavioeditorissa...22 4.2 FPGA:n pinnien kytkeminen...23 4.3 Suunnitelman käännös Quartus II:ssa...25 5. Ohjelman kehitys...26 5.1 NIOS II IDE...26 6. Ohjelman testaus...29 6.1 Testaus käskykantasimulaattorilla...29 6.2 Testaus RTL-simulaattorilla...31 6.3 Testaus kehitysalustalla...31 6.3.1 Kehitysalustan kytkennät...31 6.3.2 Kovon lataus piirille...32 6.3.3 Ohjelman lataus ja ajo...34 Liite A. Tärkeimmät tiedostotyypit...37 Liite B. HAL-tietotyypit...38 Liite C. Ulkoisten muistipiiirien käyttö...39 Liite D. MegaWizard Plug-In Manager...41 Liite E. Ohjelmallinen digitaalinen I/O...43 Liite F. Keskeytysten palvelurutiinit...46

3 1. Johdanto Tämä ohjeisto on tarkoitettu ohjelmiston kehityksen tueksi Alteran NIOS II prosessorille Quartus II suunnitteluympäristössä. Ohjeistossa kuvataan suunnitteluvuo, prosessorin konfigurointi oheiskomponentteineen, piirin pinnien kytkeminen, piirin kääntäminen, ohjelmisto/laitteisto rajapinnan toteuttaminen sekä ohjelmiston testaus. Linkit tähän dokumenttiin tai Internetiin on merkitty sinisenä. Menuissa tai ikkunoissa tehtävät valinnat on merkitty lihavoituna. 1.1 Teknologiat NIOS II on Alteran FPGA-piirille toteutettava prosessoriydin. FPGA (Field Programmable Gate Array) on yleisnimitys integroiduille piireille, jotka sisältävät suuren määrän muunneltavia logiikkasoluja (logiikkalohkoja), liitäntälohkoja sekä kytkentämatriisin. Kuvassa 1 on esitetty FPGA-piirin sisäinen rakenne. FPGA-piirien teknologiaa on kuvattu tarkemmin esimerkiksi kirjassa: Haltsonen, Levomäki & Rautanen: Digitaalitekniikka. Edita Prima, 2004. Kuva 1. FPGA-piirin periaatteellinen rakenne. FPGA-piirien suunnittelu on täysin tietokoneavusteista. Käyttäjä kuvaa suunnitelman lohkot joko piirikaavioeditorilla tai kuvauskielellä, minkä jälkeen suunnitteluohjelmisto kääntää suunnitelman sisäiseen muotoon, syntesoi kuvauksen logiikkatasolle ja sovittaa toteutuksen valittuun piirityyppiin. Tuloksena on piirin ohjelmointitiedosto, joka määrittelee, mihin asentoon piirin sisäiset kytkimet asetetaan. Kytkinten asento määrää logiikkalohkojen toiminnan sekä piirin sisäiset ja ulkoiset liitännät. NIOS II on Alteran konfiguroitava soft-core prosessori. Konfiguroitavuus tarkoittaa sitä, että käyttäjä voi tietyissä rajoissa määritellä prosessorin ominaisuudet sekä ottaa prosessoriin haluamansa liitännät ja oheistoiminnat. Termi soft-core tarkoittaa sitä, että prosessori ei ole valmis komponentti, jonka voi ostaa kaupasta. Sen sijaan käyttäjä määrittelee prosessorin ominaisuudet yhdessä muun digitaalielektroniikkaosan kanssa, kääntää suunnitelman ja lataa toteutuksen FPGA-piirille.

4 Ohjelmiston suunnittelu tapahtuu normaalisti rinnakkain laitteistosuunnittelun kanssa ja lopputuloksena on yhden piirin sulautettu järjestelmä, joka sisältää prosessorin ohjelmistoineen sekä laitteen muun digitaaliosan. Tällöin voidaan käyttää termiä järjestelmäpiiri (SoPC, System on Programmable Chip). Kuvassa 2 on esimerkki järjestelmäpiirin rakenteesta Kuva 2. SoPC-piirin käyttöön perustuvan toteutuksen arkkitehtuuri. NIOS II on yleiskäyttöinen 32-bittinen RISC- (Reduced Instruction Set Computer) tyyppinen prosessoriydin, jonka tärkeimpiä ominaisuuksia ovat: 32-bitinen käskykanta, tietoväylä ja osoiteavaruus, 32 yleiskäyttöistä rekisteriä, 32 ulkoista keskeytyslähdettä, yhden käskyn 32X32 bitin kertolasku, tulos 32 bittiä, liukulukukäskyt yksinkertaisen tarkkuuden liukulukuoperaatioihin. Lisätietoa NIOS II prosessorista ja teknologioista löytyy dokumenteista First Time User s Guide For Embedded Systems Developers ja Processor Selection Guide. NIOS II prosessorin tarkempi kuvaus on dokumentissa Nios II Processor Reference Handbook. 1.2 Suunnitteluvuo ja työkalut Suunnittelu tapahtuu Alteran Quartus II suunnitteluympäristössä, jossa tärkeimmät työkalut ovat: Piirikaavioeditori: lohkojen ja komponenttien kytkennät. SOPC Builder: NIOS II:n ja oheislaitteiden määrittely. MegaWizard Plug-In Manager: parametroitavien komponenttien määrittely. NIOS II Embedded Development Suite: ohjelman kehitys ja testaus. Kääntäjä: synteesi ja sijoittelu, ajoitusanalyysi. Simulaattori: järjestelmän simulointi.

5 Kuva 3. SoPC suunniteluvuo NIOS II prosessorille.. Tässä ohjeistossa on kuvattu tarkemmin kuvassa 3 punaisella rajattu alue: Prosessorin ja oheiskomponenttien luonti SOPC Builderilla ja MegaWizard plugin Managerilla. Laitteisto/ohjelmisto rajapinnan toteutus C-kielellä. Ohjelmiston testaus Alteran käskykantasimulaattorilla. Ohjelmiston testaus ModelSim-simulaattorilla (vain lyhyesti). Ohjelmiston testaus kehitysalustalla oikean kovon kanssa. Lisäksi tässä ohjeistossa on kuvattu NIOS II prosessorin käyttö piirikaavioeditorissa (kuvassa 3 Integrate SOPC Builder System into Quartus II Project ), FPGA-piirin pinnien kytkentä (kuvassa 3 Assign Pin Locations ) sekä suunnitelman käännös (kuvassa 3 "Compile FPGA Design to Target Board").

6 1.3 Kehitysalusta Tämä ohjeisto on tarkoitettu Alteran kehitysalustaa NIOS II Development Kit, Stratix Edition varten. Kehitysalustan käyttöä on kuvattu tarkemmin dokumentissa Nios II Development Kit Getting Started User Guide ja tekniset yksityiskohdat on kuvattu dokumentissa Nios Development Board Stratix II Edition Reference Manual. Kehitysalusta sisältää Stratix II -sarjaan kuuluvan EPS2S60F672C3-piirin, johon voidaan konfiguroida muun logiikan lisäksi yksi tai useampi NIOS II prosessori. Kehitysalustalla on piirin lisäksi: JTAG-liiityntä, RS232-liityntä, Ethernet-liityntä, kahden rivin LCD-näyttö, neljä painokytkintä, neljä LED:iä ja kaksi 7-segmentti LED-näyttöä, 16 megatavua flash ROM-muistia, 2 megatavua synkronista SRAM-muistia, 32 megatavua DDR SDRAM-muistia, logiikka, jolla FPGA voidaan ladata flash ROM-muistista, 50 MHz oskillaattori. Tämän ohjeiston kappaleessa 2 kuvataan suunnittelun alkuvaihe Quartus II ympäristössä. Kappaleissa 3-5 kuvataan yksinkertaisen järjestelmän suunnitteluvuon vaiheet, kun toteutuskohteena on Alteran kehitysalusta. Kappaleessa 6 kuvataan ohjelmiston testausmahdollisuuksia kyseiselle järjestelmälle.

7 2. Quartus II:n käyttö Quartus II on Alteran suunnitteluympäristö FPGA- ja CPLD-piireille. Tässä kappaleessa on kuvattu Quartus II:n aloitus, uuden projektin aloitus ja uuden piirikaavion luonti. Tarkemmat dokumentit Quartus II:n käytöstä löytyvät Alteran manuaaleista Introduction to Quartus II sekä Quartus II Handbook. 2.1 Käynnistys Quartus II käynnistetään suoraan työpöydän ikonista tai Start-valikon kautta: Start Programs Altera Quartus II <versio> Quartus II <versio>. Käyttöliittymä on kuvan 4 mukainen. Kuva 4. Quartus II käyttöliittymä. 2.2 Projektin määrittely Quartus II:n projekti sisältää kaikki tiedostot, joita tarvitaan piirin toteutukseen. Uusi projekti aloitetaan valitsemalla File-valikosta New Project Wizard. Jos ensin avautuu New project Wizard: Introduction ikkuna, siinä painetaan Next. Projektin tietojen asetus aloitetaan välilehdellä 1 kuvan 5 mukaisesti. Siinä määritellään projektihakemisto, projektin nimi ja ylimmän hierarkiatason nimi. HUOM! Projektihakemiston polussa ei saa olla välilyöntejä eikä ä- ja ö-kirjaimia. Ylimmän hierarkiatason nimi on oltava sama kuin ylimmän tason piirikaavion nimi Quartus II:ssa.

8 Kuva 5. Projektin tiedot (Page 1). Välilehdille 2 ja 4 ei tarvitse tehdä muutoksia. Välilehdellä 3 määritellään käytettävä piiri. Alteran kehitysalustaa varten piiriksi valitaan kuvan 6 mukaisesti EPS2S60F672C3. Kuva 6. Käytettävän FPGA-piirin valinta (Page 3).

9 Kuva 7. Yhteenveto projektista (Page 5). Välilehdellä 5 on yhteenveto projektin määrittelyistä (kuva 7). Jos kaikki kohdat ovat kunnossa, painetaan Finish. Tällöin projekti on määritelty ja projektitiedosto on tyyppiä.qpf (Quartus II Project File). Seuraavalla kerralla saadaan kaikki määrittelyt ja tiedostot käyttöön valitsemalla File-valikosta Open Project. 2.3 Piirikaavion luonti Quartus II:n piirikaavioeditori Block Editor käynnistetään valitsemalla File-valikosta New File, jolloin avautuu New-ikkuna. Siitä valitaan Block Diagram/Schematic File ja painetaan OK kuvan 8 mukaisesti. Kuva 8. Piiri/lohkokaavion luonti.

10 Piirikaavio tallennetaan projektihakemistoon valitsemalla File-valikosta Save As. On tärkeää, että piirikaaviolle annetaan sama nimi kuin kuvassa 5 annettu projektin ylimmän tason nimi. Add file to current project on oltava valittuna, jotta piirikaavio otetaan mukaan projektiin ylimmän hierarkiatason kaaviona. Piirikaaviotiedostojen tunnus on.bdf (Block Diagram/Schematic File). Kuva 9. Ylimmän hierarkiatason tallennus. Block Editor on normaali piirikaavioeditori, jolla määritellään komponenttien ja lohkojen kytkennät. Kukin komponentti on tyypiltään joku seuraavista: Käyttäjän tekemä VHDL-lohko. Quartus II:n valmis kirjastokomponentti. SOPC Builderilla konfiguroitu NIOS II prosessori. MegaWizard Plug-In Managerilla konfiguroitu komponentti. Valmis IP- (Intellectual Property) lohko. MegaWizard Plug-In Managerin käyttöä on kuvattu liitteessä D. Ohjeita Block Editorin käyttöön löytyy Quartus II:n Help-valikosta kohta About Design Entry sekä dokumentissa Introduction to Quartus II Manual kappale Using the Quartus II Block Editor (s. 52).

11 3. Prosessorin ja oheispiirien konfigurointi SOPC Builder on työkalu, jolla määritellään prosessorin ominaisuudet, oheiskomponentit ja ulkoiset liitännät. MegaWizard Plug-In Manager on työkalu, jolla saadaan käyttöön parametroitavia Alteran FPGA-piiriperheeseen optimoituja komponentteja. Tässä kappaleessa kuvataan yksinkertaisen järjestelmän kehitys Alteran kehitysalustaa varten. 3.1 SOPC Builder ja NIOS II konfigurointi SOPC Builder käynnistetään valitsemalla Quartus II:n Tools-menusta SOPC Builder. Tällöin aukeaa uusi ikkuna, jossa ensin annetaan nimi prosessorille Create New System ikkunassa. Samalla varmistetaan, että Target HDL kohdassa on valittuna VHDL ja painetaan OK. HUOM! Prosessorin nimi ei saa olla sama kuin projektin nimi. Kuva 10. SOPC Builderin käynnistäminen (Create New System). Seuraavaksi määritellään piiriperheeksi Stratix II ja kohdelaitteistoksi Nios Development Board, Stratix II (EP2S60) RoHS kuvan 11 mukaisesti. Kellotaajuudeksi asetetaan 50.0 MHz.

12 Kuva 11. Kohdelaitteiston määrittelyt. Komponentti-ikkuna on SOPC Builderin vasemmassa laidassa. Käytettävissä olevat komponentit on merkitty vihreällä. Valitaan komponentti-ikkunasta Nios II Processor ja painetaan Add, jolloin prosessorin konfigurointi käynnistyy (kuva 12). Ensimmäisellä sivulla (NIOS II Core) valitaan prosessorityyppi. Tässä esimerkissä käytetään prosessorin standard versiota, joten ikkunassa valitaan NIOS II/s. Kuva 12. Prosessorityypin valinta. Toisella sivulla (Caches & Tightly Coupled Memories) määritellään välimuistien ja tiukasti kytkettyjen muistien käyttö. Asetetaan käskyvälimuistin kooksi 2 kilotavua (2 Kbytes) kuvan 13 mukaisesti.

13 Kuva 13. Välimuistit ja tiukasti kytketyt muistit. Kolmanteen ikkunaan (Advanced Features) ei tehdä muutoksia. Neljännessä ikkunassa (JTAG Debug Module) määritellään JTAG-liitännän tyyppi. Valitaan Level 1, jolloin kehitettävä ohjelmisto voidaan ladata piirille ja ohjelmallisia breakpointteja voidaan asettaa (kuva 14). Kuva 14. JTAG-liitännän määrittely. Viidennessä ikkunassa (Custom Instructions) voidaan määritellä käyttäjän oman logiikan liittäminen prosessorin aritmeettis-loogiseen yksikköön (Arithmetic Logic Unit, ALU). Tavoitteena on tiettyjen käskyjen suorituksen nopeuttaminen erillisen kovolohkon avulla. Tässä projektissa ikkunan asetuksiin ei tehdä muutoksia ja painetaan Finish, jolloin prosessorin perusominaisuudet on määritelty. Tämän jälkeeen SOPC Builder ikkuna on kuvan 15 mukainen. NIOS II prosessori kytkeytyy FPGA-piirillä ja piirin ulkopuolella oleviin komponentteihin Avalon-väylän kautta. SOPC Builder kytkee automaattisesti väylän NIOS II prosessorin ja FPGA-piirin sisäisten oheiskomponenttien välille, joten suunnittelijan ei normaalisti tarvitse erikseen määritellä kytkentöjä.

14 Kuva 15. NIOS II prosessori SOPC Builderissa. Prosessorin konfigurointi on esitetty tarkemmin dokumentissa Implementing the Nios II Processor in SOPC Builder. 3.2 Prosessorin oheislaitteiden konfigurointi Prosessorin ominaisuuksien jälkeen SOPC Builderilla määritellään, mitä oheislaitteita ja liityntöjä prosessoriin lisätään. Useimmat oheislaitteet ja liitynnät määritellään MegaWizard Plug-In Manager työkalulla. Quartus II:n asennuksen mukana tulevat oheislaitteet ja niiden käyttö on kuvattu dokumentissa Quartus II Handbook, Volume 5: Embedded Peripherals. 3.2.1 Järjestelmän oheislaitteet Ensimmäisenä järjestelmään lisätään JTAG UART, joka mahdollistaa tiedonsiirron PC:n ja NIOS II prosessorin välillä. JTAG UART on komponentti-ikkunassa Communication-ryhmässä. Asetuksiin ei tarvitse tehdä muutoksia. Configurationikkunassa voidaan määritellä FIFO-muistien käyttö ja Simulation-ikkunassa voidaan määritellä ModelSim-simulaattorin käyttötapa. Seuraavaksi järjestelmään lisätään ajastin valitsemalla Other-ryhmästä Interval Timer. Asetetaan jaksonpituudeksi 1 millisekunti ja muut asetukset kuvan 16 mukaisiksi.

15 Kuva 16. Ajastin. Järjestelmään lisätään vielä tunnistusmoduli, joka estää toiselle järjestelmälle käännetyn ohjelmiston latauksen. NIOS II IDE tarkistaa, vastaako tunniste oikeaa prosessoria. Tunnistusmoduli System ID Peripheral on Other-ryhmässä ja siihen ei tarvitse tehdä mitään asetuksia. 3.2.2 Digitaalinen I/O (Input/Output) Prosessoriin voidaan liittää halutun levyisiä digitaaliliitäntöjä, jotka kytketään joko FPGA-piirin ulkoisiin pinneihin tai suunnitelman muihin lohkoihin. Lisätään ensin 8bittinen lähtöväylä, joka myöhemmässä vaiheessa kytketään ohjaamaan kehitysalustan ledejä. Other-ryhmästä valitaan PIO (Parallel I/O). Leveydeksi asetetaan 8 bittiä ja tyypiksi lähtö Output ports only (kuva 17). Lisäyksen jälkeen nimeksi muutetaan led_pio, jotta se tunnistetaan ohjelmointiympäristössä. Nimi muutetaan SOPC Builderissa klikkaamalla hiiren oikealla napilla PIO-komponenttia ja valitsemalla Rename. Kuva 17. 8-bittinen lähtöliitäntä ledejä varten.

16 Seuraavaksi lisätään 1-bittinen normaali digitaalinen tuloliitäntä, joka myöhemmin kytketään kehitysalustan yhteen painokytkimeen. Other-ryhmästä valitaan PIO (Parallel I/O). Leveydeksi asetetaan 1 bitti ja tyypiksi lähtö Input ports only (kuva 18). Input options ja Simulation välilehdille ei tehdä muutoksia. Muutetaan SOPC Builderissa liitännän nimeksi button_0. Kuva 18. 1-bittinen tuloliitäntä Kehitysalustaa varten prosessoriin on lisättävä vielä 1-bittinen kaksisuuntainen liitäntä kuvan 19 mukaisesti. Asetetaan leveydeksi 1 bitti ja tyypiksi Bidirectional (tri-state) ports. Muutetaan nimeksi pio_reconfig. Liitäntää käytetään piirin rekonfiguroinnnin mahdollistamiseksi kehitysalustalla. Se kytketään prosessorin pinniin H16. Kuva 19. Kaksisuuntainen liitäntä. Digitaalisten liitäntöjen luku ja kirjoitus ohjelmallisesti tehdään funktioilla, jotka on kuvattu kappaleessa 5.3.

17 3.2.3 Keskeytyspyyntölinjat Prosessorin digitaaliset tuloliitännät (kappale 3.2.2) voidaan määritellä konfiguroinnin yhteydessä keskeytyspyyntötuloiksi. NIOS II prosessorille voidaan määritellä enintään 32 ulkoista keskeytyspyyntötuloa. Esimerkkijärjestelmään lisätään yksi ulkoinen keskeytyspyyntötulo, joka kytketään kehitysalustan painokytkimeen. Other-ryhmästä valitaan PIO (Parallel I/O), jonka leveydeksi asetetaan 1 bitti ja tyypiksi lähtö Input ports only. Välilehdellä Input Options asetetaan valinnat: Synchronous Capture, Falling Edge, Generate IRQ ja Edge (kuva 20). Muutetaan SOPC-Builderissa liitännän nimeksi button_1. Kuva 20. Asetukset keskeytyspyyntötuloa varten. Kehitysalustan painokytkimet ovat 0-aktiivisia, joten keskeytyspyyntö asetetaan laskevalla reunalla aktiiviseksi. Keskeytyspalvelurutiinien kirjoitus on kuvattu Liitteessä F. 3.2.4 Piirin sisäisen muistin käyttö Alteran FPGA-piirit sisältävät muistilohkoja, joita voidaan käyttää RAM- tai ROMmuistina. NIOS II prosessorin yhteydessä. Piirin sisäinen muisti on nopeinta ja sen käyttö on yksinkertaisinta, mutta muistin kokoa rajoittaa FPGA-piirin kapasiteetti ja muun järjestelmän vaatimat kovoresurssit. Kehitettävässä esimerkkijärjestelmässä käytetään data- ja ohjelmamuistina vain piirin sisäistä muistia, jonka määräksi asetetaan 64 kilotavua. Sisäinen muisti valitaan Memory-ryhmästä On-Chip Memory. Tyypiksi asetetaan M4K, leveydeksi 32 bittiä ja kooksi 64 kilotavua (kuva 21).

18 Kuva 21. Piirin sisäinen muisti. Piirin sisäistä muistia varten ei tarvitse tehdä mitään kytkentöjä, vaan muisti on automaattisesti prosessorin käytettävissä. Lisäksi useimpien sisäisten muistityyppien sisältö voidaan alustaa, kun piiriin kytketään käyttöjännite. Sisäisten muistien käyttöä on kuvattu tarkemmin dokumentissa Building Memory Subsystems Using SOPC Builder s. 8 8-8 11. Tässä dokumentissa kuvatussa esimerkkijärjestelmässä ei käytetä ulkoisia muistipiirejä. Ulkoisten muistipiirien käyttöä esitellään liitteessä C. 3.3 Komponenttien osoitealueet ja keskeytyspyyntöjen prioriteetit Kun kaikki NIOS II:n oheiskomponentit on lisätty, seuraavaksi määritellään komponenttien osoitealueet ja keskeytysten prioriteetit. Ne voidaan asettaa manuaalisesti tai käyttämällä SOPC Builderin automatiikkaa. Yksinkertaisissa järjestelmissä automatiikan avulla saadaan yleensä riittävän hyvä tulos. SOPC Builderin luomia osoitteita ja prioriteettejä voidaan kuitenkin haluttaessa muuttaa. Osoitteiden asettamiseen on System-valikossa Auto-Assign Base addresses komento, joka automaattisesti asettaa komponenttien kantaosoitteet ja varaa riittävän osoitealueen kullekin komponentille (kuva 23).

19 Kuva 22. Osoitteiden automaattinen asetus. Tarvittaessa osoitteita voi muuttaa manuaalisesti klikkamalla komponentin Basesaraketta ja kirjoittamalla uusi arvo entisen päälle. Kantaosoitteiden asettamiseen NIOS II prosessorille on joitakin yleisiä ohjeita: NIOS II:lla on 32 bitin osoiteavaruus ja kantaosoitteiden on oltava välillä 0x00000000 and 0x7FFFFFFF. NIOS II:lle kehitettävät ohjelmat käyttävät symbolisia nimiä, joten helposti muistettavien osoitteiden käytöstä ei ole hyötyä. Kovo saadaan tehokkaimmaksi, kun eri komponenttien osoitteet poikkeavat toisistaan vain yhden bitin osalta. Kantaosoitteiden pakkaaminen pienimmälle mahdolliselle alueelle voi täten tuottaa tehottomampaa kovoa. SOPC Builder ei pyri asettamaan eri muistikomponentteja yhtenäiselle muistialueelle. Jos halutaan esimerkiksi piirin sisäisen ja ulkoisen RAM-muistin olevan yhtenäisellä muistialueella, on osoitteet asetettava manuaalisesti. Myös keskeytyspyyntöjen prioriteetit voidaan asettaa automaattisesti System-valikon Auto-Assign IRQs komennolla. SOPC Builder ei kuitenkaan voi tietää parasta järjestystä, joten tarvittaessa prioriteetit on muutettava manuaalisesti. Keskeytyspyynnöillä pienempi numero merkitsee korkeampaa prioriteettiä. Ajastimella (Interval Timer) on oltava korkein prioriteetti, jotta järjestelmän kello pysyy mahdollisimman hyvin tahdissa. Tämän vuoksi vaihdetaan JTAG UART:in keskeytysnumeroksi esimerkiksi 16, jolloin ajastimelle voidaan antaa numero 0 ja täten korkein prioriteetti (kuva 24).

20 Kuva 23. Prioriteettien muutos. Kun prosessori ja sen oheislaitteet on konfiguroitu, valitaan välilehti Board Settings. Siellä voidaan asettaa signaalien sijoitus FPGA-piirin pinneihin. Sama asia voidaan tehdä myös Quartus II:ssa, joten valitaan kaikille signaaleille Assign in Quartus II Project kuvan 25 mukaisesti. Kuva 24. Pinnien kytkennät määritellään Quartus II:ssa. Välilehdellä NIOS II cpu_0 Settings voidaan asettaa NIOS II:n toimintaan liittyviä osoitteita. Tähän ei ei tarvitse tehdä muutoksia. Prosessorin generointi käynnistetään System generation välilehdeltä. Tarkistetaan, että HDL on valittuna. Jos suunnitelmaa halutaan simuloida ModelSim-simulaattorilla, valitaan myös Simulate. Generointi käynnistyy painamalla Generate-painiketta, jolloin SOPC Builder kääntää prosessorin määrittelyn Quartus II:n ymmärtämään muotoon ja muodostaa NIOS II prosessorikomponentin piirikaavioeditoria varten. Käännös kestää jonkin aikaa. Käännöksen onnistuessa SOPC Builder antaa lopuksi ilmoituksen: SUCCESS: SYSTEM GENERATION COMPLETED.

21 Nyt NIOS II prosessori on valmis ja sitä voidaan käyttää Quartus II:n Block Editor piirikaavioeditorissa kappaleen 4 ohjeiden mukaan. SOPC Builder muodostaa.ptf (plain text file) tyyppisen tekstitiedoston, joka sisältää generoidun prosessorin kuvauksen. Tiedostoa tarvitaan, kun kehitetty ohjelma käännetään prosessorille NIOS II IDE:ssä.

22 4. NIOS II prosessori Quartus II:ssa NIOS II:n konfiguroinnin jälkeen piirretään piirikaavio, määritellään FPGA-piirin pinnien kytkennät ja käännetään suunnitelma piirin ohjelmointitiedostoksi. 4.1 NIOS II komponentti piirikaavioeditorissa Kun NIOS II prosessori on generoitu, sitä voidaan käyttää normaalina komponenttina Block Editor piirikaavioeditorissa. Esimerkkijärjestelmässä ei ole muita komponentteja kuin NIOS II, joka kytketään FPGA-piirin pinneihin. Piirikaavioon tulee prosessorin lisäksi vain piirin ulkoiset pinnit. Komponentit lisätään piirikaavioeditorissa Symbol Tool -painikkeella löytyy Symbol-ikkunassa Project-kirjastosta (kuva 28).. NIOS II Kuva 25. NIOS II komponenttina. NIOS II sijoitetaan piirikaavioon, minkä jälkeen piirikaavioon lisätään ja kytketään pinnit. Pinnit ovat Alteran kirjastohakemistossa (altera\<versio>\quartus\libraries) primitives-kirjastossa (kuva 29). Kuva 26. Pinnit

23 Pinnit kytketään NIOS II:n tuloihin ja lähtöihin johdintai väylätyökalun avulla. Annetaan pinneille nimet: clock, button_0, button_1, LED[7..0] ja pio_config (kuva 30). Prosessorin resetointitulo reset_n kytketään suoraan käyttöjännitteeseen (vcckomponentti Alteran kirjastohakemistossa other-kirjastossa). Nyt FPGA-piirillä on 11 ulkoista liityntää, jotka on suunnitelman tarkastuksen jälkeen kytkettävä piirin pinneihin kappaleen 4.2 mukaan. Kuva 27. NIOS II kytkentä piirikaaviossa. Kun piirikaavio on valmis, tarkastetaan, että suunitelmassa ei ole virheitä. Tarkastus käynnistetään Processing-valikosta komennolla Start Compilation. Normaalisti Quartus II antaa suuren joukon varoituksia ohjelmaa ajettaessa. Jos virheitä ei löydy, Quartus II ilmoittaa: Analysis & Synthesis was succesful (nnn warnings). Tähän painetaan OK, ja Quartus II avaa Compilation Report - Flow Summary ikkunan, josta näkee yhteenvedon suunnitelmasta ja käytetyistä piirin resursseista. 4.2 FPGA:n pinnien kytkeminen Prosessorin ulkoiset tulot ja lähdöt sekä muut ulkoiset liitännät kytketään FPGA:n pinneihin Assignment Editor työkalulla, joka käynnistetään valitsemalla Assignmentsvalikosta Assignment Editor. Category-ikkunassa valitaan Pin, jolloin kaikki kytketyt ulkoiset signaalit näkyvät Edit-ikkunassa. Klikkamalla Edit-ikkunan To-sarakkeessa <<new>> ruutua ulkoiset signaalit näkyvät valintalistana (kuva 31). Listasta valitaan haluttu liitäntä, minkä jälkeen klikataan vastaavaa kohtaa Locationsarakkeessa ja valitaan sieltä FPGA:n pinni, johon kyseinen signaali kytketään. Pinni voidaan valita esille tulevasta listasta tai pinnin nimi voidaan kirjoittaa Locationsarakkeen ruutuun. Alteran kehitysalustan piirilevyn komponenttien ja FPGA-piirin väliset kytkennät löytyvät dokumentista Nios Development Board Stratix II Edition Reference Manual kappaleesta 2. Kehitysalustalla kellotulo on kytketty FPGA:n pinniin B13, piirin rekonfigurointi on kytketty pinniin H16 ja prosessorin resetointi on kytketty pinniin C5 (ei ole käytössä esimerkkisuunnitelmassa, vaan prosessorin reset on kytketty suoraan käyttöjännitteeseen).

24 Kuva 28. Signaalin valinta. Esimerkkisuunnitelmassa on kolme tuloa (kello ja kaksi painonappia), kahdeksan lähtöä (ledien ohjaukset) sekä yksi kaksisuuntainen liitäntä (piirin rekonfigurointi kytkentäalustalla). Signaalit kytketään taulukon 1 mukaisesti. Taulukko 1.Esimerkkisuunnitelman pinnien kytkentä. Signaali FPGA:n pinni LED[0] W15 LED[1] V14 LED[2] AD17 LED[3] AA17 LED[4] V16 LED[5] AB17 LED[6] AD18 LED[7] V17 clock B13 button_0 P4 button_1 P5 pio_reconfig H16 Kun kytkennät on tehty, suunnitelma on valmis käännettäväksi kappaleen 4.3 mukaisesti.

25 4.3 Suunnitelman käännös Quartus II:ssa Kun pinnien kytkeminen on valmis, käännetään suunnitelma lopulliseen muotoonsa, jotta se voidaan ladata FPGA-piirille. Käännös käynnistetään Processing-valikosta komennolla Start Compilation. Käännös sisältää kolme päävaihetta, jotka suoritetaan automaattisesti peräkkäin, mikäli virheitä ei esiinny: Synteesi. Sijoittelu ja reititys. Ajoitusanalyysi. Käännös kestää kohtuullisen pitkän aikaa, ja Quartus II antaa normaalisti joukon varoituksia. Kun käännös on valmis, Quartus II ilmoittaa: Full compilation was successful (mmm warnings). Tähän painetaan OK, ja Quartus II avaa Compilation Report - Timing Analyzer ikkunan, josta nähdään ajoitukseen liittyviä rajoituksia ja mahdollisia virheilmoituksia. Kohdassa Summary on kellosignaalien maksimitaajuudet. Tarkastetaan, että signaalin clock taajuus on vähintään 50 MHz (kuva 32). Kuva 29. Ajoitusanalyysin raportti. Quartus II muodostaa käännöksen tuloksena piirin ohjelmointitiedoston, jonka tunnus on.sof (SRAM Object File). Kun.sof-tiedosto ladataan FPGA-piirille, piirin sisäiseksi kytkennäksi muodostuu suunnitelman mukainen kytkentä: NIOS II prosessori sekä muu kovo liitäntöineen.

26 5. Ohjelman kehitys NIOS II prosessorin suorittama ohjelma kehitetään NIOS II IDE (Integrated Development Environment) ympäristössä, joka on NIOS II:ta varten räätälöity Eclipseohjelmointiympäristö. 5.1 NIOS II IDE Ohjelmointiympäristö NIOS II IDE voidaan käynnistää joko Start-valikon kautta: Start Programs Altera NIOS II EDS <versio> NIOS II <versio> IDE tai SOPC Builderissa System Generation välilehdeltä Run NIOS II IDE painikkeella. Jos ensin avautuu Welcome to the Altera NIOS II IDE ikkuna, painetaan Workbench-painiketta, jolloin avautuu varsinainen käyttöliittymä. Aluksi tarkastetaan, että näkymä (perspective) on NIOS II C/C++ (kuva 33). Näkymän voi muuttaa oikean yläkulman valintanäppäimestä tai valikon kautta: Window Open Perspective Other NIOS II C/C++. Kuva 30. NIOS II IDE aloitus. Jos projekti-ikkunassa (vasemmassa laidassa) on avoinna väärä projekti, se voidaan poistaa tai sulkea klikkaamalla hiiren oikealla painikkeella projektia ja valitsemalla Delete tai Close Project. Uusi ohjelmistoprojekti aloitetaan valikosta File New NIOS II C/C++ Application, jolloin IDE avaa New Project -ikkunan (kuva 34). Tarkistetaan, että Select Hardware -kohdassa on oikea SOPC Builder System -tiedosto. Tarvittaessa haetaan uusi.ptftiedosto Browse-painikkeen avulla.

27 Kuva 31. Uuden ohjelmistoprojektin aloitus. Valitaan projektin pohjaksi Hello LED ohjelma, joka vilkuttaa kehitysalustan ledejä. Painetaan Next, jolloin avautuu HAL-systeemikirjaston luonti/valinta ikkuna (kuva 35). Valitaan Create a new system library named: ja painetaan Finish, jolloin uusi projekti avautuu NIOS II IDE:ssä. Kuva 32. Uuden HAL-systeemikirjaston luominen.

28 HAL on ohjelmiston ajoympäristö, joka tarjoaa laiteohjainliitännän käyttäjän ohjelmistolle ja mahdollistaa täten kommunikoinnin kovon kanssa. HAL Application Program Interface (API) on integroitu ANSI C standardikirjastoon. HAL API mahdollistaa laitteiden ja tiedostojen käytön normaaleilla C-kirjastofunktioilla kuten printf(), fopen() ja fwrite(). Tarkemmat ohjeet ja tiedot löytyvät dokumentista Nios II Software Developer s Handbook (Section II: The Hardware Abstraction Layer). NIOS II IDE rakentaa HAL-systeemikirjaston SOPC Builderin luoman kovon perusteella. Jos kovoon tehdään muutoksia SOPC Builderilla, muutokset näkyvät automaattisesti HAL-kirjaston luonnissa. Kuvassa 36 on esitetty NIOS II IDE projektin rakenne ja liityntä SOPC Builderiin. Kuva 33. NIOS II IDE projektin rakenne. Tiedosto system.h on HAL-systeemikirjaston perusta, joka luodaan ohjelmistoprojektin rakentamisen yhteydessä. Tiedosto sisältää kunkin oheislaitteen tiedot: Konfigurointi. Kantaosoite. Keskeytyspyynnön prioriteetti (jos laitteella on keskeytyspyyntö). Symbolinen nimi. Koska ANSI C ei määrittele tietotyyppien bittimäärää, HAL käyttää ANSI C:n tietotyyppien lisäksi omia tietotyyppejä, joissa bittimäärä on määritelty. HALtietotyypit määritellään alt_types.h tiedostossa ja ne on esitetty liitteessä B. NIOS II IDE luo kutakin ohjelmistoprojektia varten alihakemiston. Sijoituspaikkana on oletusarvoisesti <SOPC Builderin hakemisto>\software -hakemisto. Sijoitusta voi haluttaessa muuttaa valitsemalla Specify Location ensimmäisessä New Project -ikkunassa (kuva 34). HAL-systeemikirjaston oletusnimeksi annetaan <projektin_nimi>_syslib. Muistien käyttö määritellään Properties ikkunassa, joka avataan klikkaamalla hiiren oikealla napilla projektia ja valitsemalla System Library Properties. Ikkunan oikeassa laidassa on eri muistien fyysinen sijainti. Muistit voidaan sijoittaa haluttuihin komponentteihin FPGA-piirin sisälle tai ulkopuolelle. Projekti rakennetaan klikkamalla hiiren oikealla napilla projektia ja valitsemalla Build Project, jolloin NIOS II IDE luo projektia varten tarvittavat tiedostot ja kääntää ne. Käännöksen tuloksena syntyy.elf (Executable file) tiedosto, jota prosessori suorittaa.

29 6. Ohjelman testaus Ohjelmaa voidaan testata käskykantasimulaattorilla, ModelSim-simulaattorilla sekä kehitysalustalla. 6.1 Testaus käskykantasimulaattorilla Kehitettyä ohjelmaa voidaan simuloida NIOS II IDE ympäristössä ennen kuin järjestelmän kovo on valmis käskykantasimulaattorilla (ISS, Instruction Set Simulator). Tällöin voidaan varmentaa ohjelman perustoiminnot. Ohjelmaa voidaan ajaa simuloinnissa joko normaali- tai Debug-moodissa. Käskykantasimulaattori käynnistetään normaalimoodiin klikkaamalla hiiren oikealla napilla projektia ja valitsemalla Run As ja sitten NIOS II Instruction Set Simulator. Simulaattori käynnistyy ja alkaa suorittaa koodia ja tulostaa printf()-komennot konsoliikkunaan (kuva 39). Kuva 34. Käskykantasimulaattori toiminnassa (Run). Simulaattori käynnistetään Debug-moodiin klikkaamalla hiiren oikealla napilla projektia ja valitsemalla Debug As ja sitten NIOS II Instruction Set Simulator. Kun simulaattori käynnistetään ensimmäisen kerran, se kysyy, haluaako käyttäjä avata debug-näkymän. Valitaan tähän Remember my decision ja painetaan Yes. Seuraavilla kerroilla debug-näkymä avataan automaattisesti. Simulaattori käynnistyy, asettaa breakpointin main()-ohjelman alkuun ja avaa debug-näkymän (kuva 40).

30 Kuva 35. Käskykantasimulaattorin Debug-näkymä. Debug-moodissa on käytettävissä normaalit debuggaus-komennot: Step Into, Step Over, Resume, Terminate jne. Breakpointin voi asettaa ja poistaa tuplaklikkaamalla koodirivin vasenta laitaa tai klikkaamalla koodirivin vasenta laitaa hiiren oikealla painikkeella ja valitsemalla Add Breakpoint. Kuva 36. Debug-moodin toimintapainikkeet. Prosessorin ja muuttujien tilaa voidaan tarkastella debuggauksen aikana monella tavalla: Variables, Expression, Registers, Memory jne. Haluttu tarkastelu voidaan valita Window Show View valikosta. Kappaleessa 5.1 muodostettua hello_led.c ohjelmaa voidaan ajaa debug-moodissa ja seurata, miten ledeille kirjoitettava arvo muuttuu. Ledeille kirjoitettava arvo on muuttujassa led. Muuttujan arvon saa näkyviin klikkaamalla Variables ikkunassa muuttujan riviä. Lisätään ensin breakpoint riville, jossa on kirjoituskäsky ledeille: IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led); Ajamalla ohjelmaa Resume painikkeella nähdään, miten ledeille kirjoitettava arvo muuttuu joka kierroksella.

31 Käskykantasimulaattorin tarkempi käyttöohje löytyy NIOS II IDE:ssä Help-valikon kautta. Help-valikon tiedot ovat saatavilla myös pdf-muodossa: NIOS II IDE Help Topics. 6.2 Testaus RTL-simulaattorilla Koko suunnitelmaa voidaan testata myös ModelSim-simulaattorilla. RTL-tason simulointi mahdollistaa sisäisten rekisterien ja signaalien tarkkailun, joten se on hyvin tehokas menetelmä prosessorin ja oheiskomponenttien testaukseen. Tässä ohjeistossa ei käsitellä RTL-tason simulointia tarkemmin. Tarkat ohjeet RTL-simulointia varten löytyvät dokumentista Simulating Nios II Embedded Processor Designs. 6.3 Testaus kehitysalustalla Kun ohjelma ja kovo ovat valmiita, niitä voidaan testata kehitysalustalla. Kovo on ensin ladattava kehitysalustan FPGA-piiriin, minkä jälkeen ohjelmaa voidaan ajaa oikeassa kovoympäristössä kehitysalustalla. 6.3.1 Kehitysalustan kytkennät Kehitysalustan käyttöönotto tehdään seuraavasti: 1. Kytketään USB-kaapeli PC:hen ja USB-Blasteriin. 2. Kytketään USB-Blasterin kaapeli kehitysalustan JTAG-liittimeen J24, joka on Ethernet-liittimen vieressä. 3. LCD-näyttö kytketään liittimeen J12. 4. Kytketään muuntajan johto liittimeen J26. Tarkat ohjeet asennuksesta ja käyttöönotosta löytyvät dokumentista USB-Blaster Download Cable User Guide. HUOM! Varmista, että LCD-näyttö on kytketty oikein. LCD-näyttö rikkoutuu, jos se kytketään väärään liittimeen tai väärin päin liittimeen J12. HUOM! Kun käyttö lopetetaan, irroitetaan ensin muuntajan johto, sitten USB-Blasterin kaapeli kehitysalustalta ja viimeksi PC:n USB-kaapeli.

32 Kuva 37. Alteran kehitysalustan kytkennät. Kehitysalustalla on myös RS-232 sarjaliitäntä ja Ethernet-liityntä, joita voidaan käyttää, jos NIOS II:een on otettu vastaavat moduulit konfigurointivaiheessa. 6.3.2 Kovon lataus piirille Quartus II muodostaa käännöksen tuloksena projektihakemistoon piirin ohjelmointitiedoston, jonka tunnuksena on.sof (SRAM Object file). Tämä tiedosto ladataan FPGA-piirille. Kovon lataus tehdään Programmer-työkalulla, joka voidaan käynnistää Quartus II:sta tai NIOS II IDE:stä. Quartus II:ssa Tools-menusta valitaan Programmer, ja NIOS II IDE:ssä Tools-menusta valitaan Quartus II Programmer. Programmer ottaa ladattavaksi tiedostoksi oletuksena automaattisesti viimeksi käännetyn.sof-tiedoston. Mikäli tiedostoa ei ole tai tiedosto ei ole oikea, haetaan oikea tiedosto Change File tai Add File -painikkeella. Seuraavaksi valitaan Program/Configure-optio. Lopuksi varmistetaan, että ohjelmointilaitteena on Hardware Setup -kohdassa on USB Blaster [USB-0] ja Modekohdassa on JTAG kuvan 43 mukaisesti.

33 Kuva 38. Programmer käyttöliittymä. Ohjelmointilaitteen asetuksen voi tarvittaessa muuttaa Hardware Setup painikkeella, josta avautuu Hardware Setup -ikkuna (kuva 44). Kuva 39. Ohjelmointilaitteen asetus. Asetusten jälkeen.sof-tiedoston lataus käynnistetään Start-painikkeella. Lataus kestää lyhyen aikaa ja eteneminen näkyy Progress-ikkunassa. Jos suunnitelmassa on käytetty Alteran aikarajoitettuja megafunktioita, suunnitelmaa ei voi ladata pysyvästi FPGA:lle. Kovo on piirillä vain niin kauan kuin Programmer on käynnissä. Suunnitelmaa voidaan testata, mutta oikeaa piiriä ei voida toteuttaa ilman megafunktioiden lisenssejä. Kuva 40. Ilmoitus aikarajoitettujen funktioiden käytöstä.

34 6.3.3 Ohjelman lataus ja ajo Kun suunnitelman kovo on ladattu FPGA-piirille, kehitettyä ohjelmaa voidaan ajaa suoraan tai debug-moodissa piirin NIOS II prosessorilla. Normaali ohjelman ajo käynnistetään klikkaamalla hiiren oikealla napilla projektia ja valitsemalla Run As ja sitten NIOS II Hardware. Prosessori alkaa suorittaa koodia. Jos käännökset ja lataukset ovat onnistuneet, hello_led.c ohjelma vilkuttaa ledejä edestakaisin. Jos FPGA-piirille ladattu NIOS II prosessori ei ole sama kuin IDE:n käyttämä, ajon käynnistys antaa seuraavan virheilmoituksen: Reading System ID at address 0xnnnnnnnn: does not match ID value does not match: read 0xmmmmmmmm; expected 0xpppppppp Timestamp value does not match: image on board is newer than expected Read timestamp hh:mm:ss yyy/mm/dd; expected HH:MM:SS YYYY/MM/DD The software you are downloading may not run on the system which is currently configured into the device. Please download the correct SOF or recompile. Restarting target processor Tällöin piirille on ladattava oikea.sof-tiedosto kappaleen 6.3.2 mukaan. Debug-moodi käynnistetään klikkaamalla hiiren oikealla napilla projektia ja valitsemalla Debug As ja sitten NIOS II Hardware. Kun hello_led.c ohjelma toimii, sitä voidaan muuttaa, jotta painonappien toiminta voidaan testata. SOPC Builderissa NIOS II -prosessorille määriteltiin normaali tulo button_0 ja keskeytyspyyntötulo button_1. Painonapin button_0 tila voidaan lukea IORD_ALTERA_AVALON_PIO_DATA() makrolla ja painonappia button_1 varten kirjoitetaan keskeuytyspalvelurutiini. Lisätään ohjelmaan kaksi muuttujaa: edge_capture ja irq_received. Ensinmainittuun luetaan edgecapturerekisterin arvo. Toisen muuttujan arvoksi asetetaan 1, kun keskeytyspyyntö on tullut. Lisätään hello_led.c ohjelmaan #include lauseiden jälkeen: /* Uusien muuttujien määrittely. */ volatile int edge_capture; static alt_u8 irq_received = 0; Sitten kirjoitetaan handle_button_interrupt() keskeytyspalvelurutiini, joka sytyttää ledit kirjoittamalla 0 ledien ohjaukseen. Lisäksi asetetaan irq_received muuttujan arvoksi 1. Koska keskeytyspyyntölinjoja on vain yksi, ei tarvitse tutkia, mikä bitti aiheutti kesketyspyynnön.

35 /* Keskytyspalvelurutiini */ static void handle_button_interrupt(void* context, alt_u32 id) { /* Cast operaatio. */ volatile int* edge_capture_ptr = (volatile int*) context; /* Tallennetaan edgecapturerekisterin arvo. */ *edge_capture_ptr = IORD_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_1_BASE); /* Nollataan edgecapturerekisteri. */ IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_1_BASE, 0); } /* sytytetään ledit ja asetetaan irq_received 1:ksi */ IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0x00); irq_received = 1; Sitten tehdään init_button_pio() ohjelma, joka alustaa keskeytyspyynnön toimintaan: static void init_button_pio() /* Keskeytyspyynnön alustusohjelma. */ { /* cast operaatio. */ void* edge_capture_ptr = (void*) &edge_capture; /* Keskeytyksen sallinta. */ IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_1_BASE, 0x1); /* edgecapturerekisterin nollaus. */ IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_1_BASE, 0x0); /* Keskeytyskäsittelijän rekisteröinti. */ alt_irq_register( BUTTON_1_IRQ, edge_capture_ptr, handle_button_interrupt); } Lopuksi muutetaan pääohjelmaa siten, että aloituskohdaksi tulee main(). Toiminnan aluksi sytytetään ledit ja odotetaan button_0:n painamista. Kun button_0:aa on painettu, mennään while(1) silmukkaan. Silmukassa luetaan button_0:n tila ja niin kauan kuin button_0:aa painetaan, ledit ovat pimeinä. Sitten tutkitaan muuttujan irq_received arvo. Jos arvo on 1, keskeytyspyyntö on tullut ja ledit on sytytetty handle_button_interrupt() ISR:ssä. Pääohjelmassa odotetaan button_0:n painamista ennen kuin jatketaan. Tämän jälkeen jatkuu alkuperäinen ohjelma. Ohjelmassa korvataan rivistä int main (void) attribute ((weak, alias ("alt_main"))); alkaen riville if (led & 0x81) asti seuraavalla koodilla:

36 int main (void) { alt_u8 led = 0x2; alt_u8 dir = 0; alt_u8 button_0 = 1; volatile int i; /* Alustus. */ init_button_pio(); /* Sytytetään ledit ja odotetaan button_0:n painamista */ IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0x00); while (button_0 == 1) { button_0 = IORD_ALTERA_AVALON_PIO_DATA(BUTTON_0_BASE); } while (1) { /* Painetaanko button_0:aa? */ button_0 = IORD_ALTERA_AVALON_PIO_DATA(BUTTON_0_BASE); while (button_0 == 0) { IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0xff); button_0 = IORD_ALTERA_AVALON_PIO_DATA(BUTTON_0_BASE); } /* Onko keskeytyspyyntö tullut? */ while (irq_received == 1) { /* Odotetaan button_0:n painamista. */ button_0 = IORD_ALTERA_AVALON_PIO_DATA(BUTTON_0_BASE); if (button_0 == 0) { irq_received = 0; } } /* Tästä jatkuu alkuperäinen ohjelma... if (led & 0x81) */ Muutoksen jälkeen ohjelma käännetään ja linkitetään Build Project komennolla kappaleen 5.1 mukaisesti. Ohjelman suoritus käynnistetään klikkaamalla projektia hiiren oikealla napilla ja valitsemalla Run As ja NIOS II Hardware komennot tämän kappaleen ohjeiden mukaisesti.

37 Liite A. Tärkeimmät tiedostotyypit Quartus II muodostaa ja käyttää hyvin monia tiedostotyyppejä. Tähän taulukkoon on kerätty tärkeimmät tiedostotyypit ja niiden käyttötarkoitus. Taulukko 2.Quartus II:n tärkeimmät tiedostotyypit. Tunnus Käyttötarkoitus.qpf (Quartus Project File) Projektin tiedot..bdf (Block Description File) Piirikaavio..bsf (Block Symbol File) Komponentin lohkosymboli, jota piirikaavioeditori käyttää..elf (Executable File) Käännetty suoritettava ohjelmakoodi..sof (SRAM Object File) FPGA-piirin ohjelmointitiedosto..vhd (VHSIC Hardware Description Language) SOPC Builderin, MegaWizard Plug-In managerin tai suunnittelijan tuottamia kovonkuvaustiedostoja.

38 Liite B. HAL-tietotyypit HAL:n käyttämät tietotyypit ANSI C tietotyyppien lisäksi. Taulukko 3.HAL-tietotyypit. Nimi Tietotyyppi alt_8 Signed 8-bit integer. alt_u8 Unsigned 8-bit integer. alt_16 Signed 16-bit integer. alt_u16 Unsigned 16-bit integer. alt_32 Signed 32-bit integer. alt_u32 Unsigned 32-bit integer. alt_64 Signed 64-bit integer. alt_u64 Unsigned 64-bit integer.

39 Liite C. Ulkoisten muistipiirien käyttö Jos piirin sisäisen muistin koko ei riitä, FPGA-piirin yhteydessä voidaan käyttää ulkoisia muistipiirejä. Ulkoiset muistit ovat hitaampia kuin sisäiset, mutta ulkoisten muistien käytöllä on seuraavia etuja: Ulkoinen muisti on halvempaa kuin piirin sisäinen muisti. Ulkoisen muistin kokoa rajoittaa vain Avalon-väylän 32-bittinen osoiteväylä. Ulkoista ROM-tyyppistä muistia (kuten FLASH) voidaan käyttää haihtumattoman muistin varastona. Useat ulkoiset muistipiirit voivat käyttää yhteistä data- ja osoiteväylää FPGA:n pinnien säästämiseksi. Alteran kehitysalustalla on kaksi muistipiiriä, joita voi käyttää ulkoisena muistina: 32bittinen 2 megatavun SSRAM-muistipiiri (U74, CY7C1380C-167AC) ja 32-bittinen 32 megatavun SDRAM-muistipiiri (U63, MT46V16M16P-6T). SOPC Builderissa on liityntälohko valmiina komponenttina molemmille muistipiireille SOPC Builderin Memory-ryhmässä: Cypress CY7C1380C SSRAM. DDR SDRAM Controller Megafunction. Muistipiirin liitäntälohkoon kuuluu Avalon MM (Memory Mapped) Tristate Bridge komponentti, jonka SOPC Builder ottaa automaattisesti mukaan. Se kytkeytyy FPGApiirin sisäiseen logiikkaan sekä ulkoiseen muistipiiriin. Avalon MM Tristate Bridge komponentin osoitteet ovat tavuosoitteita, joten 32-bittisiä muistipiirejä käytettäessä jätetään kaksi alinta Avalon-väylän osoitebittiä address[0] ja address[1] kytkemättä. Avalon-väylän osoitebitti address[2] kytketään muistipiirin A0osoitebittiin, Avalon-väylän osoitebitti address[3] muistipiirin A1-osoitebitiin jne. Kuvassa 22 on esimerkki, miltä liitäntä kehitysalustan 32-bittiseen SSRAMmuistipiiriin näyttää piirikaavioeditorissa. Kuva 41. Liitäntä ulkoiseen SSRAM-muistipiiriin. Kehitysalustan kytkennät muistipiirien ja FPGA-piirin välillä löytyvät dokumentista Nios Development Board Stratix II Edition Reference Manual, taulukot 2 6 ja 2 7. Ulkoiset muistipiirit on kytkettävä kappaleen 4.2 mukaan. Helpoin tapa kytkentäalustan muistien käyttöönottoon on kopioida valmis prosessorikomponentti ja poistaa tarpeettomat osat. Valmiita prosessorikomponentteja Alteran kytkentäalustaa varten on

40 hakemiston \altera\<versio>\nios2eds\examples\vhdl\niosii_stratixii_2s60_rohs alihakemistoissa fast, full_featured, small ja standard. Ulkoisten muistipiirien käyttöönottoa on kuvattu tarkemmin dokumenteissa Quartus II Handbook Volume 4: SOPC Builder (kappale 8: Building Memory Subsystems Using SOPC Builder) ja Quartus II Handbook Volume 5: Embedded Peripherals (Section I: Memory Peripherals).

41 Liite D. MegaWizard Plug-In Manager Altera tarjoaa suunnittelun tueksi parametroitavia ns. megafunktioita, jotka on optimoitu Alteran piiriarkkitehtuureihin. Megafunktioiden käyttö säästää suunnittteluaikaa ja tulokset synteesin sekä piiritoteutuksen kannalta ovat usein yhtä hyviä kuin käsin koodatuilla komponenteilla. Megafunktioilla tarkoitetaan LPM- (Library of Parameterized Functions) komponentteja ja Alteran piirikohtaisia megafunktioita. Esimerkkejä megafunktioista ovat aritmetiikka- ja DSP-lohkot, liitäntä- ja I/Okomponentit sekä erilaiset muisti- ja rekisterikomponentit. MegaWizard Plug-In Manager on työkalu, jonka avulla suunnittelija ottaa käyttöön megafunktiot. Samalla työkalu varmistaa, että kaikki annetut parametrit ovat kelvollisia. Tuloksena muodostetaan komponentin vhdl-tiedostot ja komponenttisymboli, joita käytetään Quartus II:ssa. Jos prosessorin ja oheislaitteiden konfiguroinnin yhteydessä valitaan megafunktio, SOPC Builder avaa MegaWizard Plug-In Manager:in kyseistä megafunktiota varten. Se voidaan käynnistää piirikaaviota piirrettäessä myös Tool-valikosta. Ensimmäisessä ikkunassa [Page 1] valitaan Create a new custom megafunction variation ja painetaan Next. Toisessa ikkunassa [Page 2a] on komponenttiryhmät, jotka ovat käytössä. Valitaan tiedostotyypiksi VHDL ja annetaan komponentille nimi. Kuvassa 26 on esitetty vaihelukitun silmukan (PLL, Phase-Locked Loop) valinta. Kuva 42. PLL-komponentin valinta MegaWizard Plug-In Managerissa. Komponentin valinnan jälkeen painetaan Next ja MegaWizard Plug-In Manager avaa komponenttikohtaisen ikkunan, johon annetaan halutut parametrit. Esimerkkinä on kuvassa 27 PLL:n ensimmäinen komponenttikohtainen ikkuna. Ikkunoiden ja tarvittavien parametrien määrä riippuu komponenttityypistä.

42 Kuva 43. PLL-komponentin ensimmäinen parametrointi-ikkuna. Kun kaikki parametrit on annettu, painetaan Finish. MegaWizard Plug-In Manager luo komponenttisymbolin, joka otetaan piirikaavioeditorissa käyttöön Project-kirjastosta kappaleessa 4.1 kuvatulla tavalla samoin kuin NIOS II.

43 Liite E. Ohjelmallinen digitaalinen I/O Digitaalinen tiedonsiirto prosessorin ja FPGA-piirin sisäisen logiikan tai ulkoisten komponenttien välillä toteutetaan PIO-komponenttien rekistereiden avulla. PIO-komponentin rekisterit Digitaalinen I/O-toteutetaan SOPC Builderissa PIO-komponenteilla. PIO-komponentit liittyvät Avalon-väylään ja yhden PIO:n bittimäärä on maksimissaan 32. Kukin PIOkomponentti voidaan konfiguroida: Tuloksi (Input ports only). Lähdöksi (Output ports only). Kaksisuuntaiseksi (Bidirectional tristate ports). Sekä tulo- että lähtökomponentiksi (Both input and output ports). Viimeisessä tapauksessa PIO:lla on sama määrä erillisiä tulo- ja lähtöbittejä. Konfiguroinnin jälkeen PIO:n tyyppiä voi muuttaa vain SOPC Builderissa. Tyypistä riippuen PIO:lla on vaihteleva määrä rekistereitä, joita voidaan kirjoittaa ja lukea ohjelmallisesti makrojen avulla. Rekisterien bittimäärä on sama kuin PIO:n bittimäärä. Kaikilla PIO-komponenteilla on datarekisteri. Kun sitä luetaan, tuloksena saadaan tulobiteissä oleva arvo. Jos PIO on konfiguroitu lähdöksi, tuloksena saadaan määrittelemätön arvo. Kun datarekisteriin kirjoitetaan, kirjoitettu arvo menee lähtöporttia ohjaavan rekisterin arvoksi. Jos PIO on konfiguroitu tuloksi, kirjoituksella ei ole mitään vaikutusta. Kaksisuuntaisilla PIO-komponenteilla on myös directionrekisteri, jossa kukin bitti määrää vastaavan databitin suunnan. Bitin arvo 0 asettaa vastaavan databitin tuloksi ja bitin arvo 1 lähdöksi. Kuva 44. Kaksisuuntainen 32-bittinen PIO-komponentti. Jos PIO on konfiguroitu tuottamaan keskeytyspyyntöjä, sillä on myös interruptmaskrekisteri, jossa kukin bitti kieltää/sallii vastaavan databitin aiheuttaman keskeytyspyynnön. Bitin arvolla 0 kyseinen keskeytyspyyntö on kielletty ja arvolla 1 sallittu. PIO, joka on tulo, voidaan konfiguroida havaitsemaan tulobittien reunoja (low-to-high, high-to-low tai molempia). Tällöin sillä on myös edgecapturerekisteri, jossa bitti

44 asettuu ykköseksi, kun vastaavassa databitissä tapahtuu oikeanlainen muutos. Edgecapture-rekisteriin kirjoittaminen nollaa rekisterin sisällön. Kuva 45. PIO tulo- ja lähtökomponenttina, joka on konfiguroitu tuottamaan keskeytyspyyntö. Keskeytyspyyntö (IRQ, Interrupt Request) voidaan asettaa tasoherkäksi tai reunaherkäksi. Tasoherkässä tapauksessa PIO antaa keskeytyspyynnön, kun tulobitin arvo on ykkönen ja kyseinen keskeytyspyyntö on sallittu. Reunaherkässä tapauksessa PIO antaa keskeytyspyynnön, kun edgecapturerekisterin bitti asettuu ykköseksi ja kyseinen keskeytys on sallittu. PIO antaa vain yhden keskeytyspyynnön prosessorille, vaikka useampi tulobitti pyytää keskeytystä yhtä aikaa. Jos useampi tulobitti voi antaa keskeytyspyynnön, sen aiheuttaja on selvitettävä ohjelmallisesti lukemalla joko datarekisteri (tasoherkkä) tai edgecapturerekisteri (reunaherkkä). I/O-tiedon luku ja kirjoitus Kun PIO-komponentteja käytetään ohjelmassa, on tiedettävä komponentin kantaosoite. Kantaosoitteet löytyvät system.h tiedostosta ja ne muodostetaan SOPC Builderissa annetun nimen perusteella (isoilla kirjaimilla) seuraavasti: <nimi_sopc_builderissa>_base Esimerkkisuunnitelmassa annettiin tuloille nimet button_0 ja button_1. Näitä vastaavat kantaosoitteet ovat BUTTON_0_BASE ja BUTTON_1_BASE. Lähdön nimeksi annettiin led_pio, jonka kantaosoite on LED_PIO_BASE. Rekisterien luku ja kirjoitus tehdään makrojen avulla. NIOS II IDE muodostaa projektin rakentamisen yhteydessä regs.h tiedoston, jossa määritellään komponenttien rekisterien luku- ja kirjoitusmakrot, osoitemakrot sekä bittien maskaus- ja osoitemakrot. Kirjoitus- ja lukumakrot ovat muotoa: IORD_<komponentin_tyyppinimi>_<rekisterin_nimi>(kantaosoite) IOWR_<komponentin_tyyppinimi>_<rekisterin_nimi>(kantaosoite, data) PIO-komponentin tyyppinimi on ALTERA_AVALON_PIO ja rekisterien nimet ovat DATA, DIRECTION, IRQ_MSK sekä EDGE_CAP. Kun tulon arvo halutaan lukea, käytetään IORD-makroa ja luetaan DATA-rekisterin sisältö. Kun lähdön arvo halutaan asettaa, käytetään IOWR-makroa ja kirjoitetaan DATArekisteriin haluttu arvo. Esimerkkinä button_0 tulon luku ja arvon 0xf0 led_pio lähtöön kirjoittaminen: