Documente Academic
Documente Profesional
Documente Cultură
Curs AMP Zoican PDF
Curs AMP Zoican PDF
ELEMENTE DE ARITMETICĂ
BINARĂ ŞI CIRCUITE DIGITALE
ELEMENTARE
Dacă N>0 atunci valoarea lui zecimală este (în reprezentarea MS):
n−2
(N)MS = 0•2n-1 + ∑b
−n
i • 2i
Numărul negativ (-N) se reprezintă în complement de 1 prin (-N)C1 = 1 bn-
2...b-m, unde bi=1-bi (complement faţă de 1).
Pentru a reprezenta în C1 un număr negativ se consideră valoarea lui absolută
şi în reprezentarea acesteia se complementează toţi biţii.
Pentru numere pozitive reprezentarea este identică cu cea din (C1) şi (MS).
Dacă numărul este negativ atunci (N)C2 = 2n - |N| = valoarea zecimală a codului
numărului negativ N. Regula generală pentru N # 0 este (-N)C2 = 2n -N.
Dacă numărul binar are reprezentarea în C2: bn-1, bn-2, ..., b0.b-1...b-m,
atunci valoarea sa în zecimal este dată de relaţia:
n−2
N = ( −1) b n −1 • 2 n −1
+ ∑b
i =− m
i • 2i
Gama dinamică pentru reprezentarea în C2 este: -2n-1 <= N <= 2n-1 - 2-m
deoarece pentru N>=0 bn-1=0 şi valoarea maximă se obţine pentru bi=1, i = -m, n-
n−2
2, deci N max = ∑b
i =− m
i • 2 i = 2 n −1 − 2 − m , iar pentru N<0 bn-1=1 şi valoarea
Tabelul 1
Valoarea fără semn a codului de Valoarea obţinută prin interpretarea
reprezentare a numărului codului binar ca număr cu semn
zecimal binar hexazecima (MS) (C1) (C2)
l
0 00000000 00 0 0 0
1 00000001 01 1 1 1
2 00000010 02 2 2 2
... ... ... ... ... ...
127 01111111 7F 127 127 127
128 10000000 80 0 - 127 - 128
... ... ... ... ... ...
254 11111110 FE -126 -1 -2
255 11111111 FF -127 0 -1
ELEMENTE DE ARITMETICĂ BINARĂ ŞI CIRCUITE DIGITALE 5
ELEMENTARE
Tabelul 2
x y x+y T x-y I
0 0 0 0 0 0
0 1 1 0 1 1
1 0 1 0 1 0
1 1 0 1 0 0
Tabelul 3
Intrări Ieşiri
xi yi Ci Si Ci+1
0 0 0 0 0 0
1 0 0 1 1 0
2 0 1 0 1 0
3 0 1 1 0 1
4 1 0 0 1 0
5 1 0 1 0 1
6 1 1 0 0 1
7 1 1 1 1 1
2. a<0, b<0; a = -1; b = -3; a+b = -4; (a)C2 = 256 - 1 = 255 = FFH
(b)C2 = 256-3=253=FDH deci (-1)C2+(-3)C2 = FF+FD=1|FCH = FCH =
= (-4)C2
3. a ≥ 0 b<0
Depăşirea aritmetică poate apare numai dacă operanzii sunt de acelaşi semn şi
rezultatul este mai mare decât M sau mai mic decât (-M '), unde gama dinamică
G=[-M ', M]. Pentru numere întregi pe n biţi reprezentarea în C2 poate fi ilustrată
ca în figura 1.3.
Fie a, b ∈ G.
VOL ⊂ domeniu VIH). Există o stare specială de ieşire numită starea de înaltă
impedanţă (high-Z) care permite conectarea mai multor ieşiri împreună.
Un automat secvenţial este modelat conform figurii 24a (model Mealy) şi este
descris de S = (X,Y,Q,Λ,δ) (notaţiile fiind definite anterior).Fie q ∈Q; la un
semnal de tact starea q se modifică în q' prin legea de tranziţie a stării Λ. Dacă
numărul de stări este mare, funcţia Λ conduce la un CLC complicat (complex).
Dacă funcţia Λ se poate descompune în mai multe funcţii mai simple Λi astfel încât
să existe relaţia de compunere Λ =Λ0o...oΛm-1 , cu Λi: X x Q --> Q, circuitul
combinaţional complex se înlocuieşte cu un circuit combinaţional mai simplu (de
dimensiune mai mică).
Funcţia de tranziţie a stării este serializată în m paşi de tact. Din punct de
vedere formal această serializare este echivalentă cu modificarea la fiecare pas
numai a unui subvector al lui Qi. Spunem că spaţiul stărilor este structurat în Q =
Q0 x Q1 x ...x Qm-1, unde Qi reprezintă o mulţime de subvectori de stare.
Vom presupune că există Λ0, Λ1,...Λm-1 astfel încât Λi modifică numai un
subvector Qi.
Ipoteza 1. Evoluţia automatului într-un singur pas astfel:
Q = Qm-1 Qm-2 … Q1 Q0
Q’ = Q’m-1 Qm-2
B B B
… Q1 Q0
B B B B
14 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII
Q = Q’m-1 Qm-2 … Q1 Q0
Q’ = Q’m-1 Q’m-2 … Q1 Q0
.....
Λ 0 - modifică Q0
Forma simplificată a automatului de comandă de tip CROM (Controller and ROM) este
prezentată în figura 2.7.
Registrul de stare este scris la fiecare tact. Adresa cuvântului urmator din ROM poate fi
selectată, prin MXA, ca fiind (AU, YC) sau O (ordin exterior). Selecţia adresei următoare este
dată de conţinutul registrului de stare (bitul S). Câmpul de biţi STC selectează condiţia de test
care va modifica adresa următoare.
Dintr-o stare dată caracterizată de (CO, STC, S, AU) se poate trece într-o altă stare
determinată de adresa generată către ROM. Circuitul ROM realizează un CLC cu n intrări şi k
ieşiri; un cuvânt din ROM se numeşte microinstrucţiune. Iniţializarea automatului se face cu
semnalul CLR ceea ce implică ştergerea registrului de stare şi deci adresa iniţială egală cu 0.
ELEMENTE DE ARITMETICĂ BINARĂ ŞI CIRCUITE DIGITALE 21
ELEMENTARE
Prin introducerea unor registre suplimentare (varianta "pipe - line") se poate micşora
timpul TCY (vezi figura 2.8).
"Divizarea" buclei are efecte asupra secvenţării; astfel dacă notăm R(n), RA(n) conţinutul
registrelor R, RA la tactul n, se poate scrie (pentru tactul n):
Unitatea RALU modifică evoluţia unităţii de comandă UC prin flaguri (FL); unitatea de
comandă influenţează evoluţia RALU prin generarea de comenzi în funcţie de instrucţiunea (I)
primită din exterior. Sistemul este caracterizat prin flexibilitate datorită posibilităţii modificării
funcţiei sale prin instrucţiuni exterioare.
Se adaugă în plus semnale de intrare (SI) pentru sincronizarea procesorului cu
evenimente externe şi semnale de ieşire (SO) care pot reprezenta comenzi spre alte subsisteme
externe sau semnale de sincronizare cu alte dispozitive externe.
La fiecare instrucţiune primită se declanşează în UC o secvenţă de acţiuni, numită
microprogram, asociată instrucţiunii I.
Ordinea de introducere a instrucţiunii I este determinată de elemente din exteriorul
procesorului; în acest mod se simplifică substanţial unitatea de comandă. Secvenţa de
instrucţiuni introdusă se numeşte program de comandă al procesorului.
Funcţionarea procesorului este ciclică după cum urmează:
prelucrarea semnalelor). Arhitectura unui astfel de procesor, cu linii de date separate de liniile
de instrucţiuni, se numeşte arhitectură Harvard.
Dacă se renunţă la paralelismul temporal, atunci se pot unifica liniile DI, DO şi I într-o
singură magistrală (bus) bidirecţională pe care circulă date sau instrucţiuni denumită
magistrală de date sau bus de date (BD).
- din punct de vedere structural: datele şi instrucţiunile pot fi memorate pe un suport fizic
unic numit memorie principală (MP).
- din punct de vedere funcţional: flexibiltatea devine foarte mare deoarece informaţia
fizică poate fi interpretată de procesor ca dată sau ca instrucţiune.
Memoria principală poate fi memorie de program (de tip ROM) sau memorie de date (de
tip ROM - date fixe sau RAM - date variabile).
Memoria de date poate conţine şi programe, fără nici o restricţie.
LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 5
PROIECTAREA APLICAŢIILOR
Magistrala (busul) de adrese este unidirecţional; pe acest bus, UCP generează adresa
necesară memoriilor sau porturilor de intrare/ieşire.
Busul de date este bidirecţional cu 8, 16, 32 sau 64 biţi.
Busul de comandă (control) este bidirecţional şi conţine linii de ieşire ce reprezintă
comenzi (scriere, citire, etc.) şi linii de intrare - sincronizări cu evenimente externe.
Din punct de vedere al comenzii transferului pe bus-ul de date, există module active
(master) care generează adrese şi comenzi (UCP, circuite de acces direct la memorie (DMA))
şi module pasive (slave) care recepţionează comenzi de la un modul master; la un moment de
timp este activ un singur modul master.
Informaţia pe bus-ul de date poate fi:
- coduri numerice de instrucţiuni (comenzi elementare adresate UCP pentru a executa o
instrucţiune - transfer de date, operaţii aritmetice/logice, salturi în program, operaţii auxiliare);
- adrese - informaţie de localizare a datelor (ca informaţie auxiliară la instrucţiune);
- date propriu-zise.
Dispozitivele externe pot fi informatice (console teletype, monitoare video, imprimante,
memorie de masă (discuri, bandă magnetică) sau interfeţe cu sistemul comandat de
microcalculator (convertoare A/D, D/A, module de achiziţie de date, circuite logice specifice
aplicaţiei).
RALU: A - acumulator
AL - latch acumulator
TMP- registru temporar
ALU- unitate aritmetică şi logică
UCPG: PC + IMC- contor de program + circuit de incrementare
AR - registru de adresare a datelor
UC: RI - registru de instrucţiuni
DEC - decodificator instrucţiuni
8 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII
Notaţii:
MM = memorie de microprograme;
RMI = registru de microinstrucţiuni;
μP = contor de microinstrucţiuni;
μI(i) = microinstrucţiunea i;
PC = contor de instrucţiuni.
Fazele de secvenţare sunt următoarele:
Intrare
Procesor Procesor
I / O
de control
Iesire
Retea de
Memorie Unitate de
transfer
prelucrare
a datelor
Structurile (a) şi (b) sunt potrivite pentru sume de produse; se pot efectua
înmulţiri rapide. Timpul de efectuare al unei sume de produs (înmulţire şi
acumulare la suma anterioră) este destul de mare. Pentru îmbunatăţirea
performanţelor acestei structuri se pot folosi în paralel înmultitorul şi sumatorul.
Multiplicatorul se poate folosi în mod secvenţial (se efectuează cîte un produs apoi
se face acumularea rezultatului) sau în timp ce se efectueaza un produs se
acumuleaza rezultatul anterior (utilizarea în paralel a multiplicatorului şi a
sumatorului).
Dezavantajele structurii (a) sunt: efectuarea sumelor simple se face cu
utilizarea suplimentară a multiplicatorului (ceea ce măreşte timpul de calcul) şi
efectuarea produselor multiple se face cu utilizarea suplimentară a sumatorului.
Avantajul structurii (b) este posibilitatea efectuării unor calcule, de tip x.y+z, cu
viteză foarte mare datorită faptului ca sumatorul şi multiplicatorul pot lucra paralel.
Dezavantajele structurii (b) sunt: numărul de busuri interne mare; pentru
reducerea numărului de busuri se alege varianta transferurilor pe busuri comune
sumatorului şi multiplicatorului: paralelismul nu mai este total.
Unitatea de control a unui procesor de semnal poate fi realizată
microprogramat utilizînd tehnica pipe-line pentru a mari viteza de lucru. În figura
3.17-a este ilustrată realizarea unei unităţi de control microprogramate fără pipe-
line. Modificările introduse prin tehnica pipe line sînt ilustrate în figura 3.17-b.
22 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII
Daca sursa de întrerupere este unică, se alocă prin construcţia UCP o adresă
fixă, la care se va plasa subrutina de servire. În această situaţie sistemul de
întreruperi se numeşte cu vectorizare fixă.
În cazul mai multor surse de intrerupere ele vor fi identificate prin coduri
proprii (tip de întrerupere), citite de către UCP în ciclul masină de confirmare a
acceptării şi identificare a întrerupatorului.
Generarea unui tip de întrerupere se poate face în două moduri:
- de către dispozitivul extern, daca este prevăzut cu logica necesară;
- de către un dispozitiv special numit controler de ăntreruperi (CINT) prevăzut
cu mai multe intrări la care sosesc CI de la dispozitivele externe, cărora li se
alocă tipuri distincte şi cu ieşirea conectată la intrarea INTR a UCP.
În schema din figura 4.3 un singur modul de memorie sau port IO sunt
active la un moment dat. Acest lucru este asigurat de decodificatoarele DEC1 şi
DEC2.
Sectiunea de intrare asigura accesul informaţiilor din lumea exterioara spre
calculator (tastatura, cititor de banda, disc, echipamente de masură, semnalizari
dintr-un proces etc).
Prin sectiunea de ieşire se transmit spre exterior rezultate, comezi, mărimi
către echipamente de executie, etc. Toata funcţionarea sistemului este coordonată
de către unitatea de control, care supervizează şi sincronizează toate operaţiile,
transferul de informaţie, decodifică instrucţiunile programului şi determină
execuţia acestora.
Elementele de intrare/ieşire vor fi realizate cu circuite speciale, în
exteriorul microprocesorului. De multe ori, producătorii de microprocesoare vor
furniza aşa numite familii de circuite integrate, asociate (compatibile ca
funcţionare), cu tipurile de microprocesoare pe care le realizează.
Transferul de intrare ieşire repezintă schimbul de informatii dintre
dispozitivele periferice (exterioare sistemului cu microprocessor) şi este realizat
prin intermediul unor cicuite de interfată numite porturi de intrare-ieşire sau porturi
I/O.
Porturile I/O sunt accesate în mod similar unor locaţii de memorie.
Adresele acestor porturi pot fi înglobate in spaţiul de adrese al memoriei sau pot fi
separate.
Transferul datelor între diversele secţiuni ale sistemului se face pe
magistralele de date ale sistemului. Diferenţierea diferitelor surse de informaţie de
la care/către se vehiculează datele în sistem se face prin existenţa adreselor
distincte ale acestora. Astfel fiecare cuvânt de date al memoriei sistemului are o
6 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII
Transmisia în acest mod se face cu viteză mai mică decât transmisia simultană
a tuturor biţilor (transmisie paralelă), dar problemele de zgomot şi preţul
echipamentelor sunt mai reduse.
Transmisia serială se va face prin emiterea unor impulsuri de tensiune, cu două
niveluri, corespunzătoare valorilor logice "0" sau "1" ale biţilor ce se transmit.
Durata acestor pulsuri este fixă, fiind dată de semnalul de "ceas", care va impune
viteza de serializare a datelor. Este evident ca pentru o funcţionare corectă va fi
necesar ca ambele circuite, atât cel emiţător (transmitator) cât şi receptorul, să
functioneze cu aceeaşi frecvenţă a ceasului. De aceea, aceste viteze de
transmisie/receptie serială sunt standardizate. Ele se măsoară în numărul de biti ce
10 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII
permită transferul simultan al tuturor biţilor cuvintelor de date între două asemenea
echipamente.
Transferurile de date în mod paralel pot fi clasificate astfel:
- transferuri fara protocol electric ( se transmit numai datele, fără
alte semnale de comandă)
- transferuri cu protocol electric ( pe lângă date se transmit şi
semnale de comandă a transferului)
- transferurile cu protocol electric pot fi cu sau fără confirmare
- transfer paralel asincron sau sincron (după modul de sincronizare
între transmiţător şi receptor)
Pentru transferul fara protocol, UCP are sarcina interogarii porturilor de
intrare (pentru a determina momentele în care datele sunt pregatite); pentru ieşire,
dispozitivul periferic are drept sarcina urmărirea modificării datelor. Dezavantajele
transferului de date fără protocol sunt: nu există sincronizare, nu se confirmă faptul
că datele au ajuns la destinaţie şi încărcarea suplimentară a UCP pentru realizarea
transfrului programat.
În cazul transferurilor cu protocol electric fără confirmare transmisia poate
fi iniţiată fie de transmiţător fie de receptor. Daca transmisia este iniţiată de
transmiţător, acesta va emite către receptor un semnal (RDY) care indică faptul că
datele sunt pregătite de transfer. Receptorul aşteaptă semnalul RDY după care
preia datele de pe magistrala de date. Acest protocol este ilustrat în figura 4.11.
Transferul de date poate fi iniţiat şi de receptor; acesta va emite un semnal de
cerere de date (REQ) către tranmiţător. După primirea semnalului REQ,
transmiţătorul va transmite datele pe magistala de date de unde acestea vor fi
preluate de către receptor. Protocolul este ilustrat în figura 4.12.
Pentru ambele tipuri de protocoale fără confirmare nu se rezolva decât
determinarea momentelor de timp la care se vor transmite datele pe magistrala de
date. Transmitatorul si receptorul trebuie să funcţioneze la aceeaşi viteză pentru a
se evita pierderea de date sau receptionarea aceloraşi date de mai multe ori. Nu
există o confirmare a faptului că datele au fost recepţionate şi nu este posibil ca
transmitatorul şi receptorul să opereze cu viteze diferite.
Aceste dezavantaje sunt eliminate prin utilizarea protocolului cu confirmare
ilustrat in f igura 4.13.
LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 13
PROIECTAREA APLICAŢIILOR
Figura 4.11. Transfer paralel cu protocol asincron fără confirmare (transfer iniţiat
de transmiţător)
14 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII
Figura 4.12. Transfer paralel cu protocol asincron fără confirmare (transfer iniţiat
de receptor)
D 256 k
Numărul de circuite de memorie necesare este n = = =4
d 64k
Dacă nu se specifică altfel, vom lua c = 1 .
n
Numărul de semnale de selecţie este m = =n=4
1
Deoarece avem relaţia d = 64 k = 216 şi considerăm o locaţie de memorie de un
octet, numărul de biţi de adresă pentru decodificarea interna este p = 16 .
Avem relaţia D = 256 k = 218 , rezultă numarul de biti pentru adresarea zonei de
memorie 18.
Adresa finală a zonei de memorie este 0 x80000 + D − 1 =
0 x80000 + 0 x40000 − 1 = 0 xBFFFF
Fiecare port de intrare, PI_i, este selectat de bitul de adresă Ai=0. Semnalul
IORD/ indică un semnal general de citire a porturilor de intrare.
Pentru selecţia liniară a porturilor de intrare nu este permis ca două sau mai
multe adrese să fie in starea de zero logic; în acest caz va apare un conflict electric
pe magistrala de date.
Selecţia liniară a porturilor de ieşire este ilustrată în figura 4.17.
Fiecare port de ieşire, PO_i, este selectat de bitul de adresă Ai=0. Semnalul
IOWR/ indică un semnal general de scriere a porturilor de ieşire.
Pentru selecţia liniară a porturilor de ieşire două sau mai multe adrese pot fi în
starea de zero logic; în acest caz se pot scrie (cu aceeaşi valoare) mai multe porturi
de ieşire simultan.
A9 A8 A A A A A A A A0 CS Adres Port
7 6 5 4 3 2 1 a
1 0 1 0 1 0 0 0 0 0 CS0 2A0 PORT_0
1 0 1 0 1 0 0 0 0 1 CS1 2A1 PORT_1
1 0 1 0 1 0 0 0 1 0 CS2 2A2 PORT_2
1 0 1 0 1 0 0 0 1 1 CS3 2A3 PORT_3
1 0 1 0 1 0 0 1 0 0 CS4 2A4 PORT_4
22 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII
Semnalele IOR/ si IOW/ sunt formate din semnalele M/IO si RD/ respectiv
M/IO si WR astfel:
IOR = M/IO + RD
IOW = M/IO + WR
Semnalul AEN/ este format din liniile de adresa superioare (A15 pâna la A10)
astfel:
Accesarea memoriei externe SRAM implică setarea unui bit dintr-un registru
de control al microcontrolerului (bitul SRE din registrul I/O MCUCR) şi folosirea
pinilor RD (citire) şi WR (scriere). Pentru accesarea întregului spaţiu de 64K
SRAM pot fi folosite toate modalităţile de adresare directă şi indirectă.
În figura 5.7 este ilustrat modul în care este efectuată o operaţie aritmetică sau
logică folosind două registre şi salvat rezultatul în registrul destinaţie într-un singur
ciclu.
8. Moduri “Sleep”
9. Porturile I/O
1. Modulele Timer/Conters;
2. Watchdog Timer;
3. Memoria de date EEPROM;
4. Serial Peripheral Interface (SPI);
5. Universal Asynchronus Receiver Transmiter (UART);
6. Analog Comparator;
7. Interfaţa cu memoria externă.
1. Modulele Timer/Conters
2. Watchdog Timer
Interconexiunea între două dispozitive Master-Slave prin SPI este ilustrată în figura
5.8:
Pinul PB7 (SCK) este ieşire în modul Master şi intrare în mod Slave. Scrierea
în registrul SPI Data Register al microcontrolerului Master porneşte generatorul de
tact, datele încep să fie transmise pe pinul PB5 (MOSI) şi recepţionate pe acelaşi
pin PB5 al microcontrolerului Slave. Acelaşi lucru se întâmplă şi în sens invers de
la slave către master pe pinii PB6 (MISO). Aceasta înseamnă că pe timpul unei
perioade de Clock sunt interschimbaţi 2 biţi între Master şi Slave. Pentru
comunicarea între mai multe dispozitive este prevăzut un semnal de control Slave
Select PB4 (SS) care trebuie ţinut în zero pentru a accesa un dispozitiv individual.
După transmiterea ultimului bit SPI generează o întrerupere dacă aceasta este
validată.
Registrele asociate cu modulul SPI sunt: SPI Control Register – SPCR şi SPI
Status Register – SPSR.
5. Universal Asynchronus Receiver Transmiter (UART)
Baud=fCK/16(UBRR+1)
unde:
• Baud – este viteza de transfer;
• fCK – este frecvenţa oscilatorului microcontrolerului;
• UBRR – este conţinutul registrului UART Baud Rate Register
Memoria externă este validată prin setarea bitului SRE din registrul MCUCR
(MCU Control Register), acest lucru implicând suprascrierea setărilor din registru
de direcţie DDRA. Când bitul SRE este resetat (0) memoria externă nu este
folosită, Portul A este folosit în concordanţă cu setările din registrul DDRA şi
spaţiul de adrese peste spaţiul alocat memoriei interne SRAM nu poate fi folosit.
Pe frontul negativ al pinului ALE pe Portul A este disponibilă o adresă validă.
În timpul transferului de date ALE este 0. RD şi WR sunt active doar când se
accesează memoria SRAM externă. În figura 5.9 se arată cum se poate conecta o
memorie SRAM externă la microcontroler folosind 8 latch-uri care sunt
transparente când G este în 1. În mod normal accesul SRAM extern se face într-o
schemă de trei cicluri după cum se poate vedea în figura 5.10. Când este nevoie de
un ciclu în plus pentru acces se setează bitul SRW din registrul MCUCR. Noua
schemă este prezentată în figura 5.11.
Figura 5.9: Conectarea unei memorii externe SRAM
Aritmetica ALU
Aritmetica MAC
Aritmetica SHIFTER
5.2.1.Unitatea ALU
Intrarea X a ALU poate acceptă date din două surse: registrul AX sau
busul de rezultate R. Conectarea directă pe busul R permite utilizarea operanzilor
de tip imediat (acest lucru este specific pentru toate unitătile de calcul ale ADSP
2101). Registrul AX este dedicat pentru intrarea X şi are în compunere 2 registre
de 16 biţi AX0 şi AX1 care se pot citi/scrie de pe magistrala DMD; cu ajutorul
blocului de interschimbare DMD-PMD aceste registre sunt accesibile şi de pe
magistrala PMD. Un registru AX poate fi intrare în ALU în acelaşi timp în care
celălalt registru este citit/scris de pe magistrala DMD.
Intrarea Y a unităţii ALU poate de asemenea să accepte date din 2 surse:
“registrul” AY şi registrul de reacţie AF. “Registrul” AY este dedicat pentru
intrarea Y şi conţine 2 registre: AY0 şi AY1; aceste două registre se pot citi/scrie
de pe magistrala DMD şi se pot scrie direct de pe magistrala PMD; ele se pot citi
de pe magistrala PMD prin intermediul blocului de interschimb între PMD şi
DMD. În mod similar unul dintre registrele AY poate fi intrare în ALU în timp ce
celălalt registru este citit/scris de pe magistrala DMD.
Iesirea ALU este încărcată în registrul AF sau în registrul de rezultat AR;
ieşirea încărcată în AF poate fi utilizată ca intrare în ALU. Registrul AR poate fi
încărcat şi în mod direct de pe magistrala DMD; prin blocul de interschimbare
DMD-PMD registrul AR poate fi citit/scris de pe magistrala PMD.
Orice registru asociat unităţii ALU poate fi citit sau scris intr-un singur
ciclu maşină; citirea se efectuează la începutul ciclului iar scrierea la sfirşitul
acestuia. Acest lucru permite ca un operand al ALU să fie citit la începutul unui
LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 7
PROIECTAREA APLICAŢIILOR
Primitivele de împărţire
face prin blocul de interschimb PMD - DMD. Este permis ca în timp ce unul din
registrele MY este intrare pentru MAC celălalt să fie citit/scris de pe DMD.
Ieşirea sumatorului este încărcată în registrul MF sau în registrul MR.
Registrul MF permite ca bitii 16-31 ai rezultatului să fie utilizati direct la intrarea
înmultitorului la ciclul următor. Registrele MR0, MR1, MR2 pot fi încărcate de pe
magistrala DMD şi pot să fie citite de pe DMD sau bus-ul R.
Orice registru asociat unităţii MAC poate fi citit şi scris în acelasi ciclu:
citirea se face la începutul ciclului iar scrierea la sfârsitul acestuia.Se permite ca o
intrare în MAC (un operand) să fie încărcată la începutul ciclului (operaţiei) şi să
fie actualizată la sfirsitul ciclului (de exemplu din memorie).
De asemenea se permite ca un rezultat să fie încărcat în memorie şi
actualizat cu un nou rezultat în acelaşi ciclu.
Unitatea MAC conţine un set duplicat de registre (MX, MY, MR, MF); un
singur set este disponibil la un moment dat. Acest set este utilizat pentru
schimbarea rapidă a contextului programului (în cazul întreruperilor). Setul de
registre este selectat prin program.
Operatiile MAC
Operanzii pot fi cu semn sau fără semn fiecare; se pot inmulti operanzi de
tipuri diferite (semn-fără semn).Tipul operandului este specificat dinamic pentru
fiecare operaţie de înmulţire în parte.
Sunt următoarele:
registre X : MX0,MX1,AR,MR0,MR1,MR2,SR0,SR1;
registre Y : MY0,MY1,MF;
registre destinaţie: MR (MR2,MR1,MR0),MF;
- instrucţiuni de calcul;
- instrucţiuni de transfer;
- instrucţiuni multifuncţie;
- instrucţiuni de control al programului;
- alte instrucţiuni.
Instrucţiuni de transfer
Instrucţiuni MAC
Instrucţiuni ALU
Instrucţiuni SHIFTER
[IF cond] SR = [SR OR] ASHIFT xop Deplasare aritmetică (cu SE)
[IF cond] SR = [SR OR] LSHIFT xop Deplasare logică (cu SE)
SR = [SR OR] ASHIFT xop BY <exp> Deplasare aritmetică imediată
SR = [SR OR] LSHIFT xop BY <exp> Deplasare logică imediată
[IF cond] SE = EXP xop Calcul exponent
[IF cond] SB = EXPADJ xop Calcul al exponentului unui blocu
de date
LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 9
PROIECTAREA APLICAŢIILOR
Alte instrucţiuni
Notaţii:
Ix Registru index
My Registru de modificare
<data> Valoare (dată) imediată
<addr> Adresă imediată
<exp> Exponent
<ALU> Orice instrucţiune ALU (excepţie împărţirea)
<MAC> Orice instrucţiune MAC
<SHIFT> Orice instrucţiune (excepţie deplasare imediată)
cond Condiţie logică ( EQ, NE, LT, GT, CE etc.)
term Condiţie de terminare a buclei DO UNTIL
dreg Registru de date (ALU, MAC sau SHIFTER)
reg Orice registru (inclusive dreg)
; Termină o instrucţiune
, Separă operaţiile multiple într-o instrucţiune multifuncţie
LIMBAJE DE PROGRAMARE PENTRU MICROCONTROLERE. 11
PROIECTAREA APLICAŢIILOR
- definirea constantelor
#include <stdio.h>
int val; // initialized to zero
void init() {
val = 3; // re-assigned
}
void func() {
printf("val %d",val);
}
int main() {
init();
func();
}
Variabila val este iniţializată de două ori, ceea ce este ineficient. Prin analiza
interprocedurală nu se poate determina faptul ca val este o constanta. Pentru acest
lucru programul trebuie rescris astfel:
#include <stdio.h>
const int val = 3; // initialized once
12 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII
void init() {
}
void func() {
printf("val %d",val);
}
int main() {
init();
func();
}
Pentru codul rescris variabila val este iniţializată o singură dată.
În acest caz pointerii a si b pot indica acelaşi tablou (poate apare alierea).
int * restrict p = a;
int * restrict q = b;
for (i=0; i<100; i++)
*p++ = *q++;
- cu tablouri indexate:
void va_ind(const short a[], const short b[], short out[], int n) {
int i;
for (i = 0; i < n; ++i)
out[i] = a[i] + b[i]; }
14 MICROCONTROLERE - ARHITECTURĂ ŞI APLICAŢII
- cu pointeri
void va_ptr(const short a[], const short b[], short out[], int n) {
int i;
short *pout = out;
const short *pa = a, *pb = b;
for (i = 0; i < n; ++i)
*pout++ = *pa++ + *pb++;
}
Desfacerea manuală a buclelor poate face programul mai greu de înteles şi poate
împiedica realizarea optimizării automate de către compilator.
void va1(const short a[], const short b[], short c[], int n)
{
int i;
for (i = 0; i < n; ++i) {
c[i] = b[i] + a[i];
}
}
void va2(const short a[], const short b[], short c[], int n)
{
short xa, xb, xc, ya, yb, yc;
int i;
for (i = 0; i < n; i+=2) {
xb = b[i]; yb = b[i+1];
xa = a[i]; ya = a[i+1];
xc = xa + xb; yc = ya + yb;
c[i] = xc; c[i+1] = yc;
}
}
Următoarea secvenţă:
if (mult_by_b) {
for (i=0; i<100; i++)
sum1 += a[i] * b[i];
} else {
for (i=0; i<100; i++)
sum1 += a[i] * c[i];
}
Contorul buclei trebuie să fie variabilă locală (care va fi stocată într-un registru) şi
nu variabilă globală. Următorul cod:
#include <math.h>
fract32 dot_product(fract16 *a, fract16 *b) {
int i;
fract32 sum=0;
for (i=0; i<100; i++) {
/* this line is performance critical */
sum += __builtin_mult_fr1x32(a[i],b[i]);
}
return sum;
}