Sunteți pe pagina 1din 15

3

Implementarea hardware/firmware
a algoritmilor de tip grup - secvenţial

3.1 INTRODUCERE

Algoritmii de tip grup-secvenţial au proprietatea că necesită numai un


controller secvenţial pentru a oferi avantajul concurenţei şi al sporirii vitezei de
execuţie. Din această cauză, o mare parte din sistemele digitale sunt
implementări ale acestei clase de algoritmi.
Implementarea hardware/software a algoritmilor de tip grup-secvenţial are
următoarele caracteristici:
1. La nivelul implementării, obiectele (date) sunt vectori cu elemente de tip
bit (bit-vectori) sau tablouri de bit-vectori.
2. Subcalculele sunt limitate la acelea care sunt realizabile prin intermediul
operatorilor hardware. Un sub-calcul (numit micro-operaţie) constă dintr-
un transfer de bit-vectori între registre. Pe durata transferului operatorii pot
efectua transformări asupra bit-vectorilor.
3. Pentru că algoritmul este de tip grup-secvenţial, un grup de micro-operaţii
(numit micro-instrucţiune) sunt efectuate simultan, dar numai o micro-
instrucţiune se execută la un moment dat. Algoritmul este implementat
printr-o secvenţă de transferuri între registre (secvenţă de micro-
instrucţiuni). Această secvenţă se numeşte micro-program în
implementarea firmware.

73
4. Algoritmul se execută de un sistem cu control centralizat sau
semicentralizat. În cazul controlului centralizat, operatorii sunt de tip
combinaţional şi, în consecinţă, nu necesită control local. În cazul semi-
centralizat, operatorii pot fi secvenţiali, caz în care necesită un control
local. Din punctul de vedere al controlului central, în ambele cazuri micro-
operaţiile sunt transferuri între registre.
5. Timpul de execuţie al diferitelor micro-instrucţiuni poate să fie diferit.
Datorită structurii grup-secvenţial, timpul de execuţie al unei micro-
instrucţiuni corespunde timpului celei mai lungi micro-operaţii. Acest timp
de execuţie poate fi fix sau variabil. Dacă este variabil, trecerea la o nouă
micro-instrucţiune este determinată de apariţia unui semnal de terminare a
micro-operaţiei.
6. Controlul se implementează sub forma unei maşini secvenţiale. Unele
variante presupun implementări hardware [13]. În acest capitol vom
prezenta implementarea firmware în care funcţiile de tranziţie a stărilor şi
a ieşirilor sunt memorate în module de memorie, iar funcţia de tranziţie a
stărilor este reprezentată de ordinea micro-instrucţiunilor din memorie şi
de diferite ramificaţii binare.

Sistemul cu control centralizat sau semi-centralizat este alcătuit din două sub-
sisteme (Figura 3.1): sub-sistemul de date şi sub-sistemul de control [5].
Sub-sistemul de date (numit şi secţiunea de date) implementează funcţia de
memorare a datelor şi pe aceea de transformare a datelor în timp ce sub-sistemul
de control (secţiunea de control) coordonează transferurile de date,
transformările şi secvenţierea acestora. În mod obişnuit, secţiunea de control
produce secvenţe de semnale de control (secvenţe de control) pentru a coordona
sub-calculele din secţiunea de date.
Intrările şi ieşirile sistemului constau din intrări şi ieşiri de date, intrări şi
ieşiri de control. Secţiunile de date şi de control comunică prin intermediul
semnalelor de control şi al condiţiilor. Condiţiile, generate de secţiunea de date,
sunt folosite de secţiunea de control în secvenţierile dependente de date, pentru a
genera semnale de control dependente da date.

Intrări de Ieşiri de
date Subsistem date
de date

Intrări de Ieşiri de
control Subsistem control
de control

Fig. 3.1 Structura unui sistem cu control centralizat.

74
Secţiunile de date şi de control sunt definite prin specificarea unui set de
componente (primitive), a unei structuri de conectare dintre componente, şi a
unui comportament care se realizează prin componentele interconectate.
Componentele folosite în sub-sistemul de date sunt module de memorie
(registre sau tablouri de registre), operatori şi trasee de date. O componentă are
de obicei intrări şi ieşiri de date care sunt identificate ca bit-vectori de intrare şi
de ieşire, intrări de control numite puncte de control şi, posibil, ieşiri de condiţii.
Operaţia care trebuie efectuată de o componentă este determinată de semnalele
de control generate de secţiunea de control şi prezentate la punctele de control.
O componentă mai este caracterizată ca modul prin parametri cum sunt:
întârziere, fan-out, etc.
Secţiunea de control este un sistem secvenţial. Funcţia lui de tranziţie
specifică precedenţele micro-instrucţiunilor din algoritm. Funcţia lui de ieşire
specifică semnalele de control care activează micro-operaţiile executate de sub-
sistemul de date. Funcţiile de tranziţie şi de ieşire, numite funcţii de control, pot
fi implementate în mai multe moduri: registre de stare, reţele combinaţionale,
unităţi de control microprogramate.

3.2 UN LIMBAJ PENTRU ALGORITMI DE TIP


GRUP – SECVENŢIAL

Acest limbaj va fi folosit pentru descrierea elementelor hardware şi a


algoritmilor hardware/software care descriu comportarea sistemelor.
Au fost propuse mai multe limbaje de acest fel. Nu vom adopta nici unul
pentru că nici unul nu a fost acceptat ca fiind universal valabil. Vom dezvolta un
limbaj cu sintaxă şi semantică simple, care pot fi înţelese uşor, limbaj care poate
fi folosit de cititorii familiarizaţi cu conceptele de bază ale programării
calculatoarelor.
Limbajul poate fi folosit pentru următoarele trei scopuri (complementare):
1. Specificaţia funcţională a unui sistem. Specificaţia înseamnă descrierea
funcţiei îndeplinite de sistem, fără referire la modul de implementare.
2. Descrierea unei implementări specifice.
3. Ajutor în procesul de proiectare a unui sistem.

Un limbaj descriptiv este compus din următoarele elemente:


1. Obiecte de tip date (date, structuri de date) cu un set de valori acceptate. În
mod obişnuit, obiectele care au acelaşi set de valori sunt grupate în tipuri.
Exemple sunt: obiecte-întregi, obiecte-caracter. Structurile de obiecte de
tip date, cum sunt vectorii sau tablourile, sunt de asemenea obiecte de tip
date.
2. Funcţii, care au ca argumente obiecte. De exemplu, SORT(X) este o astfel
de funcţie care se aplică unui tablou de întregi X.
3. Asignări, prin care se atribuie unui obiect rezultatul unei funcţii.

75
4. Constructori de secvenţe, care reprezintă restricţii de precedenţă ale
algoritmului.
5. Constructori de structură, care permit construirea algoritmilor din alţi
algoritmi.
6. Comentarii, care permit documentarea algoritmilor.

Obiecte

Tipul de bază la nivel hardware/firmware este numit bit-vector. Un bit-vector


specific are un nume, reprezentat de una sau mai multe litere majuscule sau
caractere mici subliniate. Dimensiunea unui bit-vector, specificată între
simbolurile < şi >, este numărul de biţi din componenţa acestuia. Pentru a
specifica biţii individuali dintr-un bit-vector, se foloseşte o indexare crescătoare
spre stânga, cu originea la zero.

Exemplul 3.1

A  5 : ( A4 , A3 , A2 , A1 , A0 ) este un vector cu dimensiunea 5.


x  3 : ( x2 , x1 , x0 ) este un vector cu dimensiunea 3.

Simbolul : se foloseşte pentru a declara sau redenumi un bit-vector; astfel,


C : B indică faptul că C şi B sunt două nume diferite ale aceluiaşi obiect.
La implementare, bit-vectorii corespund conţinutului registrelor iar ieşirile
corespund reţelelor combinaţionale cu ieşiri multiple, după cum se arată în
Figura 3.2.
Bit-vectorii constanţi sunt bit-vectori cu valoare constantă. Numele
corespunde valorii incluse între semne de citare. De exemplu "1001".
Într-o specificaţie de nivel înalt pot fi folosite şi alte tipuri de obiecte. Ele sunt
specificate prin setul corespunzător de valori. Tipuri standard sunt boolean,
integer, character, dar pot fi definite şi altele.
Un cod C descrie corespondenţa dintre bit-vector şi obiect. Valoarea
obiectului este indicată prin v (C , X ) , unde X este un bit-vector. De exemplu,
valoarea vectorului X  1011 în codul 2-4-2-1 este v (2  4  2  1,1011)  5 iar
valoarea lui X  01010111 în codul ASCII este v ( ASCII ,01010111)  W .
Funcţia inversă este indicată prin v 1 (C , d ) , unde d este valoarea unei date.
De exemplu, v 1 ( EX  3,4)  0111 .
Pentru a simplifica notaţia în cazul reprezentării întregilor, atunci când se
foloseşte codul binar vom descrie valoarea omiţând codul sau folosind literele
mici corespunzătoare. De exemplu,

76
n 1
v( x)  x   X i 2i ,
i 0

unde X este un vector cu n biţi.


Pentru a avea o reprezentare mai compactă a constantelor, acestea pot fi
reprezentate prin valoarea lor într-un anumit sistem de numeraţie.

A3 A2 A1 A0
B3 B2 B1 B0

X 3 X 2 X1 X 0 K
MUX
Y3 Y2 Y1 Y0

C out Cin E
Sumator Decodificator
S3 S 2 S1 S 0
....
L CLK Z7 Z 2 Z1 Z 0
Registru

W3 W2 W1 W0
(a)
X B A
4 4

4 MUX
K

Y 4
4

3
C out Cin E
Sumator Decodificator
S 4 8
L CLK Z
Registru
4 (b)
W

Fig. 3.2 (a) Exemple de bit-vectori. (b) Notaţia simplificată.

77
Exemplul 3.2
Valoarea "01110" poate fi notată "14" pentru o reprezentare binară
convenţională a întregilor, iar "01000001" poate fi notată "A" dacă se foloseşte
codul ASCII pentru caractere.
La nivelul inferior, singura structură de obiecte elementare permisă de limbaj
este tabloul. Tablourile vor fi notate printr-un şir de litere majuscule, iar
dimensiunea este indicată printr-o pereche de întregi care reprezintă numărul de
bit-vectori şi numărul de biţi din fiecare vector. Un bit-vector individual din
tablou este specificat cu un index între paranteze drepte. Pentru implementare,
tablourile de bit-vectori corespund tablourilor de registre, RAM, sau reţelelor
combinaţionale multidimensionale cu ieşiri multiple.
Exemplul 3.3
Tabloul M  2,6  reprezintă o matrice 2  6

M : 
M [0]
 M [1] 
unde
M [0] : ( M 5 [0], M 4 [0], M 3 [0], M 2 [0], M 1[0], M 0 [0])

M [1] : ( M 5 [1], M 4 [1], M 3 [1], M 2 [1], M 1[1], M 0 [1])


sau
M [0] : ( M [0,5],..., M [0,0])
M [1] : ( M [1,5],..., M [1,0])
La nivel înalt, pot fi folosite tablouri de alte obiecte, cum sunt întregi sau
caractere. Limbajul permite şi folosirea altor structuri de date: stive, cozi, liste.

Funcţii (Operatori)

O funcţie la nivelul implementării are bit-vectori drept operanzi şi bit-vectori


drept rezultat. Un operator specific este reprezentat printr-un nume, care este un
şir de litere majuscule (în mod curent legat de funcţia realizată). Uneori, vectorul
de ieşire primeşte acelaşi nume ca şi operatorul. Argumentele sunt specificate în
paranteze după nume. de exemplu, DECODE ( X ) , ADD( X , Y ) , F (W ) .
Un operator este implementat printr-o reţea de tip combinaţional. Operatorii
standard corespund modulelor standard (???Curs ASCN, AP). Sunt acceptaţi

78
operatori implementaţi prin reţele secvenţiale: în acest caz operatorul include şi
controlul corespunzător (control semi-centralizat).
Operatorul este specificat prin funcţia pe care o realizează. Specificarea poate
fi dată prin tabele, expresii booleene, etc.
De asemenea, este posibil să se folosească operatorii limbajului la tipuri de
obiecte de nivel înalt. În aceste cazuri, specificaţia este dată în funcţie de funcţii
primitive convenţionale ale acestor tipuri de obiecte. De exemplu, dacă funcţia
este asupra obiectelor de tip întreg, în specificaţie pot fi folosite operaţiile
aritmetice de bază. În acest caz, implementarea constă dintr-o reţea
combinaţională (secvenţială) care realizează funcţia asupra bit-vectorilor codaţi.
de exemplu, funcţia unui sumator poate fi specificată sub forma
ADD( x, y ) : x  y

unde x , y şi ADD( x, y ) sunt întregi iar  este operaţia de adunare.


Alte funcţii care sunt folosite adesea au o notaţie specială:
1. Funcţia de selecţie condiţionată permite selecţia unui obiect dintr-o
mulţime, în funcţie de valoarea unei condiţii. Este specificată prin
A if a | B if b | C if c...

unde A, B, C ,... sunt obiecte iar a, b, c,... sunt condiţii care pot fi propoziţii (cu
valoarea True sau False) sau expresii booleene (cu valoarea 0 sau 1). Valoarea
funcţiei este A dacă a  True (sau 1), este B dacă b  True (sau 1), etc. Cel
mult o condiţie poate avea valoarea True (sau 1) la un moment dat. dacă toate
condiţiile sunt False, ieşirea funcţiei de selecţie este nespecificată.
Selecţia condiţionată poate fi implementată prin porţi care au vectori la intrări,
sau prin multiplexoare care au vectori la intrări, ca în Figura 3.3.
A B C A B C
a b c
n n
.... 0 1 2 2p–1
s p
MUX
2p intrări x n biţi
n
.... n

(b)
n (a)

Fig. 3.3 Implementarea operaţiei de selecţie condiţionată cu


(a) porţi de vectori şi (b) multiplexoare.

79
Pentru implementarea cu MUX, o construcţie mai utilă a limbajului este

A if s  0 | B if s  1 | C if s  2...

2. Funcţia de concatenare concatenează vectori pentru a forma un vector cu


dimensiuni mai mari. Este specificată prin

( A, B, C ,...)
3. Extragerea unui sub-vector dintr-un vector dat este specificată sub forma
unei concatenări de componente. De exemplu, A : ( B4 , B3 , B2 ) .

Asignări

O asignare se foloseşte pentru a atribui unui obiect destinaţie valoarea unui


obiect sursă. Obiectele sursă şi destinaţie trebuie să fie de acelaşi tip şi
dimensiune. O asignare este reprezentată prin

DS

O asignare este implementată printr-un transfer între registre (Figura 3.4a).


La momentul t  1 destinaţia primeşte valoarea sursei de la momentul t .
Aceasta corespunde unei tranziţii de stare într-un sistem secvenţial sincron.
Transferuri ca A  A  B sunt, prin urmare, valide şi înseamnă
A(t  1)  A(t )  B (t ) .
Asignările condiţionate produc o asignare numai dacă o condiţie este
satisfăcută. Se reprezintă prin
if c then D  S

Asignarea este realizată dacă c  True (sau 1). O asignare condiţionată poate
să conţină şi o zonă else:
if c then A  B else D  C

Asignările condiţionate pot fi implementate ca în Figura 3.4b, c.


Obiectul sursă dintr-o asignare poate fi ieşirea unui operator. Exemple de
asignări tipice împreună cu implementările lor sunt prezentate în Figura 3.5.
Construcţii secvenţiale
Instrucţiuni
Datorită caracteristicii grup-secvenţial a algoritmilor, mai multe asignări sunt
executate simultan. Construcţia de limbaj pentru a reprezenta un astfel de grup
este instrucţiunea. Aceasta constă din mai multe asignări separate prin simbolul
|| . Toate asignările dintr-o instrucţiune folosesc valorile sursă dinaintea oricărei

80
asignări din instrucţiunea care se execută. Aşadar, ordinea în care sunt scrise
asignările în instrucţiune nu este semnificativă, iar instrucţiuni ca
A  B || B  A sunt valide.
B
S S
LOAD c
A
CLK LOAD 1 CLK LOAD c
D D D

CLK LOAD c'


C

(a) (b) (c)

Fig. 3.4 Implementarea asignărilor.

R T
C D
Add
Add
Decodificator
Semnal de
CLK încărcare
Z Semnal de
paralelă CLK încărcare
F
paralelă

(a) Z  ADD (C , D ) (b) F  DECODE ( ADD ( R, T ))

B C

A
Add

c1 (c) if c3 then G  ( A if c1 | ADD ( B, C ) if c2 )


c2 Selector

CLK
F c3

Fig. 3.5 Exemple de asignări.

81
Instrucţiunile se termină cu "punct şi virgulă". Pentru a identifica o
instrucţiune se foloseşte o etichetă. Aceasta constă dintr-un şir de caractere
alfanumerice, se află la începutul instrucţiunii şi este separată de aceasta prin
"două puncte". Eticheta nu este obligatorie. Exemple de instrucţiuni şi etichete:

Set: A  B || C  B if a | D if a' ;
C  ADD( B, C );
cont: if a  b then ( A, B, C )  ( D, E , F );

Pentru că unitatea de execuţie într-un algoritm grup-secvenţial este


instrucţiunea, pentru cazurile în care este nevoie să se ia în consideraţie timpul
se foloseşte o funcţie  inclusă între paranteze: specifică numărul de unităţi de
timp pentru execuţia unei instrucţiuni. Valoarea lui  este indicată la sfârşitul
instrucţiunii şi este implicit egală cu 1. Timpul poate fi de asemenea condiţional.
De exemplu,
result: A  ADD( X , Y ) if a | MUL( X , Y ) if a' [  (3 if a | 21 if a' )];
O instrucţiune este implementată printr-o micro-instrucţiune. Eticheta este
translatată în adresa microinstrucţiunii (implementare firmware) sau în numele
stării unei maşini secvenţiale (la implementările hardware). Asignările dint-o
instrucţiune sunt implementate prin micro-operaţii corespunzătoare.

Secvenţe de instrucţiuni
Un algoritm de tip grup-secvenţial este alcătuit dintr-o secvenţă de
instrucţiuni. Secvenţierea (ordinea în care sunt executate instrucţiunile) poate fi
specificată explicit sau implicit.
Într-o secvenţiere explicită fiecare instrucţiune conţine o etichetă a
instrucţiunii care va fi executată la pasul următor. Această construcţie de limbaj
este scrisă ca parte a unei instrucţiuni după toate asignările şi constă dintr-o
săgeată orientată către dreapta urmată de etichetă.
Următoarea secvenţă de instrucţiuni foloseşte secvenţierea implicită (ne-
condiţională şi condiţională):
loop: W  OP1( A, B) ||  next;
next: if c then A  OP 2(W ) ||  more;
more: B  OP3( A,W ) ||  loop if ab' | next if ba ' | end if a ' b' ;
end: A  B;

Implementarea secvenţierilor explicite se face prin funcţia de tranziţie a


sistemului secvenţial care implementează funcţia de control. Condiţiile pentru
secvenţierea condiţională sunt determinate în secţiunea de date şi sunt transmise
secţiunii de control. În implementarea microprogramată, sunt unele restricţii

82
asupra numărului de condiţii care pot fi folosite în construcţia secvenţierii
condiţionale (una în mod curent).
Spre deosebire de acestea, în secvenţierea implicită ordinea de execuţie este
determinată de ordinea în care instrucţiunile sunt scrise în algoritm. În
consecinţă, instrucţiunile nu necesită informaţie suplimentară despre următoarea
instrucţiune de executat. Pentru că această secvenţiere implicită este prea
restrictivă, sunt incluse instrucţiuni speciale numite salturi (condiţionate) pentru
a putea întrerupe secvenţa implicită. Construcţia de limbaj este similară cu aceea
din cazul explicit. Următoarea secvenţă de instrucţiuni foloseşte secvenţierea
implicită.
loop: W  OP1( A, B) ;
next: if c then A  OP 2(W ) |;
B  OP3( A,W ) ||  loop if ab' | next if ba ' | end if a ' b' ;
 loop if a | next if b;
end: A  B;

De asemenea, este posibil să se folosească o combinaţie de secvenţieri de tip


implicit şi explicit. În acest caz, dacă în instrucţiune nu se oferă nici o
informaţie, se presupune secvenţiere de tip implicit.
Noi vom folosi această combinaţie de secvenţiere explicit-implicit în
specificarea algoritmilor.
Vom defini un bloc: o construcţie de limbaj care conţine o secvenţă de
instrucţiuni având un nume, un început (begin) şi un sfârşit (end). Un exemplu
de bloc este:
begin B1
1: A  B || C  D || 3 if c;
2: A  ADD( A, C );
3: A  0;
end B1
Pentru o reprezentare mai compactă a blocurilor mici putem folosi { şi } în
loc de begin şi end. de exemplu,
{ 1: A  B;
2: C  D || E  F }

Folosind blocul ca primitivă de bază, limbajul include următoarele construcţii


de nivel înalt:

1. Execuţia condiţionată are forma


if c then B1 else B 2;

83
unde c este o condiţie iar B1 şi B 2 sunt blocuri. Această construcţie înlocuieşte
secvenţa:
 L1 if c | L 2 if c' ;
L1: begin B1;
..........
end B1 ||  L3;
L2: begin B 2;
..........
end B 2;
L3:
2. Execuţia repetată are forma:

for COUNT  K until N do B;

unde K şi N sunt întregi iar B este un bloc de instrucţiuni. Blocul B este


executat repetat pentru COUNT egal cu K , K  1,..., N . Această construcţie
înlocuieşte:
COUNT  K ;
back:  next if (COUNT  N );
B || COUNT  COUNT  1 || back ;
next:

3. Repetarea condiţionată foloseşte următoarea construcţie


while c do B;
unde c este o condiţie iar B este un bloc. Această construcţie înlocuieşte
secvenţa
again:  next if c ;
B ||  again;
next:

4. Ramificaţia multiplă (case) are următoarele specificaţii


case of A
A1: B1;
……
Am: Bm;
endcase;

84
unde Ai este o valoare a obiectului A, iar B este un bloc. Dacă A are valoarea Ai,
atunci se execută numai blocul Bi. Dacă A are o valoare diferită de Ai, atunci nu
se execută blocul Bi. Această construcţie înlocuieşte următoarea secvenţă

if A = A1 then B1 ║
.......
if A = Am then Bm

Trebuie să menţionăm că aceste construcţii nu reprezintă descrieri mult mai


compacte. Avantajul lor este acela că descrierea este mai structurată adică, sunt
permise numai ramificaţiile controlate. Un modul de translatare va trebui să
translateze aceste construcţii în secvenţe care pot fi implementate.

Construcţii structurale

Aceste construcţii permit o compunere ordonată a subalgoritmilor pentru a


forma algoritmi. Sunt incluse aici: module, macro function si subroutine
function.
Modulul (module) este un (sub)algoritm care are un nume, un punct de intrare
şi puncte condiţionale de ieşire, după cum se arată în Figura 3.6.
Un modul utilizează variabile locale, care sunt definite numai în interiorul
modulului respectiv, şi variabile globale, care sunt folosite pentru a interacţiona
cu alte module. Un modul este alcătuit dintr-o parte declarativă, în care se
declară variabilele locale şi cele globale, şi un corp arhitectural care conţine
instrucţiuni. Numele este reprezentat printr-o etichetă care se atribuie modulului
şi este folosit ca destinaţie pentru alte ramificaţii din algoritm.

Declaraţii
Punct de
intrare
Corp
arhitectural

......

Puncte de ieşire
condiţionate

Fig. 3.6 Descrierea unui modul.

85
Punctul de intrare este reprezentat de prima instrucţiune din corpul
arhitectural. Ramificaţiile din exterior sunt permise numai la acest punct. Partea
declarativă este o listă a tuturor obiectelor folosite în modul. Aceasta se împarte
în intrări globale, ieşiri globale şi obiecte locale. Pentru fiecare obiect se indică
tipul şi dimensiunea. În partea declarativă se pot da nume anumitor expresii.
Sintaxa pentru aceasta este:
NUME := expresie
Ori de câte ori se foloseşte NUME în corpul arhitectural, acesta va înlocui
expresia corespunzătoare. La implementare, aceasta corespunde cu atribuirea de
nume ieşirilor reţelelor combinaţionale.
În continuare este prezentat un exemplu de modul.

Exemplul 3.4

Următorul modul descrie un algoritm pentru calculul Z   A  B  mod 216 .


Este alcătuit din partea declarativă, inclusă între { şi }, şi instrucţiuni care
definesc algoritmul [4].
MODULE: { Inputs A, B type integer;
Outputs Z type integer,
Local-objects Y, W type integer}
1: Y ← A if A ≥ 0 | – A if A < 0 ║
W ← B if B ≥ 0 | – B if B < 0;
2: Z ← (Y + W) mod 216 ║ → exit1 if z ≠ 0 | exit2 if z = 0;
end MODULE

Un modul poate fi compus din sub-module mai mici. Aşadar, un algoritm este
un modul. O posibilă organizare a unui algoritm compus din module este
indicată în Figura 3.7.
O funcţie macro (macro function) are aceeaşi semantică şi sintaxă ca o funcţie
dar este extinsă într-o secvenţă de instrucţiuni de către un translator (sau de
proiectant într-o etapă ulterioară) pentru a fi implementată. Este utilizată pentru
funcţii complexe care nu sunt implementate direct prin reţele combinaţionale sau
secvenţiale autonome.
O subrutină are de asemenea semantica şi sintaxa unei funcţii. Pe durata
execuţiei se pot face ramificaţii la o rutină, execuţia unei rutine, apoi controlul
se întoarce la instrucţiunea de după apelul la subrutină. Avantajul faţă de
funcţiile macro este acela că într-un algoritm care necesită aceeaşi funcţie de
mai multe ori, secvenţa pentru acea funcţie este implementată numai o singură
dată, ceea ce conduce la economie de spaţiu de memorare. Dezavantajul unei
subrutine este acela că adresa instrucţiunii de retur trebuie să fie memorată în
prealabil, ceea ce conduce la un anumit consum de timp.

86
Declaraţii
Corp
arhitectural
Instrucţiuni

Modul
Declaraţii
Corp
arhitectural

Modul

Fig. 3.7 Un algoritm compus din module (sub-algoritmi).

87

S-ar putea să vă placă și