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.
Hasi saioa irakasle-kontu batekin klase-saioa prestatzeko. Ikasleak klase-kode batekin sartzen dira.
Lehen aldia duzu LabsLand-en? Sortu irakasle-kontua
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.
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.
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.
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:
0digituaren patroia0x3Fda.1digituaren patroia0x06da.Adigitu hamaseitarraren patroia0x77da.
Ireki
Nios V C IDE for DE1-SoC.Ordeztu hasierako kodea ondorengo
hex_counterkodearekin.Sakatu
Build ELFeta geroEnviar a la FPGA(ingelesez,Upload to FPGA).Behatu HEX0 plakaren irudian, gutxienez bi digitu desberdin ikusi arte.
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?
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,+0x0desplazamenduan: 0. bita,TO, bat bihurtzen da tartea amaitzean.CONTROL,+0x4desplazamenduan:STOPgelditzeko da,STARTabiarazteko etaCONTzenbaketa etengabe errepikatzeko.PERIOD_LO,+0x8desplazamenduan: zenbaketa-balioaren beheko 16 bitak.PERIOD_HI,+0xCdesplazamenduan: zenbaketa-balioaren goiko 16 bitak.
Ordeztu C kodea ondorengo
timer_blinkkodearekin.Sakatu
Build ELFeta geroEnviar a la FPGA.Behatu
LEDR0gutxienez 10 segundoz.Jaso LEDaren egoera aldatzen den gutxienez bi une.
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.
Aldaketa txiki bat periferiko batean
18 min
Hautatu aurreko adibideetako bat, eta egin aldaketa txiki eta behagarri bat.
Adibideak:
hex_counterprograman, aldatu sekuentzia balio hamaseitar bikoitiak soilik erakusteko.hex_counterprograman, kontrolatu bi HEX digitu, HEX0 bakarrik erabili ordez.timer_blinkprograman, aldatu denbora-tartea LEDR0-k azkarrago edo motelago parpadeatzeko.timer_blinkprograman, aldatuLEDRerregistroko beste bit baten egoera.- Botoien aukerako lan osagarrian, irakurri JP1eko 0.–3. bitak
NB0..NB3kontroletatik eta erakutsiLEDR0..LEDR3irteeretan. Hurrengo aukerako atalean dago; ez du derrigorrezko HEX edo tenporizadore aldaketa ordezten.
Hautatu HEX adibidea edo tenporizadorearena.
Egin aldaketa txiki bat kodean.
Sakatu
Build ELFeta geroEnviar a la FPGA.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.
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.
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.
Lehen aldia duzu LabsLand-en? Sortu irakasle-kontua