• Ei tuloksia

Harjoitustyön implementointi Johdatus sulautettuihin järjestelmiin

N/A
N/A
Info
Lataa
Protected

Academic year: 2022

Jaa "Harjoitustyön implementointi Johdatus sulautettuihin järjestelmiin"

Copied!
61
0
0

Kokoteksti

(1)

HARJOITUSTYÖN IMPLEMENTOINTI JOHDATUS SULAUTETTUIHIN JÄRJESTELMIIN

Informaatioteknologian ja viestinnän tiedekunta Diplomityö Syyskuu 2021

(2)

TIIVISTELMÄ

Matti Rasinen: Harjoitustyön implementointi Johdatus sulautettuihin järjestelmiin Diplomityö

Tampereen yliopisto

Tietotekniikan diplomi-insinöörin tutkinto-ohjelma Syyskuu 2021

Diplomityössä tutkittiin kolmea asiaa liittyen uuteen Johdatus Sulautettuihin järjestelmiin kurs- siin: Onko PYNQ-Z1 alustalle mahdollista suunnitella harjoitustyö laitteistoläheiseen ohjelmointiin liittyen, minkälainen materiaali sopii tähän tarkoitukseen, sekä miten näiden tuloksien perusteella harjoitustyötä kannattaa jatkokehittää.

Harjoitustyö suunniteltiin muutamasta eri pohja-ajatuksesta: ensinnäkin tiedossa oli, että har- joitustyöhön pitäisi opiskelijalta kulua suunnilleen 20 tuntia. Toisekseen suunnittelun lähtökohtana oli suunnitella sama peli mitä Ohjelmointi 1:llä sekä Digital Design-kurssilla on, eli tykkipeli/aliens- hooter.

Harjoitustyön alkusuunnitteluvaiheessa heti ilmeni, että kaikki tarvittavat PYNQ-Z1 käyttämän Zynq-piirin pinnit on kytketty FPGA:lle, eli niitä ei pysty täysin suoraan ohjaamaan Zynq:n Cortex- A9 prosessorilla. Tähän onneksi oli kiertotienä käyttää Xilinx:n tarjoamaa AXI-GPIO IP:tä joka mahdollistaa lähtevien pinnien ohjaamisen suoraan prosessorilta FPGA:n lävitse. Sisään päin tulevia pinnejä pystyi suoraan lukemaan EMIO:n lävitse, jolloin erillisiä AXI-GPIO lohkoja FPGA:lla ei tarvittu.

Itse harjoitustyöpohja opiskelijoille suunniteltiin lähtökohdasta, jossa opiskelijoiden ei tarvitsisi tietää keskeytyksistä mitään, vaan tarvitsisi hyödyntää vain valmiiksi annettua keskeytyspalvelu- funktiota. Syy tähän järjestelyyn on ettei Johdatus Sulautettuihin järjestelmiin kurssilla keskeytyk- set ole enään osa kurssialuetta, vaan keskeytykset opiskellaan toisella kurssilla.

Harjoitustyöhön suunniteltiin kolme eri harjoitustyömateriaalia, jotka erosivat toisistaan siten, että A-materiaalissa kerrottiin vain välttämätön asia, B-materiaalissa kerrotaan lisäksi oleellisim- mat C-kielen asiat harjoitustyöhön liittyen, kuten silmukkarakenteet, taulut, osoittimet sekä kai- kista tärkeimpänä asiana bittimanipulaatio operaatiot. C-materiaaliin näiden lisäksi on paljastettu myös puoliksi pseudokoodina miten yhden bitin tiedonsiirto toimisi.

Harjoitustyön tuloksista voidaan päätellä, että opiskelijat riippumatta jaetusta materiaalista, tar- vitsisivat enemmän ohjeistusta LED-matriisin saattamiseen toimintaan asti. Tähän ratkaisuna on jakaa vain yksi materiaali lisätyillä ohjeistuksella, sekä pitää asiasta aloitusluento, jossa voidaan käydä lävitse opiskelijoille vaikeimmat asiat. Harjoitustyö oli siinä mielessä onnistunut, että sen tekemiseen opiskelijoilta kului keskimäärin 20 tuntia.

Harjoitustyöhön myös suunniteltiin jatkokehityksenä helpompi versio, jossa opiskelijoiden ei tarvitse tietää LED-matriisin toiminnasta mitään, vaan FPGA:lle suunniteltu ohjain ohjaa matriisia automaattisesti. Opiskelijoiden tarvitsee vain kirjoittaa kahteen eri muistiosoitteeseen piirrettävän pikselin koordinaatti, sekä tämän pikselin uudet kirkkaudet. Helpotetussakin versiossa keskeytys- palvelijoita on myöskin pakko käyttää.

Diplomityössä myös tutkittiin ongelmaa, missä LED-matriisi ei aina toiminut oikein. Tähän yksi ratkaisu on käyttää suunniteltua väliadapteria, joka nostaa Zynq-piiriltä olevan lähdön jännitteen 5V tasolle, jolloin jännite on DM163-piirin datalehden määrittelyjen mukainen.

Avainsanat: SoC kehitysalusta, ARM, FPGA, Projektityö, C-kieli

Tämän julkaisun alkuperäisyys on tarkastettu Turnitin OriginalityCheck -ohjelmalla.

(3)

ABSTRACT

Matti Rasinen: Implementation of project work into Introduction to embedded systems Master of Science Thesis

Tampere University

Master’s Programme in Information Technology September 2021

In this master’s thesis, there was three research topics related to new Introduction to embed- ded systems-course. Is it possible to design bare metal project work with PYNQ-Z1, what kind of material would be best for it and how to improve project work using gained research results.

Base of the project work was that it should take about 20 hours to complete. Also, goal was to design same game that is used in Programming 1-course and in Digital Design-course. The game is cannon/alien shooter.

At start of designing this project work, it occurred that every pin needed in PYNQ-Z1 by this project work, was connected to FPGA side of the Zynq-chip. This means it was impossible to use Cortex-A9 to directly control state of outgoing pins. Workaround for this was to use AXI-GPIO IP offered by Xilinx to make basically pass-through to FPGA. This way it’s possible to control those pins using Cortex-A9 processor. However, inputs don’t require usage of AXI-GPIO IP, since it’s possible to route wires trough FPGA to EMIO interface.

Project work by itself was design in mind that students wouldn’t need to know anything about interrupts, but rather utilize given interrupt handler-functions. Reason for this was simply that interrupts aren’t part of Introduction to Embedded Systems course, but rather interrupts are part of later course.

For this project work, three different guidance material was made. A-material only told about very essential things needed for this project work. In B-material same material that was told in A- material plus some basic C-language coding examples. Examples are how to use loops, arrays, pointers and most important, how to use bit-manipulation operations. C-material also includes same guides as found in A and B but also includes pseudo example how to transmit one bit.

Results of research told that no matter the distributed material, most common student feed- back was to give more guidance how to make LED-matrix work. Solution to this was to merge all material into one and in future, do project work startup lecture where it possible to teach most difficult parts of project work. Project work was successful in manner of how much time students used for it since average was about 20 hours.

Additionally, as improvement, easier version of project work was also designed. In this easier version students don’t have to know anything about how LED-matrix works but is only required to know how to access two registers in designed FPGA controller. These two registers contain information in which coordinate to update and what color values. However, in this easier version it’s mandatory to use interrupt handlers same as in the normal version.

In this master’s thesis, there was also minor study why LED-matrix didn’t work always correctly.

One solution to this problem was to use designed adapter to boost voltage to 5 V level to match IO-voltage specified in DM163 datasheet.

Keywords: SoC development board, ARM, FPGA, Projectwork, C-language

The originality of this thesis has been checked using the Turnitin OriginalityCheck service.

(4)

ALKUSANAT

Tämä diplomityö on kirjoitettu Tampereen yliopistolle (entinen Tampereen Teknillinen Yli- opisto) Tietotekniikan yksikölle osana kurssi uudistussa missä vanhat Mikroprosessorit- kurssi sekä johdatus digitaalitekniikkaan/ jää pois ja tilalle tulee uusi Johdatus sulau- tettuihin järjestelmiin. Kurssiuudistuksen lisäksi käytetty SoC-kehitystyöalustakin vaihtuu uudempaan. Diplomityön testaus opiskelijoilla suoritettiin syksyllä 2018.

Tämä diplomityö antoi minulle peruskäsityksen minkälaista SoC-kehitys on pohjatasolla, sekä tuntemusta millaisia ongelmia opiskelijoille voi tulla mikäli aikaisempaa kokemusta sulautetuista järjestelmistä ei ole.

Viimeisenä haluan kiittää vanhempiani henkisestä tuesta opiskelijuni aikana, sekä iso- veljeäni neuvojen antamisesta työelämään liittyen. Lisäksi haluan kiittää Tampereen Elekt- roniikkan Opiskelijoiden Kerhoa (TELOK) erinomaisesta mahdollisuudesta päästä har- rastamaan heidän tiloissaan elektroniikan ja sulautettujen järjestelmien projekteja.

Tampereella, 1. syyskuuta 2021 Matti Rasinen

(5)

SISÄLLYSLUETTELO

Lyhenteet ja merkinnät . . . v

1 Johdanto . . . 1

2 Tausta . . . 2

2.1 Harjoitustyö uudistuksen syy . . . 2

2.2 Kehitysalusta ja ympäristö . . . 3

3 Harjoitustyön suunnittelu . . . 10

3.1 Rauta osuuden suunnittelu . . . 10

3.2 Harjoitustyön ohjelmiston pohjan suunnittelu . . . 15

3.3 Materiaalin suunnittelu . . . 25

4 Harjoitustyön Testaaminen . . . 29

4.1 Harjoitustyön käytännön järjestelyt . . . 29

4.2 Harjoitustyössä esiintyneet ongelmat opiskelijoilla . . . 30

5 Tulokset . . . 33

5.1 Mittaustulokset . . . 33

5.2 Opiskelijoiden palaute . . . 35

6 Jatkokehitys . . . 40

6.1 Materiaalin parannus . . . 40

6.2 Harjoitustyön vaihtoehtoisen version kehitys . . . 40

6.3 Bonus tehtävä . . . 42

6.4 LED-matriisin toimivuuden varmistaminen kaikilla tehonsyöttölähteillä . . . 43

7 Yhteenveto . . . 50

Lähdeluettelo . . . 51

Liite A Puskuripiirilevyn kytkentäkaavio . . . 53

Liite B Puskuripiirilevyn leiskan yläpuoli . . . 54

Liite C Puskuripiirilevyn leiskan alapuoli . . . 55

(6)

LYHENTEET JA MERKINNÄT

BSP Board Support Backage

EMIO Extendet Multiplexed Input Output FPGA Field Programable Gate Array GIC General Interrupt Controller GPIO General Peripheral Input Output HDF Hardware Description File HPS Hard Processing System

IDE Integrated Development Environment IP Intellectual Property

LED Light Emitting diode LUT Look Up Table PLL Phase Locket Loop PWM Pulse Witdh Modulation SCK Serial Clock

SDA Serial Data SoC System on Chip

Tcl Tool Command Language TTC Triple Timer Counter

(7)

1 JOHDANTO

Tässä diplomityössä tutkitaan uuden harjoitustyön suunnittelua ja implementointia uudel- le Johdatus Sulautettuihin järjestelmiin- kurssille, joka korvaa vanhan mikroprosessorit, johdatus digitaalitekniikkaan (sähkötekniikan opiskelijoille) sekä johdatus tietotekniikkaan (tietotekniikan opiskelijat). Nämä kaksi kurssia on sulautettu yhdeksi viiden opintopisteen kurssiksi.

Diplomityön tutkimusmenetelminä käytetään kolmen eri tasoisen materiaalin suunnitte- lusta ja jakamisesta opiskelijoille heidän ohjelmointitaustastaan riippuen, sekä tutkitaan tämän vaikutusta tunti assistentin kuormitukseen, opiskelijoiden ajankäyttöön sekä ylei- sesti tästä seuraavan vaikutusta opiskelijapalautteeseen. Kokemuksien perusteella puo- lestaan harjoitustyötä sekä ohjeistusta muokataan siihen suuntaan mitä opiskelijat ovat antaneet palautetta. Tarkoituksena kumminkin on että opiskelijat saisivat edes pintapuoli- sen käsityksen mitä sulautettu ohjelmointi on ilman että kurssin henkilökuntaa tai opiske- lijoita kuormitettaisiin suhteettoman paljon. Harjoitustyö myös suunnitellaan näkökulmas- ta, että opiskelijat tekevät sen projektityönä. Tätä voidaan perustella kahdesta syystä:

ensinnäkin harjoitustyöhön mitoitettu 20 tuntia tukee projektityömuotoa, sillä osapalau- tukset vain kuluttaisivat turhaa aikaa. Toinen syy on tutkittu tieto, että projektityömuoto sopii kun tarvitsee soveltaa osittain jo olemassa olevaa tietoa ja kun uutta tietoa etsi- tään itsenäisesti [9]. Lisäksi ryhmässä suoritettavassa projektityössä opiskelijat saavat helposti vertaistukea toisiltaan. Viimeisenä diplomityössä on myös tutkittu osittain PYNQ- Z1 alustaan liittyvää ongelmaa LED-matriisin toimivuuden kanssa eri tehonsyöttö kombi- naatioilla. Kappaleessa 2 käydään lävitse diplomityöhön liittyvistä taustoista, kappalees- sa 3 harjoitustyöhön liittyvästä suunnittelusta, kappaleessa 4 harjoitustyön testaamisesta, kappaleessa 5 harjoitustyön testaamiseen liittyvistä tuloksista, Kappaleessa 6 harjoitus- työhön liittyvästä jatkokehityksestä, että LED-matriisin ongelman tutkintaa. Viimeisenä, kappaleessa 7 on yhteenveto.

(8)

2 TAUSTA

Tässä kappaleessa käydään läpi Diplomityön taustoista sekä kerrotaan käytettyjen kehi- tysalustojen ja ympäristöjen taustoista.

2.1 Harjoitustyö uudistuksen syy

Diplomityön aloitushetkellä syksyllä 2018 useilla eri Tietotekniikan laboratorion kursseilla, joissa harjoitustyö tehdään joko prosessorille tai FPGA:lle on käytössä useita eri kehity- salustoja. Esimerkiksi Logiikkasynteesi ja Digitaalisuunnittelun kurssilla oli aikaisemmin käytössä Terasic:n Altera DE2-kehitysalusta, joka on jo reippaasti yli 10-vuotta vanha.

System Design ja Mikroprosessori kurssilla oli puolestaan käytössä Alteran Cyclone V pohjainen SoC (System on Chip) kehitysalusta. Tästä seurasi, että eri kursseilla oli eri ke- hitysympäristöt käytössä. Nyt kun kaikilla kursseilla ollaan tai ollaan siirtymässä PYNQ- Z1 kehitysalustan käyttöön, niin eri kurssien väleillä ei enää tarvitse niin paljon perehtyä työkalujen ja kehitysalustan käyttöön mitä aikaisemmin. Kuvassa 2.1 mikroprosessorit- kurssilla käytetty vanha alusta.

(9)

Kuva 2.1.Mikroprosessorit-kurssin vanha harjoitustyöalusta [13]

Toinen syy minkä takia harjoitustyötä halutaan uudistaa tälle kurssille on se, että opiskeli- joille olisi tarkoitus antaa ensikosketus sulautettuihin järjestelmiin Ohjelmointi 1: johdatus- kurssilla. Tällä kurssilla opiskelijat ohjelmoivat PYNQ-Z1-alustalla Alien shooter pelin käyt- täen Python-ohjelmointikieltä. Sama peli toistetaan myös Johdatus sulautettuihin järjes- telmiin ja Digitaalisuunnittelun kurssilla. Tämän tarkoituksena on antaa opiskelijoille eri näkökulmia sulautettuihin järjestelmiin suunnittelusta/ohjelmoimisesta. Ohjelmointi 1 an- taa peruskäsityksen korkealla tasolla ohjelmoimisesta sulautettuun kohteeseen ilman et- tä tarvitsee tietää raudasta mitään. Johdatus Sulautettuihin järjestelmiin antaa peruskä- sityksen laitteistoläheisemmästä ohjelmoinnista C-kielellä, kun Digitaalisuunnittelu antaa peruskäsityksen digitaalisen raudan suunnittelusta.

2.2 Kehitysalusta ja ympäristö

Kuten aikaisemmin mainittiin, niin kehitysalustana käytetään Digilent:n suunnittelemaa PYNQ-Z1 kehitysalustaa. Kehitysalusta käyttää Xilinx:n Zynq-7000 tuoteperheen SoC- piiriä: ZYNQ XC7Z020-1CLG400C. Tämä SoC-piiri sisältää 650MHz kellotaajuudella toi- mivan kaksiytimisen Cortex-A9 prosessorin, sekä Artix-7 tuoteperheen FPGA:n. Artix-7 piirin ominaisuuksiin kuuluvat 13300-logiikka siivua, joissa jokainen siivu sisältää neljä

(10)

6-sisääntulon LUT:a (Look Up Table) [4].

Kehitysalustan oleelliset ja tässä diplomityössä käytetyt IDE:t (Integrated Development Environment) ovat Xilinx Vivado, sekä Xilinx SDK. Vivadoa käytetään Digitaalisen raudan implementointiin Zynq-piirillä ja XSDK:ta prosessorin ohjelmiston suunnitteluun ja imple- mentointiin [20][21].

Mukana kehitysympäristössä on PYNQ-Z1 lisäksi DM163 ja M54564FP-piirit, jotka ovat osa ITeadstudio:n Color Shield:ä [8]. Kuvassa 2.2 on esitelty harjoitustyöhön tulevat lait- teistot. Vasemmalla on PYNQ-Z1 kehitysalusta, keskellä Color Shield ja oikealla LED- matriisi.

Kuva 2.2.Käytetyt laitteistot

DM163-piiri toimii tässä Color Shield:ssä LED-ajurina, eli tämän piirin avulla voidaan oh- jata LED:jä. LED:en ohjaaminen tapahtuu sarjamuotoisen tiedonsiirtoväylän avulla, joka on kytketty ohjaavaan laitteeseen, tämän ympäristön kohdalla, Zynq 7000-piiriin. Sarja- muotoinen tiedon siirto tapahtuu siten, että käytössä on linjat SDA (Serial Data) ja CLK (Clock). Yksi bitti siirtyy, kun CLK, eli kellolinja saa nousevan reunan, jolloin saatu tieto sarjatiedonsiirtolinjalta (SDA:lta) siirtyy DM163 siirtorekisterissä eteenpäin. Kuvassa 2.3 jokainen channel (kanava) vastaa yhtä lähtöä. Kuten datalehdelläkin on mainittu, niin läh- tö vaatii molempien rekisterien 6 ja 8-bittisten rekisterien asettamista. SELBK tai Color Shield:n mainitsemalla SB-linjalla voidaan puolestaan säätää kumpaan 6-, vai 8-bittiseen rekisteripankkiin sarjaliikenne tieto lähetetään [17].

(11)

Kuva 2.3.DM163:n siirtorekisteri [17]

Kuvassa 2.4 puolestaan voidaan nähdä että pelkästään tiedon siirto rekistereille ei riitä, vaan myös LAT-B tuloa tarvitsee myös käyttää. LAT-B tai Latch (Color Shieldin nimitys) signaalia käytetään päästämään tieto siirtorekistereiltä eteenpäin synkronisoidusti. Tämä toimii siten, että Lat-B signaaleihin kytketyt D-kiikut sisältävät invertterin kellolinjalla, eli Lat-B:n laskevalla reunalla data etenee D:ltä Q:lle.

(12)

Kuva 2.4.DM163:n lähtöjen säätö periaatteelinen toiminta ylempi osa [17]

Kun tieto on päässyt Latch-signaalin jälkeen etenemään siirtorekistereiltä, tieto siirtyy varsinaiseen lähtöjen ohjaus yksikköön 2.4. Tämän yksikön tarkoitus on tuottaa PWM (Pulse Width Modulation), eli Pulssileveysmodulaatio-signaalia lähtöön. Pulssileveysmo- dulaatiolla tarkoitetaan signaalia, jolla on vakio amplitudi, jaksonaika, aloitusajankohta, sekä usein vakio pulssinleveys [16]. Kuvassa 2.5 on esitelty yleisellä tasolla pulssinle- veysmodulaation toiminta periaatetta.

Kuva 2.5.Pulssinleveysmodulaation toiminta periaate

(13)

Pulssileveys modulaation tarkoitus on säätää kulutettua tehoa DM163 kytkettyihin LEDiin.

Yksinkertaisesti: mitä kapeampi signaali, sen suurempi kulutettu teho. Normaalisti tämä menisi toistepäin, mutta DM163 imee virtaa, joten lähdön signaalin ollessa 0, Led:n yli voi kulkea virtaa. Itse Pulssi leveys modulaation tuotto tapahtuu DM163-piirin 14-bittisen las- kurin, kahden komparaattorin, yhden AND-logiikan ja yhden D-kiikun avulla. 14-bittinen laskuri laskee ylöspäin jokaisen GCK-kellon nousevalla reunalla. GCK-kellon lähde puo- lestaan on 16MHz taajuudella toimiva kellokide Color shield:llä [8]. Komparaattoreiden idea tässä on verrata laskurin ja siirtorekistereiltä tulevaa arvoa. Jos komparaattorin po- sitiivinen sisääntulo on suurempi kuin negatiivinen, niin komparaattorin lähtö on 1-tilassa.

Molempien komparaattoreiden lähtöjen mennessä AND-portin sisääntuloon, on lähtö 1- tilassa vain silloin kun molemmista komparaattoreista saadaan 1-tila. AND-portti on myös kytketty D-kiikkuun, joka saa kellonsa GCK:lta, näin ollen pulssi leveys modulaation tuotto on sidottu GCK-kelloon. DM163:n toimiessa virtanieluna, Driver, eli lähdön ajuri invertoi DM163-piiriltä näkyvän signaalin.

Kuva 2.6.DM163:n lähtöjen säätö periaatteelinen toiminta alempi osa [17]

DM163-piiri ei voi kuitenkaan ohjata koko LED-matriisia yksin, sillä piirissä on vain 24 ohjattavaa virtanielua ja ne on kytketty siten, että piirin on mahdollista ohjata vain yhtä pystysuuntaista kolumnia kerrallaan (lähde color shield). Tämän takia Color Shield:ssä on

(14)

myös mukana M54564FP-piiri, joka toimii tässä ohjattavana virtalähdepiirinä [8]. M54564FP- piiri toimii siten että kun se saa jännitteen mihin tahansa tuloonsa, niin se pystyy anta- maan suunnilleen käyttöjännitteensä mukaista jännitettä. Tiivistetysti kuvan 2.7 kytkentä toimii sisääntulon saadessa 1-tilaa vastaava jännite, PYNQ:n tapauksessa 3.3V:a, ensim- mäisen npn-transistori vasemmalta nollaa sen kollektori jännitteen, jolloin pnp transistori sen vieressä pääsee saturaatio tilaan [11]. Tästä seuraa, että viimeisetkin npn-transistorit oikealla pääsevät myöskin saturaatioon ja tällöin lähtö on suunnilleen Vs. Kanavakohtai- nen lähtövirta tällä piirillä on -500mA, eli maksimissaan lähtövirta voisi olla peräti 8x- 500mA, eli -4A. Tosin näihin virtoihin tuskin koskaan päästään PYNQ-ympäristössä, sillä USB2.0 ei pysty tarjoamaan niin suurta virtamäärää ja DM163-piiri myös rajoittaa virtaa.

Kuva 2.7.M54564FP-piirin periaatteellinen kytkentä [11]

Nämä kaksi piiriä mahdollistavat LED-matriisin kaikkien LED:n käyttämisen samaan ai- kaan. Tosin jotta matriisille voidaan muodostaa koko näytön laajuinen kuva, niin M54564- piirin kanavista vain yksi voi olla päällä kerrallaan. Mikäli useampi kanava olisi päällä samaan aikaan, niin tästä seuraisi kyseisen kanavan pystyrivin pikselien kopioituminen.

Tämän takia LED-matriisia pitää ohjata yhtä X-koordinaation kolumnia kerrallaan. Ku- vassa 2.8 on esitelty Zynq, DM163 ja M54564FP-piirien periaatteellinen kytkeytyminen toisiinsa.

(15)

Kuva 2.8.Piirien periaatteellinen kytkentä prosessoriin

(16)

3 HARJOITUSTYÖN SUUNNITTELU

Tässä kappaleessa käydään lävitse suunnittelun kaksi eri vaihetta: Itse pelin suunnittelu ja sen saattaminen harjoitustyömuotoon sekä materiaalien suunnitteleminen harjoitustyö- hön.

3.1 Rauta osuuden suunnittelu

Kuten kappalleessa 2 mainittiin, niin harjoitustyön aloituslähtökohta on se, että pelin ai- heena on sama mikä digitaalisuunnittelun ja Ohjelmointi 1 kurssilla on, mutta johdatte- levalla tavalla sulautettuun ohjelmointiin. Joten tästä syystä harjoitustyötä suunnitellaan baremetal-ohjelmointi näkökulmasta. Baremetal-ohjelmoinnilla tarkoitetaan suoraan pro- sessorille ohjelmointia ilman että käyttöjärjestelmä pyörisi taustalla [7].

Kuva 3.1.Ohjelmointi VS baremetal ohjelmointi [7]

Baremetal-ohjelmointi poikkeaa "normaalista"ohjelmointitavasta siten että normaalisti oh- jelmoijan ei tarvitse tietää prosessorin rekistereistä ja osoitteista mitään, vaan asiat ta- pahtuvat korkealla tasolla. Baremetallissa puolestaan liikutaan lähempänä raudantasoa, eli ohjelmoidaan suoraan prosessorin rekistereitä [7].

(17)

PYNQ:n kehitysalustassa hieman ongelmallisena prosessorilöhtöisen harjoitustyönsuun- nittelussa on Kaikki tarvittavat IO:t, joita tarvitaan LED-matriisin käyttöön on kytketty Zynq-piirin FPGA linjoihin [5][6]. Tämän takia harjoitustyötä on mahdoton tehdä ilman FPGA:n käyttöönottoa. Digilent on hoitanut tämän ongelman omassa valmiissa ympä- ristössään käyttämällä Xilinx:n tarjoamaa softcore prosessori IP:tä Microplazea kytke- mään HPS (Hard Processing System) sekä LED-matriisin tarvitsemat ulkoiset IO:t toi- siinsa. Softcore prosessorilla tarkoitetaan prosessoria, joka voidaan erikseen syntetisoida SoC:n FPGA:lle tarvittaessa, kun puolestaan HPS, Zynq:n tapauksessa ARM Cortex-A on implementoitu piirille kovakoodattuna. Kuvassa 3.2 on esitelty yksinkertaistettu versio PYNQ-Z1 käyttämästä blokkidiagrammista.

Kuva 3.2.PYNQ-Z1 yksinkertaistettu blokkidiagrammi [22]

Xilinx:n selitys softcoren käytölle IO:n ja prosessorin välille on mahdollisuus implementoi- da omia kommunikointiväyliä mahdollisimman helposti ilman että käyttäjän tarvitsisi tietää miten digitaalista rautaa suunnitellaan[22]. Ajatustasolla tämä on hyvä, mutta harjoitus- työn kannalta tämä tapa on huono, sillä tarkoituksena on ohjata IO:ta suoraan ja itse implementoida tiedonsiirto väylä Zynq:n ja LED-matriisin ohjaimmen välille. Tähän on- gelmaan on kuitenkin yksinkertainen ratkaisu: Hyödyntää tätä valmista blokkidiagrammia ja muokata sitä omien tarpeiden mukaan. Xilinx tarjoaa vapaasti tätä blokkidiagrammia sekä ohjeen, kuinka tätä voidaan hyödyntää. Ottaakseen tämän oletus blokkidiagrammi käyttöön, tarvitsee vain ajaa seuraavat scriptit tcl-scripti Xilinx:n tcl-shell:ssä[22].

cd <PYNQ r e p o s i t o r y > / boards / Pynq−Z1 / base source . / b u i l d _ b a s e _ i p . t c l

source . / base . t c l

Tästä seuraa että Vivado-sovellukseen luodaan automaattisesti kuvan 3.2 mukaisen blok-

(18)

kidiagrammi. Scriptin käyttämisellä saavutetaan myös ylimääräinen etu, sillä scripti myös asettelee ARM Cortex-A9 prosessorin rekisterit oikein käytetyllä kehitysalustalla. Eli esi- merkiksi itse ei tarvitse miettiä PLL (Phase locked loop) sekä muiden prosessori keskeis- ten rekisterien asettelua saadakseen prosessori toiminta valmiuteen.

Blokkidiagrammista tarvitsee täten poistaa vain kaikki turhat asiat kuten käytetty softco- re MicroBlaze prosessori IP:t. Se millä ARM, FPGA ja fyysiset IO:t yhdistetään toisiin- sa on Xilinx:n tarjoaman AXI-GPIO IP:n avulla [23]. Tämä soveltuu tähän tarkoitukseen täydellisesti, sillä sen avulla prosessori pystyy AXI-väylän kautta asettelemaan FPGA:lla sijaitsevaa GPIO-lohkoa ja täten hallitseen fyysisiä lähtöjä Zynq-piiriltä. Tämän pohjalta blokkidiagrammiin soveltuu hyvin neljä eri GPIO-lohkoa. yksi ohjamaan PYNQ-Z1:n nor- maaleita LED:ä (LD0-LD3), yksi ohjaamaan RGB-LED:ä, yksi ohjaamaan M54564FP- virtalähdepiiriä, sekä yksi ohjaamaan itse DM163-piiriä. GPIO-IP:llä pystytään itse mää- rittelemään moniko bittinen sen lähtö on [23]. Normaaleille LED:lle näin ollen on järke- vä pistää 4-bittinen lähtö, koska neljä LED:ä. kahdelle RGB-LED:lle puolestaan järkevin bittimäärä on 6. M54564FP-piirille lähtöjen määräksi soveltuu 8-bittiä ja DM163-piirille 6- bittiä. Toisin kuin muut IO:t, painonappeja ja kytkimiä ei kytketä GPIO-lohkoihin, vaan suo- raan prosessoriin EMIO:n avulla (Extended Multiplexed Input Output). EMIO on tarkoitet- tu käytettäväksi ohjelmoitavan logiikan puolelta tuleville/lähteville signaaleille Cortex-A9 prosessorille/prosessorilta [24]. Kuvassa 3.3 on esitelty Zynq-7000 arkkitehtuurin blokki- diagrammi.

(19)

Kuva 3.3.Zynq-7000 arkkitehtuurin blokkidiagrammi [24]

Tällä saavutetaan mahdollisuus käyttää eri tyyppisiä keskeytyksiä, sillä GPIO-IP:t tuke- vat vain taso-keskeytyksiä [23]. Synteesivaiheessa painonappien ja kytkimien fyysiset sisääntulot SoC:n pinnillä kytketään käytännössä vain suoralla vedolla EMIO-pinnien ja fyysisten pinnien välille. Kuvassa 3.4 on esitelty muokattu blokkidiagrammi.

(20)

Kuva 3.4.Vivadossa muokattu lopullinen blokkidiagrammi

Vivadossa voidaan määrittää myös samalla Address Editor:ssa GPIO IP:n AXI-väylien osoitteet mitä kautta prosessori on yhteydessä näihin lohkoihin. Synteesi vaiheessa puo- lestaan voidaan määrittää I/O Planning työkalulla mihin fyysiseen lähtöön nämä IP:t kyt- ketään. Taulukossa 3.1 on esitelty miten bitit ja M54564FP-piille tulevat lähdöt on järjes- telty. Kuten taulukosta näkee, tämä noudattaa selkeää järjestystä.

Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0

C7 C6 C5 C4 C3 C2 C1 C0

Taulukko 3.1.M54564FP-piiriin kytketyt kanava bitit

DM163-piirille on pyritty asettamaan mahdollisimman järkevä järjestys miten IO:t on kyt- ketty. Tärkeintä tämän tapauksessa on että SDA ja SCK IO:t ovat vierekkäin, sillä sarja- kello ja sarjadata voidaan luokitella pariksi. Taulukossa 3.2 on esitelty miten DM163:lle lähdöt on kytketty.

Bit4 Bit3 Bit2 Bit1 Bit0

SDA SCK SB Lat Rst

Taulukko 3.2.DM163-piiriin kytketyt signaalit

Myös PYNQ-Z1 laudan omat LED:t LD0-LD3 noudattaa selkeää järjestystä: ensimmäinen LED on kytketty vähiten merkitsevään bittiin ja viimeinen eniten merkitsevään bittiin, kuten taulu 3.3 osoittaa.

(21)

Bit3 Bit2 Bit1 Bit0

LD3 LD2 LD1 LD0

Taulukko 3.3.PYNQ-Z1 LED:n kytkentä

Pynq-Z1 laudalla olevat RGB-LED:t on asetettu myöskin selkeään taulun 3.4 mukaiseen järjestykseen.

Bit5 Bit4 Bit3 Bit2 Bit1 Bit0

LD5.R LD5.G LD5.B LD4.R LD4.G LD4.B Taulukko 3.4.PYNQ-Z1 RGB-LED:n kytkentä

Vaikka painonapit ja kytkimet eivät käytä GPIO-IP:tä, niin ne voidaan myös järjestellä loogisesti taulukon 3.5 mukaiseen järjestykseen, koska ne kulkevat joka tapauksessa FPGA:n kautta Cortex-A9 prosessorille.

Bit5 Bit4 Bit3 Bit2 Bit1 Bit0

SW1 SW0 BTN3 BTN2 BTN1 BTN0

Taulukko 3.5.PYNQ-Z1 kytkinten ja painonappien kytkentä

Taulukossa 3.6 on puolestaan esitelty mihin muistiosotteisiin kaikki edellämainitut on kyt- ketty.

Nimi Muisti-osoite

Kanava 0x41220000

Kontrolli signaalit 0x41220008

Led 0x41200000

RGB-Led 0x41240000

Painonappi/kytkin 0xE000A068 Taulukko 3.6.Muistiosoitteet

3.2 Harjoitustyön ohjelmiston pohjan suunnittelu

Vivadossa luodaan myös HDF-tiedosto (Hardware Description File) jossa kerrotaan pro- sessorin asetukset kuten PLL, UART, TTC, DDR-asetukset. Tätä tiedosta puolestaan käytetään hyväksi, kun Xilinx SDK:ssa luodaan BSP (Board Support package). BSP:llä tarkoitetaan rautakohtaista kokoelmaa matalantason kirjastoja mitä tarvitaan jotta pro-

(22)

sessori saadaan käyttökuntoon oli käytössä joko käyttöjärjestelmä tai baremetal ympä- ristö[25].

Toisin kuin esimerkiksi ARM-Cortex-M0 sarjan mikrokontrollereissa, ARM-Cortex-A sar- jan prosessorit, kuten Zynq:ssa oleva Cortex-A9:t eivät hyödynnä NVIC(Nested Vec- tor Interrupt Controller), vaan näissä hyödynnetään GIC:a(Generic Interrupt Controller) [1][24]. NVIC keskeytysarkkitehtuurilla usealle eri keskeytyslähteelle on oma määritelty keskeytysosoite,prioriteetti sekä keskeytyksen sisälläkin voi tapahtua keskeytys. Cortex- A käyttämässä GIC:ssä tämä on hieman monimutkaisempi asia. GIC tukee myös nested- keskeytystä [26], mutta tässä harjoitustyössä sille ei ole käyttöä, joten sitä ei tarvitse ottaa käyttöön.

XSDK:ssa hyödynnetään Xilinx:n antamaa kirjastoa sekä esimerkkikoodia kuinka kes- keytykset sekä Triple-timer-counter saadaan toimimaan[27]. Esimerkki koodissa on osa ajastimen asettaminen esitelty seuraavasti:

t y p e d e f s t r u c t {

u32 OutputHz ; /∗ Output f r e q u e n c y ∗/ X I n t e r v a l I n t e r v a l ; /∗ I n t e r v a l v a l u e ∗/ u8 P r e s c a l e r ; /∗ P r e s c a l e r v a l u e ∗/ u16 O p t i o n s ; /∗ O p t i o n s e t t i n g s ∗/ } TmrCntrSetup ;

Tietorakenne C:n struct:n avulla, jossa määritellään keskeytystaajuus, intervalli väli, esi- jakaja sekä muut asetukset. Näistä vain OutputHz tarvitsee asettaa, eli kuinka usein kes- keytyspalvelijaa kutsutaan. Molemmille ajastimelle aloitusarvit määritellään globaalisti:

s t a t i c TmrCntrSetup t i c k s e t u p ={800 , 0 , 0 , 0 } ; / / 8 0 0 hz s t a t i c TmrCntrSetup t i c k s e t u p 1 = { 1 0 , 0 , 0 , 0 } ; / / 1 0 hz

Tässä luodaan TmrCntrSetup tietorakenteelle omat instanssit kumpaakin ajastinta var- ten sekä asetetaan toinen toimimaan 800Hz ja toinen 10 Hz taajuudella. 800Hz on valittu nopeammaksi taajuudeksi, koska se soveltuu erinomaisesti näytönpäivitys taajuudeksi.

Vaikka yhden kolumnin päivitys tapahtuu 800Hz välein, niin 8-kolumnin päivitys toimii tä- ten 100Hz taajuudella, eli 100Hz on koko LED-matriisin päivitysnopeus. 10Hz:ä valikoitu hitaamman keskeytys ajastimen nopeudeksi, koska tämä nopeus soveltuu erinomaisesti pelin logiikan päivitysnopeudeksi.

Itse ajastin saadaan toimintaan setupTimerInt-functiossa määrittelemällä ensin vain funk- tion sisällä näkyvä osoitin ja antamalla tälle osoittimelle edellä nähty ticksetup:n osoite:

TmrCntrSetup ∗TimerSetup ; XTtcPs_Config ∗C o n f i g ; TimerSetup = &( t i c k s e t u p ) ;

Seuraavassa puolestaan ajastimen alkualustuksia:

(23)

TimerSetup−>O p t i o n s | = ( XTTCPS_OPTION_INTERVAL_MODE | XTTCPS_OPTION_WAVE_DISABLE ) ;

C o n f i g = XTtcPs_LookupConfig ( TTC_TICK_DEVICE_ID ) ;

X T t c P s _ C f g I n i t i a l i z e (& T t c P s I n s t , Config , Config−>BaseAddress ) ; XTtcPs_SetOptions (& T t c P s I n s t , TimerSetup−>O p t i o n s ) ;

Xilinx kirjaston TTC-ajurille annetaan myös käytetyt parametrit:

X T t c P s _ C a l c I n t e r v a l F r o m F r e q (& T t c P s I n s t , TimerSetup−>OutputHz ,

&( TimerSetup−> I n t e r v a l ) , &( TimerSetup−>P r e s c a l e r ) ) ; X T t c P s _ S e t I n t e r v a l (& T t c P s I n s t , TimerSetup−> I n t e r v a l ) ;

X T t c P s _ S e t P r e s c a l e r (& T t c P s I n s t , TimerSetup−>P r e s c a l e r ) ;

TTC-keskeytys tarvitsee myös yhdistää toimimaan Tickhandler-keskeytyspalvelija funk- tion kanssa, sallia TTC-keskeytykset sekä aloittaa TTC-keskeytyksen toiminta.

XScuGic_Connect (& I n t c , TTC_TICK_INTR_ID ,

( X i l _ E x c e p t i o n H a n d l e r ) T i c k H a n d l e r , ( v o i d ∗)& T t c P s I n s t ) ; XScuGic_Enable (& I n t c , TTC_TICK_INTR_ID ) ;

X T t c P s _ E n a b l e I n t e r r u p t s (& T t c P s I n s t , XTTCPS_IXR_INTERVAL_MASK ) ; X T t c P s _ S t a r t (& T t c P s I n s t ) ;

Keskeytyspalveija Tickhandler1:lle on myös tehty seuraavanlainen vapaaehtoisesti käy- tettävä funktio:

v o i d change_freq ( u i n t 3 2 _ t f r e q ) { i f ( f r e q ! = 0 ) {

TmrCntrSetup ∗TimerSetup ; TimerSetup = &( t i c k s e t u p 1 ) ; t i c k s e t u p 1 . OutputHz= f r e q ;

X T t c P s _ C a l c I n t e r v a l F r o m F r e q (& T t c P s I n s t 1 , TimerSetup−>OutputHz ,

&( TimerSetup−> I n t e r v a l ) ,

&( TimerSetup−>P r e s c a l e r ) ) ; X T t c P s _ S e t I n t e r v a l (& T t c P s I n s t 1 ,

TimerSetup−> I n t e r v a l ) ;

X T t c P s _ S e t P r e s c a l e r (& T t c P s I n s t 1 , TimerSetup−>P r e s c a l e r ) ;

(24)

} }

Funktion tarkoitus on vain muuttaa pelilogiikassa käytettävän keskeytyksen taajuutta mi- käli opiskelija näin haluaa. Kyseisen funktio käyttö on jokatapauksessa täysin vapaaeh- toinen.

Painonappeja varten tehty keskeytys on myös tehty esimerkkien mukaan[28]. Koska tämä on hyvin vastaava kuin TTC-keskeytyspalvelijan käyttöönotto, niin vain oleellisimmat osat tämän keskeytyspalvelijan koodista kerrotaan seuraavassa:

/ / s e t I n t e r r u p t t y p e ( i n t h i s case low edge , / / on b u t t o n s , both on s w i t c h ) .

/ / For more i n f o , see x i l i n x API D r i v e r documentation XGpioPs_SetIntrType (& Gpio , GPIO_BANK, 0xFF , 0x00 , 0x30 ) ;

Tällä asetetaan GPIO-keskeytyspalvelija keskeyttämään painonapin laskevalla reunalla, sekä vipujen molemmilla reunoilla. Painonappien kohdalla keskeytyspalvelijaan siirrytään tällä asettelutavalla vasta painonapin päästettyä pois pohjasta. Tämä tapa on valittu, kos- ka ensinnäkin painonappi on kytketty siten Zynq-piirin, että painonapin mentyä pohjaan, Zynq:n ja painonapin välillä on tällöin 3.3V jännite[6]. Painonapin päästettyä pois poh- jasta, saadaan laskeva reuna. Vivuille puolestaan nousevalla ja laskevalla reunalla saatu keskeytys on parhain mahdollinen tapa, sillä itse vivun tilaa voidaan lukea keskeytyspal- velijassa ja katsoa kumpaan tilaan vipu on siirtynyt.

Seuraavassa koodinpätkässä yhdistetään GPIO-keskeytys toimimaan ButtonhaHandler- keskeytysfunktion kanssa, sallitaan keskeytykset Bank2:ssa, sekä sallitaan GPIO-keskeytykset.

/ / connect h a n d l e r t o g p i o d r i v e r

XGpioPs_SetCallbackHandler (& Gpio , ( v o i d ∗)& Gpio , B u t t o n H a n d l e r ) ; / / enable i n t e r r u p t s connected t o bank ( 2 )

XGpioPs_IntrEnable (& Gpio , GPIO_BANK, 0b111111 ) ; / / enable GPIO i n t e r r u p t s

XScuGic_Enable (& I n t c , GPIO_INTERRUPT_ID ) ;

Viimeisenä painonappikeskeytys käyttöönottamisessa tarvitsee tyhjentää GPIO-bank0 ja bank1 rekisterit, koska kokeilujen perusteella nämä ovat jostain syystä jo asettuneet, eikä keskeytykset täten toimi oikein.

X G p i o P s _ I n t r C l e a r (& Gpio , 0 , 0 x f f f f f f f f ) ; X G p i o P s _ I n t r C l e a r (& Gpio , 1 , 0 x f f f f f f f f ) ;

Pixel.c-tiedostossa opiskelijoiden versioon on annettu valmiina seuraavanlaiset muuttujat globaaliin. Muuttujan dots toimii harjoitustyössä eräänlaisena puskurina jonka sisältämä

(25)

tieto lähetetään DM163-piirille aina tietynajan välein. Page_size on puolestaan määritelty vakioksi pixel.h:ssa ja on oletuksena arvoltaan 10. Tämän on tarkoituksena toimia help- pona tapana tehdä esimerkiksi animaatioita LED-matriisille. Muuttujalla page pystytään puolestaan hallitseen mitä 8x8-matriisin tietoa lähetetään. Kommentteihin on myös an- nettu vihje miten dots-taulun järjestys on ajateltu olevan, vaikka mikään ei sinänsä estä käyttämällä eri järjestyksiä.

/ / Table f o r p i x e l d o t s . d o t s [ page ] [ X ] [ Y ] [ COLOR]

v o l a t i l e u i n t 8 _ t d o t s [ Page_size ] [ 8 ] [ 8 ] [ 3 ] = { 0 } ; v o l a t i l e u i n t 8 _ t page = 0 ;

Samassa pixel.c-tiedostossa on myös annettu setup-funktio, jonka opiskelijoiden on tar- koitus kirjoittaa. Tiivistetysti tässä funktiossa opiskelijoiden tarvitsee kirjoittaa vaaditta- vaan muistiosoitteeseen arvo millä reset-linja lähdöllä siirtyy 1-tilaan, sekä toiminto millä DM163:lle voidaan lähettää tarvittava määrä tietoa 6-bittiselle siirtorekisterille. Tätä var- ten opiskelijoiden tarvitsee tutkia ensinnäkin DM163-datalehteä että Color Shield:n doku- mentaatiota.

v o i d se tup ( ) {

/ / r e s e t i n g screen a t s t a r t i s a MUST t o o p e r a t i o n . / / H i n t : r e s e t i s a c t i v e low

/ / W r i t e code t h a t s e t gamma v a l u e s t o / / l e d m a t r i x d r i v e r (6−b i t data ) }

SetPixel-funktion tarkoitus puolestaan asettaa tauluttoon arvot oikeassa järjestyksessä funktioon annettujen arvoparametrien perusteella. Opiskelijoiden tehtäväksi jää miettiä:

Missä tätä kutsutaan, sekä missä järjestyksessä arvoparametrit asetetaan tauluun.

/ / Set v a l u e o f one p i x e l a t l e d m a t r i x v o i d S e t P i x e l ( u i n t 8 _ t x , u i n t 8 _ t y ,

u i n t 8 _ t r , u i n t 8 _ t g , u i n t 8 _ t b ) { / / Set new p i x e l v a l u e .

}

Run-funktio on puolestaan yksi tärkeimmistä funktioista tässä harjoituksessa, sillä jos tie- toa ei lähetetä oikein, ei LED-matriisikaan toimi oikein. Teoriassa tämän funktion kirjoitta- minen pitäisi olla suhteellisen helppo, jos setup-funktion on saanut kirjoitettua oikein, sillä tässä toistetaan sama tiedonsiirto, mutta 8-bittisellä tiedolla. Tässä funktiossa tarvitsee vain miettiä miten saadaan lähetettyä oikea määrä tietoa oikeista taulukon paikoista. Tätä varten opiskelijoiden tarvitsee selvittää miten DM163 ja M54564FP-virtalähdepiiri muo- dostaa kokonaisen kuvan LED-matriisin näytölle. Funktiota tarvitsee myös kutsua sopi- vasta paikkaa, eli ajastin keskeytyskäsittelijästä jotta tämä voisi toimia halutulla tavalla.

/ / Put new data t o l e d m a t r i x

(26)

v o i d run ( u i n t 8 _ t c ) {

/ / check i f page e x i s t

i f ( page>=Page_size ) r e t u r n ; / / W r i t e code t h a t w r i t e s data t o / / l e d m a t r i x d r i v e r (8−b i t data ) / / H i n t : a l m o s t same as i n set up . }

}

Latch-funktio on käytännössä tyhjä ja se mitä tässä pitää tehdä, selviää sekä DM163- datalehdeltä, että Colors Shield:n dokumentaatiosta melko suoraan [8]. Tästä syystä tä- hän ei ole tarvetta antaa erillisiä vihjeitä.

/ / l a t c h s i g n a l . v o i d l a t c h ( ) { }

Viimeisenä pixel.c:ssä on open_line-funktio jota käytetään avaamaan ja sulkemaan M54564FP- piirin tehonsyötön kanavia. Funktion tarkoituksena on aukasta vain yksi kanava kerrallaan tai sulkea kaikki annetun arvoparametrin mukaan. Se kuinka tämä toteutetaan, jää myös- kin opiskelijoiden vastuulle.

/ / Set one l i n e as a c t i v e per t i m e . v o i d o p e n _ l i n e ( u i n t 8 _ t i ) {

}

Pääohjelma on puolestaan yksinkertainen ja tähän opiskelijoiden ei tarvitse edes kirjot- taa riviäkään koodia, jotta LED-matriisin ja pelin saisi toimimaan. Pääohjelmassa kutsu- taan vain setup-funktiota, sekä annettu esimerkki kuinka sarjaterminaaliin saa tulostettua tekstiä. Tämä esimerkki on annettu, jotta useammat opiskelijat myöhemmin voisivat käyt- tää sarjaterminaalia esimerkiksi testaamaan keskeytysohjelman toimintaa tai mihin ikinä keksivät sitä käytettävän. Harjoitustyöohjeissa on tästä syystä mainittu miten sarjatermi- naalin saa käyttöön tietokoneen puolella.

i n t main ( ) {

/ /∗ ∗DO NOT REMOVE THIS∗∗∗∗

i n i t _ p l a t f o r m ( ) ;

/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗

# i f d e f e n a b l e _ i n t e r r u p t s i n i t _ i n t e r r u p t s ( ) ;

# e n d i f

/ / set up screen se tup ( ) ;

(27)

X i l _ E x c e p t i o n E n a b l e ( ) ;

/ / p r i n t h e l l o w o r l d t h r o u g h s e r i a l t e r m i n a l p r i n t ( " H e l l o World \ n \ r " ) ;

/ / Main l o o p w h i l e ( 1 ) { }

c l e a n u p _ p l a t f o r m ( ) ; r e t u r n 0 ;

}

Koska keskeytysmekanismi on Cortex-A prosessoreissa huommattavasti vaikeampi kuin juurikin Cortex-M sarjan prosessoreissa, niin opiskelijoille jaetussa versiossa keskeytyk- siä ei tarvitse alustaa, vaan ohjelma kirjoitetaan valmiiksi annettuun keskeytys-palvelijoihin.

Buttonhandler-keskeytys pysäyttää aina pääohjelmasilmukan ajon kun jotain nappia on painettu tai vivun tilaa muutettu. Keskeytyskäsittelijän Status-parametri kertoo mikä nap- pi tai minkä vivun tila on muuttunut. Opiskelijoiden tehtäväksi on jätetty miettiä miten tätä keskeytystä voisi hyödyntää ja mikä Status muuttujan arvo kun esimerkiksi BTN0 tai BTN1:stä on painettu. Tämän osattuaan tämän keskeytyskäsittelijän käyttö pitäisi olla suhteellisen vaivatonta.

/ / I n t e r r u p t h a n d l e r f o r s w i t c h e s and b u t t o n s . / / Connected b u t t o n s and s w i t c h e s are a t bank2 .

/ / Reading S t a t u s w i l l t e l l which b u t t o n o r s w i t c h was used v o i d B u t t o n H a n d l e r ( v o i d ∗CallBackRef , u32 Bank , u32 S t a t u s ) {

/ /∗ ∗ ∗ ∗W r i t e code here ∗∗∗∗

/ /∗ ∗ ∗ ∗END OF OWN CODE∗∗ ∗∗ ∗∗ ∗∗ ∗∗∗ ∗∗ ∗∗ ∗∗

}

Nopeammalle ajastinkeskeytykselle on annettu valmiina TickHandler-funktio. Opiskelijoil- le on kommeintteihin annettu valmiina tieto, että tätä hyödynnetään LED-matriisin päi- vittämiseen. Kommentteihin on myös kirjoitettu selkeästi mitä koodirivejä ei missään ni- messä saa poistaa, sillä yhdenkin yhdenkin kielletynkohdan poistamisen jälkeen ajastin- keskeytys ei enään toimi. Opiskelijoiden tehtäväksi jää täten miettiä, miten tätä keskey- tystä voisi hyödyntää LED-matriisin kanssa.

/ / Timer i n t e r r u p t h a n d l e r f o r l e d m a t r i x update . / / Frequency i s 800Hz

v o i d T i c k H a n d l e r ( v o i d ∗CallBackRef ) { / / Don ’ t remove t h i s

u i n t 3 2 _ t S t a t u s E v e n t ;

/ / e x c e p t i o n s must be d i s a b l e d when u p d a t i n g screen

(28)

X i l _ E x c e p t i o n D i s a b l e ( ) ; / /∗ ∗ ∗ ∗W r i t e code here ∗∗∗∗

/ /∗ ∗ ∗ ∗END OF OWN CODE∗∗ ∗∗ ∗∗ ∗∗ ∗∗∗ ∗∗ ∗∗ ∗∗

/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗c l e a r t i m e r i n t e r r u p t s t a t u s . / /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗DO NOT REMOVE∗∗∗∗∗∗∗∗

S t a t u s E v e n t = X T t c P s _ G e t I n t e r r u p t S t a t u s ( ( XTtcPs ∗) CallBackRef ) ;

X T t c P s _ C l e a r I n t e r r u p t S t a t u s (

( XTtcPs ∗) CallBackRef , S t a t u s E v e n t ) ; / /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗

/ / enable e x c e p t i o n s X i l _ E x c e p t i o n E n a b l e ( ) ; }

Myöskin pienemmällä taajuudella toimivan keskeytyspalvelijan, TickHandler1-funktioon on kirjoitettu vastaavat kiellot mitä edellä olevaan. Myös vihje on annettu, että tätä kes- keytyspalvelijaa voisi käyttää pelinlogiikkaan missä jotain tarvitsee tehdä tietynajan vä- lein.

/ / Timer i n t e r r u p t f o r moving a l i e n , s h o o t i n g . . . / / Frequency i s 10Hz by d e f a u l t

v o i d T i c k H a n d l e r 1 ( v o i d ∗CallBackRef ) { / / Don ’ t remove t h i s

u i n t 3 2 _ t S t a t u s E v e n t ;

/ /∗ ∗ ∗ ∗W r i t e code here ∗∗∗∗

/ /∗ ∗ ∗ ∗END OF OWN CODE∗∗ ∗∗ ∗∗ ∗∗ ∗∗∗ ∗∗ ∗∗ ∗∗

/ / c l e a r t i m e r i n t e r r u p t s t a t u s . DO NOT REMOVE S t a t u s E v e n t = X T t c P s _ G e t I n t e r r u p t S t a t u s

( ( XTtcPs ∗) CallBackRef ) ; X T t c P s _ C l e a r I n t e r r u p t S t a t u s

( ( XTtcPs ∗) CallBackRef , S t a t u s E v e n t ) ; }

harjoitustyöhön on tehty myös pienimuotoisia mittauksia joilla on pyritty varmentamaan, että opiskelijat eivät pysty rikkomaan DM163-piirin minimiajoituksia. Nämä mittaukset on suoritettu Rigol 1000Z sarjan oskilloskooppilla sekä 100Mhz passiivi mittaprobeilla 10x asetuksella [12]. Ensimmäisenä mittauksessa on mitattu kuinka ison kellotaajuuden pro-

(29)

sessori voi antaa muuttamalla DM163-piirille menevän CLK-lähdön tilaa C:llä. Kuvassa 3.5 tämän mittaus.

Kuva 3.5.C:llä saavutettu kellon taajuus DM163:lle

Kuten kuvasta nähdään, niin kellotaajuus on noin 740KHz luokkaa riippuen mittausajan- kohdasta. Pulssisuhde ei ole ideaalinen 50 prosenttia, mutta sillä ei tässä tapauksessa olekkaan käytännön merkitystä.

Harjoitus työssä ei myöskään ole mahdollista rikkoa DM163-piirin data-linjan pitoaikaa, eli aikaa jona linja pitää olla stabiili nousevan kelloreunan jälkeen. Mittauksen perusteel- la datalinja, eli SDA voi muuttua aikasintaan 470ns päästä kellon nousevasta reunasta.

Datalehden mukaan 3ns on minimi pitoaika 5V käyttöjännitteellä, joten 470ns on riittävä aika [17]. Kuvassa 3.6 keltainen on kellolinja ja vaaleansininen on datalinja.

(30)

Kuva 3.6. C:llä saavutettu ajoitus kellon nousevasta reunasta tiedon vaihtumiseen läh- dössä

Viimeisenä mitattuna ajotuksena on latch-signaalin leveys. Mitattu leveys on 460ns ja mi- nimileveys datalehden mukaan on 5ns 5V:n käyttöjännitteellä, joten tämäkin ylittää vaa- ditut ajoitukset [17]. Kuvassa 3.7 Keltainen on myöskin kellosignaali ja vaaleansininen latch-signaali.

Kuva 3.7.C:llä saavutettu latch signaaliin leveys

(31)

3.3 Materiaalin suunnittelu

Koska diplomityön tarkoituksena on tutkia harjoitustyönsuunnittelun lisäksi myös eri ma- teriaalien vaikutusta oppimistulokseen, näin ollen kolmella eri harjoitustyöohjeistuksella tämä mahdollisesti saavutetaan. Asiat mitkä yhteisesti kerrotaan jokaisessa eri harjoitus- työohjeversiossa ovat harjoitustyön vaatimukset työn läpäisylle, hieman taustaa PYNQ- Z1:stä, kehitysympäristön käyttöönotosta, sekä lyhyt tiivistelmä miten eri keskeytysohjel- ma käsittelijät toimivat. Kuvassa 3.8 on esitelty myös yksi tärkeä tieto mikä opiskelijoille pakko, ensinnäkin jaettu projekti tiedosto ei saa sijaita paikallisessa hakemistossa, eli C-levyllä, sillä jokaisen uloskirjautumisen yhteydessä labran koneet tyhjentävät hakemis- tot. Siksi P-verkkoasema on annettu kohteeksi mihin projekti pitää purkaa. Toisekseen ominaisuuteen kuuluu, että pohjoismaalaisia merkkejä ei saa olla tiedostopolussa, sekä välilyöntejä ei sallita. Kuvassa 3.9 on esitelty harjoitustyön purku sijainti.

Kuva 3.8.Sijainti, mihin harjoitustyö puretaan

Lisäksi kaikille opiskelijoille on annettu tieto miten LED-matriisin koordinaatisto menee.

Heidän tehtäväksi jää selvittää että DM163-piiri ohjaa vaakasuunnassa, sekä M54564FP- piiri ohjaa pysty suunnassa. Kuvassa 3.9 on esitelty annettu koordinaatisto, mikä löytyy opiskelijoiden ohjeistuksesta.

(32)

Kuva 3.9.LED-matriisin koordinaatit

Viimeisenä tärkeänä asiana kaikille on annettu LED-matriisin eri väristen LED:n järjestys suhteutettuna DM163:n siirto-rekistereihin. Tämä on esitetty 3.10 kuvassa.

Kuva 3.10.Järjestys, missä eri värit sijaitsevat siirtorekistereissä

(33)

B- ja C-materiaalin omaaville on annettu lisäksi muutamia oleellisia asioita C-kielestä, kuten pientä tietoa muuttujista, silmukoista, switch case-rakenteista, C:n tauluista, osoit- timista, sekä tärkeimpänä, bittimanipulaatio operaatioista.

Seuraavassa esimerkki miten C:n taulukot on opiskelijoille kerrottu. Tämän lisäksi vihjee- nä annettu että indexointi lähtee nollasta.

u i n t 8 _ t a [ ] = " t i p t a p " ; / / t h i s w i l l d e c l a r e t a b l e t o

/ / s i z e o f s t r i n g and i s i n i t i a l i z e d . u i n t 8 _ t b [ 6 ] ; / / A r r a y i s d e c l a r e d t o s i z e 6 ,

/ / b u t i s u n i n i t i a l i z e d .

u i n t 8 _ t c [ 2 ] [ 2 ] ; / / M u l t i d i m e n s i o n a l a r r a y i s d e c l a r e d / / t o s i z e 2x2 , b u t i s u n i n i t i a l i z e d .

Osoittimelle myös on annettu seuraavanlainen koodiesimerkki, jonka tarkoituksena on opastaa kuinka ensinnäkin osoittimia käytetään, sekä kuinka jonkun muistiosoitteen pääs- sä olevaan prosessorin rekisteriin päästään käsiksi.

u i n t 8 _ t ∗a ; u i n t 8 _ t b = 0 ;

a=&b ; / / a have b : s address

∗a = 4 ; / / now b has v a l u e 4

a=0xAABBFF00 ; / / a haves some random address

Bittimanipulaatiolle on annettu seuraavanlainen esimerkki. Tässä on esitelty kaikki tarvit- tavat operaatiot minkä avulla harjoitustyö pitäisi onnistua.

a | = 1 ; / / Or o p e r a t i o n , and LSB

( Le ast S i g n i f i c a n t B i t ) o f v a r i a b l e a i s s e t t o 1 ( does n o t h i n g i f i t s a l r e a d y 1 )

a &=1; / / And o p e r a t i o n . V a r i a b l e a i s s e t t o 0 i f i t does n o t have LSB s e t .

a=~a ; / / One complement t o a . f o r example i f a v a l u e i s 0b1010 , now i t i s 0b0101

a ^ = 2 ; / / Xor o p e r a t i o n . Toggles b i t 1 . I f a b i t 1 i s 1 now i t i s 0 o r i f b i t 1 i s 0 , now i t i s 1 .

(34)

Pelkästään C-ryhmälle annettu seuraavanlainen koodirivi. Tämän on tarkoituksena hie- man helpottaa pelkän python taustaisten työtä, sillä tämä koodi pätkä toimii esimerkkinä kuinka yksi tavu voidaan lähettää Zynq:lta DM163-piirille. Tämä on osittain pseudoa, jotta opiskelijat joutuisivat miettimään mitä SDA ja CLK tilalle pitäisi pistää. Myöskin opiskelijat joutuvat miettimään miten saataisiin koko tavu lähetettyä. He joutuvat lisäksi miettimään mihin pixel.c:n funktioon tämä voisi sopia.

u i n t 8 _ t data =0b11010110 ; / / send 8−b i t data , MSB f i r s t f o r ( u i n t 8 _ t a = 0 ; a < 8 ; a + + ) {

i f ( ( data & 0x80 ) SDA= 1 ; e l s e SDA= 0 ;

CLK= 0 ;

data < <=1; / / s h i f t one t o l e f t CLK= 1 ;

}

Tiivistetysti materiaali A:ssa kerrotaan vain oleelliset asiat mitä minimissään tarvitaan et- tä harjoitustyö on edes teoriassa mahdollista läpäistä. B:ssä avataan hieman enemmän ja annetaan hieman esimerkkejä bittimanipulaation ja C:ssä puolestaan viljellään hieman vihjeitä sekaan ja annetaan pseudokoodi (vahvasti C-kieleen pohjautuva) kuinka yhden bitin tiedonsiirto voisi tapahtua. Materiaalien suunnittelussa otetaan huomioon juurikin se, että A on tarkoitettu henkilöille/ryhmille jotka ovat lukeneet vähintääkin Ohjelmointi 2:n.

Materiaali B puolestaan sekaryhmille (toinen käynyt ohjelmointi 1:n ja toinen ohjelmointi 2:n). Materiaali on lisäksi kirjoitettu englannin kielellä. Tämän peruste on puhtaasti pie- nempi työtaakka jatkoa ajatellen, eli ohjetta ei tällöin tarvitse kirjoittaa uudelleen englan- ninkielisellä toteutuskerralla. Perusteita miksi harjoitustyö tehdään ryhmissä eikä yksilö- suorituksena on resurssien säästäminen. Harjoitustyön suorittajia voi olla pahimmillaan yli 200, joten kurssiassistenttien määrä ja labravarausten määrä olisi yksittäisillä suoritta- jilla yksinkertaisesti liian suuri. Projektimuotoiseen toteutukseen löytyy myös tutkittua tie- toa miksi sellainen toteutus on hyvä. On tutkittu että projektimuotoisessa toteutuksessa opiskelijat joutuvat soveltamaan jo olemassa olevaa tietoa ja varsinkin kun projektimuo- toinen työ tehdään ryhmissä, niin opiskelijat myös antavat vertaistukea toisilleensa [9].

Tällöin opetustulos on potentiaalisesti erinomainen.

(35)

4 HARJOITUSTYÖN TESTAAMINEN

Tässä kappaleessa käydään lävitse harjoitustyön testaamiseen liittyvistä järjestelyistä se- kä harjoitustyön päivystysajoilla saaduista kokemuksista sekä yleisistä ongelmista mitä opiskelijoilla oli harjoitustyön kanssa ja kuinka ne mahdollisesti korjattiin harjoitusten ai- kana.

4.1 Harjoitustyön käytännön järjestelyt

Koska harjoitustyön arvioitu/mitoitettu suoritusaika on 20 tuntia, niin opiskelijoille annettiin 5-viikkoa aikaa suorittaa harjoitustyö. Harjoitus suoritetaan Tampereen yliopiston hervan- nan kampuksen luokassa TC-219, vaikkakin PYNQ-Z1 kehitysalustoja olisi myös mah- dollista ottaa lainaan kurssin suorituksen ajaksi. Syy miksi harjoitus annettiin vain suori- tettavaksi TC-219 luokassa on epävarmuus, kuinka harjoitustyö toimisi Xilinx:n SDK:lla ilmaisversiolla opiskelijoiden omilla koneilla. Myös ohjelman iso koko on ongelmallinen, sillä ohjelman asennuksen koko on noin 40GB, koska SDK:ta ei ole mahdollista asentaa ilman Vivado-sovellusta. Mahdollisesti tulevaisuudessa tätä vaihtoehtoa voitaisiin testa- ta ja katsoa kuinka hyvin tämä voisi toimia. Diplomityön kirjoitushetkellä ongelmana on myös LED-matriisien rajallinen saatavuus, eli PYNQ-Z1 ja LED-matriisin sisältäviä paket- teja voitaisiin jakaa vain arviolta 10 ryhmälle.

Koska tämä harjoitustyö on niin sanotusti kokeilumuotoinen, niin myös materiaalin jaka- minen tapahtuu myös hieman poikkeuksellisesti: Opiskelijoiden on pakko käydä ainakin yhdellä lähiharjoituskerralla ja ilmoittauduttava harjoitustyöryhmään saadakseen materi- aalin. Annettu materiaali pohjautuu opiskelijaryhmän ohjelmointitaustaan, eli pelkästään Ohjelmointi 1 käyneet saavat helpoimman C-materiaalin, Ohjelmointi 2:en ja ylöspäin käyneet saavat vaikeimman A-materiaalin, sekä ryhmät, joissa vain toinen on käynyt Oh- jelmointi 2:n saavat B-materiaalin. Lisäetu tästä materiaalin jakotavasta on myös, että näkee moniko loppuen lopuksi saa työn valmiiksi ja moniko keskeyttää. Harjoitustyön päivystys ajat ovat ti 10-12, ke:8-10, 12-16 sekä pe 8-14. Näillä ajoilla myös saadaan tietoon mihin aikoihin opiskelijat mieluiten tulevat suorittamaan/kysymään neuvoja harjoi- tustyöhön. Tähän toki vaikuttaa myös mahdolliset päällekkäisyydet muiden harjoitusten tai luentojen kanssa.

(36)

4.2 Harjoitustyössä esiintyneet ongelmat opiskelijoilla

Opiskelijoiden yleisimmät ongelmat harjoitustyön kanssa ovat seuraavanlaiset: Sarjaväy- län kautta tulostettu ’Hello world’ ei toimi terminaalissa, ohjelma ei suostu latautumaan PYNQ-Z1 alustalle, LED-matriisi saaminen toiminta kuntoon, tupla-luenta painonapilta, sekä kummitus pikselit LED-matriisissa. Muita ongelmia oli myös itse ohjelmointikieleen liittyvät asiat.

Sarjaväylän toimimattomuus tapahtui satunnaisilla opiskelijoilla. Ongelmaa ratkottiin sel- vittämällä, ovatko opiskelijat asettaneen sarjaväylän asetukset oikein, testata ajamista toi- sella koneella ja PYNQ-Z1:llä sekä testaamalla toisella terminaaliohjelmalla. Huolimatta kaikesta edellä mainituista testailuista, niin ongelma siltikin jatkui. Tämä ongelma tuntui koskettavan vain tiettyjä opiskelijoita ja toisilla opiskelijoilla sarjaväylä toimi normaalisti, jopa samalla koneella millä toisilla oli ongelmia. Kuten aikaisemmin mainittiin, niin ainut tapa korjata ongelma oli jättää sarjaväylän käyttö pois. Tästä ei sinänsä mitään haittaa syntynyt, koska sarjaväylän käyttö ei ole oleellinen osa tätä harjoitustyötä, vaan pieni lisä.

Ohjelman latautumis ongelmista kokivat muutamat opiskelijat ja ongelman syitä on kaksi:

Xilinx SDK:n ohjelman aukaisun yhteydessä kehitysympäristön polku on väärä, sekä so- pimattomia merkkejä tiedostopolussa. Väärän tiedostopolun opiskelijat saivat aikaiseksi kun projektin zip-paketti purettiin käskyllä ’extract to ....’ eikä ’Extract Here’-komennolla.

Tämän seurauksena syntyi käytännössä turha alikansio jonka sisällä on varsinainen pro- jekti kansio. Kun opiskelijat ohjeiden mukaisesti asettivat polun XSDK:ssa, niin polusta tulikin väärä ja XSDK ei osaa tulkita oikein tiedosto polkua. Tähän oli kaksi selkeätä rat- kaisua: valita tiedostopoluksi tiedostohierarkiassa alempi kansio tai poistaa koko kansio P-aseman juuressa ja purkaa uudelleen ’extract here’-komennolla. Syy minkä takia joil- lain ei myöskään toiminut ohjelman lataus liittyi myös kehitysympäristöön, siten että po- lussa ei myöskään saa olla välilyöntejä. Tämän korjaus oli että projekti kansio piti siirtää paikkaan mikä ei välilyöntejä sisältänyt. Esimerkiksi "My documents"olisi muuten hyvä si- jainti, mutta se sisältää välilyönnin niin tätä ei voida käyttää. Tästä syystä ohjeistuksiin on pistetty P-aseman juuri, koska se on varmaksi todennettu sijainti.

Jotkut opiskelijat ihmettelivät miksi pelin alus joskus liikkuu painonapilla useamman ker- ran mitä ollaan painettu. Tämä ongelma johtuu puhtaasti painonappien ominaisuudesta ja kuinka PYNQ-Z1 kehitysalusta on suunniteltu. Painonapeilla on melko yleistä että niis- sä tapahtuu niin sanottua kytkinvärähtelyä, eli linjalla mihin painonappi on kytketty, alkaa värähtelemään käyttöjännitteen ja nollan välillä painettaessa painonappia [3]. Tämä ilmiö voidaan helposti todistaa mittaamalla oskiloskoopilla SoC:lle menevää linjaa vastuksen R43 kohdalta, niin tällöin nähdään jännitetasot mitä Zynq-piirikin näkee [6]. Tämä on esi- tetty kuvassa 4.1. Mittaus suoritettu R&S RTB2004 oskilloskoopilla ja RT-ZP03 passiivi- mittapäillä mittapäiden 10x asetuksella [14][15].

(37)

Kuva 4.1.kytkin värähtely

Tämän ilmiön seurauksena prosessori tulkitsee painonapin painetuksi useampaan ker- taan ja painonappi keskeytysohjelmassa saatetaan käydä useammin kuin kerran. Tähän ongelmaan ei varsinaisesti ole yksinkertaista korjausta, koska PYNQ-Z1 kehitysalustalla ei kytkinvärähtelyä ole varsinaisesti huomioitu. 10kohm alasveto vastus ja 10kohm sar- jakytkentä ei riitä värähtelyn poistamiseen, vaan sarjavastuksen lisäksi kytkentä tarvitsisi ohituskondensaattorin Zynq:n ja sarjavastuksen väliin jolloin tämä muodostaisi alipäästö- suotimen [16]. Kytkentä on esitelty kuvassa 4.2.

Kuva 4.2.kytkin värähtelyn poistaminen kondensaattoreilla

(38)

Tätä voisi korjata sekä raudalla FPGA:lla että prosessori-ohjelmiston puolella. Kummal- lakin tavalla ongelma korjaantuisi suunnittelemalla niin sanottu debounce joko FPGA:lle tai ohjelmiston puolelle. Ohjelmiston puolella tämä olisi sinänsä ongelmallista, sillä harjoi- tustyössä keskeytysohjelma huolehtii luennasta ja debounce tyyliset luennat vaativat toi-

miakseen useampia luenta iteraatioita varmistamaan, että linja on stabiili. IO-keskeytysohjelmissa tämä ei onnistu järkevästi, koska keskeytysohjelma liipaistuu laskevalla reunalla auto-

maattisesti ja IO:n pollausohjelmaa ei ole järkevää tehdä keskeytysohjelmaan. Tälle on- gelmalle ei loppupeleissä tehty muuta kuin selitettiin opiskelijoille mistä tämä ongelma johtuu. Tämä ongelma on oivallinen, koska se demonstroi käytännössä yhtä sulautettu- jen järjestelmien perusongelmaa.

Kummituspikseli ongelmaan yksiselitteisesti yksi ratkaisu: M54564FP-piirin kanavien au- kasimen ja sulkeminen oikeessa oikeisiin aikoihin DM163-piirin tiedonsiirron kanssa. Mi- käli vaikka X0-koordinaatin kanava on päällä samaan aikaan kun X1-koordinaatin tieto lähetetään, niin X1 paikan tieto näkyy myös himmeästi X0-koortinaatissakin. Yksinker- tainen ratkaisu oli kertoa opiskelijoille oikea sekvenssi: sulje kaikki kanavat, lähetä tiedot DM163:lle ja lopuksi, aukaise oikea kanava. Kuvassa 4.3 on havainnollistettu miltä yleisin kummituspikseli tyyppi näyttää. Kamerateknisistä syistä kummituspikselit näyttää hieman himmeiltä kuvassa, mutta esimerkiksi ylhäällä olevassa alienissa tämä on huomattavissa.

Kuva 4.3.Kummitus pikseli LED-matriisilla

C-kielen ja LED-matriisin vaikeuksiin ei ollut muuta vaihtoehtoa kuin yrittää opastaa ja neuvoa tarpeen mukaan.

(39)

5 TULOKSET

Tässä kappaleessa käydään lävitse Diplomityössä kerätyistä mittaustuloksista joita ovat mitattu ajankäyttö per jaettu materiaalin kategoria, opiskelijoiden palaute harjoitustyöstä sekä kirjallisen palautteen arviointi. Kirjallisen palautteen arvioinnissa käydään läpi har- joitustyöpalaute.

5.1 Mittaustulokset

Mittaustuloksia on kolme erillaista: kuinka paljon opiskelijat tarvitsivat ajallisesti tunti as- sistentin apua yhteensä, avun tarve eri viikkoina, sekä harjoitustyön palautukset eri viik- koina.

Kun tarkistellaan eri ryhmien välistä assistentin ajankäyttöä, niin kuvasta 5.1 näkyy sel- keästi trendi, miten eri ohjelmointi tausta näkyy assistentin ajankäytössä. Kuten aikasem- missa kappaleissa on kerrottu, niin A-ryhmä koostuu enimmäkseen opiskelija ryhmistä jotka ovat suorittaneet Ohjelmointi 2:n, B-ryhmä opiskelijaryhmistä joista toinen on suo- rittanut Ohjelmointi 1:n ja toinen ohjelmointi 2:n, C-ryhmä puolestaan opiskelijaryhmistä jotka ovat suorittaneen vain Ohjelmointi 1:n. Kuten kuvasta 5.1 näkyy, niin C-ryhmä ku- luttaa selkeästi eniten assistentin aikaa. Tästä voi melko helposti vetää johtopäätöksen että ohjelmointitausta vaikuttaa suuresti siihen kuinka paljon opiskelijat tarvitsevat apua.

Tämä on sinänsä itsestäänselvyys, koska C-ryhmän opiskelijoilla on muutenkin suurin urakka harjoitustyön kanssa, sillä he joutuvat opiskelemaan LED-matriisin lisäksi C-kieltä enemmän kuin A ja B-ryhmät.

(40)

Kuva 5.1.Assarin ajankäyttö ryhmittäin

Kuvaajasta 5.2 näkee melko selkeästi miten opiskelijat on aktiivisia eri viikoilla. Aktiivi- simmat opiskelijat alkavat tekemään harjoitustyötä jo ensimmäisellä mahdollisella viikol- la, sekä loputkin ovat aktiivisimmillaan toisella viikolla. Kolmannen viikon ajankäytön vä- hentyminen selittyy mahdollisesti muiden kurssien päällekkäisyyksillä.

Kuva 5.2.Assistentit ajankulutus viikoittain

(41)

Kuvaajasta 5.3 ilmenee epävirallisesti yleisesti tiedossa oleva fakta harjoitustöiden pa- lautuksista: Harjoitustöitä palautellaan eniten viimeisillä viikoilla. Tämä myös tukee ku- vaajasta 5.2 saatua tietoa, sillä palautukset korreloi suhteellisen hyvin assistentin ajan- käytön kanssa: ensimmäisillä viikoilla assistentilla suurin ajankäyttö ja vähiten palautuk- sia, viimeisillä eniten palautuksia ja pienin ajakäyttö. Viimeisillä viikoilla assistentin aikaa meni enimmäkseen harjoitustöiden demonstraatioiden katseluun. Tämä suora on myös siittä optimaalinen, että aikaisemmilla toteutuksilla palautukset painottuivat loppupäähän.

Kuorman jakautumiseen mahdollisesti vaikutti pari asiaa: harjoitustyön tekeminen ei ole pakollinen, jolloin sen tekee opiskelijat joilla on enemmän motivaatiota ja aikaa. Palau- tuksen suoramaiseen jakautumiseen vaikutti myös mahdollisesti osanottajalukumäärä, sillä kuulopuheen perusteella useat opiskelijat jättivät harjoitustyön tekemättä kun van- ha harjoitustyö korvattiin uudella kesken kurssin, jolloin enemmän motivaatiota omaavat opiskelijat suorittivat harjoitustyön.

Kuva 5.3.Palautukset

Harjoitustyössä kävi ilmi myös epävirallinen tietämys ajoista milloin opiskelijat on mielui- ten paikalla: Kello 8 aamulla ei ole kannattava aika jos opiskelijoille on annettu muitakin vaihtoehtoja, sillä tähän aikaan opiskelijoita oli paikalla maksimissaan yksi ryhmä.

5.2 Opiskelijoiden palaute

Opiskelijoiden kirjallisesta harjoitustyöpalautteesta tulee ilmi sama asia vahvasti mikä harjoituksissa tuli esille: LED-matriisin vaikeus. Tämä oli melko vahvasti yhteinen tekijä

(42)

kaikkien eri materiaalien omaavien välillä, sillä suurimmassa osassa kirjallista palautet- ta juurikin otettiin kantaa LED-matriisin vaikeuteen ja toivottiin kattavampia ohjeita LED- matriisin toimintaan. Tämä näkyy myös opiskelijoiden numeraalisena arviona harjoitus- työstä, sillä keskimäärin jokaisen ryhmän arvio harjoitustyöohjeistuksesta jäi alle kolmen mikä nähdään kuvaajasta 5.4.

Kuva 5.4.Opiskelijoiden arvio harjoitustyö ohjeesta

Opiskelijoiden antama arvio kuvaajassa 5.5 harjoitustyön vaikeudesta on odotuksien mu- kainen. A ja B ryhmät arvio harjoitustyön vaikeuden keskimäärin lähemmäksi kolmos- ta, vaikkakin A-ryhmässä yksi poikkeuksellisesti antoi vaikeudeksi 1, eli liian helppo. C- ryhmä puolestaan arvio harjoitustyön keskimäärin nelosen tasolle, eli hieman liian vaikea.

Tässä korostuu juurikin se että he joutuvat myös opiskelemaan C-kielen harjoitustyön ohessa.

(43)

Kuva 5.5.Opiskelijoiden arvio harjoitustyön vaikeudesta

Opiskelijoiden arvio käyttämäänsä aikaan harjoitustyöhön on kuvaajan 5.6 mukaan mel- ko hyvällä tasolla kun ottaa huomioon että harjoitustyöhön mitoitettu ajankäyttö on 20 tuntia. Tässä toki pitää huomioida että C-ryhmän ajankäyttö harjoitustyöhön olisi ollut huomattavasti suurempi jos he olisivat joutuneet tekemään harjoitustyön vähäisemmällä assistentin avustuksella.

(44)

Kuva 5.6.Opiskelijoiden arvio käyttämästä ajasta harjoitustyöhön

Opiskelijoiden arvio omasta osaamisesta kurssin vaatiman C-kielen, datalehtien lukemi- sesta, sekä bitti manipulaation hallinnasta on kuvaajan 5.7 mukaan muuten hyvällä tasol- la paitsi C-ryhmän osalta. Tässä korostuu edelleenkin heidän suurempi taakka harjoitus- työssä, sillä he joutuvat opiskelemaan kaikista eniten uutta asiaa.

(45)

Kuva 5.7.Opiskelijoiden arvio omasta osaamisesta

Kurssilta saatiin myös kaiku-palaute, joka vastasi harjoitustyön osalta paperista palautet- ta.

(46)

6 JATKOKEHITYS

Tässä kappaleessa käydään lävitse jatkokehityssuunnitelmia palautteiden ja harjoitus- työn assaroimisesta saadun kokemuksen perusteella. Kappaleessa käydään läpi myös miten itse PYNQ-Z1:n LED-matriisin voisi saada toimimaan jokaisella tehonsyöttölähteel- lä.

6.1 Materiaalin parannus

Harjoitustyön palautteiden, päivystysajoilla saadun kokemuksen sekä saaduista mittaus- tuloksista voidaan päätellä että harjoitustyömateriaali kannattaa kaikilla olla sama. Tämä päätelmä pohjautuu siihen, että vaikka A-materiaalissa kerrotaan vain välttämätön pak- ko, niin assistentin kuormitus oli huomattavasti kevyempi, kuin esimerkiksi C-materiaalin omaavat. Lisäksi tähän päätelmään voidaan päätyä, siten että vaikka opiskelija olisi aikai- semmin suorittanut useampiakin ohjelmoinnin kursseja, niin bittien manipulointi operaa- tioista heillä ei välttämättä ole osaamista, sillä bittien manipulointi on enemmän sulautet- tujen järjestelmien ohjelmoimisessa vaadittava erikoispiirre, jota muut kuin sulautettujen ohjelmistojen suunnittelijat eivät välttämättä tarvitse. Myöskin eri materiaalien eristämi- nen eri ryhmistä voisi osoittautua hankalaksi, sillä mitä suuremmalla todennäköisyydel- lä materiaalit vuotaisivat eri ryhmien välillä ristiin. Tätä myös tapahtui näissäkin harjoi- tuksissa, jota todistaa A-materiaalien omaavien palautteessa olevat pyynnöt, että bittien manipulointia voisi näissäkin materiaaleissa ohjeistaa. Harjoitustyöhön kannattaa myös suosiolla antaa selkeä ohje, kuinka esimerkiksi PYNQ-Z1 laudan normaaleihin LED:hin pääsee käsiksi. Tämä asia tuntui olevan jokaiselle eri materiaalin omaaville ryhmille yksi ensimmäisistä pysähdyspaikoista. Harjoitusohjeeseen tai pyydetyllä aloitusluennolla tätä asiaa olisi mahdollista käydä lävitse.

6.2 Harjoitustyön vaihtoehtoisen version kehitys

Kuten mittaustuloksista saaduista luvuista näkee, niin kaikki jotka tekivät harjoitustyön, tekivät 10 pisteen suorituksen, eli koko harjoitustyön. Ottaen huomioon että kurssin suo- ritti noin 200 opiskelijaa ja 57 heistä sai harjoitustyön tehtyä, niin tässä mielessä hieman kevyemmän version suunnitteleminen on kannattavaa.

Yksi hyvä vaihtoehto on suunnitella LED-matriisi näytölle täydellinen rautatason toteutus,

(47)

jossa opiskelijan ei tarvitsisi enää niin paljoa tietää näytön toiminnasta, vaan opiskeli- jan tarvitsisi enää osata lähettää pikselin koordinaatti sekä koordinaatin värit prosessorin kautta FPGA:lle. Koska tämä versio on huomattavasti helpompi kuin itse pääversio, niin saatava pistemääräkin on pienempi kuin pääharjoitustyössä. Sopiva pistemäärä tällaisel- le toteutukselle voisi olla 5-pistettä, eli puolet pienempi.

Näin ollen FPGA:lle suunniteltiin kolme eri ohjausmoduulia VHDL:llä: Sarjalähetysmo- duuli, näytönohjausmoduuli, sekä rekisterimoduuli. Kuvassa 6.2 on esitelty miten nämä kolme moduulia on yhdistetty toisiinsa. Moduulit on suunniteltu VHDL-raudankuvauskielellä.

Kuva 6.1.Led-matriisi ohjain

Rekisteripankki toimii nimensä mukaisesti pankkina LED-matriisinäytölle menevästä da- tasta. Sen sisältävää tietoa voidaan muokata samalla tavalla kuin normaalissa harjoitus- työssä, eli pankin sisääntulot on kytketty Xilinx AXI-GPIO yksikölle ja AXI-GPIO puoles- taan on asetettu toimimaan tietyssä osoiteavaruudessa, jolloin prosessori voi lähettää sille tietoa tähän osoitteeseen. Rekisteripankin sisältämä tieto on asetettu muuttumaan vain tapauksissa, kun molemmissa data ja koortinaatti sisääntulossa on uutta dataa. Tä- mä tieto saadaan käyttämällä AXI-väylän s_axi bvalid-signaalia. Tämä signaali siirtyy 1- tilaan aina kun tieto AXI-väylällä on muuttunut ja pysyy 1-tilassa vain 1-kellosyklin ajan [2]. Rekisteripankki lohkolle tämä 1-kellosykli riittää ja tallentaa omaan rekisteriinsä, että 1-tila on saavutettu. Kun huomataan että molemmissa sisääntuloissa tieto on muuttunut niin tieto tallennetaan koordinaatin mukaiseen rekisteriin.

LED-matriisi ohjainlohko toimii tässä kokonaisuudessa ohjaimena, miten tietoa luetaan rekisteripankista, miten tietoa lähetetään sarjaväylä ohjaimelle sekä ohjaa DM163 ja M54564FP-virtalähdepiiriä. Yksinkertaisesti LED-matriisiohjain kertoo rekisteripankille min- kä X-rivin tiedon se haluaa, rekisteripankki lähettää tämän 24-tavua sisältävän tiedon Led-matriisiohjaimelle jonka jälkeen ohjain siirtää tiedon tavu kerrallaan sarjaväyläohjai- melle. Lopuksi LED-matriisi ohjain suorittaa Latch-operaation DM163-piirille ja asettaa X-koordinaattia vastaavan bitin aktiiviseksi Channel-lähdölle.

Viittaukset

LIITTYVÄT TIEDOSTOT

heillä oli jo tarpeeksi »suomalaista paperia» salkuissaan, ja heidän kiin- nostuksensa uusiin lainoihin kuvasti useinkin vain halua myydä pois aikai- semmin ostettuja

Alakoulun havaintojen pohjalle voitai- siin rakentaa tuen jatkumo, niin että aikai- semmin saatu tuki jatkuu automaattisesti yläkoulussa ja toisella asteella.. Huomio

Kuten aikai- semmin (1987) olen huomauttanut, edellä kuvatun lainen pääpainollisen ja pääpainottoman tavun vokaalijärjestelmien välinen jyrkkä eroavuus, joka ilmenee

Lukiodiplomin suorittamisen edellytyksenä on, että opiskelija on suorittanut pohjakursseina määrätyn määrän kyseisen aineen tai aineryhmän lukiokursseja. Lukiodiplomin

Opiskelusuunnitelmaan voidaan sisällyttää kursse- ja perusopetuksen eri vaiheista niin, että esimerkiksi alkuvaiheen opiskelija voi tehdä päättövaiheen eng- lannin kursseja,

Janssonin perheen kirjeistä voi löytää piirteitä, jotka olivat tyypillisiä ruotsalaisella maaseudulla selvästi aikai- semmin, 1800-luvun alussa: kirjoittamista

Rovaniemen jätevesien purkupaikan alapuolella Valajaskoskella aikai- semmin tehtyjen ravinnelisäyskokeiden perusteella joen päällyslevätuotan- to oli lähinnä fosforirajoitteista,

Tammikuussa 2013 sattui tiistaipiirissä taas niin hyvin, että juuri samaan aikaan 75 vuotta aikai- semmin syntyivät Helsingin naistenklinikalla seniorit, kaksoissisarukset Helena