KANDIDAATINTYÖ. I2C-ohjatun LED PWM-ohjaimen toteuttaminen FPGA-piirillä. Anssi Partanen. Ohjaaja: Jukka Lahti

Samankaltaiset tiedostot
Ohjelmistoradio. Mikä se on:

TIETOKONETEKNIIKAN LABORAATIOT V2.0 VHDL ohjelmoinnin perusteet

Piirien väliset ohjaus- ja tiedonsiirtoväylät H. Honkanen

Arduino. Kimmo Silvonen (X)

I2S-VÄYLÄLIITYNNÄN TOTEUTUS FPGA- PIIRILLE. Joel Junttila. Ohjaaja: Jukka Lahti

6. Analogisen signaalin liittäminen mikroprosessoriin Näytteenotto analogisesta signaalista DA-muuntimet 4

TIES530 TIES530. Moniprosessorijärjestelmät. Moniprosessorijärjestelmät. Miksi moniprosessorijärjestelmä?

CLPD ja FPGA piirien arkkitehtuuri ja ominaisuudet

Arduino ohjelmistokehitys

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

ELEC-A4010 Sähköpaja Arduinon väylät tutuiksi

Ohjelmoitavat logiikkaverkot

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

Ongelma(t): Mistä loogisista lausekkeista ja niitä käytännössä toteuttavista loogisista piireistä olisi hyötyä tietojenkäsittelyssä ja tietokoneen

Nopea tiedonkeruulaitteisto radiokanavamittauksiin

S14 09 Sisäpeltorobotti AS Automaatio ja systeemitekniikan projektityöt. Antti Kulpakko, Mikko Ikonen

TKT-1220 Tietokonearitmetiikka I PC-harjoitus 3

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

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. FT Ari Viinikainen

BL40A17x0 Digitaalielektroniikka A/B: Ohjelmoitavat logiikkapiirit

Tekniikka ja liikenne (5) Tietoliikennetekniikan laboratorio

Ongelma(t): Mistä loogisista lausekkeista ja niitä käytännössä toteuttavista loogisista piireistä olisi hyötyä tietojenkäsittelyssä ja tietokoneen

ELEC-A4010 Sähköpaja Arduinon ohjelmointi. Jukka Helle

Arduino. Kimmo Silvonen (X)

SPI-VÄYLÄN TOTEUTUS FPGA-PIIRILLE

MUISTIPIIRIT H. Honkanen

1. Yleistä. 2. Ominaisuudet. 3. Liitännät

SATAKUNNAN AMMATTIKORKEAKOULU Sähkötekniikan koulutusohjelma. M-koodit Omron servojen ohjauksessa. Luovutettu. Hyväksytty

TKT-1220 Tietokonearitmetiikka I PC-harjoitus 1

A14-11 Potilaan mittaustiedon siirtäminen matkapuhelimeen

Jussi Klemola 3D- KEITTIÖSUUNNITTELUOHJELMAN KÄYTTÖÖNOTTO

1 YLEISTÄ. Taitaja2002, Imatra Teollisuuselektroniikkatyö Protorakentelu 1.1 PROJEKTIN TARKOITUS

Tietokone. Tietokone ja ylläpito. Tietokone. Tietokone. Tietokone. Tietokone

OMNIA OPINNÄYTETYÖ AMMATTIOPISTO. Diginoppa ICTP09SLG OMNIAN AMMATTIOPISTO

Kehittyneiden Aaltomuotojen Käytettävyys HF-alueen Tiedonsiirrossa

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

Mikro-ohjain µc harjoitukset - yleisohje

BL40A1810 Mikroprosessorit, harjoitus 1

LUKUJA, DATAA KÄSITTELEVÄT FUNKTIOT JA NIIDEN KÄYTTÖ LOGIIKKAOHJAUKSESSA

Tehtävä 5. ECIO dataloggeri lämpötila-anturilla

P I C A X E O H J E L M O I N T I

Elektroniikkalajin semifinaalitehtävien kuvaukset

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

LUMA SUOMI -kehittämisohjelma LUMA FINLAND -utvecklingsprogram LUMA FINLAND development programme Ohjelmointia Arduinolla

Tehtävä 2: Tietoliikenneprotokolla

AUTO3030 Digitaalitekniikan jatkokurssi, harjoitus 2, ratkaisuja

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

ELEKTRONISET TOIMINNOT

TKT224 KOODIN KOON OPTIMOINTI

Ohjelmoi Arduino Grovella

Peltorobotin akselimoduulin kontrolleri

6.3. AVR_rauta. EEPROM-muisti pva

S14 09 Sisäpeltorobotti AS Automaatio ja systeemitekniikan projektityöt. Antti Kulpakko, Mikko Ikonen

RAPORTTI Risto Paakkunainen Arto Valtonen Pasi Vähämartti Metsäteollisuuden automaation harjoitustyö Joulukuu 2007

AS Automaatio- ja systeemitekniikan projektityöt

A11-02 Infrapunasuodinautomatiikka kameralle

Harjoitustyö - Mikroprosessorit Liikennevalot

Arduino. Kimmo Silvonen (X)

7.3. Oheisrautaa. DS

EVTEK/ Antti Piironen & Pekka Valtonen 1/6 TM01S/ Elektroniikan komponentit ja järjestelmät Laboraatiot, Syksy 2003

S Elektroniikan häiriökysymykset. Laboratoriotyö, kevät 2010

WBelectronics. Infinity USB Phoenix - Käyttöohje

SM211 RS485 - JBUS/MODBUS mittarille SM103E. Käyttöohje

Projektityöt. Sami Alaiso, Jyri Lujanen 30. marraskuuta 2009

Turo Id MIKROPROSESSORIJÄRJESTELMÄN SUUNNITTELU FPGA:LLA

HARJOITUSTYÖ: LabVIEW, Kiihtyvyysanturi

TURVAVÄYLÄSEMINAARI. Erilaiset kenttäväylät ja niiden kehitys Jukka Hiltunen

Flash AD-muunnin. Ominaisuudet. +nopea -> voidaan käyttää korkeataajuuksisen signaalin muuntamiseen (GHz) +yksinkertainen

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

ELM GROUP 04. Teemu Laakso Henrik Talarmo

Käyttöohje BTGP-38KM Bluetooth GPS Data Logger V1.0

ASM-kaavio: reset. b c d e f g. 00 abcdef. naytto1. clk. 01 bc. reset. 10 a2. abdeg. 11 a3. abcdg

ELEC-C5070 Elektroniikkapaja (5 op)

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

DXL Library ja DXL-kielen olemus. Pekka Mäkinen SoftQA Oy http/

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

VHDL/Verilog/SystemC. Jukka Jokelainen

Apuja ohjelmointiin» Yleisiä virheitä

Tehtävä 6. MIAC-pohjainen valo/moottoriohjaus

Operaatiovahvistimen vahvistus voidaan säätää halutun suuruiseksi käyttämällä takaisinkytkentävastusta.

Nokeval No Käyttöohje. Tekstinäyttö 580-ALF

Mikrokontrollerit. Mikrokontrolleri

Supply jännite: Ei kuormaa Tuuletin Vastus Molemmat DC AC Taajuus/taajuudet

MultiBoot. Käyttöopas

1. Mittausjohdon valmistaminen 10 p

ELEC-A4010 Sähköpaja Arduinon ohjelmointi. Peter Kronström

Kojemeteorologia. Sami Haapanala syksy Fysiikan laitos, Ilmakehätieteiden osasto

4. Lausekielinen ohjelmointi 4.1

A. SMD-kytkennän kokoaminen ja mittaaminen

Simulaattorin asennus- ja käyttöohje

Digitaalitekniikka (piirit) Luku 15 Sivu 1 (17) Salvat ja kiikut 1D C1 C1 1T 1J C1 1K S R

2 Konekieli, aliohjelmat, keskeytykset

1 Muutokset piirilevylle

Pika-asennusohjeet Suomeksi

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

Interfacing Product Data Management System

SM210 RS485 - JBUS/MODBUS mittarille SM102E. Käyttöohje

GSM OHJAIN FF KÄYTTÖOHJE PLC MAX S03

Taitaja semifinaali 2010, Iisalmi Jääkaapin ovihälytin

Midland BTNext -päivityssovellus

Transkriptio:

KANDIDAATINTYÖ I2C-ohjatun LED PWM-ohjaimen toteuttaminen FPGA-piirillä Anssi Partanen Ohjaaja: Jukka Lahti SÄHKÖTEKNIIKAN TUTKINTO-OHJELMA 2016

Partanen A. (2016) I2C-ohjatun LED PWM-ohjaimen toteuttaminen FPGApiirillä. Oulun yliopisto, sähkötekniikan osasto, sähkötekniikan koulutusohjelma Kandidaatintyö, 25 s. TIIVISTELMÄ Tässä työssä toteutettiin I2C-väylällä ohjattu LED-ohjain. Lähtökohtana oli Digitaalitekniikka 2 kurssilla tehty harjoitustyö, joka sovitettiin FPGA-piirille. RTL-koodi vaati muutoksia vain siltä osin, että FPGA-alusta ja pohjana käytetty harjoitustyö käyttivät eri kellotaajuuksia. Jotta RTL-koodi saatiin toimimaan FGPA-alustalla, työssä perehdyttiin ensin FPGA-piirien konfiguroimiseen. Työn testaamista varten koottiin pienimuotoinen testausjärjestelmä, joka koostui FPGA- ja mikrokontrolleri-alustoista sekä logiikkatasonmuuntimesta. Mikrokontrollerille kirjoitettiin yksinkertainen arduino-koodi, jolla saatiin tehtyä testianimaatio LED-valojen testausta varten. Järjestelmän testaaminen aloitettiin visuaalisesti tarkastelemalla LEDvaloja, jonka perusteella pystyttiin huomaamaan ilmeisimmät ongelmat. Lisäksi suoritettujen mittausten avulla pystyttiin rajaamaan ongelmien aiheuttajia ja varmentamaan väylän toiminta ja PWM-aaltomuodot. Korjaamalla virheet RTL-koodista ja lisäämällä logiikkatasonmuunnin, järjestelmä saatiin toimimaan ongelmitta. Avainsanat: FPGA, Altera Quartus, I2C.

Partanen A. (2016) Implementation of I2C controlled LED PWM controller on FPGA. University of Oulu, Department of Electrical Engineering, Degree Programme in Electrical. Bachelor s Thesis, 25p. ABSTRACT In this project, I2C bus controlled LED controller was implemented. The starting point was an assignment made on Digital Technology 2 course which was implemented on FPGA circuit for this project. The configuration of FPGA circuits was studied first in order to get RTL code to work on FPGA board. The RTL code was then modified and compiled for the FPGA. The small-scale test environment consisting of FPGA and MCU boards as well as logic level converter was made for testing the system. Simple Arduino code was written for MCU to get test animation for the LEDs. The testing of the system began by examining the LEDs visually. From this the most obvious problems were able to be noticed. In addition, causes of problems could be limited on the basis of made measurements. PWM-waveform and operation of the I2C bus were also verified by the measurements. The system was made to work without problems by correcting errors in RTL-code and adding logic level converter. Keywords: FPGA, Altera Quartus, I2C.

SISÄLLYSLUETTELO TIIVISTELMÄ... 2 ABSTRACT... 3 SISÄLLYSLUETTELO... 4 ALKULAUSE... 5 LYHENTEIDEN JA MERKKIEN SELITYKSET... 6 1. JOHDANTO... 7 2. TEORIA... 8 2.1. FPGA-piirit... 8 2.2. I2C-väylä... 9 2.3. LED PWM-ohjain... 10 2.3.1. Ominaisuudet... 10 2.3.2. Rakenne... 10 3. TOTEUTUS... 11 3.1. Suunnitelma ja kytkennät... 11 3.2. Koodin kääntäminen... 11 3.3. Testausjärjestelmä... 13 3.4. FPGA-piirin konfigurointi... 14 3.5. Arduino koodi... 15 4. TESTAUS JA MITTAUKSET... 16 4.1. Visuaalinen tarkastelu... 16 4.2. Mittaukset BitScope... 16 4.3. Mittaukset SignalTap... 17 5. POHDINTA... 19 6. YHTEENVETO... 20 7. LÄHTEET... 21 8. LIITTEET... 22

ALKULAUSE Haluan kiittää ohjaajaani Jukka Lahtea hyvästä opastuksesta tätä työtä tehdessäni. Lisäksi haluan kiittää veljeäni Aki Partasta avusta työn kirjallisen osuuden oikolukemisessa. Oulussa 20.12.2016 Anssi Partanen

LYHENTEIDEN JA MERKKIEN SELITYKSET LED PWM FPGA I/O SW ASIC I2C SDA SCL ACK NACK PLL HDL SRAM JTAG SOF JIC SFL Light-emitting Diode Pulse Width Modulation Field-programmable Gate Array Input/Output Software Application-specific Integrated Circuit I²C, Inter-integrated Circuit Serial Data Serial Clock Acknowledge Not Acknowledge Phase-locked Loop Hardware Description Language Static Random Access Memory Joint Test Action Group SRAM Object File JTAG Indirect Configuration File Serial Flash Loader

1. JOHDANTO Tämän kandidaatintyön aiheena on yksinkertaisen digitaalisen mallin käytännöntoteutus FPGA-piirille. Suunnitelma pohjautuu digitaalitekniikka 2 kurssilla tehtyyn harjoitustyöhön, minkä vuoksi tässä työssä ei paneuduta RTL-koodin tuottamiseen. Pääyksityiskohdat tässä työssä ovat FPGA-piirin konfiguroiminen, yksinkertaisen testausjärjestelmän kokoaminen ja järjestelmän toiminnan varmentaminen. Työ koostuu teoria- ja toteutusosista, testaus ja mittaukset -osiosta sekä pohdinnasta. Alussa käsitellään työssä käytettyjen laitteiden ominaisuuksia ja muita yksityiskohtia, sekä perehdytään laitteiden käyttämiin tekniikkoihin ja standardeihin. Toteutus -osiossa perehdytään FGPA-piirin kofiguroimiseen liittyviin työvaiheisiin, sekä testausjärjestelmän kokoamiseen. Testaus ja mittaukset -kappaleessa käydään läpi järjestelmän testaaminen, sekä esitellään mittalaitteet ja niiden tulokset. Pohdinnassa on arvioitu työn onnistumista.

8 2. TEORIA Tässä kappaleessa käydään läpi tässä työssä käytettyjen laitteiden ominaisuuksia ja muita yksityiskohtia, sekä perehdytään laitteiden käyttämiin tekniikkoihin ja standardeihin. 2.1. FPGA-piirit FPGA-piiri eli field programmable gate array -piiri on yleinen toteutustekniikka digitaaliselle piirille. Sen toimintaperiaate perustuu uudelleenkonfiguroitavaan logiikkamatriisiin. FPGA-piirit koostuvat valmiista logiikkalohkoista, I/O-lohkoista, ohjelmoitavasta johdotusverkosta sekä muistilohkoista, joiden avulla voidaan toteuttaa haluttu rautatason toiminta [1]. Digitaalipiirin toiminta kuvataan kovonkuvauskielellä SW-tasolla. Kirjoitetut ohjelmistokoodit käännetään muotoon, joka sisältää tiedon siitä, kuinka komponentit kytkeytyvät toisiinsa [2]. FPGA-piirit sisältävät usean eri valmistustekniikan osia, joten niiden voidaan ajatella yhdistävän ASIC-piirien ja prosessipohjaisten järjestelmien parhaat ominaisuudet. FPGA-piirit tarjoavat rautatason nopeuden ja luotettavauuden. Tuotantomäärät voidaan pitää pieninä, sillä valmistusmenetelmään ei tarvitse sijoittaa suuria summia rahaa, toisin kuin ASIC-piirien valmistuksessa. FPGA-piirien uudelleenohjelmoitavuuden ansiosta suunnittelussa tapahtuneita virheitä on helppo ja edullinen korjata. Tästä syystä FPGA-piirejä käytetään paljon suunnitelmien prototyyppivaiheessa. FPGA-piirit häviävät ASIC-piireille kuitenkin tehonkulutuksessa ja pakkaustiheydessä niiden uudelleenkonfiguroitavuudesta johtuen [1,2]. Kuva 1 FPGA-piirin rakenne [1]

9 2.2. I2C-väylä I2C-väylä on maailmanlaajuinen standardi, jota käytetään yli 1000 eri IC-piirissä, joita valmistavat yli 50 eri valmistajaa. I2C-väylä on Philips Semiconductors:n suunnittelema kaksisuuntainen tiedonsiirtokanava. Se on toteutettu käyttämällä vain kahta siirtotietä: SDA ja SCL. SDA-signaali sisältää siirrettävän informaation sarjamuotoisena. SCL-signaali on kellosignaali, jonka avulla lähettäjä ja vastaanottaja toimivat synkronoidusti. I2C-väylä käyttää perinteistä master/slave tiedonsiirtomallia. Samaan I2C-väylään voidaan kytkeä useita master ja slave -tyypin laitteita. Jokaisella väylään kytketyllä laitteella on oma osoitteensa, jolla informaatio osoitetaan oikeaan laitteeseen. Siirrettävä data koostuu 8-bittisistä sarjamuotoisista tavuista. [3] Väylän ollessa tilassa, jossa tiedonsiirtoa ei tapahdu, SDA- ja SCL-signaalit ovat molemmat loogisessa tilassa yksi. Tämä tila on toteutettu kytkemällä väylän johtimet ylösvetovastuksilla käyttöjännitteeseen. Tiedonsiirto alkaa, kun master-laite asettaa SDA-signaalin maaahan. Tämä tilanne on esitetty kuvassa 1 kohdassa START condition. Aloituskäskyn jälkeen, slave-tyypin laitteet ovat valmiita lukemaan dataa väylältä. Tiedonsiirtopaketit ovat 8-bitin eli tavun mittaisia. Ne koostuvat seitsemästä data-bitistä ja yhdestä R/W-bitistä, jolla ilmaistaan, halutaanko laitteeseen lukea vai kirjoittaa. R/W-bitin ollessa 1 halutaan lukea ja sen ollessa 0 halutaan kirjoittaa. Jokaisen siirretyn tavun jälkeen tulee ACK eli Acknowledge-bitti, joka ilmaisee tapahtuiko tiedonsiirto onnistuneesti. Kun master on lähettänyt yhden tavun, se jää odottamaan slaven lähettämää ACK tai NACK bittiä. Ensimmäinen lähetetty tavu sisältää tietona kohdelaitteen osoitteen, jonka avulla slave tietään onko saapuva data kohdistettu siihen. [4] Kuva 2 I2C-väylän tiedonsiirron periaate [4]

10 2.3. LED PWM-ohjain 2.3.1. Ominaisuudet LED PWM-ohjain on mikrokontrollerilla ohjattu LED-valojen kirkkauden säätöön käytettävä ohjain, joka perustuu pulssinleveysmodulaatioon. Ohjain on suunniteltu ohjaamaan 25 LED-valoa, joista jokaiselle voidaan antaa eri kirkkausaste. Piiri sisältää I2C-väylän slave-rajapinnan, jonka kautta tiedonsiirto tapahtuu. Piiri generoi PWM aaltomuodot, jotka on moduloitu kirkkaustasojen mukaisesti. LED PWM-ohjaimen ja mikrokontrollerin välinen tiedonsiirto on kuvattu tarkemmin kappaleessa 2.2. Ensimmäisen datapaketin saavuttua ohjaimelle, ledit kytketään päälle annettujen arvojen mukaisesti. Piiri sisältää myös omanaisuuden, jolla voidaan nappia painamalla himmentää kaikkien ledien kirkkautta. Tätä ominaisuutta ei kuitenkaan otettu mukaan lopulliseen FPGA-toteutukseen. Ledit voidaan sammuttaa lähettämällä ohjaimelle lyhyt -paketti, joka sisältää vähemmän kuin 25 tavua. 2.3.2. Rakenne LED PWM-ohjainpiiri koostuu useasta eri lohkosta. Kuvassa 3 on esitetty piirin arkkitehtuuritason lohkokuvaaja. Kuva löytyy myös suurempana liitteenä 1. Lohkon i2c_slave toimintoihin kuuluvat SDA- ja SCL-pulssien reunojen tunnistus, kolmitila signaalien ohjaus ja synkronointi. dregs-lohko on rekisteripankki, joka sisältää 25 8- bittistä rekisteriä. LED-valojen kirkkauden määrää pulssien leveysarvot, jotka on vastaanotettu I2C-vaylän kautta ja jotka tallennetaan dregs-rekisteripankkiin. Pulssien leveyden moduloimiseen tarvittavat laskurit on sijoitettu pwm_counter-lohkoon. pwm_gen-lohko generoi PWM-aaltomuodot ledejä varten. Jokaiselle ledille on oma pwm_gen-lohko. Ohjaussignaaleja ajaa control_unit-lohko. button_if-lohko synkronoi ja suodattaa napin painamisesta tulevan signaalin. Kuva 3 LED PWM-piirin rakenne

11 3. TOTEUTUS 3.1. Suunnitelma ja kytkennät Tässä työssä käytetty RTL-suunnitelma pohjautuu suurimmaksi osakseen digitaalitekniikka 2 kurssilla tehtyyn projektiin. Alkuperäinen suunnitelma on tehty toimimaan 10Mhz taajuudella ja työssä käytettävä FPGA-piirin kellotaajuus on 50Mhz, joten RTL-koodiin tehtiin pieniä muutoksia. Suunnitelma sisältää laskureita, joita inkrementoidaan aina kellon nousevalla reunalla. Nopeammasta kellotaajuudesta johtuen laskurit saavuttavat maksimiarvonsa liian nopeasti ja niistä dekoodatut signaalit tulevat väärään aikaan. Laskurit uudelleenmitoitettiin ja uudet arvot korjattiin RTL-koodiin. Vaihtoehtoinen tapa olisi ollut käyttää PLL eli phase-locked loop lohkoa, jonka avulla olisi voitu tuottaa haluttu kellotaajuus. Tässä tapauksessa on kuitenkin helpompi vain muuttaa laskureiden arvoa niiden vähäisestä määrästä johtuen. Jos laskureita olisi enemmän ja suunnitelma olisi muutenkin kompleksisempi, oikea tapa olisi käyttää PLL-lohkoa. Koodiin oli myös tehtävä muita muutoksia, jotta se olisi käännettävissä Quartus-ohjelmistolla. Muutosten jälkeen suunnitelmalle ajettiin vielä RTL-simulointi, jolla varmistettiin, ettei suunnitelman toiminta ole muuttunut edeltävien muutosten seurauksena. 3.2. Koodin kääntäminen Seuraava vaihe RTL-koodin valmistumisen jälkeen on koodin kääntäminen. Jokaisella FPGA-valmistajalla on oma ohjelmistonsa, jolla koodin kääntäminen ja piirin ohjelmoiminen tapahtuvat. Tässä tapauksessa käytössä oli Altaran valmistama FPGApiiri ja saman valmistajan Quartus-ohjelmisto. Kääntäminen tapahtui käyttämällä Quartuksen Compiler ominaisuutta. Compiler koostuu useasta eri moduulista, joilla projektin suunnitelmatiedostot muunnetaan tiedostoiksi laitteen ohjelmointia ja simulointeja varten. HDL-kieliset kooditiedostot eivät suoraan sisällä tietoa siitä, kuinka FPGA-piiri tulisi ohjelmoida, vaan koodi tulee ensin kääntää. Kuvassa 4 on esitetty käännöksen eri vaiheet.

12 Kuva 4 Kääntäjän rakenne Synteesi tehdään Compiler:n ensimmäisessä moduulissa: Analysis & Synthesis. Ensimmäiseksi tarkistetaan tiedostojen syntaksi ja koko suunnitelma virheiden varalta sekä kootaan yksi tietokanta, joka yhdistää kaikki tiedostot yhdeksi hierarkiaksi. Seuraavaksi vuorossa on logiikkasynteesi, jossa minimoidaan suunnitelman logiikka, sekä suoritetaan teknologiakartoitus, jossa implementoidaan logiikka käyttämään FPGA-piiriltä löytyviä resursseja kuten logiikkaelementtejä. Seuraava moduuli on nimeltään Fitter eli sovittaja, jota kutsutaan myös place and route -vaiheeksi. Fitter sovittaa suunnitelman logiikan FPGA-piirille. Käyttämällä Analysis & Synthesis-moduulin luomaa tietokantaa, fitter sovittaa projektin logiikan ja ajoitusvaatimukset halutuiksi käyttäen piiriltä saatavilla olevia resursseja. Se sijoittaa jokaisen logiikkafunktion parhaaseen mahdolliseen logiikkasoluun johdotuksen ja ajoituksen kannalta sekä valitsee sopivimmat yhteyspolut ja pinnien määritykset. Place and route vaihteesta saatavan tiedon pohjalta on mahdollista suorittaa ajoitusta koskevat simuloinnit. The TimeQuest Timing Analyzer-moduuli mittaa signaalin etenemisviiveen synkronisessa systeemissä. Se analysoi ajoituspolkuja suunnitelmassa ja laskee viiveen jokaiselle polulle, sekä analysoi ajoitusvaatimusrikkomukset ja raportoi tuloksista. Tulosten perusteella voidaan päättää, täytyykö suunnitelman ajoitusvaatimuksiin tehdä joitain poikkeuksia tai vaaditaanko logiikkaan muutoksia vaatimusten saavuttamiseksi. Ohjelmointitiedostot luova Compiler:n Assembler-moduuli on käännöksen viimeinen vaihe. Assember muuttaa fitter-moduulin laitteen, logiikkalohkojen ja pinnien määritykset ohjelmoitavaksi image-tiedostoksi, sekä luo tiedostoja tehonkulutuksen arvioimista varten. Image-tiedostojen tyypeistä ja niiden käyttötarkoituksista on kerrottu enemmän kappaleessa 3.4. [6]

13 3.3. Testausjärjestelmä FPGA-piirin testausta varten sen ympärille koottiin pienimuotoinen testausjärjestelmä, jonka avulla systeemin toimivuus pystyttiin varmistamaan. Järjestelmä koostuu FPGA-kehityslaudasta, Arduino-mikroprosessorista ja logiikkatasonmuuntajasta. Niiden lisäksi tarvittiin myös PC:tä laitteiden konfigurointiin. Kuvassa 5 on esitetty havainnekuva testausjärjestelmästä, josta voi nähdä kuinka laitteet on kytketty toisiinsa. Kuva 5 Testausjärjestelmä Tässä työssä käytettiin Terasicin valmistamaa DE0-Nano kehitysalustaa, joka sisältää Alteran Cyclone IV (EP4CE22F17C6N) FPGA-piirin. FPGA-piirin tärkeimpinä ominaisuuksina mainittakoon 22320 logiikka elementtiä, 594Kbit muistia, 66 kappaletta 18x18 kertoimia, 4 PLL-lohkoa sekä 153 I/O-pinniä. Kehitysalustalta löytyy myös FPGA-piirin konfigurointiin tarvittavat USB-Blaster ja EPCS-laitteet sekä 50MHz kellotaajuudella toimiva kello-oskillaattori. Muita tärkeitä ominaisuuksia ovat alustalta löytyvät 3.3V I/O-pinnit sekä 8kpl vihreitä LED-valoja, jotka ovat tämän työn kannalta oleellisia. [7] Arduino on avoimeen lähdekoodiin perustuva mikrokontrollerialusta, jota on helppo käyttää ja jolle on saatavilla laaja ohjelmistokirjasto. Tässä työssä käytössä oli Arduino Uno kehitysalusta, joka pohjautuu ATmega328P mikrokontrolleriin. Alustan ja mikrokontrollerin käyttöjännite on 5V. Työssä käytettiin Wire-kirjastoa, joka sisälsi valmiiksi mahdollisuuden kommunikoida I2C-väylää käyttäen. [8] Kehitysalustojen käyttöjännitteiden erosta johtuen laitteita ei suoraan voitu kytkeä kiinni toisiinsa. Kehitysalustojen väliin tarvittiin muunnin, joka muuttaa logiikkatasot kummallekin laitteelle sopivaksi. Kuvassa 6 on esitetty yksinkertainen kytkentä, jolla haluttu muutos saatiin tehtyä. Vastukset R1, R2, R3 ja R4 ovat ylösvetovastuksia 3,3V:n ja 5V:n käyttöjänniteisiin. Niillä on toteutettu väylien heikkolooginen tila yksi. FGPA-kehitysalusta kytketään pinneihin SDA1 ja SCL1 ja Arduino pinneihin SDA2 ja SCL2. Kytkennässä käytetyt transistorit ovat mallia BSS138. Ne ovat N-tyypin DMOS-transistoreja, jotka ovat suunniteltu muun muassa logiikkatason muunnoksiin.

14 Kuva 6 Logiikkatasonmuuntajan piirikaavio 3.4. FPGA-piirin konfigurointi DE0-nano kehitysalustalla olevan FPGA-piirin ohjelmointi tapahtuu JTAG-porttia käyttäen. FPGA-piirillä kunkin logiikkalohkon konfigurointidata on tallennettu sitä ohjaavaan SRAM-lohkoon. SRAM on muistityyppi, joka ei säilytä sisältämäänsä dataa virran katkaisun jälkeen. Tästä syystä FPGA-piiri tulee aina virran päälle kytkemisen jälkeen ohjelmoida uudelleen. Quartus-ohjelmisto generoi koodin kääntämisen jälkeen sof-tiedoston eli SRAM object file:n, joka sisältää tiedon siitä, kuinka SRAM-lohkot ohjelmoidaan. Kuvassa 7 on esitetty konfigurointiketju sof-tiedostolla. Terasic:n DE0-alusta kytketään tietokoneeseen USB-kaapelilla. UBS Blaster on Alteran valmistama laite, jolla tiedonsiirto FPGA:lle viimekädessä tapahtuu. USB Blaster toimii linkkinä USBrajapinnan ja JTAG-rajapinnan välillä. [5] Kuva 7 Konfigurointiketju sof-tiedostolla Kuvassa 8 on esitetty vaihtoehtoinen tapa konfiguroida FPGA-piiri. Tämä konfigurointiketju on hieman monimutkaisempi kuin edellä esitetty ketju, mutta sitä käyttämällä saavutetaan seuraavanlaisia etuja. Ideana tässä konfigurointitavassa on

15 tallentaa konfugurointidata DE-0 alustalta löytyvään Flash-muistiin, joka säilyttää datan myös virran katkaisun jälkeen. Ensiksi Quartuksen generoima sof-tiedosto on muutettava jic eli JTAG Indirect Configuration File muotoon. Muunnos onnistuu Quartuksen sisäsäisellä konvertterilla (File -> Convert Programming Files). Serial Configuration Device (EPCS) on laite, jonka konfiguroi FPGA-piirin aina virran käynnistyksen jälkeen. Se sisältää Flash-muistin sekä tarvittavan ohjauslogiikan. Suoraa väylää USB-portin ja EPCS:n välillä ei ole, vaan tiedonsiirron täytyy tapahtua FPGA:n kautta. Tätä varten on FPGA ensin ohjelmoitava imagella, joka sisältää Serial Flash Loaderin (SFL). SFL luo yhteyden USB Blasterin ja EPCS:n välille. SFLimagesta ei kuitenkaan itse tarvitse huolehtia vaan Quartuksen programmer generoi ja ohjelmoi sen automaattisesti FGPA:lle jic-tiedoston ollessa valittuna. Kuva 8 Konfigurointiketju jic-tiedostolla 3.5. Arduino koodi Mikrokontrolleria varten tehtiin yksinkertainen ohjelmistokoodi, jolla pystytiin ohjaamaan FGPA-alustaa ja testaamaan järjestelmän toiminta. Arduino on C-kieleen pohjautuva koodikieli, mutta sen kirjastot tekevät siitä vielä astetta ylemmän tason koodikieltä muistuttavaa, sillä porttitasolla ei tarvitse koodata. Tässä työssä käytettiin Wire-kirjastoa, josta löytyi suoraan I2C-väylää ohjaava funktio. LED-valojen animaatio tehtiin siten, että yksi LED-valo paloi täydellä kirkkaudella ja sitä edeltävät ja seuraavat LED-valot himmenivät portaittain. Arduino koodi on liitteenä 3.

16 4. TESTAUS JA MITTAUKSET Tässä kappaleessa käydään läpi, kuinka systeemiä testattiin sekä esitellään mittalaitteet ja saadut tulokset. Myös työssä ilmenneitä vikoja ja virheitä sekä niiden ratkaisuja käydään läpi tässä kappaleessa. 4.1. Visuaalinen tarkastelu Laitteiden konfiguroimisen (kappale 3.4) ja testausjärjestelmän kokoamisen (kappale 3.3) jälkeen siirryttiin järjestelmän testaamiseen. FPGA-alustalla olevat LED-valot, joita työssä ohjattiin, toivat helpon tavan tarkastella systeemin toimintaa. Heti aluksi voitiin huomata, että LED-valojen animaatio oli halutun mukainen, mutta ne välkkyivät 5kHz alemmalla taajuudella. Syy tähän oli ilmeinen; PWM taajuus oli liian pieni, johtuen laskureiden uudelleenmitoittamisessa tapahtuneesta laskuvirheestä. Pienen muutoksen jälkeen RTL-koodiin LED-valojen kirkkaus toimi halutulla tavalla. Toinen selvästi havaittava ongelma oli I2C-väylän jumiutuminen satunnaisen ajan välein. Ongelma ilmeni siten, että LED-valojen animaatio pysähtyi. Sen syy saatiin rajattua väylän epävakauteen. Tähän viittasi animaation jatkuminen mikrokontrollerin uudelleenkäynnistämisen jälkeen. Tätä tukivat myös kappaleessa 4.2 esitellyt mittaukset. Ongelma korjattiin lisäämällä kuvassa 6 esitelty logiikkatasonmuuntaja, jonka avulla väylä saatiin toimimaan vakaasti. 4.2. Mittaukset BitScope Työssä käytettiin BitScope Micro Analyzer & Scope -mittalaitetta. Se on pienivirtainen, suoraan PC:n USB-väylään liitettävä laite, josta löytyy runsaasti erilaisia ominaisuuksia, kuten muun muassa digitaalinen oskilloskooppi, spektri analysaattori sekä logiikka- ja protokolla-analysaattori. Tämän työn kannalta selkeimpiin mittaustuloksiin päästiin käyttämällä logiikka- ja protokollaanalysaattoria, sillä mittadatan olleessa valmiiksi I2C-protokollalle ominaisessa muodossa, se oli huomattavasti helppolukuisempaa. Kuvissa 9 ja 10 on esitelty mittaukset kappaleen 4.1 tapaukseen, jossa I2C-väylän epävakaus johti koko systeemin jumiutumiseen. Kuvissa kaksi ylintä signaalia kuvaavat SDA- ja SCL -signaaleja analogisessa muodossa. Niitä tarkasteltaessa täytyy huomioida se, että pitkän aikavälin mittauksia tehdessä näytteenottotaajuus on alhainen ja tällöin ne eivät tarkasti kuvaa aaltomuotoja todellisuudessa. Kaksi alinta signaalia ovat digitaalisessa muodossa ja SDA -signaali on valittu näkymään I2Cprotokollan pakettien muodossa. Kuvista voidaan nähdä, kuinka muutamien onnistuneiden tiedonsiirtokertojen jälkeen tiedonsiirto epäonnistuu, josta seuraa NACK-bitti. NACK-bitin jälkeen väylä menee virheelliseen tilaan, jossa SDA ja SLC ovat tilassa 1, eikä tiedonsiirtoa enää tapahdu. Tiedonsiirtoa olisi voitu jatkaa lisäämällä mikrokontrollerin koodiin ominaisuus, jossa NACK-bitin ilmentyessä tiedonsiirto olisi aloitettu uudelleen. Tämä ei kuitenkaan olisi poistanut väylän epävakautta. Kokonainen 25-tavuinen tiedonsiirto on esitetty liitteessä 2.

17 Kuva 9 Epäonnistunut tiedonsiirto Kuva 10 Virheestä johtuva NACK 4.3. Mittaukset SignalTap Toinen työssä käytetty mittausjärjestelmä on nimeltään SignalTap. Se on sulautettu logiikka-analysaattori, joka on osa Alteran Quartus-ohjelmistoa. SignalTapominaisuutta voidaan käyttää järjestelmätason virheiden paikantamisen ja korjaamisen apuna eli debug-työkaluna. Sen avulla voidaan tarkastella reaaliaikaisia signaaleja FPGA:lle implementoidusta suunnitelmasta. SignalTap sitoutuu osaksi imagetiedostoa koodiin kääntämisen yhteydessä ja ohjelmoituu FPGA:lle. Kun työ on valmis, on SignalTap-ominaisuus helposti kytkettävissä pois käytöstä, jolloin se ei turhaan kuluta resursseja. Mittauspisteeksi voidaan valita mikä tahansa suunnitelma muuttujista tai lohkojen porteista. Tässä tapauksessa mittapisteiksi valittiin LED-valoja ohjaavat PWMsignaalit, koska silmämääräisesti on vaikea sanoa toimiiko kirkkauden säätö halutulla tavalla. Mittauksia varten lisättiin PLL-lohko, jolla tarvittava näytteenottotaajuus saatiin generoitua. Mittaustulokset on esitetty kuvassa 11, sekä lyhyemmällä aikavälillä kuvassa 12. Tuloksista nähdään, että PWM-signaalit ovat halutun mukaisia. Kuvissa LED-valojen animaatiota on nopeutettu mittauksia varten. Kuva 11 LED:jä ohjaavat PWM-signaalit

Kuva 12 PWM-aaltomuodot tarkemmin 18

19 5. POHDINTA Tässä työssä opittiin, kuinka FPGA-piiri konfiguroidaan ja kuinka vakaasti toimiva I2C-väylä voidaan toteuttaa. Alussa ilmenneet epävakausongelmat saatiin ratkaistua ja lopputulos oli hyvä. Mittauksilla pystyttiin varmistamaan, että tiedonsiirto I2Cväylällä toimi oikein sekä varmistamaan, että PWM-signaalit olivat oikeanlaisia. Työssä pohjana käytetyn harjoitustyön ja FPGA-alustan eri kellotaajuuksista johtuen koodiin piti tehdä muutoksia, jotka myöhemmin todettiin virheellisiksi. Näiltä virheiltä olisi vältytty, jos olisi käytetty PLL-lohkoa koodin muuttamisen sijaan. Ratkaisu oli siinä mielessä hyvä, että nopeamman kellotaajuuden ansiosta LEDvalojen päivitysnopeus oli korkeampi. Epävakaasti toimivan I2C-väylän korjaus oli tärkeä osa työtä, sillä ilman vakaata tiedonsiirtoa järjestelmä oli ollut käyttökelvoton. Parantamalla maadoitusta ja lisäämällä järjestelmään logiikkatasonmuuntaja olivat toimivia ratkaisuja epävakauden poistamiseksi. Ne kuitenkin tekivät kytkennästä hieman monimutkaisempia ja lisäsivät johtimien lukumäärää alustojen välillä.

20 6. YHTEENVETO Tässä työssä toteutettiin I2C-väylällä ohjattu LED-ohjain. Lähtökohtana oli Digitaalitekniikka 2 kurssilla tehty harjoitustyö, joka sovitettiin FPGA-piirille. RTLkoodi vaati muutoksia vain siltä osin, että FPGA-alusta ja pohjana käytetty harjoitustyö käyttivät eri kellotaajuuksia. Jotta RTL-koodi saatiin toimimaan FGPAalustalla, työssä perehdyttiin ensin FPGA-piirien konfiguroimiseen. Työn testaamista varten koottiin pienimuotoinen testausjärjestelmä, joka koostui FPGA- ja mikrokontrolleri-alustoista sekä logiikkatasonmuuntimesta. Mikrokontrollerille kirjoitettiin yksinkertainen arduino-koodi, jolla saatiin tehtyä testianimaatio LED-valojen testausta varten. Järjestelmän testaaminen aloitettiin visuaalisesti tarkastelemalla LED-valoja, jonka perusteella pystyttiin huomaamaan ilmeisimmät ongelmat. Lisäksi suoritettujen mittausten avulla pystyttiin rajaamaan ongelmien aiheuttajia ja varmentamaan väylän toiminta ja PWM-aaltomuodot. Korjaamalla virheet RTL-koodista ja lisäämällä logiikkatasonmuunnin, järjestelmä saatiin toimimaan ongelmitta.

21 7. LÄHTEET [1] J. Lahti (2015) Digital Design Basics. Oulun yliopisto, Elektroniikan laboratorio, Oulu. [2] R. Wisniewski (2009) Synthesis of Compositional Microprogram Control Units for Programmable Devices, University of Zielona Góra, Poland [3] NXP Semiconductors (luettu 7.3.2016) I2C-bus specification and user manual URL: http://www.nxp.com/documents/user_manual/um10204.pdf. [4] Philips Semiconductors (luettu 15.3.2016) I2C Manual URL: http://www.nxp.com/documents/application_note/an10216.pdf [5] Altera (luettu 6.9.2016) Cyclone IV Device Handbook URL: https://www.altera.com/content/dam/alterawww/global/en_us/pdfs/literature/hb/cyclone-iv/cyclone4-handbook.pdf [6] Altera (luettu 5.10.2016) Quartus II Help ULR: http://quartushelp.altera.com/15.0/mergedprojects/comp/comp/comp_view _comp.htm [7] Terasic (luettu 15.10.2016) DE0-Nano Board URL: http://www.terasic.com.tw/cgibin/page/archive.pl?language=english&categoryno=165&no=593&part No=2 [8] Arduino (luettu 16.10.2016) Arduino UNO URL: https://www.arduino.cc/en/main/arduinoboarduno

22 8. LIITTEET Liite 1. Liite 2. Liite 3. LED PWM-ohjainpiirin rakenne Kokonainen 25-tavuinen tiedonsiirto Arduino-koodi

Liite 1. LED PWM-ohjainpiirin rakenne 23

Liite 2. Kokonainen 25-tavuinen tiedonsiirto 24

25 Liite 3. Arduino-koodi #include <Wire.h> void setup() { Wire.begin(); // join i2c bus (address optional for master) } byte x = 0b10000000; int z = 0; int y = 1; void loop() { Wire.beginTransmission(0b0010000); // transmit to device #8 for(int i = 0; i < 25; i++){ if(i < 8){ if(i == z){ Wire.write(0b11111111); } for(int a = 1; a < 8; a++){ if((i == (z - a)) or (i ==(z + a))){ Wire.write(x>>(a)); } } } else{ Wire.write(0b00000000); } } Wire.endTransmission(); // stop transmitting if(z == 7){ y = -1; } if(z == 0){ y = 1; } z = z + y; delay(33); }