Teach Urruneko laborategidun ikasgaiak

Teach ikasgaia

Nios V DE1-SoC plakan (4/5): HEX bistaratzailea eta tenporizadorea

Konpilatu eta kargatu Nios V-rako C adibideak, HEX0 eta tarte-tenporizadorea erabiltzeko; behatu HEX0 eta LEDR0 irteeren portaera DE1-SoC plakan.

  • DE1-SoC · Nios V
  • 75 min
  • Informatika, Elektronika edo Konputagailuen Ingeniaritzako unibertsitateko lehen mailak
  • eu
  • Digital systems & FPGA · Embedded systems

Hasi saioa irakasle-kontu batekin klase-saioa prestatzeko. Ikasleak klase-kode batekin sartzen dira.

Nios V programak HEX3_HEX0 erregistroan idazten du (0xFF200020), eta haren beheko byteak HEX0 kontrolatzen du. Tarte-tenporizadorea ere konfiguratzen du (0xFF202000 oinarria); TO bat bihurtzen denean, programak detektatu, zeroan jarri eta LEDR0-ren egoera aldatzen du.
DE1-SoC · Nios V · Laborategiaren xehetasunak

Ikaskuntza-emaitzak

  • Nios V sistema finkoan egiaztatutako bistaratzailearen eta tenporizadorearen periferikoak erabiltzea, memorian mapatutako erregistroen bidez.

  • Azaltzea zergatik behar dituzten zazpi segmentuko bistaratzaileek segmentuen patroi kodetuak.

  • FPGAren 0xFF202000 helbideko tarte-tenporizadorea konfiguratu eta galdeketa bidez irakurtzea.

  • JP1/GPIO bidez egiaztatutako NB0..NB3 sarrera logikoak eta FPGAcademyren KEY portua bereiztea; egungo nabigatzaileko kontrolak ez dira KEY erregistrora iristen.

  • Periferikoen portaeraren benetako ebidentzia jasotzea DE1-SoC plakan.

Ikaslearen jardueraren aurrebista

Jardueraren edukia

Aurrebista soilik. Klase-saio batean, ikasleek erantzunak bete eta lana irakasleari bidal diezaiokete.

1

GPIOtik periferikoetara

5 min

Aurreko ikasgaietan, memorian mapatutako sarrera/irteera erabili duzu kontrol errazetarako: nabigatzaileko NSW sarrerak, JP1eko GPIO datuak eta LEDR irteerak. Orain ideia bera aplikatuko diezu FPGA sistema finkoan dauden beste bi periferiko osatuagori.

Periferikoa Nios V prozesadoreak helbide jakinetan irakurriz eta idatziz kontrolatzen duen hardware-blokea da. Ez duzu FPGAren diseinua aldatuko. main.c ordeztuko duzu C adibide txikiekin, ELF programa konpilatu eta kargatuko duzu, eta plakaren portaera erregistroen azalpenarekin bat datorren egiaztatuko duzu.

Derrigorrezko bi adibideak hauek dira:

  • hex_counter: patroi kodetuak idazten ditu HEX0 bistaratzailean.
  • timer_blink: tarte-tenporizadorea konfiguratzen du eta LEDR0-ren egoera txandakatzen du.

Erregistro-mapa osoa kontsultatzeko, erabili FPGAcademy DE1-SoC Computer with Nios V eskuliburua. Jarduerak behar diren zatiak azaltzen ditu: HEX3_HEX0, 0xFF200020 helbidean, eta tarte-tenporizadorea, 0xFF202000 oinarri-helbidean.

Nios V programak HEX3_HEX0 erregistroan idazten du (0xFF200020), eta haren beheko byteak HEX0 kontrolatzen du. Tarte-tenporizadorea ere konfiguratzen du (0xFF202000 oinarria); TO bat bihurtzen denean, programak detektatu, zeroan jarri eta LEDR0-ren egoera aldatzen du.

Bi bide erabiliko dituzu Nios V sistema finkoan: HEX bistaratzailearen irteera, eta LEDaren denbora-tarteak kontrolatzen dituen tenporizadorea. Adibideak banaka exekutatuko dituzu.

Nabigatzaileak Nios V-ren NB0..NB3 botoi logikoak erakusten ditu. JP1/GPIO sarrerak dira; ez dute 0xFF200050 helbideko FPGAcademyren KEY erregistroa erabiltzen.

Derrigorrezko lanerako, erabili ondorengo HEX eta tenporizadore adibideak. Botoien aukerako atalak behar duen azalpena eta kodea ditu: NB0..NB3 JP1eko sarrera logiko gisa erabiltzen ditu, KEY0..KEY3 izenak erabili gabe.

Erabili jarduera honetan azaltzen diren kontrolak eta helbideak. Erregistro bat erreferentziako sisteman egoteak ez du bermatzen nabigatzaileko kontrol bat hari konektatuta dagoenik. Bereziki, ez ordeztu NB botoien JP1 bidea KEY erregistroarekin.

2

HEX irteera-erregistroa

22 min

HEX bistaratzaileek zazpi segmentu dituzte. 3 digitua erakusteko ez da zuzenean hiru zenbakia idazten: segmentu bakoitza piztu edo itzaltzen duen bit-patroia idazten da.

hex_counter adibideak segmentu-patroiak HEX3_HEX0 erregistroan idazten ditu, 0xFF200020 helbidean.

HEX3_HEX0 erregistroko byte bakoitzak bistaratzaile bat kontrolatzen du. Programa honek beheko byteko patroia aldatzen du, HEX0 kontrolatzeko; gainerako byteak zeroan idazten ditu. 0x3F ez da zero zenbakia: 0 digitua marrazteko behar diren segmentuak pizten dituen patroia da.

Adibideak:

  • 0 digituaren patroia 0x3F da.
  • 1 digituaren patroia 0x06 da.
  • A digitu hamaseitarraren patroia 0x77 da.
  1. Ireki Nios V C IDE for DE1-SoC.

  2. Ordeztu hasierako kodea ondorengo hex_counter kodearekin.

  3. Sakatu Build ELF eta gero Enviar a la FPGA (ingelesez, Upload to FPGA).

  4. Behatu HEX0 plakaren irudian, gutxienez bi digitu desberdin ikusi arte.

  5. Jaso HEX0-k balio hamaseitarrak txandaka erakusten dituen.

Klase-saio batean erabilgarri

Erabili kode hau hex_counter programarako:

Hautatu bloke osoa main.c fitxategian kopiatu aurretik; hasierako kode osoa ordeztu behar duzu.

/* DE1-SoC Computer with Nios V -- memorian mapatutako S/I */
volatile int *HEX3_HEX0 = (int *) 0xFF200020;  /* 7 segmentu: HEX3..HEX0 */

static const unsigned char HEX_CODE[16] = {
    0x3F, 0x06, 0x5B, 0x4F,
    0x66, 0x6D, 0x7D, 0x07,
    0x7F, 0x67, 0x77, 0x7C,
    0x39, 0x5E, 0x79, 0x71
};

static void delay(void)
{
    volatile int i;
    for (i = 0; i < 2000000; i++) {
    }
}

int main(void)
{
    int count = 0;

    while (1) {
        *HEX3_HEX0 = HEX_CODE[count & 0xF];
        count++;
        delay();
    }
    return 0;
}

Jaso hex_counter kargatu ondoren behatutakoa taulan. Espero den portaera emanda dago. Gehitu HEX0-n ikusitako bi digitu edo patroi desberdin, eta hautatu zuzena, hutsegitea edo ezin ondorioztatu emaitza gisa.

Jaso benetako plakako HEX0-ren egiaztapen bat. Mantendu espero den portaera, irakasleak beste probarik eskatu ezean. Idatzi behatutako bi digitu edo patroi eta hautatu zuzena, hutsegitea edo ezin ondorioztatu.

Espero den portaera Behatutako lehen digitua edo patroia Behatutako bigarren digitua edo patroia Emaitza: zuzena / hutsegitea / ezin ondorioztatu

Zergatik erabiltzen du adibideak segmentu-patroien bilaketa-taula, HEX erregistroan zuzenean 0, 1, 2 eta abar zenbaki osoak idatzi ordez?

3

Tarte-tenporizadorea

22 min

timer_blink adibideak FPGAren tarte-tenporizadorea programatzen du, 0xFF202000 oinarri-helbidean. Denbora-tartea ezarri, tenporizadorea abiarazi, tartea amaitu den adierazten duen bita galdeketa bidez irakurri, bit hori zeroan jarri eta LEDR0-ren egoera aldatzen du.

Tenporizadorearen erlojua 100 MHz-ekoa da; beraz, 50.000.000 ziklok segundo erdia ematen dute gutxi gorabehera. Hasierako 32 biteko zenbaketa-balioa 16 biteko bi erregistrotan banatzen da, interfazeak beheko eta goiko erdiak bereiz gordetzen dituelako. LEDak egoera aldatzen du tarte bakoitzean: piztu-itzali ziklo osoak bi tarte behar ditu, segundo bat inguru. Kamerako atzerapenak behaketari eragin diezaioke; begizta honek software bidez detektatzen du tartearen amaiera.

Erabilitako tenporizadore-erregistroak:

  • STATUS, +0x0 desplazamenduan: 0. bita, TO, bat bihurtzen da tartea amaitzean.
  • CONTROL, +0x4 desplazamenduan: STOP gelditzeko da, START abiarazteko eta CONT zenbaketa etengabe errepikatzeko.
  • PERIOD_LO, +0x8 desplazamenduan: zenbaketa-balioaren beheko 16 bitak.
  • PERIOD_HI, +0xC desplazamenduan: zenbaketa-balioaren goiko 16 bitak.
  1. Ordeztu C kodea ondorengo timer_blink kodearekin.

  2. Sakatu Build ELF eta gero Enviar a la FPGA.

  3. Behatu LEDR0 gutxienez 10 segundoz.

  4. Jaso LEDaren egoera aldatzen den gutxienez bi une.

  5. Estimatu ea LEDaren piztu-itzali zikloa nahikoa erregularra den aurreikusitako denbora-kontrolerako.

Klase-saio batean erabilgarri

Erabili kode hau timer_blink programarako:

Hautatu bloke osoa main.c fitxategian kopiatu aurretik; aurreko kode osoa ordeztu behar duzu.

/* DE1-SoC Computer with Nios V -- memorian mapatutako S/I */
volatile int *LEDS = (int *) 0xFF200000;  /* LED gorriak */

#define TIMER_BASE      0xFF202000
#define TIMER_STATUS    (*(volatile short *)(TIMER_BASE + 0x0))
#define TIMER_CONTROL   (*(volatile short *)(TIMER_BASE + 0x4))
#define TIMER_PERIOD_LO (*(volatile short *)(TIMER_BASE + 0x8))
#define TIMER_PERIOD_HI (*(volatile short *)(TIMER_BASE + 0xC))

#define TIMER_TO        0x1
#define TIMER_CONT      0x2
#define TIMER_START     0x4
#define TIMER_STOP      0x8

int main(void)
{
    const unsigned int half_second = 50000000u;  /* 100 MHz-eko tenporizadore-erlojua */
    int led = 0;

    TIMER_CONTROL = TIMER_STOP;
    TIMER_PERIOD_LO = (short)(half_second & 0xFFFFu);
    TIMER_PERIOD_HI = (short)((half_second >> 16) & 0xFFFFu);
    TIMER_STATUS = 0;  /* TO zeroan jarri */
    TIMER_CONTROL = TIMER_CONT | TIMER_START;

    while (1) {
        if ((TIMER_STATUS & TIMER_TO) != 0) {
            TIMER_STATUS = 0;  /* TO zeroan jarri */
            led ^= 1;
            *LEDS = led;
        }
    }
    return 0;
}

Jaso tenporizadoreak kontrolatutako LEDaren piztu-itzali zikloa taulan. Mantendu 10 segundoko behaketa-tartea, irakasleak proba luzeagorik eskatu ezean. Ebidentzian, idatzi zer aldatu den —adibidez, itzalita → piztuta → itzalita— eta, ahal baduzu, aldaketen gutxi gorabeherako uneak behaketa hasi duzunetik. Baloratu denbora-tarteak nahikoa erregularrak diruditen aurreikusitako erabilerarako, eta hautatu zuzena, hutsegitea edo ezin ondorioztatu.

Jaso tenporizadorearen behaketa bat. Erabili 10 segundoko tartea; deskribatu LEDR0-ren behatutako egoera-aldaketak, baloratu denbora-tarteen itxurazko erregulartasuna eta hautatu zuzena, hutsegitea edo ezin ondorioztatu.

Behaketa-tartea (s) LEDR0-ren behatutako egoera-aldaketak Espero den portaera Denbora-tarteen itxurazko erregulartasuna Emaitza: zuzena / hutsegitea / ezin ondorioztatu

Zer alde dago tenporizadoreak kontrolatutako LEDaren piztu-itzali ziklo honen eta softwareko itxaron-begizta baten artean? Azaldu nola ezartzen duten PERIOD_LO eta PERIOD_HI erregistroek denbora-tartea, nola abiarazten duten CONTROL erregistroko START eta CONT bitek etengabeko funtzionamendua, eta nola detektatzen eta zeroan jartzen duen programak STATUS erregistroko TO bita. Eman hardwareko tenporizadore bat sistema txertatuetako softwarean erabilgarria izateko arrazoi bat.

4

Aldaketa txiki bat periferiko batean

18 min

Hautatu aurreko adibideetako bat, eta egin aldaketa txiki eta behagarri bat.

Adibideak:

  • hex_counter programan, aldatu sekuentzia balio hamaseitar bikoitiak soilik erakusteko.
  • hex_counter programan, kontrolatu bi HEX digitu, HEX0 bakarrik erabili ordez.
  • timer_blink programan, aldatu denbora-tartea LEDR0-k azkarrago edo motelago parpadeatzeko.
  • timer_blink programan, aldatu LEDR erregistroko beste bit baten egoera.
  • Botoien aukerako lan osagarrian, irakurri JP1eko 0.–3. bitak NB0..NB3 kontroletatik eta erakutsi LEDR0..LEDR3 irteeretan. Hurrengo aukerako atalean dago; ez du derrigorrezko HEX edo tenporizadore aldaketa ordezten.
  1. Hautatu HEX adibidea edo tenporizadorearena.

  2. Egin aldaketa txiki bat kodean.

  3. Sakatu Build ELF eta gero Enviar a la FPGA.

  4. Behatu plaka eta jaso nola aldatu den portaera.

Klase-saio batean erabilgarri

Entregatu aldatutako kode-lerroak, eta adierazi bakoitzak memorian mapatutako zein erregistrori eragiten dion.

Aldaketak saio bakarrean egiaztatzeko modukoa izan behar du. Entrega onak portaera bat aldatzen du, eta behaketa batekin edo birekin egiaztatzeko aukera ematen du.

Entregatu behaketa-ohar labur bat: zer aldatu duzun, zer espero zenuen ikustea eta zer erakutsi duen benetako plakak.

5

Aukerakoa: NB botoi logikoak

Urruneko NB0..NB3 botoi logikoek JP1eko datu-erregistroaren 0.–3. bitak erabiltzen dituzte. Galdeketa-ariketa labur bat egiteko balio dute. Ez dira FPGAcademyren KEY portua, eta egungo nabigatzaileko kontrolek ez dute haren datu-erregistroa erabiltzen.

C-ko oinarrizko adibidea:

volatile int *LEDS = (int *) 0xFF200000;
volatile int *JP1 = (int *) 0xFF200060;
volatile int *JP1_DIR = (int *) 0xFF200064;

int main(void)
{
    *JP1_DIR = 0;
    while (1) {
        *LEDS = (*JP1) & 0xF;   // NB0..NB3 -> LEDR0..LEDR3
    }
    return 0;
}

Zergatik irakurtzen ditu aukerako ariketa honek JP1eko 0.–3. bitak, 0xFF200050 helbideko FPGAcademyren KEY erregistroa erabili ordez?

Aukerako ariketa egiten baduzu, jaso zein NB botoi sakatu duzun eta zein LEDR bit aldatu den.

6

Prestatu azken proiektua

8 min

Azken proiektuak NSW0..NSW9 eta LEDR0..LEDR9 erabili behar ditu, baita ikasgai honetan egiaztatutako HEX edo tenporizadore periferikoetako bat gutxienez ere.

Zein periferiko erabiltzeko asmoa duzu azken proiektuan?

Deskribatu azken proiekturako portaera bat, NSW/LEDR eta hautatutako periferikoa konbinatuz. Adierazi zein erregistro-helbide erabiltzeko asmoa duzun.

Bihurtu aurrebista hau klase-saio batean

Jarraitu LabsLand Teach-era ikasgai hau ikasleekin erabiltzeko eta kontuaren sarbidea berrikusteko.