luni, 17 septembrie 2012

Arhitectura Microcontrolerului. Organizarea memoriei


     Înainte de a trece la analiza arhitecturii Microcontrollerului vom da câteva definiţii:
    Microprocesor - un circuit care poate îndeplini oricare funcţie în dependenă de programul care îl are spre execuţie.
    Program - un set de instrucţiuni care se execută una după alta.
    Instrucţiune - o acţiune pe care o poate executa nucleul Microcontrollerului.
    Nucleu - Partea principală a Microcontrollerului care execută instrucţiunile din program.
    Microcontroller - minicalculator care cuprinde în sine un nucleu de microprocesor, memorie de program şi    Module periferice. În general MCU preia informaţia de la interfeţele de intrare, o prelucrează  şi aplică rezultatul către interfaţa de ieşire.



Arhitectura nucleului Microcontrollerului

    Microcontrollerul seriei AVR are o arhitetură RISC pe 8 biţi construit după principiul arhitecturii HAWARD. O asemenea arhitectură permite ca majoritatea instrucţiunilor să se execute într-un singur tact al semnalului de ceas. Deci, la o frecvenţă a semnalului de ceas de 1 MHz, acesta poate executa până la 1 000 000 operaţii pe secundă - 1MIPS/MHz.
    Schematic arhitectura AVR poate fi reprezentată prin figura de mai jos.


  • PM - Memoria de programe. Aici sunt stocate instrucţiunile ce urmează a fi executate de către MCU.
  • PC - Contorul de program, bazat pe un registru numărător, destinat selecţiei instrucţiunilor din memoria de programe. În mod normal PC-ul se auto modifică prin încrementare asigurând execuţia consecutivă a instrucţiunilor din PM. Totodată acestuia i se poate încărca o valoare din CDC, ce va realiza salturile  pentru instrucţiunile de salt condiţionat şi necondiţionat.
  • CDC - decodificatorul de comenzi. CDC configurează nucleul pentru execuţia instrucţiunii selectate luând în consideraţie valorile flagurilor din registrul de stare SREG.
  • ALU - Unitatea aritmetico logică- execută instrucţiunile aritmetice şi logice. Datele către ALU sunt aprovizionate din regiştrii de uz general, fiecare operand fiind selectat de către CDC conform instrucţiunii curente, la fel ca şi stocarea datelor.
  • GPR - regiştrii de uz general, regiştrii de lucru a MCU. Prelucrarea datelor pentru arhitectura AVR este restricţionată la utilizarea a cel puţin unui registru de uz general, adică orice instrucţiune de transfer sau prelucrarea datelor are loc cu participarea unui registru de uz general.
  • RAM - memoria cu acces aleator, memoria pentru lucru cu date de dimensiuni mari.
  • SREG - Registru de stare a MCU. Oricare operaţie de prelucrare a datelor, implicând prelucrarea lor de către ALU, raportează către registrul SREG cu modificarea flagurilor acestuia, prezentând date suplimentare despre rezultatul operaţiei. Este plasat în spaţiul de adrese al regiştrilor periferici. Continutul acestui registru este accesibil cât pentru scriere atât şi pentru citire.
    • C - Bit de transport. Se va seta în 1 în cazul când reprezentarea rezultatului va ieşi din limita de 8 biţi.
    • Z - Zero. Se va seta în 1 în cazul în care rezultatul va fi egal cu zero.
    • N - Negativ. Se va seta în 1 în cazul în care bitul 7 al rezultatului este 1.
    • V - Transport în operaţiile cu semn.
    • S - Semn. Se va seta în 1 dacă rezultatul va fi mai mic ca 0.
    • H - Transport la jumatate. Se va seta în 1 dacă va avea loc trasport la bitul 4 (la mijlocul rezultatului).
    • T - Bit temporar. Serveşte pentru stocrea informaţiei de un bit a unui registru de uz general, poate fi scris/citit cu BST/BLD
    • I - Bitul de permisiune a întreruperilor, în cazul în care acest bit este setat în 0 întreruperile sunt interzise, 1 - permise. se resetează/setează cu comenzile CLI/SEI sau când se cheamă automat subrutina de prelucrare a întreruperii/ se returnează din întrerupere cu RETI.
  • I/O Reg - regiştri de acces la modulele periferice cum ar fi GPIO, Ext INT, TIMER, etc.

Executarea unei instructiuni in cadrul nucleului microcontrollerului

    Instrucţiunea este selectată din memoria de programe PM cu ajutorul contorului de program PC şi transmisa către decodificatorul de comenzi CDC. CDC decodifică comanda şi generează semnale de configurare a nucleului. 
    În cazul în care instrucţiunea este una de prelucrare, aritmetică sau logică, se generează un semnal de selecţie a funcţiei către ALU şi adresele pentru operandul stâng LA şi operandul drept RA. Adresa pentru stocarea rezultatului coincide cu adresa operandului stâng LA. Odată cu evaluarea rezultatului se generează şi biţii de stare a procesorului care sunt stocaţi în registrul de stare SREG. 
    În cazul în care instrucţiunea este de salt condiţionat, dacă se satisface condiţia presupusă de instrucţiune verificând biţii de stare din SREG, se generează o adresă de salt pentru a fi înregistrată în contorul de program PC. În acelaşi mod se generează şi adresa de salt pentru instrucţiunile de salt necondiţionat, doar că nu se iau in consideraţie biţii de stare din SREG. 
    Pentru operaţiile de transfer, se generează adrese către modulele de memorie între care se efectuază transferul. Aici vom evidenţia faptul că pentru arhitectura AVR sunt posibile operaţii de transferuri în care strict participă un registru de uz general GPR.

Organizarea memoriei in arhitectura AVR

În cadrul arhitecturii AVR vom enumera mai multe tipuri de memorie dupa cum urmează:
  • PM - Memoria de programe
  • GPR - Regiştri de uz general
  • I/O - Regiştri de acces la periferii (periferici)
  • RAM - Memoria cu acces aleator
  • EEPROM - Memorie permanentă


    Blocurile de memorii sunt grupate în trei spaţii de adrese, memoria de programe, memoria de date şi memoria EEPROM, reprezentând 3 segmente: Segmentul de cod, segmentul de date şi segmentul EEPROM.
    Spre deosebire de segmentul de programe şi cel de EEPROM, segmentul de date este format din trei tipuri de memorie, după cum se poate observa din figura de mai sus. Adică Regiştrii de uz general, Regiştrii periferici şi memoria RAM sunt plasate în acelaşi spaţiu de adrese.
    Regiştrii de operanzi în majoritatea operaţiilor aritmetico logice şi de tranfer, şi sunt plasaţi începând cu adresa 0x000 de uz general, se găsesc în t0 şi ocupă 32 de locaţii. 
    Regiştrii periferici sunt plasaţi îndată după regiştrii de uz general, începând cu adresa 32 (0x0020), şi sunt destinaţi accesului la periferiile microcontrollerului.
    Îndată după Regiştrii I/O urmează spaţiul de adrese pentru memoria RAM care o putem diviza în două părţi. Memoria intern care intră în componenţa chipului microcontrollerului şi memoria externă, care poate fi atasată la microcontroller prin anumiţi pini ai lui.