Sunteți pe pagina 1din 3

ASC2 – Lucrări de laborator 1/3 Lucrarea nr.

Porturi de intrare/ieșire
(partea a doua)

1. Scopul lucrării

Obiectivul acestei lucrări este să faciliteze înțelegerea modului în care comunică procesorul
cu afișoarele cu 7 segmente și cu butoanele de pe placa Altera DE1.

2. Mersul lucrării

Această lucrare continuă prezentarea perifericelor (începută în lucrarea precedentă), aducând


în discuție cele patru afișoarele cu 7 segmente (numite HEX0-HEX3) și cele patru butoane care pot
fi acționate (KEY[0]-KEY[3]) de pe placa Altera DE1.

2.1 Crearea proiectului și elaborarea sistemului

Pentru această lucrare se poate folosi proiectul din lucrarea precedentă sau se poate crea un
nou proiect în Quartus II Web Edition (după modelul din Anexa A).

Urmează construirea sistemului (după modelul din Anexa C) sau completarea celui din
lucrarea precedentă cu încă două porturi. În final, sistemul trebuie să cuprindă:
 un procesor NIOS II (varianta economică Nios II/e)
 un modul de memorie (se va alege un modul de 4 KB de memorie on-chip de tip RAM)
 un port de intrare (PIO) de 10 biți (corespunzător comutatoarelor SW)
 un port de ieșire (PIO) de 8 biți (corespunzător LED-urilor verzi LEDG)
 un port de ieșire (PIO) de 10 biți (corespunzător LED-urilor roșii LEDR)
 un port de intrare (PIO) de 3 biți (corespunzător butoanelor KEY[3..1])
 un port de ieșire (PIO) de 7 biți (corespunzător afișorului HEX0[6..0])

Portul corespunzător butoanelor este de numai 3 biți deoarece butonul KEY[0] este asociat
intrării de reset a procesorului și nu poate fi utilizat în alt scop. De asemenea, pentru început, se
folosește doar unul dintre afișoarele cu 7 segmente ( HEX0).

După creare, instanțiere și compilare, sistemul trebuie descărcat pe placa Altera DE1.
Etapele care trebuie parcurse pentru acest lucru sunt prezentate în Anexa D.

E important să fie notate adresele alocate porturilor, întrucât ele trebuie accesate din
programul care va fi executat.

Daniel FILIPAȘ 1/3 dfilipas@uoradea.ro


ASC2 – Lucrări de laborator 2/3 Lucrarea nr. 3

2.2 Compilarea și încărcarea unui program

Se consideră următorul program (scris în limbajul C):

volatile int *comutatoare = (int *) 0x00003000; // adresa alocată comutatoarelor


volatile int *LED_verzi = (int *) 0x00003010; // adresa alocată LED-urilor verzi
volatile int *LED_rosii = (int *) 0x00003020; // adresa alocată LED-urilor rosii
volatile int *buton = (int *) 0x00003030; // adresa alocată butoanelor KEY[3..1]
volatile int *afis7 = (int *) 0x00003040; // adresa alocată afisorului HEX0

volatile int c;

int afisor (int nr)


{
volatile int a;
switch(nr)
{
case 0:
a = 0x40; break;
case 1:
a = 0x79; break;

//******* celelalte cazuri *******

default:
a = 0x7f;
}
return a;
}

void main (void)


{
while(1)
{

if( (*buton & 0x4) == 0 )


c = *comutatoare;

*afis7 = afisor(c%16);
*LED_rosii = c;
}
}

Execuția acestui program are ca efect afișarea valorii de pe comutatoare pe LED-urile roșii
(în binar), respectiv pe afișorul cu 7 segmente HEX0 (în hexazecimal). Afișarea are loc doar în
momentul în care este apăsat butonul KEY[3]. Așa cum se observă din codul de mai sus, butoanele
funcționează în logică negată: „0” înseamnă buton apăsat, iar „1” înseamnă buton eliberat.

Figura alăturată prezintă legătura dintre afișorul cu 7 segmente și cei șapte


biți care comandă segmentele. Bitul cel mai semnificativ comandă segmentul notat
cu 6. Așadar, ordinea biților este 6 5 4 3 2 1 0. În plus, trebuie precizat că segmentele
sunt comandate și ele în logică negată: „0” însemnă aprins, iar „1” înseamnă stins.
Astfel, secvența binară „1000000” (în hexazecimal 0x40) reprezintă codul
pentru afișarea cifrei 0, iar secvența binară „1111001” (în hexazecimal 0x79) este
codul pentru afișarea cifrei 1. În programul dat, conversia e realizată de funcția afisor.

Daniel FILIPAȘ 2/3 dfilipas@uoradea.ro


ASC2 – Lucrări de laborator 3/3 Lucrarea nr. 3

Tipul variabilelor e precedat de directiva volatile pentru a-i preciza compilatorului că


valorile asociate variabilelor se pot modifica în orice moment și, astfel, să nu optimizeze codul
obiect.
Codul de mai sus trebuie să fie salvat într-un fișier cu extensia .c și reprezintă sursa care va
fi compilată, încărcată în memoria RAM a sistemului de pe placa DE1 și apoi executată.

Pentru a putea lansa în execuție programul, e necesar ca acesta să fie inclus, la rândul lui,
într-un proiect. Pentru crearea proiectului se utilizează Altera Monitor Program.
Etapele care trebuie parcurse pentru acest lucru sunt prezentate în Anexa MP.

2.3 Aplicații în cadrul ședinței de laborator

a. Să se completeze funcția afisor în așa fel încât să includă codurile pentru toate cifrele
hexazecimale posibile: cifrele 0-9 și literele A, b, C, d, E, F (care codifică valorile 10-15). Apoi să
se verifice funcționarea programului.

b. Ce rost are operația (*buton & 0x4) în programul dat ca exemplu? Ce s-ar întâmpla dacă
ar lipsi 0x? Ce rost are c%16 și ce s-ar întâmpla dacă ar fi doar c?

c. Să se completeze programul în așa fel încât valoarea afișată pe HEX0 și pe LED-urile


roșii să fie incrementată/decrementată automat, la interval de aproximativ o secundă. Pentru
stabilirea sensului numărării (crescător sau descrescător) va fi utilizat butonul KEY[2], iar butonul
KEY[1] va fi folosit pentru resetarea acestei valori.

d. Să se completeze sistemul (realizat în Quartus) cu încă un port de ieșire (asociat lui


HEX1) și să se completeze programul astfel încât să implementeze un cronometru (care să afișeze
ciclic valorile de la 0 la 59) pe HEX1 și HEX0.

Bibliografie:

http://www.altera.com/education/univ/materials/comp_org/labs/unv-labs.html

Daniel FILIPAȘ 3/3 dfilipas@uoradea.ro