Structura Si Organizarea Calculatoarelor

105
Reprezentarea în calculator a numerelor întregi. Sistemul de numeraţie utilizat pentru reprezentarea datelor în tehnica electronică de calcul este sistemul binar. Reprezentarea numerelor în acest sistem se poate face în mai multe forme, în funcţie de mulţimea căreia îi aparţine numărul. Operaţiile (calculele) sunt efectuate fie de dispozitive aritmetice specializate pentru fiecare mod de reprezentare, fie prin succesiunea conversie-calcul-conversie, în cazul în care sistemul de calcul nu dispune decât de un singur dispozitiv specializat pentru calcul. Reprezentarea numerelor naturale este numită şi reprezentarea aritmetică, şi se realizează pe lungimi standard, de 8, 16, 32, 64 poziţii binare. Dacă se cunoaşte numărul de poziţii binare pe care se reprezintă un număr natural, se poate stabili numărul maxim admis care poate fi reprezentat. Acest număr maxim se obţine prin ocuparea tuturor poziţiilor disponibile cu cifra 1. Reprezentarea numerelor întregi este numită şi reprezentarea algebrică. Ea este asemănătoare reprezentării aritmetice, cu deosebirea că prima poziţie este ocupată de semnul reprezentării. Prin convenţie, dacă poziţia de semn este 0, numărul este pozitiv, iar dacă este 1 numărul este negativ. Pe n poziţii binare, un număr întreg este reprezentat ca în figura următoare: De regulă, numerele întregi se reprezintă pe 8, 16, 32 şi 64 biţi. Cunoscând numărul de poziţii binare pe care se reprezintă un număr întreg, se poate determina intervalul admis pentru această reprezentare. De exemplu, adunarea numerelor întregi se efectuează în binar; dispozitivul aritmetic al sistemului de calcul ce efectuează operaţia de adunare se numeşte SUMATOR. Pentru a nu se construi hardware un dispozitiv suplimentar care să efectueze scăderea, această operaţie revine tot sumatorului, cu condiţia ca scăderea să fie transformată într-o adunare, adică: a – b = a + (- b)

Transcript of Structura Si Organizarea Calculatoarelor

Page 1: Structura Si Organizarea Calculatoarelor

Reprezentarea în calculator a numerelor întregi. Sistemul de numeraţie utilizat pentru reprezentarea datelor în tehnica electronică de calcul este sistemul binar. Reprezentarea numerelor în acest sistem se poate face în mai multe forme, în funcţie de mulţimea căreia îi aparţine numărul. Operaţiile (calculele) sunt efectuate fie de dispozitive aritmetice specializate pentru fiecare mod de reprezentare, fie prin succesiunea conversie-calcul-conversie, în cazul în care sistemul de calcul nu dispune decât de un singur dispozitiv specializat pentru calcul. Reprezentarea numerelor naturale este numită şi reprezentarea aritmetică, şi se realizează pe lungimi standard, de 8, 16, 32, 64 poziţii binare. Dacă se cunoaşte numărul de poziţii binare pe care se reprezintă un număr natural, se poate stabili numărul maxim admis care poate fi reprezentat. Acest număr maxim se obţine prin ocuparea tuturor poziţiilor disponibile cu cifra 1. Reprezentarea numerelor întregi este numită şi reprezentarea algebrică. Ea

este asemănătoare reprezentării aritmetice, cu deosebirea că prima poziţie este ocupată de semnul reprezentării. Prin convenţie, dacă poziţia de semn este 0, numărul este pozitiv, iar dacă este 1 numărul este negativ. Pe n poziţii binare, un număr întreg este reprezentat ca în figura următoare: De regulă, numerele întregi se reprezintă pe 8, 16, 32 şi 64 biţi. Cunoscând numărul de poziţii binare pe care se reprezintă un număr întreg, se poate determina intervalul admis pentru această reprezentare. De exemplu, adunarea numerelor întregi se efectuează în binar; dispozitivul aritmetic al sistemului de calcul ce efectuează operaţia de adunare se numeşte SUMATOR. Pentru a nu se construi hardware un dispozitiv suplimentar care să efectueze scăderea, această operaţie revine tot sumatorului, cu condiţia ca scăderea să fie transformată într-o adunare, adică:

a – b = a + (- b)

Page 2: Structura Si Organizarea Calculatoarelor

Reprezentarea numerelor negative se poate face în trei forme, astfel:

În cod direct, adică reprezentare prin mărime şi semn, care coincide cu reprezentarea numerelor întregi, având cifra 1 în poziţia alocată semnului, urmată de cifrele binare ale numărului.

În cod invers, adică reprezentarea în complement faţă de 1. Fiecare cifră binară dintr-un număr reprezentat în cod invers este complementul faţă de 1.

În cod complementar, complementul faţă de 2, în care fiecare cifră binară

schimbă starea, adunând apoi 1 la cifra cea mai puţin semnificativă. Toate aceste reprezentări au apărut din necesitatea uşurării operaţiilor aritmetice. Scăderea efectuată ca o adunare prin reprezentarea scăzătorului în cod invers sau în cod complementar impune următoarele observaţii:

dacă rezultatul scăderii este un număr negativ acesta va fi reprezentat în acelaşi cod în care a fost reprezentat scăzătorul;

dacă în urma operaţiei apare transport de la prima poziţie, care este alocată pentru semn, acesta se va aduna la cifra cea mai puţin semnificativă a rezultatului, dacă operaţia s-a efectuat în cod invers, respectiv se ignoră dacă operaţia s-a efectiuat în cod complementar.

Reprezentarea în virgulă mobilă.

Numerele reale se reprezintă într-un sistem de calcul sub formă fracţionară, prin intermediul reprezentării în virgulă mobilă (flotantă). Forma generală de reprezentare a unui număr în virgulă mobilă este: Unde:

N - numărul

+ - semnul (pozitiv sau negativ)

f - partea fracţionară

b - baza de numeraţie

e - exponentul (puterea)

Page 3: Structura Si Organizarea Calculatoarelor

Forma 1, f se numeşte formă normalizată. Reprezentarea numerelor reale în virgulă mobilă se poate face în două forme:

virgulă mobilă simplă precizie (pe 32 biţi)

virgulă mobilă dublă precizie (pe 64 biţi).

Forma de reprezentare în simplă precizie se prezintă astfel: Unde: S – bitul de semn care respectă aceeaşi condiţie ca la numerele întregi: 0 pentru numerele pozitive, 1 pentru cele negative C – caracteristica e – exponentul M – mantisa (partea fracţionară) Pentru a nu se ocupa încă o poziţie binară pentru semnul exponentului s-a introdus noţiunea de caracteristică, care este reprezentarea exponentului în exces de 127. Rezultă în urma acestei convenţii, că, dacă C ≥ 127, exponentul e ≥ 0, iar dacă C < 127, atunci e < 0. Lungimea mantisei reprezintă de fapt precizia de reprezentare a numărului. Forma de reprezentare în dublă precizie foloseşte un număr de 52 de biţi pentru mantisă:

Unde: S – bitul de semn

Page 4: Structura Si Organizarea Calculatoarelor

C – caracteristica M – mantisa Atât la numerele în simplă precizie cât şi la cele în dublă precizie, partea fracţionară este aliniată stânga, adică de la virgulă. La formatul de reprezentare în virgulă mobilă se observă că cifra 1 din faţa virgulei nu se reprezintă. Acest lucru se va avea în vedere când se va interpreta numărul real exprimat în virgulă mobilă.

Reprezentarea zecimală. Se realizează prin exprimarea fiecărei cifre zecimale printr-o tetradă (4 poziţii) binară, conform unui anumit cod numeric. Deoarece într-un sistem de calcul orice număr se poate reprezenta pe un multiplu de 8 cifre binare, reprezentarea zecimală are două forme:

zecimal condensată (împachetată), când pe 8 cifre binare se reprezintă câte 2 cifre zecimale, ficare pe câte 4 biţi;

zecimal dilatat (despachetat), în care, pe 8 cifre binare se reprezintă o singură cifră zecimală, exprimată binar pe 4 biţi, precedată de un grup de cifre binare numite MARCĂ.

Spre exemplu numărul 7.954 în forma zecimal condensată (împachetată) se reprezintă:

Forma zecimal dilatat (despachetat) se reprezintă asfel: Justificarea celor trei moduri de reprezentare a numerelor în calculator (în virgulă mobilă, în virgulă fixă şi zecimal) are la bază, simultan, criterii de acoperire a unor valori cât mai diverse pentru datele de intrare şi ieşire din calculator, combinat cu minimizarea conversiilor pentru intrare şi pentru ieşire. Astfel, numerele în virgulă mobilă acoperă mulţimea numerelor reale, dar introduc un grad de aproximare. Numerele în virgulă fixă (şi calculele în virgulă fixă) sunt exacte, dar numai pentru mulţimea numerelor întregi şi pentru valori mici. Pe de altă parte, dialogul utilizator calculator se face în

Page 5: Structura Si Organizarea Calculatoarelor

sistemul zecimal, specific utilizatorului. Pentru efectuarea unor calcule asupra unor date introduse de utilizator în format zecimal, de către un calculator care nu posedă decât aritmetica în virgulă fixă, este necesară atât conversia la intrare din format zecimal în format binar în virgulă fixă, cât şi convertirea rezultatului din format binar virgulă fixă în format zecimal. Cele trei aritmetici pot fi implementate în calculator atât prin dispozitive hardware (procesoare specializate), cât şi prin mecanisme software, care emulează calculele în virgulă mobilă sau zecimale, de exemplu, pe un procesor de calcul în virgulă fixă. Prin mecanismul de emulare, utilizatorului i se dă rezultatul fără să cunoască procedeul prin care se ajunge la rezultat.

Codificarea datelor. Procedeul de rprezentare a informaţiei conform unui anumit format poartă denumirea de codificare. Necesitatea utilizării codurilor se impune pentru a asigura comunicaţia între utilizator şi sistemul de calcul, având în vedere că utilizatorului îi este specifică gândirea zecimală şi folosirea caracterelor alfabetului, în timp ce tehnica de calcul recunoaşte doar sistemul binar.

Raportul codificare reprezentare Se numeşte cod un set de simboluri elementare, împreună cu o serie de reguli potrivit cărora se formează aceste simboluri. Codificarea reprezintă procesul de stabilire a unui cod. Dacă se noteză cu X mulţimea elementelor accesibile utilizatorului şi cu Y mulţimea caracterelor recepţionate de sistemul de calcul, atunci codificarea reprezintă asocierea fiecărui element Xi din mulţimea X cu un element Yi din mulţimea Y. Codul este astfel o funcţie bijectivă f : X → Y

Page 6: Structura Si Organizarea Calculatoarelor

Funcţia inversă f-1

: Y → X este procesul de decodificare. Operaţia de decodificare a datelor constă deci în stabilirea unei corespondenţe biunivoce între elementele sistemului informaţional: documente, operaţii, produse, materiale etc. şi o mulţime de simboluri, cifre, litere etc. Datele de codificat constituie vocabularul de intrare; simbolurile de reprezentare formează limbajul de codificare; rezultatele codificării se concretizează în sisteme de coduri care semnifică alfabetul de ieşire. Operaţia de codificare este prezentă pe mai multe nivele de tratare a informaţiilor. Ea este prezentă pornind de la nivelul scăzut al sistemului de calcul (hardware, software de bază) până la nivelul codificării în ansamblul sistemului informaţional (coduri de materiale, coduri de produse, codul de bare etc.) Desfăşurarea operaţiilor de codificare presupune respectarea următoarelor principii:

adoptarea aceloraşi norme în determinarea vocabularului de intrare;

folosirea unui limbaj de codificare accesibil, astfel încât interpretarea alfabetului de ieşire să se facă fără dificultăţi;

respectarea biunivocităţii între vocabularul de intrare şi limbajul de codificare;

previziunea evoluţiei codurilor, care să asigure posibilitatea actualizării sistemelor de coduri, fără perturbaţii; sistemele de coduri adoptate să fie sugestive în redarea legăturilor dintre fenomene, procese şi documente;

adaptarea codificării în vederea prelucrării informaţiilor în sistemul de calcul.

Procesul de codificare constă în parcurgerea următoarelor activităţi: A. Stabilirea caracteristicilor generale ale codurilor, în care se urmăreşte:

determinarea vocabularului de intrare şi a caracteristicilor acestuia;

analiza structurii informaţiilor din vocabularul de intrare pentru fixarea structurii generale a codului;

determinarea alfabetului de ieşire în funcţie de mărimea vocabularului de intrare şi de structura generală a codurilor;

fixarea sistemelor de coduri astfel încât acestea să asigure maximum de uniformitate a codificării.

Page 7: Structura Si Organizarea Calculatoarelor

B. Clasificarea elementelor vocabularului de intrare de la general la particular, până la nivel elementar, cu respectarea normelor legale, astfel:

operaţiile şi documentele se grupează după locul şi rolul lor;

materialele după natură, proprietăţi, mod de gestionare etc.

C. Precizarea tehnologiei standard de codificare la care se pretează fiecare clasă de elemente din vocabularul de intrare. D. Codificarea propriu-zisă, prin stabilirea corespondenţei între vocabularul de intrare şi alfabetul de ieşire. E. Unificarea tehnologiei şi atribuirea codurilor. F. Actualizarea codurilor, care constă în adăugări de coduri pentru elementele noi şi eliminări de coduri pentru elementele care nu se mai utilizează. Principalele sisteme de coduri utilizate sunt:

Sistemul în ordine numerică/naturală. Este utilizat pentru elemente temporare ale sistemului fără periodicitate. Orice element nou apărut afectea-ză întregul sistem de coduri.

Sistemul în serie. Este o dezvoltare a sistemului în ordine naturală prin rezervarea de numere pentru eventuale apariţii de noi elemente în vocabularul de intrare.

Sistemul pe grupe. Constă în atribuirea unui anumit număr de coduri

fiecărei clase de elemente de reprezentat. De exemplu IJK poate indica: grupa I, subgrupa J şi sortimentul K pentru elementul reprezentat.

Sistemul zecimal.Presupune divizarea vocabularului de intrare în 10

grupe, iar fiecare grupă în 10 subgrupe etc. În practica economică, acest sistem este folosit în codificarea conturilor în contabilitate.

Sistemul în şah. Se bazează pe construirea de tabele în care fiecare dimensiune specifică o caracteristică a elementelor de reprezentat. Aplicarea sistemului este recomandată pentru clase de elemente care rămân neschimbate, cum ar fi codificarea subansamblelor şi pieselor unui utilaj.

Sistemul repetitiv. Constă în realizarea codului din caracteristicile elementelor de codificat. Sfera sistemului este limitată la un vocabular de intrare mai puţin complex.

Sisteme combinate: sistemul în ordine naturală pentru clase ale

Page 8: Structura Si Organizarea Calculatoarelor

vocabularului de intrare, sistemul în serie pentru grupe, sistemul repetitiv pentru elemente.

Procedura de codificare, la nivelul sistemului informaţional, este în mare parte la alegerea utilizatorului. Cu cât coborâm spre nivelul elementar de prelucrare a informaţiei, cu atât sistemele de codificare sunt mai rigide, ele fiind standardizate din considerente de compatibilitate în utilizarea tehnicii electronice de calcul. Codurile alfanumerice sunt coduri binare utilizate pentru reprezentarea caracterelor alfanumeric. Prin caractere alfanumerice înţelegem:

literele mari şi mici ale

alfabetului; cifrele de la 0 la 9;

semnele de punctuaţie;

operatorii aritmetici şi de

relaţie; alte caractere speciale.

În general prin caractere alfanumerice se înţeleg toate caracterele care pot fi introduse de la tastatura unui calculator. Numărul acestor caractere este mai mare decât 64 şi, din acest motiv, pentru reprezentarea binară a caracterelor alfanumerice sunt necesare cel puţin 7 poziţii binare. Cum numărul de caractere de codificat este limitat şi relativ redus, funcţia de codificare alfa-numerică se defineşte tabelar. Din marea familie a codurilor alfanumerice le exemplificăm pe cele mai cunoscute:

Codul EBCDIC (Extended Binary Coded decimal Interchange Code) este un cod alfa-numeric pe 8 biţi, proiectat pentru codificarea informaţiilor, la calcu-latoarele din seria IBM 360. Codul a fost utilizat până prin anii ’70.

Codul ASCII (American Standard Code for Information Interchange) reprezintă un standard actual de codificare alfa-numerică pe 7 biţi. Este un cod alfa-numeric, cu recomandare ISO (International Standard Organization) şi este utilizat de multe tipuri de calculatoare şi de majoritatea echipamentelor periferice care lucrează cu aceste calculatoare.

Codul UNICODE. Este un cod alfa-numeric pe 16 biţi care îşi propune să definească un cod stan-dard pentru simbolurile alfa-numerice utilizate în toate ţările lumii: litere, semne de punctuaţie, semne monetare specifice tuturor limbilor de pe planetă.

Prin dezvoltarea sistemelor de coduri pe 7 şi 8 biţi, aşa-numitele coduri

Page 9: Structura Si Organizarea Calculatoarelor

pe octet, către coduri pe doi octeţi sau coduri DBCS (Duble-Bit Code System). s-a creat o familie de coduri care se doreşte a fi unificată de sistemul de codificare UNICODE. Înlocuirea codului ASCII cu UNICODE ar avea avantajul unificării sistemului de codificare a caracterelor folosite oriunde în lume. Pe de altă parte apar şi unele dezavantaje:

utilizând UNICODE pe 16 biţi, dimensiunea fişierelor text se dublează, în comparaţie cu cea a fişierelor codificate ASCII;

programele care utilizează codul ASCII vor trebui adaptate pentru a putea recunoaşte codul UNICODE.

Coduri detectoare şi corectoare de erori. În fluxul prelucrării automate a datelor, operaţia de transfer a informaţiilor prin intermediul unui canal de comunicaţie este extrem de frecventă. Cu ocazia acestui transfer de informaţie, la nivelul canalului de comunicaţie pot apare perturbaţii. Pentru a nu se altera conţinutul informaţional este necesară protejarea informaţiilor împotriva acestor perturbaţii. Procedura presupune adăugarea unor informaţii suplimentare, necesare în primul rând detectării erorilor şi ulterior corectării acestora. Una din modalităţile practice cel mai frecvent utilizate în detectarea erorilor este reprezentată de codurile pentru controlul parităţii. La emisia unei secvenţe binare de n biţi se ataşează o cifră binară suplimentară, numită cifră de control, astfel încât:

în cazul parităţii pare, numărul poziţiilor binare din şir care au valoarea 1 să fie par (inclusiv cifra de control)

în cazul parităţii impare, numărul poziţiilor binare din şir (inclusiv cifra de control) care au valoarea 1 să fie impar

La recepţia unui caracter se efectuează suma cifrelor binare care au fost primite. Dacă această sumă respectă convenţia de paritate stabilită, mesajul este considerat corect recepţionat. În caz contrar se semnalează eroarea, solicitându-se reluarea transmisiei. Acest tip de cod este implementat de regulă hardware la nivelul dispozitivelor fizice ale sistemului de calcul. El are două forme de reprezentare:

VRC – control de paritate vertical

LRC – control de paritate orizontal (longitudinal) În anumite situaţii, simpla detectare a erorilor este ineficientă. În vederea eliminării, fie şi numai partiale, a acestui neajuns, au fost proiectate coduri care, pe lângă detectarea erorilor, oferă şi posibilitatea corectării cifrelor binare eronate. Cele mai semnificative sisteme de coduri din această categorie sunt:

codurile de paritate

Page 10: Structura Si Organizarea Calculatoarelor

încrucişată codul HAMMING La codurile de paritate încrucişată succesiunea de cifre binare care se transmit se divide într-un număr de secvenţe binare de aceeaşi lungime n, astfel încât succesiunea va fi formată dintr-un număr variabil de linii şi un număr fix de coloane. La emisie fiecărei linii şi fiecărei coloane i se va ataşa o cifră de control de paritate. Practic se aplică LRC pentru linii şi VRC pentru coloane. La recepţie, prin controlul parităţii, pe fiecare linie şi coloană se detectează eventualele erori, având posibilitatea de a corecta o singură eroare detectată la intersecţia liniei şi a coloanei care nu respectă paritatea stabilită. Paritatea simplă pară: Exemplu: 1 0 0 1 0 0 1 1 - par bitul de control Paritatea încrucişată pară

VRC

1 0 0 1 0 0 1 1 <-LRC

1 1 0 1 0 1 1 1

1 0 0 0 1 0 0 0

1 1 0 0 1 1 0 0 <-VRC Codul HAMMING ataşează, la emisie, pentru fiecare grup de patru cifre binare utile ale mesajului, trei cifre binare de control. De remarcat că prin acest cod, datorită ataşării a trei cifre de control la patru cifre utile, concomitent cu verificarea mai riguroasă a mesajului, se măreşte şi mesajul, cu toate implicaţiile ce derivă din aceasta. Codificarea setului de caractere la P.C. La majoritatea calculatoarelor, fiecare caracter se prezintă codificat pe un octet. Setul de caractere PC cuprinde 256 caractere. Jumătate din aceste caractere sunt codificate utilizând codul ASCII pe 7 biţi, la care se adaugă un prim bit, 0; restul de 128 de caractere nu au o codificare standard pentru toate sistemele de calcul. Aceste ultime 128 caractere din set sunt numite setul de caractere ASCII extins. Setul de caractere ale PC cuprinde:

primele 32 caractere (0-31) sunt caractere cu funcţii speciale, folosite pentru transmiterea de comenzi (caractere de control). De exemplu:

Page 11: Structura Si Organizarea Calculatoarelor

caracterul "backspace" (cod 8), care produce ştergerea caracterului din stânga;

caracterul "line feed" (cod 10) produce saltul la rândul următor;

caracterul "form feed" (cod 12) produce saltul la pagina următoare;

caracterul "cariage return" (cod 13) produce saltul la începutul rândului curent etc.

Când se utilizează combinaţia de taste CTRL + O LITERĂ, programul de conversie a tastaturii scade valoarea zecimală 64 din codul ASCII corespunzător literei mari tastate. Aceasta este o metodă de a introduce de la tastatură un caracter de control care nu are asociat o tastă specială.

Următoarele 96 de caractere

cuprind: spaţiu (cod 32)

cifrele 0 – 9 (codurile 48-57)

literele mari A-Z (codurile 65-

90) literele mici a-z (codurile

97-122) semnele de punctuaţie

operatorii de relaţie

operatorii aritmetici

O operaţie de sortate în ordine alfabetică se face de fapt prin ordonarea

codurilor binare sortate, adică în ordinea: cifre → litere mari → litere mici etc.

Caracterele ASCII extinse cuprind:

caracterele limbilor străine de limba engleză;

caracterele grafice de trasare a liniilor şi a umbrelor ;

caracterele ştiinţifice, care includ litere greceşti şi simboluri matematice speciale.

Page 12: Structura Si Organizarea Calculatoarelor

Coduri Huffman 1

Coduri Huffman

Una dintre aplicatiile binecunoscute ale arborilorbinari optimi o constituie determinarea codurilorHuffman pentru caracterele unui sir de intrare

Aceste coduri vor putea fi apoi folosite pentrucodificarea sirului pe un numar de biti semnificativmai mic decat initial

Daca pe post de sir de caractere este folosit un fisier, codurile Huffman pot ajuta la compresia fisieruluirespectiv (reprezentarea continutului sau pe un numar de biti mai mic decat in mod normal)

Page 13: Structura Si Organizarea Calculatoarelor

Coduri Huffman 2

Coduri Huffman

Vom studia mersul algoritmului pe un exemplu

Fie sirul de intrare: “MARE E MAREA MARMARA”

Se parcurge sirul si se contorizeaza numarul de aparitii ale fiecarui caracter distinct

Astfel: ‘M’ apare de 4 ori

‘A’ apare de 6 ori

‘R’ apare de 4 ori

‘E’ apare de 3 ori

<blank> (spatiul) apare de 3 ori (pentru o mai mare claritate vom reprezenta caracterul spatiu prin simbolul ‘_’)

Page 14: Structura Si Organizarea Calculatoarelor

Coduri Huffman 3

Coduri Huffman

Cunoscand ca lungimea sirului este de 20 de caractere, putem calcula foarte usor frecventele(probabilitatile) de aparitie ale fiecarui caracter

Astfel:

‘M’ – 4/20

‘A’ – 6/20

‘R’ – 4/20

‘E’ – 3/20

‘_’ – 3/20

Evident: 4/20 + 6/20 + 4/20 + 3/20 + 3/20 = 20/20

Page 15: Structura Si Organizarea Calculatoarelor

Coduri Huffman 4

Coduri Huffman

Pentru fiecare caracter distinct vom construi un arbore binar optim avand un singur nod

Asociem fiecarui nod frecventa de aparitie a cheiinodului respectiv

Ideea este de a reduce la fiecare pas numarul de arbori binari optimi prin combinare, pana cand se ajunge la un singur arbore binar optim

M A R E _

4/20 6/20 4/20 3/20 3/20

Page 16: Structura Si Organizarea Calculatoarelor

Coduri Huffman 5

Coduri Huffman

In acest sens, la fiecare pas se aleg 2 dintre arborii binari optimi disponibili, sianume acei 2 arbori binari optimi care au frecventele de aparitie minime(minimul si urmatorul minim)

Daca sunt mai mult de 2 arbori in aceasta situatie, se vor alege arbitrar 2 dintreei

In cazul nostru, vom alege ultimii 2 arbori, ei avand frecventele de aparitieminime

Se vor inlocui cei 2 arbori printr-unul singur, care are ca radacina un caracterfictiv ‘*’ si cei 2 arbori selectati ca subarbori (nu conteaza plasarea pe stangasau pe dreapta, ideea este ca unul din ei va fi subarbore stang si celalaltsubarbore drept)

Frecventa de aparitie a noului arbore va fi data de suma frecventelor de aparitiea celor 2 subarbori componenti

Deoarece am inlocuit 2 arbori printr-unul singur, numarul total de arbori a scazut cu o unitate

Page 17: Structura Si Organizarea Calculatoarelor

Coduri Huffman 6

Coduri Huffman

Din cei 4 arbori ramasi, alegem 2 care au frecventele de aparitie minime

Acestia vor fi primul si al treilea si vor fiinlocuiti printr-un nou arbore avandfrecventa 8/20

M A R

E _

4/20 6/20 4/20

*

6/20

3/20 3/20

Page 18: Structura Si Organizarea Calculatoarelor

Coduri Huffman 7

Coduri Huffman

Din cei 3 arbori ramasi, alegem 2 care au frecventele de aparitie minime

Acestia vor fi ultimii 2 si vor fi inlocuitiprintr-un nou arbore avand frecventa12/20

A

E _

6/20

*

6/20

M R

*

8/20

4/20 4/20 3/20 3/20

Page 19: Structura Si Organizarea Calculatoarelor

Coduri Huffman 8

Coduri Huffman

Nu mai avem de ales, fiind doar 2 arbori

Acestia vor fi inlocuiti printr-un nouarbore avand frecventa 20/20

A

E _

*M R

*

8/20

*

12/20

4/20 4/20 6/20

3/20 3/20

Page 20: Structura Si Organizarea Calculatoarelor

Coduri Huffman 9

Coduri Huffman

Am ajuns la un singur arbore, moment in care neoprim

Vom eticheta fiecare ramura spre stanga cu 0 sifiecare ramura spre dreapta cu 1

A

E _

*M R

* *

20/20

*

4/20 4/20 6/20

3/20 3/20

Page 21: Structura Si Organizarea Calculatoarelor

Coduri Huffman 10

Coduri Huffman

Caracterele din sirul initial au ajuns frunze in arboreleHuffman

Drumul de la radacina la fiecare frunza va da codulHuffman al caracterului corespunzator frunzei

A

E _

*M R

* *

20/20

*

4/20 4/20 6/20

3/20 3/20

0

0 1

1 0 1

0 1

Page 22: Structura Si Organizarea Calculatoarelor

Coduri Huffman 11

Coduri Huffman

Astfel, vom avea: ‘M’ – codul ’00’; ‘A’ – codul ’10’; ‘R’ – codul ’01’;

‘E’ – codul ’110’; ‘_’ – codul ’111’

In mod normal, un caracter din sir (sau din fisier, daca folosim un fisier) se codifica pe 8 biti

In cazul de fata, tinand cont ca sunt numai 5 caractere in total, am putea implementa foarte usor o codificare binara de 3 biti/caracter (2 biti ar asiguradoar 4 caractere distincte, dar noi avem 5)

Page 23: Structura Si Organizarea Calculatoarelor

Coduri Huffman 12

Coduri Huffman

Se observa ca codurile Huffman obtinute in urmaalgoritmului prezentat sunt mai scurte decat codurilestandard de 3 biti/caracter

Mai precis, fiecare aparitie a caracterelor ‘M’, ‘A’ sau‘R’ in sirul initial va duce la o economie de 1 bit iarfiecare aparitie a caracterelor ‘E’ sau ‘_’ nu va cauzanici pierdere nici castig (se folosesc tot 3 biti)

Nu intamplator, caracterele ‘M’, ‘A’ si ‘R’ suntcaracterele care aveau frecventele de aparitie celemai mari, astfel incat economiile de care aminteamse vor manifesta foarte des

Page 24: Structura Si Organizarea Calculatoarelor

Coduri Huffman 13

Coduri Huffman

Practic, datorita faptului ca la fiecare pas am selectatcei 2 arbori care aveau frecventele de aparitieminime, caracterele cu frecvente de aparitie relativmari au fost lasate la urma, astfel incat in arborelefinal sa se regaseasca mai sus decat caracterele cu frecvente de aparitie mai mici

Aceasta este ideea dominanta la arbori optimi, deciarborele rezultat este, din acest punct de vedere, un arbore optim

Page 25: Structura Si Organizarea Calculatoarelor

Coduri Huffman 14

Coduri Huffman

Vom codifica sirul “MARE E MAREA MARMARA” folosind codurile obtinute

Rezultatul este: 00 10 01 110 111 110 111 00 10 01 110 10 111 00 10 01 00 10 01 10

Sunt necesari 46 de biti

Codificarea cu 3 biti/caracter ar fi dus la 3·20 = 60 de biti, deci am realizat o compresie de 76,6%

Codificarea implicita cu 8 biti/caracter ar fi dus la 8·20 = 160 de biti deci am realizat o compresie de 28,75% fata de aceasta codificare

Page 26: Structura Si Organizarea Calculatoarelor

Coduri Huffman 15

Coduri Huffman

Codurile Huffman obtinute au proprietatea de prefix

Proprietatea de prefix suna astfel: “nici un cod nueste prefix pentru alt cod”

Aceasta proprietate este asigurata implicit din modulde constructie al arborelui Huffman

Fiecare caracter ajunge o frunza in arbore, si nuexista drum de la radacina la o frunza in totalitatecontinut in alt drum de la radacina la o alta frunza (o proprietate de bun simt a arborilor, in general)

Page 27: Structura Si Organizarea Calculatoarelor

Coduri Huffman 16

Coduri Huffman

Daca codurile Huffman nu ar fi avut proprietatea de prefix, am fiavut mari probleme la decodificarea unui sir

Sa presupunem, prin absurd, ca am fi obtinut:

cod(‘A’) = ’11’ si cod(‘E’) = ‘111’

Atunci sirul initial “AE” ar fi fost codificat “11111” dar de decodificat poate fi decodificat fie ca “AE” fie ca “EA”

Proprietatea de prefix (pe care am incalcat-o aici) nu ar fi dus la astfel de ambiguitati

Page 28: Structura Si Organizarea Calculatoarelor

3. Elemente introductive privind operarea si organizarea unui sistem numeric.

Un calculator numeric este constituit dintr-un ansamblu de resurse fizice ( hardware ) si

de programe de sistem ( software de baza ), care asigura prelucrarea automata a

informatiilor, in conformitate cu algoritmii specificati de catre utilizator, prin programele

de aplicatii ( software de aplicatii - utilizator ).

Conform principiilor stabilite de John von Neumann un calculator trebuie sa posede

urmatoarele elemente:

- un mediu de intrare, pentru instructiuni si date ( operanzi );

- o memorie in care se stocheaza programul, datele initiale, rezultatele partiale si finale;

- un ansamblu de prelucrare, capabil sa efectueze operatii aritmetice si logice, in

conformitate cu un algoritm dat, specificat prin program;

- un mediu de iesire, pentru extragerea rezultatelor si prezentarea acestora intr-o forma

accesibila utilizatorului;

- un element de decizie care, pe baza rezultatelor partiale obtinute pe parcursul

prelucrarii, va selecta una din optiunile posibile de continuare a calculelor.

Programul elaborat, pentru un calculator numeric, reprezinta descrierea algoritmului de

rezolvare a unei probleme ( clase de probleme ) date, cu ajutorul instructiunilor pe care le

poate executa calculatorul respectiv.

Conform propunerii lui von Neumann, datele si programul sunt plasate in aceeasi

memorie, ceea ce a permis, la calculatoarele din generatia I-a, efectuarea unor operatii

aritmetice sau logice asupra unor campuri din instructiune, in vederea reducerii

dimensiunilor programelor.

Functionarea calculatorului are un caracter secvential, constand in citiri si executii

succesive ale instructiunilor programului.

Intr-un calculator pot fi evidentiate, pe parcursul executiei unui program, doua fluxuri de

informatii: fluxul datelor, care se prelucreaza, si fluxul instructiunilor, care controleaza,

comanda procesul de calcul.

Calculatoarele bazate pe principiile amintite mai sus se numesc calculatoare de tip von

Neumann sau conventionale, fiind comandate de fluxul de instructiuni.

Page 29: Structura Si Organizarea Calculatoarelor

In prezent se studiaza si realizeaza sub forma de modele de laborator noi tipuri de

calculatoare, neconventionale, bazate pe fluxul de date si fluxul de cereri.

In primul caz sunt amorsate, la un moment dat, toate operatiile din program pentru care

sunt disponibile datele implicate.

In al doilea caz necesitatea unui rezultat activeaza toate operatiile de calcul asociate.

Intrucat un calculator numeric este folosit, in esenta, pentru implementarea automata a

unui algoritm, se reaminteste ca un algoritm reprezinta un set finit de reguli, care

precizeaza o secventa de operatii, pentru solutionarea unei clase date de probleme.

Un algoritm poseda cinci elemente mai importante:

- caracter finit: trebuie sa se termine dupa un numar finit de pasi;

- caracter determinist: fiecare pas al unui algoritm trebuie definit in mod precis, actiunile

care se executa trebuie sa fie specificate riguros, fara ambiguitati, pentru fiecare caz.

- intrare: un algoritm are una sau mai multe intrari, reprezentind datele initiale;

- iesire: un algoritm are una sau mai multe iesiri, care reprezinta rezultatele, aflate intr-o

anumita relatie cu intrarile;

- eficacitate: un algoritm trebuie sa se execute exact si intr-un interval finit de timp.

Printre altele, analiza algoritmilor are ca scop determinarea performantelor acestora, in

sensul ca, daca pentru o problema exista mai multi algoritmi, trebuie sa se decida care din

ei este mai potrivit, sub aspectul numarului de operatii, al spatiului de memorie necesare

si, uneori, al puterii consumate, pentru implementare.

Teoria algoritmilor trateaza, in principal, problemele existentei sau nonexistentei

algoritmilor eficienti,pentru efectuarea unor calcule particulare.

Inainte de a incerca o descriere formala a unei metode de calcul se vor preciza unele

notiuni:

- variabilele de stare reprezinta marimi primare, care presupun unele valori bine definite

(ele pot reprezenta parametrii unui sistem fizic);

- un ansamblu de variabile de stare, in care fiecare poarta un nume, reprezinta multimea

variabilelor de stare;

- o atribuire data de valori pentru toate variabilele multimii variabilelor de stare poarta

numele de stare a multimii sau o stare presupune o valoare data fiecarei variabile de stare;

Page 30: Structura Si Organizarea Calculatoarelor

- ansamblul tuturor starilor posibile, pentru o multime data de variabile de stare,

formeaza spatiul starilor pentru acea multime;

- un calcul in spatiul starilor reprezinta o secventa de stari in acel spatiu, primul element

al secventei reprezinta starea initiala, iar ultimul constituie starea finala.

Din punct de vedere formal, metoda de calcul reprezinta un cuadruplu:

< Q, I, E, f >,

in care s-au facut urmatoarele notatii:

Q -multimea starilor calculului,

I - multimea intrarilor,

E -multimea iesirilor,

f - multimea functiilor de calcul, definite in Q.

In plus:

I⊂ Q si E⊂ Q,

iar pentru ∀ q, q ⊂ E , f trebuie sa lase nemodificate elementele multimii E, adica:

f(q) = q,

Fiecare intrare x in multimea I defineste o secventa de calcul:

x0, x1, x2,..,xk,...., dupa cum urmeaza:

x0 = x si x(k+1) = f(xk), pentru k > 0.

Se poate spune ca secventa de calcul se termina in k pasi, daca k este cel mai mic intreg

pentru care xk este in E. In acest caz se spune ca intrarea x produce iesirea xk.

Se observa ca daca xk ⊂ E, la fel si x(k+1) ⊂ E, intrucat, conform definitiei date mai sus,

x(k+1) = xk.

Unele secvente de calcul pot avea o lungime infinita.

Un algoritm reprezinta o metoda de calcul care se termina dupa un numar finit (eventual

foarte mare) de pasi, pentru toate intrarile x ⊂ I.

Exemplu: Algoritmul MAX.

Acest algoritm gaseste elementul cu valoarea cea mai mare al multimii A(i) ,

unde 1 ≤ i ≤ n, si o atribuie iesirii MAX.

In cele ce urmeaza operatorul " " specifica atribuirea unei valori variabilei de stare

din membrul stang, obtinuta prin evaluarea functiei din membrul drept al expresiei.

Page 31: Structura Si Organizarea Calculatoarelor

Se vor folosi doua variabile de stare pentru calcul: xc ( x-curent ), xm (x-maxim ).

ALGORITM: MAX.

intrari: A(i) , 1 ≤ i ≤ n,

iesiri: MAX,

var.de stare: xc, xm .

f: secventa de calcul:

1. if n < 1 go to STOP

2. if n = 1 then MAX A(1) and go to 9 (STOP)

3. xm A(1); xc A(2);

4. if xm < xc then xm xc

5. xc A(i)

6. i i+1

7. if i > n then MAX xm and go to STOP

8. go to 4

9. STOP

Mecanizarea acestui algoritm presupune existenta unui modul, care dispune de

urmatoarele resurse hardware:

- RC: registru in care se aduce valoarea curenta A(i);

- RM: registru in care se plaseaza valoarea curenta maxima A(j);

- N si UNU: registre in care se pastreaza constantele n si 1;

- CNT: contor pentru indexul i;

- RD: registru in care se plaseaza rezultatul scaderii;

- MAX: registru de iesire ( coincide ca nume cu iesirea MAX );

- START: bistabil in care se inregistreaza comanda externa start;

- SUM/DIF: unitate logica combinationala, care efectueaza adunarea/scaderea;

- un automat cu 10 stari distincte.

Se considera ca intrarile A(i) sunt furnizate din exterior in mod curent si ca nu sunt

stocate in modul. Astfel, se pot observa, in continuare, unele diferente nesemnificative

functional in implementarea fizica a algoritmului, in raport cu prezentarea lui teoretica.

Schema care va efectua automat algoritmul va purta numele MODULE: MAX si va

opera cu numere binare intregi si pozitive.

Page 32: Structura Si Organizarea Calculatoarelor

Urmeaza descrierea modulului si a modului sau de operare (nu se specifica lungimea

operanzilor ).

Operatorul " " specifica fortarea valorii numerice, obtinuta ca urmare a evaluarii

termenul din dreapta al expresiei, in registrul din termenul din stanga al expresiei.

MODULE: MAX

INTRARI: A(i); start; RESET; n;

IESIRI: MAX;

MEMORII: RC; RM; N; UNU; CNT; RD; MAX; START /* Registre care corespund

/* variabilelor de stare, atat pentru unitatea de executie, cat si pentru unitatea de comanda

1. if (START = 0) then go to 1 /* cicleaza pentru START

2. RC 0; RD 0; RM 0; N n; UNU 1; CNT 1;

START 0 /* Initializare

3. if N = 0 then go to 1

4. RC A(CNT)

5. RD DIF(RC,RM) /* DIF(RC,RM) = RC - RM

6. if RD > 0 then RM RC

7. CNT SUM(CNT,UNU) /* SUM(CNT,UNU) = CNT + UNU

8. RD DIF(N,CNT) /* DIF(N,CNT) = N - CNT

9. if RD < 0 then MAX RM and go to 1

10. go to 4

ENDSEQ /* Sfarsit secventa

if RESET = 1 then go to 1 /*Operatia RESET indiferent de stadiul executiei in

/*secventa

if start = 1 then START = 1 /* Fortarea in 1 a bistabilului START, la aparitia intrarii

/*start = 1

ENDMODULE /* Sfarsitul descrierii modulului

Implementarea fizica a modulului presupune existenta urmatoarelor elemente:

- un ceas, care asigura sincronizarea sistemului;

- o intrare start, sincrona cu ceasul, care este stocata temporar intr-un bistabil (START);

- o intrare asincrona RESET,care forteaza sistemul instarea 1.

Page 33: Structura Si Organizarea Calculatoarelor

Intrarea RESET este indicata la sfirsitul descrierii secventei de lucru, deoarece se aplica

asincron.

Descrierea secventei se termina cu marcajul ENDSEQ, modulul fiind cuprins intre

numele MODULE si marcajul ENDMODULE.

Stabilirea schemei modulului presupune evidentierea unitatii de executie, in care se

prelucreaza fluxul de date, si a unitatii de comanda, care asigura fluxul de control,

mentionindu-se resursele hardware asociate.

Prima iteratie a procesului de realizarea/”mecanizare” a algoritmului MAX este data mai

jos:

Unitatea de Executie

A[i]

MAX

n

RESET Ceas RD … … .. Comenzi

Unitatea de Comanda

start … …

RESET

RC SUM/DIF N

RM RD UNU

MAX CNT

CEAS

AUTOMAT DE COMANDA

START

Page 34: Structura Si Organizarea Calculatoarelor

Evolutia automatului din unitatea de comanda poate fi ilustrata cu ajutorul grafului de

mai jos, in care nodurile marcate cu cifre reprezinta starile automatului, iar arcele

orientate marcheaza taranzitiile conditionate/neconditionate.

RESET START=0

start START=1

N = 0

N ≠ 0

RD < 0

RD ≥ 0

1.

2.

3.

4.

5.

7.

8.

9.

6.

10

Page 35: Structura Si Organizarea Calculatoarelor

Diagrama de stari prezentata mai sus se utilizeaza pentru proiectarea automatului de

comanda, care asigura fluxul de control necesar derularii algoritmului MAX.

Procesul de proiectare a sistemului numeric, corespunzator algoritmului dat, necesita mai

multe etape, care vor fi ilustrate in cadrul cursului Calculatoare Numerice.

Masina Turing. In literatura de specialitate consacrata studierii posibilitatilor de

mecanizare a algoritmilor Masina Turing joaca un rol important.

Masina Turing se caracterizeaza prin doua principii de baza:

- descompunerea in operatii elementare a executiei unui algoritm este dusa la limita,

de exemplu adunare se implementeaza prin incrementari repetate;

- memoria masinii se prezinta sub forma unei benzi nelimitate, formata din

compartimente succesive in care se poate afla un simbol, reprezentind o informatie;

- conceptul de memorie infinita este pur matematic.

Masina opereaza asupra informatiilor reprezentate prin simboluri luate dintr-un alfabet

finit: a0, a1, a2,....,ai, exterior masinii. Printre simboluri se afla un simbol special V, care

indica lipsa unei informatii.

Fiecare compartiment al benzii, la un moment dat, contine un singur simbol.

Functionarea are loc in cicluri succesive, tratandu-se la fiecare pas cate un singur simbol.

Masina poseda un cod de instructiuni, specificat intr-un alfabet intern: F0, F1, F2,....,Fp.

O instructiune defineste in fiecare ciclu starea dispozitivului de prelucrare. Unul din

codurile de instructiuni, notat cu A, specifica oprirea masinii.

In fiecare ciclu un simbol de pe banda este prelucrat pe baza unui operator Fi.

In afara benzii infinite masina Turing mai contine:

- un element de executie si comanda: operatorul Ω ,

- o celula de memorie, M, in care se stocheaza instructiunea ( functia ) urmatoare,

- un dispozitiv, d, de antrenare a benzii in ambele sensuri, prin fata unui cap de

citire/scriere; comanda de antrenare a benzii este codificata dupa cum urmeaza:

"+" deplasare la stanga,

"-" deplasare la dreapta,

"0" fara deplasare.

Schema bloc a masinii Turing este data mai jos:

Page 36: Structura Si Organizarea Calculatoarelor

Informatia de prelucrat Instructiunea curenta

aI ai Fi

Cap citire/

scriere

.

. aj d Fj

. Informatia prelucrata Instructiunea urmatoare

. Banda infinita/Memoria

.

. -

0 Comanda deplasarii

+

Functionare. Incepand cu o informatie ai, de pe banda, masina intra in functiune. Daca

operarea are loc in timp finit, adica se va intalni simbolul A, masina va prelucra

informatia ai. In caz contrar, operarea are loc fara oprire si masina nu poate trata

informatia respectiva.

Operarea masinii Turing este definita prin tabelul de corespondenta intre dubletii de

intrare < ai, Fi > si tripletii de iesire < aj, Fj, d >. In fiecare ciclu de lucru operatorul Ωefectueaza transformarea:

< ai, Fi > < aj, Fj, d >,

simbolul ai fiind inlocuit cu simbolul aj.

Banda este deplasata conform codului simbolului d, iar Fj este stocat in memoria M, pana

in ciclul urmator.

In vederea executiei, un algoritm trebuie descris sub forma urmatorului tablou:

Operatorul Ω M

d

Page 37: Structura Si Organizarea Calculatoarelor

Fi

ai aj Fj d

Structura acestui tablou este continuta in organizarea interna a operatorului Ω . Operarea

poate fi amorsata cunoscand continutul celulei de pe banda, plasata in fata capului de

citire/scriere, si instructiunea initiala.

Pentru exemplificare, se va considera cazul unui numar zecimal n care va fi incrementat.

Se presupune ca pe banda se afla, in celule succesive, cifrele unui numar zecimal,

incadrate la stanga si la dreapta de simbolul V.Algoritmul consta in examinarea cifrelor

incepand de la dreapta.

Se incrementeaza prima cifra la dreapta si procesul se opreste daca rezultatul este diferit

de zero. In cazul in care rezultatul este zero ( depaseste 9 ) se mai efectueaza o deplasare

a benzii spre dreapta, incrementandu-se noua cifra.

Alfabetul extern al masinii consta in 10 cifre zecimale si din simbolul vid V.

Alfabetul instructiunilor Fi contine functia F, care asigura incrementarea si functia A

care comanda oprirea.

Tabelul de functionare este urmatorul

Informatia ai Instructiunea Fi

0 1 A 0 1 2 A 0 2 3 A 0 3 4 A 0 4 5 A 0 5 6 A 0 6 7 A 0 7 8 A 0

8 9 A 0 9 0 F - V 1 A 0

Page 38: Structura Si Organizarea Calculatoarelor

In cazul cifrelor 0 – 8, are loc incremntarea si oprirea masinii, iar in cazul cifrei 9

procesul continua prin incrementarea simbolului si propagarea transportului, cu

deplasarea benzii spre dreapta si incrementarea urmatorului simbol. Daca urmatorul

simbol este din gama 0 - 9 situatia este aceeasi. Daca simbolul este V, are loc inlocuirea

lui cu 1 si masina se opreste.

Concluzii. Masina Turing reprezinta cea mai simpla entitate care se poate imagina in

vederea prelucrarii automate a informatiei.

In masina Turing se pot regasi o serie de elemente comune cu calculatoarele numerice:

- codificarea informatiei; exista doua limbaje/coduri independente: limbajul extern,

pentru codificarea informatiilor manipulate de catre masina, si limbajul propriu al

instructiunilor/functiilor masinii;

- functionarea automata a masinii se bazeaza pe un set limitat de instructiuni/functii;

- operarea masinii are un caracter secvential, executia instructiunii curente este insotita

de pregatirea executiei operatiei urmatoare;

- executia unui algoritm de catre masina se traduce prin examinarea unui tablou care

contine toate situatiile posibile, ceea ce corespunde unui program cablat, reprezentand un

algoritm independent de informatia care se trateaza;

- unele informatii de baza pot avea un caracter conditional, evenimentul urmator va

depinde de rezultatul operatiei curente;

- memoria M este ireductibila si aminteste contorul programului/registrul instructiunii

din calculatoarele conventionale;

- masina Turing are un program fix; pentru a-l modifica trebuie reconstruita masina.

Masina Turing nu are un caracter universal. Pentru a deveni universala trebuie sa

indeplineasca urmatoarele conditii:

- sa accepte toate alfabetele, conditie usor de realizat daca alfabetele se codifica binar, iar

masina va trata toate codurile binare;

- sa aibe posibilitatea de a i se introduce din exterior un tabel de functionare, pentru a

executa un algoritm dat, adica un program,ceea ce caracterizeaza masina von Neumann.

Page 39: Structura Si Organizarea Calculatoarelor

4. Modalitati de reprezentare a calculatoarelor.

Un calculator poate fi examinat, atat subaspect functional, cat si structural.

Din punct de vedere functional, sub forma cea mai generala, un calculator se poate reprezenta

prin tripletul:

< I, E, C >,

unde:

- I constituie multimea intrarilor,

- E corespunde multimii iesirilor,

- C ⊂ I x E reprezinta o submultime a produselor carteziene intre elementele multimii I si

elementele multimii E. C realizeaza aplicatii din multimea intrarilor I, in multimea iesirilor E.

Pentru a facilita studiul unui calculator sub aspect functional, adesea se recurge la reprezentarea

lui sub forma unei ierarhii de niveluri imbricate.

Un nivel este constituit din multimea aplicatiilor asupra elementelor multimii de intrare pentru

nivelul dat, cat si asupra elementelor multimilor de intrare si iesire de la nivelul inferior,

imbricat. Aplicatiile de la un nivel dat pot constitui aplicatii si pentru nivelul superior urmator.

O posibilitate de reprezentare este data mai jos unde se pot distinge trei niveluri imbricate:

- aplicatiile/functiile primitive ale masinii de baza implementate in hardware, capabila sa execute

operatii elementare,

- functiile standard/predefinite reprezentate prin nivelul instruciunilor masinii conventionale,

- functiile construite de utilizator, pe baza instructiunilor masinii conventionale, pentru diverse

tipuri de aplicatii concrete.

Nivelul functiilor standard/predefinite; nivelul instructiunilor masinii conventionale.

Nivelul functiilor construite de utilizator pe baza functiilor de la nivelul inferior. Acesta este nivelul aplicativ al calculatorului.

Nivelul aplicatiilor/functiilor primitive masina de baza ( realizata in hardware ) capabila sa execute operatii elementare.

Page 40: Structura Si Organizarea Calculatoarelor

La nivelul masinii conventionale se defineste notiunea de arhitectura a unui calculator numericprin cuadruplul:

A = < PI,PE,RG,I >

unde:

PI = PI0,....,PIi este multimea porturilor de intrare,

PE = PE0,....,PEj este multime porturilor de iesire,

RG = RG0,....,RGk este ansamblul registrelor generale din unitatea de executie,

I = I0,......,Il este setul instructiunilor calculatorului.

Porturile de intrare si iesire sunt utilizate pentru schimbul de informatii cu mediul inconjurator,

prin intermediul echipamentelorperiferice, in timp ce registrele generale sunt folosite pentru

stocarea diferitelor variabile de stare.

Sub forma unui prim exemplu se prezinta mai jos arhitectura microprocesorului Intel 8080.

7 0 7 0

7 0

15 0

Atat porturile de intrare PI0,.....,PI255, cat si porturile de iesire PE0,....,PE255 au cate 8 biti.

In cadrul registrelor generale se intalnesc si o serie de registre cu caracter specializat in ceea ce

priveste utilizarea:

- A este registrul acumulator principal, folosit in cele mai multe operatii aritmetice si logice;

- B, C, D, E, H, L sint registre de uz general, desi unele au si utilizari speciale ( H si L sunt

folosite adesea pentru formarea unor adrese de operanzi pe 16 biti );

- F este registrul indicatorilor de conditii, furnizati de unitatea de executie dupa fiecare operatie

PI0

……..

PI255

PE0

…….

PE255

F

A

B

D

C

E

H L

SP

PC

Page 41: Structura Si Organizarea Calculatoarelor

( CY - transport in afara rangului de semn, AC - transportauxiliar intretetradele octetului

rezultat, S - semnul rezultatului, Z - indicator de rezultat zero, P - indicator privind

paritatea numarului de unitati din rezultat ). Pozitiile ocupate de acesti indicatori de conditii in

registrul F sunt date mai jos:

7 6 5 4 3 2 1 0

7 6 5 4 3 2 1 0

- SP este indicatorul de stiva, care asigura accesul la o structura de tip stiva organizata in

memorie;

- PC contor program, pentru adresarea instructiunilor din memorie.

Lista de instructiuni a microprocesorului 8080 contine 78 de instructiuni.

Un alt exemplu il constituie arhitectura microprocesorului 8086:

15 8 7 0

AX: Acumulator

BX: Registru - baza

CX: Registru - contor

DX: Registru - date

Indicator - stiva

Indicator - baza

Indicator - sursa

Indicator - destinatie

Indicatorii de conditii

15 12 11 10 9 8 7 6 5 4 3 2 1 0

S Z * AC * P * CY

BH BL

CH CL

DH DL

AH AL

SP

BP

SI

DI

* * O D I T S Z * A * P * C

Page 42: Structura Si Organizarea Calculatoarelor

Semnificatiile indicatorilor de conditii sint urmatoarele: O - depasira aritmatica, D - directia la

explorarea sirurilor, I - activare/dezactivare intreruperi, T - capcana pentru lucrul pas cu pas, S -

semn, Z - zero, A - transport auxiliar, P - paritate, C - transport in afara rangului de semn.

15 0

Registrul segmentului de cod

Registrul segmentului de date Registrul segmentului stivei

Registrul segmentului suplimentar

15 0 Indicator de instructiune

(Contorul Programului)

Microprocesorul 8086 mai poseda cate doua tablouri de porturi de intrare/iesire, a cate 65536

octeti fiecare:

65536 Porturi de Intrare organizate pe octe

65536 Porturi de Iesire organizate pe octeti

Nota: Porturile de I/E pot fi organizate si pe cuvinte de 16 biti, la dimensiunea de 32768 cuvinte

fiecare tablou de porturi.

Tinand seama de toate modurile de adresare, microprocesorul 8086 dispune peste 300 de

instructiuni diferite.

Ultimul exemplu se refera la unitate centrala a calculatorului FELIX 5000, care este vazuta de

catre programator sub formaa 16 registre generale RG0,...,RG15, de cate 32 de biti, si a unui

cuvant dublu de stare program ( PSW Program Status Word ), care stocheaza contorul

program si o serie de indicatori de conditii:

CS

DS

SS

ES

IP

PI0, ……………,.PI65536

PE0, ……………,.PE65536

Page 43: Structura Si Organizarea Calculatoarelor

0 31

Registrele Generale

Cuvantul de stare program ( PSW ): 0 ……………………………….8 9 ……………………………………………….31

32 33 34 35 36 37 38 39 40 41

42 43 44 ………….47 48 …………………..54 55 56 57 …63

Campurile PSW au urmatoarele semnificatii:

PC - contor program;

Masti de depasire:

DI,DS - depasire inferioara/superioara in virgula mobila:

- 64 < E < 64 , ( E = exponent );

DD- depasire zecimala;

DB - depasire binara: -1 < n < 1, ( n = mantisa ).

Daca masca este unu atunci derutarea este interzsisa.

Indicatorii de conditii ai rezultatului:

Z = 1 - rezultat nul;

S = 1 - rezultat < 0;

D = 1 - depasire;

C = 1 - transport.

Masti de intrerupere:

IS - masca intreruperi de I/E;

RG0

…………………………………………………..

RG15

DI DS DD DB Z S D C IS IE

CE NP CA NIT PM MR ………………………..

PC

Page 44: Structura Si Organizarea Calculatoarelor

IE - masca intreruperi externe;

CE - masca intreruperi contor nul.

Daca masca este unu, intreruperea este inhibata si ramane in asteptare.

Nivelul programului:

NP = 0 - unitatea centrala opereaza in modul privilegiat ( poate executa toate instructiunile );

NP = 1 - unitate centrala opereaza in modul normal ( incercarea de a executa instructiunile de

sistem genereaza o derutare ).

Cheia de acces:

CA = cheia de acces la paginile de memorie, de cite 2Ko, protejate prin chei de protectie.

Masca de rotunjire:

MR = 0 - se rotunjeste rezultatul operatiei in virgula mobila;

MR = 1 - rezultatul nu se rotunjeste.

Paritate memorie:

PM = 0 - eroarea de paritate la memorie este tratata prin deru tare;

PM = 1 - eroarea se trateaza prin intrerupere.

Nivelul de intrerupere asociat programului:

NIT- defineste nivelul de prioritate al programului in curs de executie ( pot exista cel mult 128

niveluri de prioritate ).

Calculatorul FELIX 5000 are implementate 102 instructiuni, din 128 instructiuni posibile.

Cunoscand arhitectura unui calculator ( porturile de I/E, setul registrelor generale, indicatorii de

conditii, lista de instruc-tiuni - inclusuiv modurile de calcul pentru adresa efectiva- ) se pot scrie

programe la nivelul masinii conventionale ( in limbaj de asamblare ).

Reprezentarea structurala a unui calculator pleaca de la ideea ca acesta reprezinta un

agregat/sistem, care consta din componente primitive ( primitive functionale ) interconectate

intr-o maniera data, pentru a putea executa operatii specifice, de prelucrare a informatiei.

Componentele se caracterizeaza printr-o serie de atribute, iar atributele - prin valori. Informatia

poate fi masurata in biti, ranguri zecimale, caractere alfanumerice etc. Pe linga functiile

specifice de prelucrare a informatiei, componentele primitive se mai caracterizeaza prin

debit de transfer si capacitate de stocare ale informatiilor.

Page 45: Structura Si Organizarea Calculatoarelor

Aceste caracteristici prezintaimportantapentru studiul sistemelor de calcul cu ajutorul metodelor

cercetarii operationale, in numeroase aplicatii ( multiprogramare, multiprelucrare, timp di-

vizat, retele de calculatoare etc. ), in care intervin congestii, cozi de asteptare, zone tampon

( buffer ), debite de transfer al datelor etc.

Din punct de vedere structural sistemul de calcul poate fi descompus in:

- unitatea de intrare ( UI ),

- unitatea centrala ( UCe ),

- unitatea de iesire ( UE ).

I E

Unitatile de intrare si de iesire asigura legatura sistemului cu echipamentele periferice primare

( traductoarele/ elementele de executie ) care preiau informatia din mediul extern si o furni-

zeaza in sistem sau care executa diferite actiuni asupra mediului extern, ca urmare a interpretarii

informatiei prelucrate de calculator.

Unitatea centrala asigura stocarea programului, a datelor si realizeaza prelucrarea automata a

acestora pe baza interpretariiprogramului dat.

Pentru a putea intelege organizarea si operarea unor sisteme complexe cum sunt calculatoarele

se impune descompunerea lor in unitati functionale mai simple, cu precizarea semnalelor

manipulate si al modului lor de dialog.

Astfel, rafinarea structurii sistemului de calcul evidentiaza in zonele UI si UE:

- subsistemul de intrare ( SI ),

- subsistemul de iesire ( SE ),

- echipamentele periferice de intrare ( EPI ) si echipamentele periferice de iesire ( EPE ).

EPI au rolul de a prelua datele de la diverse traductoare, evenual stocata pe diversi purtatori

fizici, si a le aduce la o forma compatibila cu intrarile SI ( ca naturafizica,format de reprezen-

tare etc ).

UI UCe UE

Page 46: Structura Si Organizarea Calculatoarelor

EPE au functia de a prelua datele prelucrate, furnizate prin SE, si de a le aduce la o forma

corespunzatoare destinatiei: semnale specifice diferitelor elemente de executie ( in cazul

conducerii proceselor tehnologice ) sau de a le plasa pe un anumit suport fizic etc.

Subsistemele de I/E asigura transferul, autonom sau sub controlul UCe, al informatiilor intre

UCe si EP prin realizarea unei adaptari de debite de transfer ( vitezele de operare ale acestora

difera cu mai multe ordine de marime ). Uneori sint implementate si alte operatii: modificarea

formatului de reprezentare a datelor, validari, verificari etc.

La nivelul UCe se pot distinge urmatoarele unitati functionale:

- unitatea de memorie ( UM ),

- unitatea de executie ( UE ),

- unitatea de comanda ( UC ).

UCe

Date/

Instr. Instr. Date

Date Rez. Comenzi

Cond Cond

Com

Comenzi

Conditii

Comenzi

date /adrese

instructiuni

comenzi,

conditii/indicatori de stare/stari.

SE SIEPI EPE UM

UE UC

Page 47: Structura Si Organizarea Calculatoarelor

Unitatea de memorie are functia de stocare a datelor initiale, a programului, a rezultatelor

intermediare si finale. In sistemele moderne ea poate opera autonom, atat cu SI/SE, cat si cu

procesorul ( ansamblul unitate de comanda - unitate de executie ). Unitatea de memorie are o

organizare liniara, constand in celule de stocare a informatiei, al caror continut poate fi

manipulat prin specificarea adresei celulei date.

Memoria

(n-1) 0

(m-1) 0

m

Registrul de adrese

Adresa ia valori cuprinse intre 0 si 2 (m-1) unde m este numarul de ranguri binare ale registrului

de adrese.

Unitatea de executie asigura, sub controlul unitatii de comanda, o succesiune de operatii

aritmetice si logice asupra datelor preluate din unitatea de memorie sau din memoria locala-

proprie (implementata sub forma unor registre generale -RG-), rezultatele fiind returnate in

unitatea de memorie sau in registrele generale.

Dupa fiecare operatie UE actualizeaza starea unor indicatori de conditii, care reflecta

caracteristicile rezultatului curent ( < 0, > 0, = 0, paritate, transport, depasire etc. ).

Unitatea de comanda prelucreaza fluxul de instructiuni, care constituie programul. Ea furnizeaza

semnale de comanda pentru celelalte unitati, coordonind functionarea lor in conformitate cu

cerintele programului. UC poate examina, in cadrul executiei unei instructiuni date, informatia

de stare asociata fiecarei unitati, luand in continuare deciziile corespunzatoare pentru executia

corecta a programului.

Celula 0

Celula 1

Celula i

Celula 2(m -1)

Adresa i

Page 48: Structura Si Organizarea Calculatoarelor

Unitatea de comanda se poate implementa sub forma conventionala ( ca automat secvential cu

stari codificate sau cu stari complet decodificate ) sau sub forma microprogramata ( cu stocarea

semnalelor de comanda, in maniera statica, intr-o memorie rapida ).

Inunele cazuri UC este denumita si unitate deprelucrare a instructiunilor - unitatea I, iar unitatile

de executie si de memorie sunt notate cu E si respectiv cu M.

Astfel, un calculator C ( unitatea centrala ) poate fi reprezentat prin expresia:

C = I [ E - M ].

In cadrul notatiei structurale PMS ( in care sunt folosite drept componente primitive: P -

procesorul, M - memoria, S - comutatorul, D - operatorul asupra datelor, K - operatorul de

comanda, L - legatura, T - terminalul/traductorul ) un calculator C se descrie prin formula:

C = M - P - T

Prima notatie este utila in cazul sistemelor constituite din mai multe unitati de executie si

memorii asociate, controlate de o singura unitate de comanda( Sisteme cu un singur Flux de

Instructiuni si mai Multe Fluxuri de Date - SIMD - Single Instruction Stream Multiple Data

Stream ).

Sistemele obisnuite au un singur flux de instructiuni si un singur flux de date SISD - Single

Instruction Stream Single Data Stream ).

In rezumat se poate observa ca:

- ansamblul: UE + UC = P ( Procesor sau Unitate Centrala de Prelucrare - UCP sau CPU ),

- ansamblul: P + M = UC ( Unitate Centrala ),

- ansamblul: UC + SI + SE + Software = Sistem de calcul.

In continuare se vor prezenta cateva exemple de sisteme de calcul, folosind notatia PMS:

- sistem de calcul in care terminalele ( echipamentele de I/E ) transfera datele cu memoria prin

intermediul p[rocesorului:

M P S K1 T1

K2 T2

Page 49: Structura Si Organizarea Calculatoarelor

- sistem de calcul in care unele terminale ( echipamentele de I/E ) transfera date cu memoriadirect ( T1 ) sau prin intermediul procesorului ( T2, T3 ):

Instructiunile calculatorului reprezinta o colectie de informatii privind operatiile operatiile care

se pot efectua intr-un calculator dat.

Sub forma cea mai generala instructiunile se impart in doua categorii:

- instructiuni operationale si de transfer al informatiilor, inclusiv instructiunile de I/E;

- instructiuni cu caracter de decizie, care modifica secventa de executie a programului in mod

conditionat de o serie de indicatori sau in mod neconditionat.

Instructiunile sunt formate din mai multe cimpuri, dintre care se mentioneaza urmatoarele:

- codul de operatie/functia, care specifica operatia/actiunea elementara evocata de instructiune:

aritmetica, logica, transfer de date, transfer al comenzii etc.;

- adresa operandului/instructiunii, care specifica locatia de memorie cu care se face transferul

de date sau de la care se citeste o instructiune.

In cazul instructiunilor cu caracter operational, structura instructiunii poate contine, pe linga

campul codului de operatie, unul sau mai multe campuri pentru adrese.

Instructiunea cu o adresa:

M S1 P S2 K2 T2

K3 T3

T1 K1

COP ADRESA

Page 50: Structura Si Organizarea Calculatoarelor

Instructiunea cu doua adrese:

Instructiunea cu trei adrese:

In primul caz instructiunea specifica adresa unui singur operand, cel de-al doilea operand (in

cazul operatiilor ce implica doi opeanzi) fiind deja adus in UE. De regula, rezultatul ramane in

UE.

In cazul al doilea sunt prezente adresele celor doi operanzi (adresa operandului destinatie si

adresa operandului sursa - rezultatul operatiei se stocheazalaadresaoperandului destinatie).

Campul ADRESA3, in cel de-al treilea caz, poate specifica adresa la care se trimite rezultatul.

Instructiunile cu trei adrese sunt extrem de rar intilnite.

Campul de adresa din instructiune poate avea mai multe semnificatii:

- contine chiar operandul, in cazul operandului imediat;

- reprezinta adresa unui operand din memorie, in situatia adresarii directe;

- reprezinta adresa unei celule de memorie in care se afla adresa unui operand, in cazul adresarii

indirecte.

In unele situatii, la continutul cimpului de adresa din instructiune se aduna continuturile unor

registre speciale:

- registrele baza, la adresarea bazata;

- registrele index, la adresarea indexata.

Cu ajutorulacestor facilitati se pot adresa diverse date stocate in memorie, care sunt structurate

sub forma de masive, multidimensionale, in cazuri particulare: matrici si vectori.

Registrul baza contine adresa de start ( baza ) a structurii, adresa din instructiune reprezinta o

deplasare in structura data, iar registrul index asigura adunarea unei cantitati variabile

COP ADRESA1 ADRESA2

COP ADRESA1 ADRESA2 ADRESA3

Page 51: Structura Si Organizarea Calculatoarelor

( incrementabile/decrementabile - eventual automat ).

Adresa obtinuta in urma unor asemenea operatii, adesea combinate, poarta numele de adresa

efectiva.

In consecinta, instructiunea va contine campuri aditionale, care vor specifica adresarea bazata,

indirecta, indexata etc, deci modul de calcul al adresei efective.

Aceste artificii sunt impuse de faptul ca, in calculatoarele conventionale, memoria este

organizata liniar, in cadrul ei informatia fiind stocata sub forma unor structuri date. Diversele

moduri de adresare faciliteaza accesul la componentele acestor structuri.

Trebuie mentionat faptul ca listele de instructiuni pentru cele mai multe calculatoare contin si

instructiuni fara adresa. Acestea se bazeaza pe facilitatile implementate in hardware care permit

adresarea si manipularea datelor plasate intr-o structura speciala numita stiva ( stack - LIFO -

Last In Last Out ), organizata in memorie sau ( mai rar ) in asamblaje de registre aflate in

unitatea de executie ( microprocesorul Intel 8008 ). Accesul la informatia plasata in stiva se

realizeaza numai prin intermediul varfului stivei, folosind doua operatii de baza: plasarea unui

nou cuvant in stiva ( PUSH ) si extragerea cuvintului din varful stivei ( POP ). Adresa celulei

ocupate din varful stivei este stocata intr-un registru indicator de stiva ( Stack Pointer - SP ) al

carui continut este automat incrementat dupa o operatie POP si respectiv - decrementat, dupa o

operatie PUSH.

Instructiunile, care afecteaza executia programului, trebuie sa specifice in campul codului de

operatie conditiile testate, iar in campul de adresa deplasarea necesara calculului adresei efec-

tive. Si in acest caz adresa efectiva se poate obtine direct, indirect, bazat, idexat sau ca urmare a

unor operatii combinate.

Formatul instructiunii calculatorului FELIX 5000, contine in cadrul a 32 de biti mai multe

campuri:

0 1 3 4 7 8 9 15 16 31

unde:

- I poate lua valoarea 0 in cazul adresarii directe si 1, in cazul adresarii indirecte;

I B Q X F D

Page 52: Structura Si Organizarea Calculatoarelor

- B poate lua valori intre 0 si 7, specificand pentru valori mai mari decat 0, adresarea bazata cu

unul din registrele generale RG9 - RG15, iar pentru 0 adresarea nebazata;

- Q poate specifica, printre altele, ( registrul general, care contine unul din operanzi, o

constanta sau un vector logic sau adresa de origine si lungimea unui operand, in cazul

manipularii sirurilor ) si registrul general RG0 - RG15 folosit la indexare;

- X ia valoarea 0, in cazul adresarii neindexate si valorea 1, in cazul adresarii indexate;

- D specifica deplasarea, folosita pentru calculul adresei efective, prin adunarea cu registrul

baza. Daca registrul baza nu este specificat, D asigura adresarea pe o zona de 64 Ko. Pentru

explorarea intregului spatiu de memorie se aduna in mod curent continutul lui D cu continutul

registrului baza.

Modurile de adresare intilnite la FELIX 5000:

- Adresare directa: I = 0; X = 0; B <> 0.

Aef = ( B + 8 ) + D; unde ( B + 8 ) specifica registrul general utilizat ca baza.

- Adresarea indirecta: I = 1; X = 0; B <> 0.

Prima adresa efectiva, Aef, calculata va reprezenta adresa unui cuvant din memorie in care se

gaseste o informatie care este tratata, din punctul de vedere al calculului unei noi adrese efective,

ca o instructiune. Astfel, la adresa efectiva:

Aef1 =( B + 8 ) + D se va gasi un cuvant care va avea campurile: I1, B1, Q1, X1, F1, D1.

Daca I1 = 1, atunci se va calcula noua adresa efectiva:

Aef2 = ( B1 + 8 ) + D1, de la care se va citi un nou cuvant, procesul putand continua pe

maximum 5 niveluri de adresare indirecta, pana cand Ii = 0.

Adresarea indexata directa: I = 0; X = 1.

Aef = ( Q ) + ( B + 8 ) + D, unde ( Q ) specifica RG folosit ca registru index.

Adresarea indexata indirecta: I = 1; X = 1.

Aef1 = ( B + 8 ) + D,

Aef(k+1) = ( Bk + 8 ) + Dk

Aef = ( Q ) + Aef(k+1) = ( Q ) + ( Bk + 8 ) + Dk.

Page 53: Structura Si Organizarea Calculatoarelor
Page 54: Structura Si Organizarea Calculatoarelor

5. Conventii de proiectare.

Dupa cum s-a aratat intr-un capitol anterior, un sistem numeric poate fi partitionat in:

- sectiunea de date ( unitatea de executie ),

- sectiunea de comanda ( unitatea de comanda ).

Intrare: Date Iesire: Date/Rezultate

Semnale de Conditii

comanda

Intrare: Conditii Iesire: Comenzi

Unitatea de executie asigura prelucrarea datelor, reprezentate sub forma unor vectori binari,

prin transferul acestora intre registrele sursa si registrele destinatie.Transferul se efectueaza prin

intermediul unor retele/circuite logice combinationale.

Transferurile intre registre.

Intrucat prelucrarea datelor are la baza transferul intre registre, proiectarea unui sistem

numeric, in vederea executiei unui algoritm, consta intr-o planificare, ce va defini fiecare

transfer, prin specificarea ordinii/temporizarii ( timing ) in care aceste transferuri vor avea loc.

In continuare se prezinta mecanismele hardware de implementare a transferurilor intre registre

si notatiile corespunzatoare folosite. Registrele sunt notate cu majuscule avand, de regula, o

semnificatie mnemotehnica. Pe scurt, se vor folosi "mnemonice".

Transferul continutului unui registru sursa intr-un registru destinatie, fara a afecta continutul

sursei, se noteaza astfel:

AC RD

Daca registrul AC are patru biti, anularea/fortarea in unu a tuturor bistsbililor se pot nota dupacum urmeaza:

Registre si Logica aferenta(Sectiunea /Unitatea de Date/Executie)

Circuit secvential de comanda (Sectiunea/Unitatea de Comanda)

Page 55: Structura Si Organizarea Calculatoarelor

AC 0,0,0,0

AC 1,1,1,1

Implementarea registrelor se bazeaza pe bistabile JK si D, cu intrari de sincronizare de ceas, Ck,

si cu intrari de tip PRESET/CLR.

Transferurile sincrone au loc sub controlul semnalului de ceas pe fronturile anterior, pentru

bistabilele de tip D, sau pe frontul posterior, pentru bistabilele master-slave, de tip JK.

Transferurile implementate prin semnale de comanda aplicate pe intrarile PRESET/CLR au, in

general, caracter asincron. Mai jos se vor prezenta, pentru cazul unui bistabil D controlat pe

frontul anterior al semnalului de ceas, reprezentarea simbolica si diagrama temporala de operare.

Se observa ca datele la intrarea D sunt stabile inaintea aparitiei frontului crescator al semnalului

de ceas, cand are loc fortarea datei in bistabil. Iesirea va lua valoarea corespunzatoare intrarii cu

o anumita intarziere in raport cu frontul crescator al semnalului de ceas.

In cazul bistabilelor de tip master-slave fortarea datelor are loc pe frontul anterior al semnalului

de ceas, iar aparitia lor la iesire se constata pe frontul posterior al ceasului. Mai jos se prezinta

simbolul si diagrama temporala pentru operarea bistabilului JK.

In continuare se vor considera elemente bistabile de tip master-slave, atat pentru sectiunea de

date, cat si pentru sectiunea de comanda.

7476

2

4

1

16

15

14

PR

E

J

CLK

K

CLR

Q

Q

Data

Data

Ceas Data (J/K)

Ceas (CLK)Iesire

Iesire (Q)

7474

3

2

4

5

6CLK

CLR

D PR

E

Q

QCeas

Ceas (CLK)

Iesire (Q)

IesireData

Data (D)

Page 56: Structura Si Organizarea Calculatoarelor

Un circuit secvential de comanda furnizeaza, pentru sectiunea de date, diverse semnale de

comanda, sincrone cu ceasul sistemului, cu perioade egale cu durata unei perioade de ceas sau

cu multipli ai acesteia. Acestea sunt semnalele de comanda de tip nivel.

Semnalele de Comanda de tip Nivel (SCN) vor avea un sufix numeric i ce va specifica numarul

iesirii de comanda a automatului (SCNi). Semnalele SCNi pot fi strobate/esantionate cu

semnalul curent de ceas, pentru a forma Semnale de Comanda de tip Impuls(SCIi), cu durata

activa corespunzatoare semnalului curent de ceas.

Presupunem ca in etapa i (pasul i al implementarii/executiei) algoritmului trebuie sa se efectueze

transferul continutului registrului de doi biti RA[2], numerotati de la 0 la 1 ( RA0:1 ),in registrul

destinatie RB[2] ( RB0:1 ):

i. RB0:1 RA0:1

Considerand, in continuare, ca se vor folosi numai bistabile master-slave JK sau D (se face

presupunerea ca si bistabilele de tip D opereaza in maniera master-slave ), schemele hardware

pentru implementarea acestui transfer vor fi urmatoarele:

7408

1

23

Circuit Secvential (Unitate e Comanda)

Conditii

Ceas

SCN(i-1) SCNiSCIi

Ceas

Ceas

SCN(i-1)

SCNi

SCIiSCIi

SCI(i-1)

Page 57: Structura Si Organizarea Calculatoarelor

Diagrama de timp care arata modul in care noua informatie se transfera in RB este data mai jos:

74762

4

1

16

3

15

14

PR

E

J

CLK

K

CLR

Q

Q

7476

2

4

1

16

3

15

14

PR

E

J

CLK

K

CLR

Q

Q

7476

2

4

1

16

3

15

14

PR

E

J

CLK

K

CLR

Q

Q

7476

2

4

1

16

3

15

14

PR

E

J

CLK

K

CLR

Q

Q

7408

1

23

RA0

RA1 RB1

RB0

SCN1

Ceas

7474

3

1

2

4

5

6CLK

CLR

D PR

E

Q

Q

7474

3

1

2

4

5

6CLK

CLR

D PR

E

Q

Q

7474

3

1

2

4

5

6CLK

CLR

D PR

E

Q

Q

7474

3

1

2

4

5

6CLK

CLR

D PR

E

Q

Q

7408

1

23

RA0

RA1 RB1

RB0

SCN1

Ceas

Ceas

SCNi

SCIi

Vechea Valoare din RB \\

Noua Valoare din RB

Page 58: Structura Si Organizarea Calculatoarelor

Adesea, intr-un registru trebuie sa se transfere, in momente diferite, vectori diferiti, de la diverse

surse.

Fie registrele sursa: RA, RB si registrul destinatie RC. Se cere implementarea, la momentele

1, 2 a urmatoarelor transferuri:

1. RC RA

2. RC RB

sub controlul semnalelor SCN1, SCN2.

Se cere implementarea hardware a transferurilor:

1. RA 1,1

2. RA 0,0

3. RA RB

Pentru a stabili expresia functiei logice combinationale, care reprezinta intrarea Di a bistabilului

destinatie RAi, se utilizeaza diagrama Karnaugh, cu variabila RBi introdusa in diagrama:

7474

3

1

2

4

5

6CLK

CLR

D PR

E

Q

Q

7474

3

1

2

4

5

6CLK

CLR

D PR

E

Q

Q

7474

3

1

2

4

5

6CLK

CLR

D PR

E

Q

Q

7474

3

1

2

4

5

6CLK

CLR

D PR

E

Q

Q

7408

1

23

7408

1

23

7408

1

23

7408

1

23

U9A

7432

1

23

U10A

7432

1

23

7474

3

1

2

4

5

6CLK

CLR

D PR

E

Q

Q

7474

3

1

2

4

5

6CLK

CLR

D PR

E

Q

Q

7408

1

23

7432

1

23

RA0

RA1

RB0

RB1

SCN1

SCN2

SCN2

SCN1

CLK

Page 59: Structura Si Organizarea Calculatoarelor

SCN1, SCN2 00 01 11 10 SCN3 Functia de excitatie Di este data de expresia:

0 Di = SCN1 ∪ RBi .SCN3

1

Aceasta va duce la urmatoarea implementare:

In cazul in care se urmareste implementarea operatiei elementare:

j. RAi RBi.RCi

se poate folosi schema de mai jos:

RBi

* *

*

* 1

* *

7474

3

1

2

4

5

6CLK

CLR

D PR

E

Q

Q

7408

1

23

U41A

7408

1

23

RAi

RBi

RCi

SCNj

SCIjCeas

7474

3

1

2

4

5

6CLK

CLR

D PR

E

Q

Q

7474

31

2

4

5

6CLK

CLR

D PR

E

Q

Q

7432

1

23

7432

1

23

7408

1

23

7408

1

23

U7A

7408

1

231

28

9

RA0

RA1

RB0

RB1

SCN1

SCN1

SCN2

SCN3

SCN3

CLK

Page 60: Structura Si Organizarea Calculatoarelor

Reprezentarea componentelor constructive logice combinationale si secventiale (SSI/MSI).

In realizarea practica a unui sistem numeric de complexitate mica/medie (in afara cazurilor cand

se folosesc circuite programabile FPGA/FPLD) sunt utilizate atat componente logice

combinationale, cat si secventiale standard, integrate pe scara simpla si medie. Pentru o tratare

unitara a celor doua tipuri de componente, mai jos, se prezinta o modalitate de tratare unitara a

acestora.

Componentele combinationale.

Sub forma cea mai generala o componenta combinationala (Circuit Logic Combinational – CLC)

se poate reprezenta sub forma unei “cutii negre” avand m intrari de date X[m], p intrari de

comanda C[p] si n iesiri Z[n]. Intrarile si iesirile se pot reprezenta sub forma unor vectori binari

X[m], C[p], Z[n], iar operarea componentei/circuitului poate fi descrisa cu ajutorul unei tabele.

m X[m] Operatia Descrierea Comanda

p Functia C(p-1) ………C0

C[p] F0 Z = F0(X) 0 …………0 0

n Z[n] F1 Z = F1(X) 0 …………0 1 ….. ………… ……………… F(2^p-1) Z = F(2^p-1)(X) 0 …………0 0

Se poate observa ca iesirea Z este prezenta atata timp cat este sunt prezente intrarile X si C, fapt

mentionat prin utilizarea semnului “=” intre termenii din dreapta si stanga, in coloana

“Descriere”. Iesirea Z este definita, ca functie de intrarea X, pentru cele 2p valori pe care le

poate lua vectorul de comanda C. In continuare sevor prezenta cateva cazuri particulare.

Circuitul AND (7408).

Modelul Componenta din Tabelul de descriere

biblioteca

A[4] B[4] Operatia Descrierea Comanda

4 4 AND Z = A ∩ B ------

4 Z[4] ¼ din pastila 7408

CLC

7408

7408

1

23

Page 61: Structura Si Organizarea Calculatoarelor

Circuitul de mai sus poate fi reprezentat in conditiile in care intrarile A[4] sunt controlate decatre acelasi semnal si devin, astfel, intrari de comanda:

A[1] 1 B[4] Operatia Descrierea Comanda

4 A[4] 4 A[1]

ZERO Z = 0000 0

TRUE Z = B 1

4 Z[4]

Circuitul sumator 7483.

Modelul Componenta din Tabelul de descriere

biblioteca

A[4] B[4] C0[1] Operatia Descrierea Comanda

4 4 1 ADD C4,S = ADD(A,B,C0) -----

C4[1] 1 4 S[4]

Circuitul XOR (7486).

Modelul Componenta din Tabelul de descriere

biblioteca

A[4] B[4] Operatia Descrierea Comanda

4 4 XOR Z = A ⊕ B ------

4 Z[4] ¼ din pastila 7486

Ca si in cazul circuitului AND (7408), pentru circuitul XOR (7486) intrarile A[4] pot fi

controlate de catre acelasi semnal de comanda, ceea ce va permite implementarea pe 4 biti a

functiilor TRUE si NEG, conform tabelului de mai jos.

7408

7483

7483A

138

101647

1113

14

15

2

6

9

A4A3A2A1B4B3B2B1C0

C4

SUM4

SUM3

SUM2

SUM1

7486

7486

1

23

Page 62: Structura Si Organizarea Calculatoarelor

A[1] 1 B[4] Operatia Descrierea Comanda

4 A[4] 4 A[1]

TRUE Z = B 0

NEG Z = B 1

4 Z[4]

Multiplexorul 74157

Modelul Componenta din Tabelul de descriere

biblioteca

A[4] B[4] Operatia Descrierea Comanda

S=A/B 4 4 G S=A/B SELA Z = A 0 0

G SELB Z = B 0 1

4 Z[4] STROB Z = 0000 1 *

Intrarile active pe nivel coborat sunt marcate cu un cerc

Circuite secventiale.

In cazul circuitelor secventiale intervine si semnalul de ceas, pe langa semnalul de comanda.

Pentru a marca faptul ca iesirea circuitului isi pastreaza valoarea si dupa disparitia datelor de la

intrare, atribuirea valorii expresiei logice din termenul din dreapta variablei din termenul din

stanga se specifica prin “ “. Intrarile de ceas sunt marcate printr-un varf de sageata.

C[p] m X[m] Operatia Descrierea Comanda

p Functia C(p-1) ………C0

CLK F0 Q F0(X) 0 ………..0 0

n Q[n] F1 Q F1(X) 0 ………..0 1 ….. ………… ……………… F(2^p-1) Q F(2^p-1)(X) 0 ………..0 0

7486

74157

74157

4

7

9

12

2356

11101413

151

1Y

2Y

3Y

4Y

1A1B2A2B3A3B4A4B

STROBEGSELECTAB

CLS

Page 63: Structura Si Organizarea Calculatoarelor

Circuit bistabil JK (7473).

Modelul Componenta din Tabelul de descriere

biblioteca

Operatia Descrierea Comanda

J J K K NOP Q Q 0 0

CLK CLEAR Q 0 0 1

4 Q[4] PRESET Q 1 1 0

COMPL Q Q 1 1

Contor binar 74163

Modelul Componenta din Tabelul de descriere

biblioteca

ENT A[4] Operatia Descrierea Comanda

CLR CLR LOAD ENP ENP NOP Q Q 1 1 0

LOAD INC Q ADD(Q,T) 1 1 1

CLK LOAD Q A 1 0 *

RC0 Q[4] CLEAR Q 0 0 * *

Registru de deplasare 74178

SER A[4] Operatia Descrierea Comanda

SH 1 4 SH LOAD

LOAD NOP Q Q 0 0

CLK LOAD Q A 0 1

4 Q[4] SHIFT Q Q2:0, SER 1 *

Bistab.JK

7473

14

1

3

12

13

J

CLK

KC

LR

Q

Q

74163

3456

21079

1413121115

CLR

ABCD

CLKENTENPLOAD

QAQBQCQD

RCO

74163

74178

Page 64: Structura Si Organizarea Calculatoarelor

In cazul in care intrarea SEReste folosita drept intrare de comanda se realizeaza functiile din

tabelul de mai jos:

Modelul Componenta din Tabelul de descriere

biblioteca

A[4] Operatia Descrierea Comanda

SER SER SH LOAD SH NOP Q Q * 0 0

LOAD LOAD Q A * 0 1

CLK SHIFT0 Q Q2:0, 0 0 1 0

Q[4] SHIFT1 Q Q2:0, 1 1 1 0

Registru cu doua intrari multiplexate 74298

Modelul Componenta din Tabelul de descriere

biblioteca

A[4] B[4] Operatia Descrierea Comanda

WS 4 4 WS

CKL LOADA Q A 0

LOADB Q B 1

4 Q[4]

74178

74178

39

11

21

1312

4

6

8

10

5

SERIALLOADSHIFT

ABCD

QA

QB

QC

QD

CLK

74298

74298

10

32419576

11

15

14

13

12

WS

A1A2B1B2C1C2D1D2CLK

QA

QB

QC

QD

Page 65: Structura Si Organizarea Calculatoarelor

Scheme combinate.

Schema unui sumator/scazator

Schema se bazeaza pe utilizarea a doua circuite: XOR (7486) si ADD (7483)

Operatia Descrierea Comanda

D

ADD Z = C4,ADD(A,B) 0

SUB Z = C4,SUB(A,B) 1

In functie de valoarea 0/1 a semnalului de comanda D, schema efectueaza adunarea/scaderea.

Schema se poate extinde usor pentru operatiile pe 8 biti. In acest mod se pot realiza structuri

complexe, noi blocuri constructive, a caror operare poate fi descrisa concis cu ajutorul tabelelor.

Conexiuni prin magistrale.

In numeroase cazuri implementarea in hardware a unui algoritm de prelucrare a datelor impune,

la diverse etape ale executiei sale, conectarea unor registre-sursa la anumite registre-destinatie.

Conexiunile directe ofera posibilitatea unui inalt grad de paralelism al transferurilor de date. In

schimb sunt neeconomice sub aspectul consumului de circuite logice.

Pentru exemplificare se vor considera, pe de-o parte, doua registre-sursa: RA si RB, iar pe de

alta parte doua registre-destinatie: RC si RD, intre care se realizeaza urmatoarele transferuri:

1. RC RA

2. RD RB

3. RC RB

4. RD RA

5. RC RA; RD RB

6. RC RD; RC RA

4 4

44

4

1

1

DA[4] B[4]

7486

7483C4

Z[4]

C0 1

Page 66: Structura Si Organizarea Calculatoarelor

Aceste transferuri se vor realiza sub controlul semnalelor de comanda de tip nivel: SCN1,

SCN2, SCN3, SCN4, SCN5, SCN6 si al semnalelor de comanda de tip impuls: SCI1, SCI2,

SCI3, SCI4, SCI5, SCI6.

O ilustrare a implementarii transferurilor de mai sus este prezentata in continuare, considerand,

pentru simplificare, registre de cate un bit.

Considerand ca sunt s registre-sursa, avand n biti, si d registre-destinatie, de cate n biti se poate

stabili o functie de cost, pe baza numarului de porti SI, SAU si a numarului de biti al fiecarui

registru. Astfel,

- numarul de porti SI = s.d.n,

- numarul de porti SAU = d.n

Rezulta o functie de cost ≈ n.d.(s + 1)

7474

3

1

2

4

5

6CLK

CLR

D PR

E

Q

Q

7432

1

23

7432

1

23

7408

1

23

7408

1

23

7408

1

23

7432

1

23

7432

1

23

7408

1

23

7474

3

1

2

4

5

6CLK

CLR

D PR

E

Q

Q

7474

3

1

2

4

5

6CLK

CLR

D PR

E

Q

Q

7474

3

1

2

4

5

6CLK

CLR

D PR

E

Q

Q

7432

1

23

7432

1

23

7408

1

23

7408

1

23

23

45

1

23

45

1

CLK

CLK

SCN1

SCN1

SCN2

SCN2

SCN4

SCN5

SCN5

SCN5

SCN6

SCN6

SCN6

RA

RB

RC

RD

SCN3

SCN3

SCN4

SCN6

SCN5

Page 67: Structura Si Organizarea Calculatoarelor

Pentru a reduce costul conexiunilor intre surse si destinatii se utilizeaza magistralele. Acestea

reprezinta, de regula, trasee metalice/fire pe circuite imprimate sau la nivelul structurilor

integrate pe siliciu. Modelul conexiunilor, prin intermediul magistralei, este ilustrat mai jos.

Se poate observa ca portile SI, care conecteaza iesirile registrelor RA si RB, la magistrala sunt

de tipul “colector deschis” OC. Conexiunile Registrelor RA si RB, la magistrala MAG/BUS se

realizeaza sub controlul unor semnale de comanda de tip nivel, specificate in desen prin

expresiile: MAG/BUS = RA si MAG/BUS = RB. Fortarea continutului magistralei MAG/BUS

in registrele RC si RD are loc sub controlul semnalelor de comanda de tip impuls, specificate in

desen prin expresiile: RC MAG/BUS si RD MAG/BUS.

Magistrala joaca rolul unui circuit SAU, conform figurii de mai jos.

Transferurile nu se mai pot efectua in paralel, de la surse la destinatii. Ele vor avea un caracter

secvential. Astfel, transferul:

1. RC RA, se va efectua prin operatiile:

1. MAG/BUS = RA; RC MAG/BUS,

unde simbolul “=” reprezinta o conexiune, pe durata unui semnal de comanda de tip nivel.

1

23

1

23

1

23

1

23

R

RA

RB

RC

RD

CLK

CLK

D

D

Q

Q

CLK

CLK

MAG/BUS

MAG/BUS = RA

MAG/BUS = RB

RC <- MAG/BUS

RD <- MAG/BUS

+5V

OC

OC

Page 68: Structura Si Organizarea Calculatoarelor

Functia de cost va fi data de numarul portilor SI, al portilor SAU, cat si de numarul de biti ai

vectorilor transferati:

- numarul de porti SI = s.n,

- numarul de porti SAU = n

Rezulta o functie de cost ≈ n.(s + 1)

De cele mai multe ori conexiunile registrelor-sursa la magistrala se realizeaza prin circuite “Tri-

state”, care inlocuiesc circuitele de tip “OC”.

1

23

1

23

1

23

1

23

7474

3

12

45

6CLK

CLR

D PR

EQ

Q

7474

3

1

2

4

5

6CLK

CLR

D PR

E

Q

Q

7474

3

1

2

4

5

6CLK

CLR

D PR

E

Q

Q

7474

3

1

2

4

5

6CLK

CLR

D PR

E

Q

Q

7432

1

23

RA

Q

CLK

CLKMAG/BUS

MAG/BUS = RA

MAG/BUS = RB

RC <- MAG/BUS

RD <- MAG/BUS

Page 69: Structura Si Organizarea Calculatoarelor
Page 70: Structura Si Organizarea Calculatoarelor

1

VHDL - ca un limbaj de programare VHDL seamana cu un limbaj de programare; cei care sint familiarizati cu limbajul de programare Ada vor observa similaritati cu acest limbaj. 1.Elemente lexicale a)Comentarii: Comentarife in VHDL incep cu '--' si se continua pina la sfirsitul rindului. Ele nu au semnificatie intr-o descriere VHDL. b)Identificatori: Identificatorii in VHDL sint cuvinte rezervate sau nume definite de programator. Se formeaza dupa regula: identificator ::= litera [_ ] litera_sau_cifra Nu se face diferenta intre litere mari si litere mici, de exemplu id si Id reprezinta acelasi lucru. c)Numere: Numerele sint reprezentate in baza 10 (numere zecimale) sau in alta baza de numeratie (de la 2 la 16). Numerele care contin '.' sint considerate numere reale, celelalte fiind numere intregi. Numerele zecimale sint definite de: numar_zecimal ::= intreg[.intreg][exponent] intreg ::= cifra[_]cifra exponent :.= E[+]intreg |E[-]intreg Exemple: 0 1 123_456 678E9 --numere intregi 0.0 0.1 2.345 67 12.3E-4 --numere reale

Numerele date intr-o baza de numeratie sint definite de: numar bazat ::= baza#intreg bazat[.intreg-bazat]#[exponent] baza ::= intreg intreg_bazat ::= cifra_extinsa[_]cifra extinsa cifra-extinsa ::= cifra | litera Baza si exponentul sint in baza 10. Exponentul reprezinta puterea la care se ridica baza, cu care va fi inmultit numarul. Literele de la A la F (de la a la f) sint 'cifre extinse' si reprezinta numerele de la 10 la 15. Exemple: 2# 1100 0100# 16#C4# 4#301 #E1 --nr. intreg 196 2# 1.1111_1111_111 #E+ 11 16#F. FF#E2 --nr. real 4095 d) Caractere: Caracterele sint delimitate de ’ ’. Exemple: 'A' 'a' e)Siruri de caractere: Sirurile de caractere sint delimitate de "". Pentru a include " intr-un sir, ghilimelele trebuie dublate. Un sir de caractere poate reprezenta valoarea unui obiect care a un vector de caractere. Exemple: “Un sir in sir: “”Un sir”” “ --sir care contine "

Page 71: Structura Si Organizarea Calculatoarelor

2

f)Siruri de biti: VHDL permite o reprezentare convenabila a vectorilor de biti ('0' sau ' 1'). Sintaxa este: sir biti ::= baza_de_reprezentare"valoare_bit" baza de_reprezentare ::= B | O | H valoare bit ::= cifra extinsa[ ]cifra_extinsa Baza de reprezentare poate fi B (in binar), O (in octal) sau H (in hexazecimal). Exemple: B"1010110" --lungimea sirului e 7 O"126" --lungimea a 9, B”001_010_110" H"56" --lungimea a 8, B"0101_0110" 2.Tipuri de date si obiecte In VHDL exista doua feluri de tipuri: tipuri SCALARE si tipuri COMPUSE. Tipurile scalare includ numere, cantitati fizice si enumerari, si tipuri predefinite. Tipurile compuse sint vectori si inregistrari. In VHDL sint definite si tipurile 'access' (pointeri) si 'file' (fisiere). declaratie_de_tip :.= type identificator is tip tip ::= tip_scalar

tip_compus tip_access tip_file

tip_scalar ::= tip_enumerare I tip-intreg I tip_real tip_fizic tip-compus ::= tip_tablou I tip_inregistrare a)Tip intreg: Tipul intreg reprezinta o multime de numere intregi dintr-un interval specificat. Sintaxa este: tip_intreg ::= multime_in_interval multime_in_interval ::= range interval interval ::= expresie_simpla directie expresie_simpla directie :.= to I downto Expresiile care specifica intervalul trebuie sa aiba valori intregi. Limitele intervalului sint cuprinse intre -2147483647 si +2147483647. Exemple: type byte_int is range 0 to 255; type signed is range -32768 to 32767; type bit_index is range 31 downto 0; Exista tipul predefinit 'integer', care reprezinta numere intregi cuprinse intre -2147483647 si +2147483647. b)Tip fizic: Tipul fizic este un tip numeric de reprezentare a unor cantitati fizice (lungime, timp, volti). Declaratia de tip include specificarea unei unitati de masura de baza si eventual un numar de unitati de masura secundare, care reprezinta multiplii ai unitatii de baza. Sintaxa este: tip_fizic ::= constructor_interval

units unitate_de_baza

unitati secundare end units

unitate_de baza ::= identificator; unitati_secundare ::= identificator = literal_fizic; literal_fizic :.= [literal_abstract]nume_unit;

Page 72: Structura Si Organizarea Calculatoarelor

3

Exemple: type length is range 0 to 1E9 units um; mm = 1000 um; cm = 10 mm; m = 1000 mm; end units; type resistance is range 0 to 1E8 units ohms; kohms = 1000 ohms; Mohms = 1E6 ohms; end units; Exista tipul predefinit 'time', folosit in simulari VHDL pentru specificarea intirzierilor. type time is range interval_maxim_din_implementare units fs; ps = 1000 fs; ns = 1000 ps; us = 1000 ns; ms = 1000 us; sec = 1000 ms; min = 60 sec; hr = 60 min; end units; Un numar de tip fizic se scrie: valoare unitate. Exemple: 10 mm 1200 ohm 23 ns c)Tip real: Tipul real reprezinta o aproximare discreta a setului de numere reale ditr-un interval specificat. Precizia de aproximare nu e definita de limbajul VHDL standard, dar numarul trebuie sa aiba maxim 6 cifre. Intervalul a cuprins intre -1E38 to + 1E38. Sintaxa: tip real ::= constructor interval Exemple: type signal level is range -10.00 to +10.00; type probability is range 0.0 to 1.0; Exista un tip predefinit 'real'. Intervalul de valori este predefinit si include valorile cuprinse intre -1E38 si +1E38. d)Tip enumerare: Tipul enumerare este o multime ordonata de identificatori sau caractere. Identificatorii si caracterele din cadrul unei enumerari trebuie sa fie distincti, dar pot fi 'refolositi' in enumerari diferite. Sintaxa este: tip_enumerare ::= (enumeraref,enumerare) enumerare ::= identificator I caracter Exemple: type logic_level is (unknown,low,undriven,high); type alu_function is (disable,pass,add,substract,multiply,divide); type octal_digit is (‘0',’1’,’2’,’3’,’4','5',’6’,’7’);

Page 73: Structura Si Organizarea Calculatoarelor

4

Exista o serie de tipuri de enumerari predefinite: type severity-level is (note,warning,error,failure); type boolean is (false,true); type bit is ('0','1'); type character is ( NUL, SOH, STX, ETX, EOT, ENQ, ACK, BEL, BS, HT, LF, VT, FF, CR, SO, SI, DLE, DC1, DC2, DC3, DC4, NAK, SYN, ETB, CAN, EM, SUB, ESC, FSP, GSP, RSP, USP, ‘ ‘, ‘!’, … ‘z’, ‘‘, ‘|’, ‘’ , ‘~’, DEL); I e)Tablouri : In VHDL, un tablou e o colectie indexata de elemente de acelasi tip. Tablourile pot fi unidimensionale sau multidimensionale. Un tablou poate avea dimensiunea definita la declarare sau nedefinita, urmind ca indicele sa is valori definte ulterior. Sintaxa este: tip_tablou ::= tablou dim-nedefinita I tablou_dim_definita tablou dim_nedefinita ::=array (subtip-index,subtip-index) of subtip element tablou dim _definita ::= array multime_index of subtip_element subtip-index ::= tip range <> multime_index ::=(interval _discret,interval_discret) interval discret ::= subtip discret I interval Exemple: type word is array (31 downto 0) of bit; type memory is array (address) of word; type transform is array (1 to 4,1 to 4) of real; type register _bank is array (byte range 0 to 132) of integer; type vector is array (integer range <>) of real; Simbolul ' < >' poate fi vazut ca o 'locatie' pentru index, care va fi 'umpluta' atunci cind a folosit vectorul. De exemplu, un obiect e declarat vector de 20 de elemente astfel: vector(1 to 20). Exista doua tipuri predefinite de tablouri (vectori): type string is array (positive range <>) of character; type bit_vector is array (natural range <>) of bit; Tipul 'bit vector' a folosit la simularea sistemelor digitale. Un element al tabloului poate referit prin indexarea numelui tabloului. De exemplu, fie a si b doua tablouri de dimensiuni 1 si, respectiv, 2. Atunci a(1) si b(l,1) se refera la elementele tablourilor. Se pot referi si parti continue din tablouri, de exemplu a(8 to 15) este un vector de 8 elemente care a inclus in vectorul a. Fie un tip de tablou declarat astfel: type a is array (1 to 4) of character; si vrem sa scriem un vector de acest tip, care sa contina elementele 'f, 'o', 'o', 'd' in aceasta ordine. Putem scrie astfel: ('f' 'o' 'o' 'd') in care elementele sunt in ordinea crescatoare a indicelui. O alta varianta ar fi aceasta: (1=>'f',3=>'o',4=>'d',2=>'o') In acest caz, este dat explicit indicele pentru fiecare element, care pot fi deci in orice ordine. Ambele variante pot fi folosite in cadrul scrierii aceluiasi tablou. Se poate folosi si cuvintul 'others', in locul indexului, care indica spre o valoare folosita pentru toate elementele care nu au fost mentionate explicit. De exemplu: ('f',4=>'d',others=>'o')

Page 74: Structura Si Organizarea Calculatoarelor

5

f)Inregistrari: Inregistrarile in VHDL sint colectii de elemente, care pot avea tipuri diferite. Sintaxa este: tip_inregistrare ::=

record element element

end record element ::= lista_identificatori : subtip_element; lista identificatori ::= identificator,identificator subtip element ::= subtip Exemple: type instruction is record

op_code : processor_op; address mode : mode; operand1,operand2 : integer range 0 to 15;

end record; Fie o inregistrare r si un cimp f in aceasta inregistrare. Acel cimp poate fi referit cu numele 'r.f’ g)Subtipuri: Subtipurile reprezinta tipuri de baza restrictionate. Sintaxa este: declaratie subtip ::= subtype identificator is subtip; subtip ::= [functie de rezolutie] marcaj_tip [constringere] marcaj_tip ::= nume_tip I nume-subtip constringere ::= mult:wq :ime_inintervalimultime-index Exista doua feluri de subtipuri: 1. Subtipul reprezinta valorile unui tip scalar, restrinse la un interval. subtype pin_count is integer range 0 to 400; subtype digits is character range '0' to '9'; 2 . Subtipul reprezinta valorile unui tablou cu indici nedefiniti, restrins prin definirea indicilor. subtype id is string(1 to 20); subtype word is bit_vector(31 downto 0); Exista doua subtipuri numerice predefinite: subtype natural is integer range 0 to MAXINT subtype positive is integer range 1 to MAXINT h)Declaratii de obiecte: In VHDL exista trei clase de obiecte: CONSTANTE, VARIABILE si SEMNALE. Vom discuta despre constante si variabile. A. O constanta este un obiect care este initializat cu o valoare cind e creat, care nu mai este ulterior modificata. Sintaxa este: constanta::=constant lista_identificatori:subtip[:=expresie];

Page 75: Structura Si Organizarea Calculatoarelor

6

Declaratiile de constante care nu au expresie de initializare se numesc 'constante aminate', si nu apar decit in declaratiile de package. Valoarea de initializare trebuie data in package body corespunzator. Exemple: constant e : real := 2.13455; constant max-size : natural; B. Variabila e un obiect a carui valoare se poate modifica. Sintaxa este: variabila::=variable lista_identificatori:subtip[:=expresie]; Daca expresia de initializare lipseste, i se asociaza variabilei o valoare implicita. Pentru tipurile scalare implicita este cea mai din stinga valoare pentru acel tip: prima dintr-o enumerare, cea mai mica dintr-un interval dat in ordine ascendenta, cea mai mare dintr-un interval dat in ordine descendenta. Daca variabila este un tip compus, valoarea implicita este formata din toate valorile implicite alr tipurilor componente. Exemple: variable count : natural := 0; variable trace : trace_array; Daca 'trace array' este un vector de booleeni, atunci valoarea initiala a lui 'trace' este un vector de elemente cu valorile 'false'. Find dat un obiect, a posibil sa se defineasca nume alternative pentru obiect sau pentru o parte din el. Sintaxa este: nume_alternativ::=alias identificator:subtip is nume; Exemple: variable instr : bit_vector(31 downto 0); alias op_code : bit vector(7 downto 0) is instr(31 downto 24) ; In acest exemplu, numele 'op code' este un nume alternativ pentru primii 8 biti din 'instr'. i) Atribute: Tipurile si obiectele declarate in VHDL pot avea asociate informatii suplimentare, numite atribute. Un atribut este referit cu ''' (ghilimele simple). Atribute pentru orice tip sau subtip scalar T: ATRIBUT REZULTAT T'left valoarea stinga a lui T T’right valoarea dreapta a lui T T'low valoarea cea mai mica a lui T T'high valoarea cea mai mare a lui T Atribute pentru orice tip T, X fiind membru al lui T si N un intreg: ATRIBUT REZULTAT T’pos(X) pozitia lui X in T T’val(N) valoarea de la pozitia N din T T’leftof(X) valoarea de la stinga lui X in T T'rightof(X) valoarea de la dreapta lui X in T T’pred(X) valoarea imediat mai mica decit X in T T’succ(X) valoarea imediat mai mare decit X in T Atribute pentru orice tablou sau obiect A, N fiind un intreg cuprins intre 1 si numarul de dimensiuni ale lui A: ATRIBUT REZULTAT A'left(N) v al.stinga a interv.index pt.dim.N in A A’right(N) val.dreapta a interv.index pt.dim.N in A

Page 76: Structura Si Organizarea Calculatoarelor

7

A'low(N) val.cea mai mica int.index pt.dim.N in A A'high(N) val.cea mai mare int.index pt.dim.N in A A’range(N) int.de valori pt.index pt.dim.N in A A’reverse_range(N) int.valori pt.index, in ordine inversa A’length(N) lungimea intervalului index pt.dim.N in A 3.Epresii si operatori Iata lista operatorilor din VHDL in ordinea descrescatoare a precedentei ** abs not * / mod rem +(unar) -(unar) + - & = /= < <= > >= and or nand nor xor Operatorii logici AND, OR, NAND, NOR, XOR si NOT opereaza pe valori de tip bit sau boolean si pe vectori (tablouri unidimensionale) de aceste tipuri. Operatiile pe vectori se aplica intre elementele corespondente ale fiecarui vector, rezultatul fiind tot un vector. Operatorii relationali =, /=, < , < =, > si > = se aplica pe operanzi de acelasi tip si au ca rezultat o valoare booleana. Operatorii de egalitate (= si /=) permit operanzi de orice fel de tip. Ceilalti operatori permit numai operanzi de tip scalar sau vectori uni-dimensionali de tip discret. Operatorii + si - (unari sau binari) au semnificatia uzuala pentru operanzi numerici. Operatorul de concatenare (&) se aplica pe vectori, rezultatul fiind un nou vector format din alipirea celor doi vectori operanzi. Se pot concatena un element si un vector, sau doua elemente care prin concatenare formeaza un nou vector de dimensiune 2. ' Operatorii de inmultire si impartire (* si /) lucreaza pe numere intregi, reale si operanzi de tip fizic. Operatorii cit si rest (MOD si REM) lucreaza numai pe tipuri intregi. Operatorul valoare absoluta (ABS) lucreaza cu operanzi de orice tip. Operatorul ridicare la putere (**) poate avea un intreg sau un real in partea stinga, dar trebuie sa aiba neaparat un intreg in partea dreapta. Un exponent negativ a permis numai daca operandul din partea stinga a tip real. 4.Instructiuni secventiale a)Instructiunea de atribuire: Sintaxa este: instr atribuire::=tinta:=expresie; tinta::=nume l lista-elemente Partea stinga si partea dreapta ale atribuirii trebuie sa aiba acelasi tip de baza. Daca in partea stinga se afla o lista de elemente, atunci ele trebuie sa fie nume de obiecte, iar in partea dreapta trebuie o valoare compusa de acelasi tip. Mai intai se se evalueaza lista, apoi expresia si, in final, componentele expresiei sint atribuite. Exemplu: ( a => r.b , b => r.a ) = r b)Instructiunea IF: Sintaxa este: instr_if::=if conditie then

secventa_instr elsif conditie then secventa_instr [else secventa_instr]

end if;

Page 77: Structura Si Organizarea Calculatoarelor

8

c)Instructiunea CASE: Sintaxa este: instr_case::= case expresie is alternativa case

alternativa case end case;

alternativa_case::=when alternative => secventa_instr alternative::=alternativa, alternativa alternativa::=expresie_simpla interval discret

nume_simplu_element others Expresia de selectie trebuie sa aiba tip discret sau sa fie un vector de caractere. Alternativele trebuie sa fie distincte, deci nu trebuie sa existe valori duplicate. Toate valorile trebuie sa fie prezente in lista de alternative, sau OTHERS trebuie inclusa ca ultima alternativa. Daca expresia are ca valoare un vector, atunsi alternativele trebuie sa fie siruri de caractere sau siruri de biti. Exemple: case element_colour of

when red => instr. red; when green I blue => instr. green, blue; when orange to turquoise => instr;

end case; case opcode of when X"00" => perform add; when X"01" => perform substract; when others => signal_illegal_opcode; end case; d)Implementarea ciclurilor: Sintaxa este: ciclu::= [eticheta:]

[schema de iteratie] loop secventa_instr

end loop [eticheta]; schema_de iteratie::= while conditie

| for specificare_parametrii_bucla specificare_parametrii_bucla::= identificator in interval_discret Daca lipseste schema de iteratie, avem cazul unei bucle infinite: loop ceva; end loop; Exemplu ciclu WHILE: while index < length and str(index) /= " loop

index := index + 1; end loop; Exemplu ciclu FOR:

for item in 1 to last item loop table(item) := 0; end loop;

Exista doua tipuri de instructiuni aditionale care pot fi folosite in cadrul unui ciclu. Cu instructiunea 'next' se termina executia iteratiei curente si se trece la iteratia urmatoare. Cu instructiunea 'exit' se termina executia iteratiei curente si se iese din ciclu. Sintaxa este:

Page 78: Structura Si Organizarea Calculatoarelor

9

instr next::=next[eticheta][when conditie]; instr exit::=exit[eticheta][when conditie]; Daca este omisa eticheta, instructiunile se executa in cadrul buclei celei mai apropiate care le cuprinde, altfel se executa in cadrul buclei specificate de eticheta. Daca clauza WHEN este prezenta, dar conditia asociata e evaluata la FALSE, iteratia continua normal. Exemple: for i in 1 to max str_len loop

a(i) .= buf(i); exit when buf(i) = NUL;

end loop; outer loop: loop

inner_loop: loop do_something; next outer_loop when temp = 0; do_something-else; end loop inner_loop;

end loop outer loop; e)Instructiunea vida: Instructiunea vida nu are nici un efect. Este folosita cind se doreste sa se arate explicit ca in unele cazuri nu se executa nimic. E folosita frecvent in instructiuni CASE, unde trebuie listate toate valorile alternative posibile ale unei expresii, cu toate ca pentru unele dintre ele nu trebuie sa se execute nimic. Sintaxa este: case controller command is when forward => engage motor forward; when reverse => engage-motor reverse; when idle => null; end case; f)Asertiuni: Asertiunile sint folosite pentru verificarea unor conditii specificate si raportarea in caz ca acestea nu sint indeplinite. Sintaxa este: asertiuni::=assert conditie [report expresie]

[severity expresie]; Daca a prezenta clauza REPORT, rezultatul expresiei trebuie sa fie un sir de caractere. Acesta reprezinta un mesaj ce va fi raportat in cazul in care conditia a evaluata la FALSE. Daca este omis, mesajul implicit este "Assertion violation". Daca e prezenta clauza SEVERITY atunci tipul expresiei trebuie sa fie 'severity-level'. Daca a omisa, valoarea implicita este 'error'. Un simulator termina executia daca o asertiune nu se mai respecta si valoarea specificata de 'severity' a mai mare decit un prag dat, dependent de implementare. De obicei acest prag este dat de catre utilizator. 5.Subprograme si pachete Subprogramele VHDL pot fi proceduri sau functii. Exista si modalitati de incapsulare a datelor in package-uri(engl.pachet). a)Proceduri si functii: Sintaxa este: subprogram::=specificare_subprogram; specificare_subprogram::= procedure nume[(lista parametrii formali)] | function nume[lista parametrii-formali)] return marcaj tip Aceste declaratii de subprograme sint folosite de obicei in specificatii de package, unde corpul subprogramului este dat in corpul package-ului. lista_parametrii_formali::=lista_interfata parametrii lista_interfata::=element_interfata;element interfata

Page 79: Structura Si Organizarea Calculatoarelor

10

element_interfata::=declaratie_interfata declaratie_interfata::=declaratie_constante_interfata declaratie _semnale_interfata declaratie_variabile_ interfata declaratie_constante_interfata::=

[constant]lista_identificatori:in subtip[:=expresie_statica] declaratie variabile interfata::=

[variable]lista_identificatori:[mod]subtip[:=expresie_statica] Exemple: 1) procedure reset; …

reset; --apel procedura 2) procedure increment_reg ( variable reg : inout word_32;

constant incr : in integer := 1 ); In al 2-lea exemplu, procedura are 2 parametrii: 'reg' si 'incr'. Modul lui 'reg' este INOUT, ceea ce inseamna ca 'reg' poate fi citit si asignat. Alte moduri posibile sint: IN (parametrul poate fi numai citit) si OUT, parametrul nu poate fi decat asignat. Daca modul este INOUT sau OUT, atunci cuvintul VARIABLE poate lipsi, fiind subinteles. Daca modul este IN, atunci CONSTANT poate lipsi. Un apel de procedura contine lista parametrilor actuali, data sub aceiasi forma ca la vectori. Exemple: Increment_reg ( index_reg , offset-2 ); --adaug o valoare increment_reg ( prog counter );

incrementez(1=implicit) sau increment_reg ( incr => offset-2 , reg => index_reg ); increment_reg ( reg => prog_counter ); Exemplu de functie:

function byte_to_int ( byte : word-8 ) return integer; Pentru functii, modul trebuie sa fie IN, si nu mai trebuie specificat. Daca nu se specifica clasa parametrului, se considera implicit CONSTANT. Sintaxa pentru corpul unui subprogram este: corp_subprogram::=

subprogram is declaratii subprogram begin

instructiuni_subprogram end [nume];

declaratii_subprogram::=declaratie subprogram instructiuni_subprogram::=instructiune secventiala declaratie-subprogram::=subprogram

corp_subprogram tip subtip constanta variabila alias

Numele listate dupa partea declarativa a subprogramului sint locale si nu sint vizibile in afara subprogramului. Ele chiar "ascund" semnificatia celor declarate in afara. Dupa apel, se executa instructiunile subprogramului pina se ajunge la sfirsit sau la un RETURN: insructiunea-return::=RETURN[expresie];

Page 80: Structura Si Organizarea Calculatoarelor

11

Functiile nu trebuie sa aiba efecte laterale. O consecinta importanta a acestei reguli este ca functiile pot fi apelate fara sa aiba efect asupra mediului apelant. Exemplu corp functie: function byte_to_int ( byte : word_8 ) return integer is variable result : integer := 0

begin for index in 0 to 7 loop

result := result * 2 + bit'pos ( byte ( index) ); end loop; return result;

end byte to_int; REDENUMIRE: exista posibilitatea ca 2 subprograme sa aiba acelasi nume, diferentiindu-se prin numarul sau tipul parametrilor. Exemple:

function check limit ( value : integer ) return boolean; function check-limit ( value : word-32 ) return boolean;

… testl := check-limit ( 4095 ) -- apel prima functie test2 := check-limit ( X"0000_OFFF") --apel a doua functie Numele subprogramului poate fi simbol de operator. Se pot redefini astfel operatori pentru tipuri not de operanzi. Exemple: function "+"(a,b : word_32) return word_32 is

begin return inttoword_32(word_32_to_int(a) + word-32 to int(b)); end "+";

… X"1000_0010" + X"0000_FFDO" --e apelat noul operator

"+"(X"1000_0010",X"0000_FFDO") --notatie echivalenta b)Package-uri si declaratia corpului pentru package Un package - pachet - este o colectie de tipuri, constante, subprograme si eventual alte constructii care se folosesc de obicei pentru a implementa un anumit serviciu sau pentru a izola un anume grup de elemente intre care exista o legatura. Mai mult decit atit, detaliile implementarii unui package pot fi "ascunse" fata de utilizatorii acestuia, lasind vizibila pentru restul lumii numai partea de interfata. Un package poate fi impartit in doua parti: partea de declaratii - care defineste interfata package-ului - si corpul package-ului, in care se define celelalte detalii. Corpul poate fi omis daca nu sint alte detalii nespecificate in partea de declaratii. Sintaxa declararii unui package este urmatoarea: declaratie_package ::=

package identificator is partea_declarativa_package

end [ nume_simplu package ] ; partea_declarativa_package ::=[ element_parte_declarativa ] element_parte_declarativa ::=declaratie subprogram

declaratie_tip declaratie_subtip declaratie_constanta declaratie_alias clauza_use

Page 81: Structura Si Organizarea Calculatoarelor

12

Declaratiile definesc acele elemente care vor fi vizibile pentru utilizatorii packageului si totodata in interiorul corpului package-ului. Trebuie notat de asemenea ca mai sint si alte tipuri de declaratii ce mai pot fi incluse, dar nu vor fi discutate aici. Exemple: package data_types is

subtype address is bit_vector(24 downto 0); subtype data is bit _vector(15 downto 0); constant vector_table_loc : address; function data _to_int(value : data) return integer; function int_to_data(value : integer) return data;

end data_types; In acest exemplu, declararea valorii constantei vector table precum si corpurile celor doua functii sint aminate, drept pentru care este necesar si corpul package-ului. Sintaxa pentru corpul unui package este: corp_package ::=

package body nume_simplu package is parte declarativa_corp_package

end [ nume-simplu package ] ; parte declarativa_corp package ::= [element corp package ] element_package ::= declaratie subprogram corp_subprogram declaratie_subtip declaratie_constanta declaratie_alias clauza_use In corpul package-ului poate fi inclus corpul unui subprogram, in timp ce in interfata package-ului nu poate fi inclusa decit partea declarativa a unui subprogram. Exemple: package body data_types is

constant vector_table_loc : address = X"FFFFF00"; function data_to_int(value : data) return integer is corpul functiei data_to_int end data_to_int; function int_to_data(value : integer) return data is corpul functiei int_to_data; end int_to_data;

end data_types; In corpul package-ului se specifica valoarea pentru constante si sint date corpurile functiilor. Declaratife de subtip nu sint repetate deoarece cele facute in partea declarativa a package-ului sint vizibile si in corpul package-ului. Odata package-ul declarat, elementele sale pot fi referite prin prefixarea numelui for cu numele package-ului. Pentru exemplele anterioare: variable PC : data_types.address; int_vector_loc := data_types.vector_table_loc * 4 int_level; offset := data types.data to int(offset reg); Adeseori este convenabil sa poti referi elementele dintr-un package fara a le mai prefixa cu numele acestuia. Pentru aceasta se foloseste clauza use intr-o parte declarativa. Sintaxa acesteia este:

Page 82: Structura Si Organizarea Calculatoarelor

13

clauza_use ::= use nume selectat , nume_selectat ; nume selectat ::= prefix . sufix Efectul utilizarii acestei clauze este ca toate numele listate pot fi folosite apoi fara a mai fi nevoie sa le, prefixam cu numele package-ului. Se poate folosi sufixul *all* pentru referirea neprefixata la toate elementele declarate intr-un package. Exemple: use data_types.all; -- ***************************************************************************************** -- AVR constants and type declarations -- ***************************************************************************************** library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; use WORK.SynthCtrlPack.all; package AVRuCPackage is -- Old package type ext_mux_din_type is array(0 to CExtMuxInSize-1) of std_logic_vector(7 downto 0); subtype ext_mux_en_type is std_logic_vector(0 to CExtMuxInSize-1); -- End of old package constant IOAdrWidth : positive := 16; type AVRIOAdr_Type is array(0 to 63) of std_logic_vector(IOAdrWidth-1 downto 0); constant CAVRIOAdr : AVRIOAdr_Type :=("0000000000000000","0000000000000001","0000000000000010","0000000000000011", "0000000000000100","0000000000000101","0000000000000110","0000000000000111", "0000000000001000","0000000000001001","0000000000001010","0000000000001011", "0000000000001100","0000000000001101","0000000000001110","0000000000001111", "0000000000010000","0000000000010001","0000000000010010","0000000000010011", "0000000000010100","0000000000010101","0000000000010110","0000000000010111", "0000000000011000","0000000000011001","0000000000011010","0000000000011011", "0000000000011100","0000000000011101","0000000000011110","0000000000011111", "0000000000100000","0000000000100001","0000000000100010","0000000000100011", "0000000000100100","0000000000100101","0000000000100110","0000000000100111", "0000000000101000","0000000000101001","0000000000101010","0000000000101011", "0000000000101100","0000000000101101","0000000000101110","0000000000101111", "0000000000110000","0000000000110001","0000000000110010","0000000000110011", "0000000000110100","0000000000110101","0000000000110110","0000000000110111", "0000000000111000","0000000000111001","0000000000111010","0000000000111011", "0000000000111100","0000000000111101","0000000000111110","0000000000111111");

Page 83: Structura Si Organizarea Calculatoarelor

14

-- I/O port addresses -- I/O register file constant RAMPZ_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#3B#); constant SPL_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#3D#); constant SPH_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#3E#); constant SREG_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#3F#); -- End of I/O register file -- UART constant UDR_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#0C#); constant UBRR_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#09#); constant USR_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#0B#); constant UCR_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#0A#); -- End of UART -- Timer/Counter constant TCCR0_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#33#); constant TCCR1A_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#2F#); constant TCCR1B_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#2E#); constant TCCR2_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#25#); constant ASSR_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#30#); constant TIMSK_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#37#); constant TIFR_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#36#); constant TCNT0_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#32#); constant TCNT2_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#24#); constant OCR0_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#31#); constant OCR2_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#23#); constant TCNT1H_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#2D#); constant TCNT1L_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#2C#); constant OCR1AH_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#2B#); constant OCR1AL_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#2A#); constant OCR1BH_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#29#); constant OCR1BL_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#28#); constant ICR1AH_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#27#); constant ICR1AL_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#26#); -- End of Timer/Counter -- Service module constant MCUCR_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#35#); constant EIMSK_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#39#); constant EIFR_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#38#); constant EICR_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#3A#); constant MCUSR_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#34#); constant XDIV_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#3C#); -- End of service module -- EEPROM constant EEARH_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#1F#); constant EEARL_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#1E#); constant EEDR_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#1D#); constant EECR_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#1C#); -- End of EEPROM -- SPI constant SPDR_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#0F#); constant SPSR_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#0E#); constant SPCR_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#0D#); -- End of SPI -- PORTA addresses constant PORTA_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#1B#);

Page 84: Structura Si Organizarea Calculatoarelor

15

constant DDRA_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#1A#); constant PINA_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#19#); -- PORTB addresses constant PORTB_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#18#); constant DDRB_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#17#); constant PINB_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#16#); -- PORTC addresses constant PORTC_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#15#); constant DDRC_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#14#); constant PINC_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#13#); -- PORTD addresses constant PORTD_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#12#); constant DDRD_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#11#); constant PIND_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#10#); -- PORTE addresses constant PORTE_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#03#); constant DDRE_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#02#); constant PINE_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#01#); -- PORTF addresses constant PORTF_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#07#); constant DDRF_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#08#); constant PINF_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#00#); -- ******************** Parallel port address table ************************************** constant CMaxNumOfPPort : positive := 6; type PPortAdrTbl_Type is record Port_Adr : std_logic_vector(IOAdrWidth-1 downto 0); DDR_Adr : std_logic_vector(IOAdrWidth-1 downto 0); Pin_Adr : std_logic_vector(IOAdrWidth-1 downto 0); end record; type PPortAdrTblArray_Type is array (0 to CMaxNumOfPPort-1) of PPortAdrTbl_Type; constant PPortAdrArray : PPortAdrTblArray_Type := ((PORTA_Address,DDRA_Address,PINA_Address), -- PORTA (PORTB_Address,DDRB_Address,PINB_Address), -- PORTB (PORTC_Address,DDRC_Address,PINC_Address), -- PORTC (PORTD_Address,DDRD_Address,PIND_Address), -- PORTD (PORTE_Address,DDRE_Address,PINE_Address), -- PORTE (PORTF_Address,DDRF_Address,PINF_Address)); -- PORTF -- *************************************************************************************** -- Analog to digital converter constant ADCL_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#04#); constant ADCH_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#05#); constant ADCSR_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#06#); constant ADMUX_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#07#); -- Analog comparator constant ACSR_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#08#); -- Watchdog constant WDTCR_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#21#); -- JTAG OCDR (ATmega128)

Page 85: Structura Si Organizarea Calculatoarelor

16

constant OCDR_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#22#); -- JTAG OCDR (ATmega16) --constant OCDR_Address : std_logic_vector(IOAdrWidth-1 downto 0) := CAVRIOAdr(16#31#); -- *************************************************************************************** -- Function declaration function LOG2(Number : positive) return natural; end AVRuCPackage; package body AVRuCPackage is -- Functions function LOG2(Number : positive) return natural is variable Temp : positive; begin Temp := 1; if Number=1 then return 0; else for i in 1 to integer'high loop Temp := 2*Temp; if Temp>=Number then return i; end if; end loop; end if; end LOG2; -- End of functions end AVRuCPackage; 6. Structura sistemelor in VHDL 6.1. Entitati Un sistem digital este format dintr-o colectie ierarhica de module. Fiecare modul are un set de porturi care constituie interfata lui cu exteriorul. Un asemenea modul se numeste in VHDL entity. Sintaxa pentru descrierea unei entitati este:

entitate ::= entity identificator is antet_entitate declaratii_entitate [begin instructiuni_entitate ] end [ nume_simplu_entitate ] ;

antet entitate ::= [ clauze_formale_generice ]

[ clauze_formale_porturi ] clauze generice :.= generic ( lista generic ) ; lista generic ::= lista interfata generica clauze_porturi ::= port ( lista porturi ) ; lista_porturi::= lista interfata porturi declaratie_entitate ::= elemente_declaratie_entitate In partea declarativa a unei entitati se declara elementele care vor fi folosite in implementarea acesteia. De obicei aceste declaratii sint incluse in partea de implementare. De obicei, declaratiile optionale din partea declarativa a unei entitati sint pentru a defini comportamente particulare ale entitatii.

Page 86: Structura Si Organizarea Calculatoarelor

17

Constantele generice pot fi folosite pentru a controla structura si comportamentul entitatii, iar porturile pentru a specifica canalele de intrare si iesire ale entitatii. Ele sint de tip constant. Valoarea actuala a unei constante generice este transmisa in momentul in care entitatea este folosita. Porturile unei entitati sint de tip signal. Sintaxa este: interfata_signal ::= [ signal ] lista-identificatori : [ mod ] subtip [ bus] [ := expresie statica ] Cuvintul bus poate fi folosit daca portul poate fi conectat la mai mult de o iesire . La fel ca la constantele generice, semnalele care trebuie conectate la porturi sint specificate cind entitatea este folosita. Exemple: entity processor is

generic (max_clock_freq: frequency := 30 MHz); port (clock: in bit; address: out integer; data: inout word_32; control: out proc control; ready in bit

); end processor;

In acest caz constanta generica max clock freq este folosita pentru a specifica comportamentul in timp al entitatii. In codul care descrie comportamentul entitatii, se va folosi aceasta valoare pentru a determina intirzierile in schimbarea valorilor semnalelor. In exemlul urmator se arata cum pot fi folositi parametrii generici pentru a specifica o clasa de entitati de structura variabila: entity ROM is

generic (width , depth: positive); port (enable : in bit; address: in bit_vector(depth - 1 downto 0; data : out bit_vector(width - 1 downto 0);

end ROM; Aici cele doua constante generice sint folosite pentru a specifica numarul de biti de date si respectiv de adresa pentru memoria "read-only". Trebuie notat ca nu este data nici o valoare implicita pentru aceste constante. Aceasta inseamna ca atunci cind entitatea este folosita ca o componenta trebuie actualizate valorile acestora. Exemplu de declaratie de entitate fara constante sau porturi generice: entity test bench is end test_bench Cu toate ca acest exemplu pare la prima vedere sa nu aiba sens, de fapt el ilustreaza o utilizare des intilnita a entitatilor: O entitate "top-level" pentru un design in curs de testare (design under test - DUT) este folosita ca o componenta intr-un circuit de tip "banc de lucru" impreuna cu o alta entitate generator de test (test generator - TG). Nu este nevoie de conexiuni externe, deci nu exista porturi. 6.2. Arhitecturi Odata specificata interfata entitatii, una sau mai multe implementari ale acesteia pot fi descrise in sectiunea architecture, care reprezinta corpul entitatii. Pot fi date mai multe arhitecturi care descriu aceeasi entitate. De exemplu, o arhitectura poate descrie pur si simplu comportamentul entitatii, in timp ce alta poate descrie aceeasi entitate ca o colectie ierarhica de componente. In aceasta sectiune vom prezenta numai descrierile structurale. arhitectura ::= architecture identificator of nume entitate is parte_declarativa_arhitectura

begin instructiuni arhitectura end [ nume arhitectura ];

Page 87: Structura Si Organizarea Calculatoarelor

18

parte_declarativa_arhitectura ::= bloc declaratii instructiuni-arhitectura ::= instructiune-concurenta bloc_declaratii ::= declaratie_subprogram

corp_subprogram declaratie_tip declaratie_subtip declaratie_constanta declaratie_alias declaratie_signal declaratie_componente declaratie_configuratie clauza_use

instructiune_concurenta ::= instructiune_bloc instructiune-instantiere_componenta Declaratiile dintr-o arhitectura definesc elemente care vor fi folosite pentru a construi descrierea designului. In particular, semnalele si componentele pot fi declarate aici si folosite pentru a construi o descriere structurala, dupa cum a fost exemplificat. a)Declaratiile de semnal Semnalele sint folosite pentru a conecta submodule. Ele sint declarate cu sintaxa urmatoare: declaratie_signal ::=

signal lista_identificatori : subtip [ tip-signal ][ :=expresie ] ; tip-signal ::= register | bus Expresia din declaratie este folosita pentru a initializa semnalul in timpul fazei de initializare a simulari. Daca expresia este omisa, atunci va fi asignata o valoare implicita. b)Blocuri Submodulele dintr-o arhitectura pot fi descrise ca blocuri. Un bloc este o unitate ce contine propria interfata, conectat cu alte blocuri sau porturi prin semnale. Sintaxa este: bloc ::= eticheta_bloc block [ (expresie_garda) ]

antet_bloc parte_declarativa_bloc begin instructiuni bloc end block [ eticheta bloc ] ;

antet_bloc ::=

[ clauza generica [ map_generic ;] ] [ clauza port ] [ map port ; ] ]

map-generic ::=

generic map ( lista asociatie generic ) map_port ::=

port map ( lista asociatie port ) parte_declarativa_bloc ::= declaratie bloc

instructiuni_bloc ::=

instructiune concurenta

Page 88: Structura Si Organizarea Calculatoarelor

19

Antetul blocului defineste interfata cu blocul respectiv in mod similar cu modul in care antetul entitatii defineste interfata unei entitati. Lista de asociatie generica specifica valorile pentru constantele generic evaluate in blocul inconjurator sau in arhitectura. Lista de asociatie a porturilor specifica care dintre semnalele sau porturile blocului inconjurator sau arhitecturii sint conectate la porturile blocului. Trebuie notat ca instructiunile dintr-un bloc pot de asemenea contine instructiuni bloc, astfel ca un proiect (design) poate fi privit ca o ierarhie de blocuri ce contine descrierea comportamentului la baza ierarhiei. Ca si exemplu, sa presupunem ca se doreste descrierea structurii unei arhitecturi a entitatii procesor descrise intr-o sectiune anterioara. Daca separam procesorul intr-o structura de control si o sectiune ce se ocupa cu calea datelor, putem scrie o descriere ca o pereche de blocuri inlantuite. Unitatea de control are porturile clk, bus control si bus ready, care sint conectate la porturile entitatii procesor. Exista de asemenea un port de iesire pentru controlul caii de date, acesta fiind conectat la un semnal declarat in sectiunea de arhitectura. Acest semnal este conectat de asemenea la un port de control din blocul caii de date. Porturile de date si de adrese ale blocului caii de date sint conectate la porturile corespunzatoare ale entitath respective. Avantajele acestei abordari modulare se refera la faptul ca odata precizate blocurile, fiecare dintre acestea poate fi dezvoltat separat. Aici putem observa aplicarea cu succes a separarii partii de interfata in mod clar, lucru ce permite astfel dezvoltarea in paralel. architecture block_structure of processor is type data-path-control is .... ; signal internal control : data-path-control; begin control_unit: block port (clk: in bit; bus _control : out proc_control;bus _ready: out data-path-control); port map (clk => clock, bus_control => control, bus_ready => ready, control => internal control); --declaratii pentru control_unit

begin instructiuni pentru control-unit

end block control unit; data_path: block port (address: out integer;data : inout word 32; control: in data_path_control); port map (address => address, data=> data, control => internal-control); declaratii pentru data_path begin instructiuni pentru data_path; end block_data_path; end block_structure; c)Declaratii de componente O arhitectura poate folosi de asemenea si alte entitati descrise separat si plasate in biblioteci de proiectare. Pentru aceasta, intr-o arhitectura trebuie sa se declare o componenta la care ne putem gindi ca la un model ce defineste o entitate de proiectare virtuala. Aceasta componenta virtuala va fi instantiata mai tirziu in cadrul arhitecturii. Sintaxa este: componenta ::=

component identificator [ clauza generic-locala ] [ clauza port locala ]

end component; Exemple: component nand3

generic (Tpd : Time := 1 ns ); port (a,b,c :in logic level; y :out logic-level); end component;

component read_only_memory

Page 89: Structura Si Organizarea Calculatoarelor

20

generic(data bits, addr_bits : positive); port( en : in bit;

addr : in bit _vector(depth-1 downto 0); data : out bit_vector(width-1 downto 0);

end component; Acest exemplu declara o poarta cu 3 porturi si un parametru generic care specifica intrizierea de propagare. Instante diferite pot fi folosite apoi cu intirzieri de propagare diferite. Al doilea exemplu declara o componenta de memorie "read-only" ale carei dimensiuni sint dependente de constante generice. b)Instantierea componentelor O componenta definita intr-o arhitectura poate fi definita astfel: instructiune instantiere_componenta::=

eticheta_instantiere: nume_componenta [ map generic ] [ map port ] ;

Aceasta inseamna ca arhitectura contine o instanta a unei componente pentru care sint specificate valorile actuale ale constantelor generice. De asemenea, porturile componentei respective sint conectate la semnalele corespunzatoare sau la porturile entitatii. Enable_gate: nand3 port map (a => enl, b => en2, c => int_req, y => interrupt); Parameter_rom: read_only_memory *generic map* (data bits => 16, addr_bits => 8); port map (en => rom_sel, data => param, addr => a(7 downto 0) ); In primul exempla nu este specificat map-generic, asa ca constanta generica Tpd timpul de propagare) este folosita. In al doilea exemplu sint specificate valorile pentru porturile de adrese si date. --************************************************************************************************ -- ALU(internal module) for AVR core -- Version 1.2 --************************************************************************************************ library IEEE; use IEEE.std_logic_1164.all; entity alu_avr is port( alu_data_r_in : in std_logic_vector(7 downto 0); alu_data_d_in : in std_logic_vector(7 downto 0); alu_c_flag_in : in std_logic; alu_z_flag_in : in std_logic; -- OPERATION SIGNALS INPUTS idc_add :in std_logic; idc_adc :in std_logic; idc_adiw :in std_logic; idc_sub :in std_logic; idc_subi :in std_logic; idc_sbc :in std_logic; idc_sbci :in std_logic; idc_sbiw :in std_logic; adiw_st : in std_logic; sbiw_st : in std_logic;

Page 90: Structura Si Organizarea Calculatoarelor

21

idc_and :in std_logic; idc_andi :in std_logic; idc_or :in std_logic; idc_ori :in std_logic; idc_eor :in std_logic; idc_com :in std_logic; idc_neg :in std_logic; idc_inc :in std_logic; idc_dec :in std_logic; idc_cp :in std_logic; idc_cpc :in std_logic; idc_cpi :in std_logic; idc_cpse :in std_logic; idc_lsr :in std_logic; idc_ror :in std_logic; idc_asr :in std_logic; idc_swap :in std_logic; -- DATA OUTPUT alu_data_out : out std_logic_vector(7 downto 0); -- FLAGS OUTPUT alu_c_flag_out : out std_logic; alu_z_flag_out : out std_logic; alu_n_flag_out : out std_logic; alu_v_flag_out : out std_logic; alu_s_flag_out : out std_logic; alu_h_flag_out : out std_logic ); end alu_avr; architecture rtl of alu_avr is -- #################################################### -- INTERNAL SIGNALS -- #################################################### signal alu_data_out_int : std_logic_vector (7 downto 0); -- ALU FLAGS (INTERNAL) signal alu_z_flag_out_int : std_logic; signal alu_c_flag_in_int : std_logic; -- INTERNAL CARRY FLAG signal alu_n_flag_out_int : std_logic; signal alu_v_flag_out_int : std_logic; signal alu_c_flag_out_int : std_logic; -- ADDER SIGNALS -- signal adder_nadd_sub : std_logic; -- 0 -> ADD ,1 -> SUB signal adder_v_flag_out : std_logic; signal adder_carry : std_logic_vector(8 downto 0); signal adder_d_in : std_logic_vector(8 downto 0); signal adder_r_in : std_logic_vector(8 downto 0); signal adder_out : std_logic_vector(8 downto 0); -- NEG OPERATOR SIGNALS signal neg_op_in : std_logic_vector(7 downto 0);

Page 91: Structura Si Organizarea Calculatoarelor

22

signal neg_op_carry : std_logic_vector(8 downto 0); signal neg_op_out : std_logic_vector(8 downto 0); -- INC, DEC OPERATOR SIGNALS signal incdec_op_in : std_logic_vector (7 downto 0); signal incdec_op_carry : std_logic_vector(7 downto 0); signal incdec_op_out : std_logic_vector(7 downto 0); signal com_op_out : std_logic_vector(7 downto 0); signal and_op_out : std_logic_vector(7 downto 0); signal or_op_out : std_logic_vector(7 downto 0); signal eor_op_out : std_logic_vector(7 downto 0); -- SHIFT SIGNALS signal right_shift_out : std_logic_vector(7 downto 0); -- SWAP SIGNALS signal swap_out : std_logic_vector(7 downto 0); begin -- ######################################################################## -- ############### ALU -- ######################################################################## adder_nadd_sub <=(idc_sub or idc_subi or idc_sbc or idc_sbci or idc_sbiw or sbiw_st or idc_cp or idc_cpc or idc_cpi or idc_cpse ); -- '0' -> '+'; '1' -> '-' -- SREG C FLAG (ALU INPUT) alu_c_flag_in_int <= alu_c_flag_in and (idc_adc or adiw_st or idc_sbc or idc_sbci or sbiw_st or idc_cpc or idc_ror); -- SREG Z FLAG () -- alu_z_flag_out <= (alu_z_flag_out_int and not(adiw_st or sbiw_st)) or -- ((alu_z_flag_in and alu_z_flag_out_int) and (adiw_st or sbiw_st)); alu_z_flag_out <= (alu_z_flag_out_int and not(adiw_st or sbiw_st or idc_cpc or idc_sbc or idc_sbci)) or ((alu_z_flag_in and alu_z_flag_out_int) and (adiw_st or sbiw_st))or (alu_z_flag_in and alu_z_flag_out_int and(idc_cpc or idc_sbc or idc_sbci)); -- Previous value (for CPC/SBC/SBCI instructions) -- SREG N FLAG alu_n_flag_out <= alu_n_flag_out_int; -- SREG V FLAG alu_v_flag_out <= alu_v_flag_out_int; alu_c_flag_out <= alu_c_flag_out_int; alu_data_out <= alu_data_out_int; -- ######################################################################################### adder_d_in <= '0'&alu_data_d_in; adder_r_in <= '0'&alu_data_r_in; --########################## ADDEER ###################################

Page 92: Structura Si Organizarea Calculatoarelor

23

adder_out(0) <= adder_d_in(0) xor adder_r_in(0) xor alu_c_flag_in_int; adder_carry(0) <= ((adder_d_in(0) xor adder_nadd_sub) and adder_r_in(0)) or (((adder_d_in(0) xor adder_nadd_sub) or adder_r_in(0)) and alu_c_flag_in_int); summator:for i in 1 to 8 generate adder_out(i) <= adder_d_in(i) xor adder_r_in(i) xor adder_carry(i-1); adder_carry(i) <= ((adder_d_in(i) xor adder_nadd_sub) and adder_r_in(i)) or (((adder_d_in(i) xor adder_nadd_sub) or adder_r_in(i)) and adder_carry(i-1)); end generate; -- FLAGS FOR ADDER INSTRUCTIONS: -- CARRY FLAG (C) -> adder_out(8) -- HALF CARRY FLAG (H) -> adder_carry(3) -- TOW'S COMPLEMENT OVERFLOW (V) -> adder_v_flag_out <= (((adder_d_in(7) and adder_r_in(7) and not adder_out(7)) or (not adder_d_in(7) and not adder_r_in(7) and adder_out(7))) and not adder_nadd_sub) or -- ADD (((adder_d_in(7) and not adder_r_in(7) and not adder_out(7)) or (not adder_d_in(7) and adder_r_in(7) and adder_out(7))) and adder_nadd_sub); -- SUB --##################################################################### -- LOGICAL OPERATIONS FOR ONE OPERAND --########################## NEG OPERATION #################### neg_op_out(0) <= not alu_data_d_in(0) xor '1'; neg_op_carry(0) <= not alu_data_d_in(0) and '1'; neg_op:for i in 1 to 7 generate neg_op_out(i) <= not alu_data_d_in(i) xor neg_op_carry(i-1); neg_op_carry(i) <= not alu_data_d_in(i) and neg_op_carry(i-1); end generate; neg_op_out(8) <= neg_op_carry(7) xor '1'; neg_op_carry(8) <= neg_op_carry(7); -- ??!! -- CARRY FLAGS FOR NEG INSTRUCTION: -- CARRY FLAG -> neg_op_out(8) -- HALF CARRY FLAG -> neg_op_carry(3) -- TOW's COMPLEMENT OVERFLOW FLAG -> alu_data_d_in(7) and neg_op_carry(6) --############################################################################ --########################## INC, DEC OPERATIONS #################### incdec_op_out(0) <= alu_data_d_in(0) xor '1'; incdec_op_carry(0) <= alu_data_d_in(0) xor idc_dec; inc_dec:for i in 1 to 7 generate incdec_op_out(i) <= alu_data_d_in(i) xor incdec_op_carry(i-1); incdec_op_carry(i) <= (alu_data_d_in(i) xor idc_dec) and incdec_op_carry(i-1); end generate; -- TOW's COMPLEMENT OVERFLOW FLAG -> (alu_data_d_in(7) xor idc_dec) and incdec_op_carry(6) --####################################################################

Page 93: Structura Si Organizarea Calculatoarelor

24

--########################## COM OPERATION ################################### com_op_out <= not alu_data_d_in; -- FLAGS -- TOW's COMPLEMENT OVERFLOW FLAG (V) -> '0' -- CARRY FLAG (C) -> '1' --############################################################################ -- LOGICAL OPERATIONS FOR TWO OPERANDS --########################## AND OPERATION ################################### and_op_out <= alu_data_d_in and alu_data_r_in; -- FLAGS -- TOW's COMPLEMENT OVERFLOW FLAG (V) -> '0' --############################################################################ --########################## OR OPERATION ################################### or_op_out <= alu_data_d_in or alu_data_r_in; -- FLAGS -- TOW's COMPLEMENT OVERFLOW FLAG (V) -> '0' --############################################################################ --########################## EOR OPERATION ################################### eor_op_out <= alu_data_d_in xor alu_data_r_in; -- FLAGS -- TOW's COMPLEMENT OVERFLOW FLAG (V) -> '0' --############################################################################ -- SHIFT OPERATIONS -- ########################## RIGHT(LSR, ROR, ASR) ####################### right_shift_out(7) <= (idc_ror and alu_c_flag_in_int) or (idc_asr and alu_data_d_in(7)); -- right_shift_out(7) shift_right:for i in 6 downto 0 generate right_shift_out(i) <= alu_data_d_in(i+1); end generate; -- FLAGS -- CARRY FLAG (C) -> alu_data_d_in(0) -- NEGATIVE FLAG (N) -> right_shift_out(7) -- TOW's COMPLEMENT OVERFLOW FLAG (V) -> N xor C (left_shift_out(7) xor alu_data_d_in(0)) -- ####################################################################### -- ################################## SWAP ############################### swap_h:for i in 7 downto 4 generate swap_out(i) <= alu_data_d_in(i-4); end generate; swap_l:for i in 3 downto 0 generate swap_out(i) <= alu_data_d_in(i+4); end generate; -- ####################################################################### -- ALU OUTPUT MUX alu_data_out_mux:for i in alu_data_out_int'range generate alu_data_out_int(i) <= (adder_out(i) and (idc_add or idc_adc or (idc_adiw or adiw_st) or -- !!!!! idc_sub or idc_subi or idc_sbc or idc_sbci or (idc_sbiw or sbiw_st) or -- !!!!! idc_cpse or idc_cp or idc_cpc or idc_cpi)) or (neg_op_out(i) and idc_neg) or -- NEG

Page 94: Structura Si Organizarea Calculatoarelor

25

(incdec_op_out(i) and (idc_inc or idc_dec)) or -- INC/DEC (com_op_out(i) and idc_com) or -- COM (and_op_out(i) and (idc_and or idc_andi)) or -- AND/ANDI (or_op_out(i) and (idc_or or idc_ori)) or -- OR/ORI (eor_op_out(i) and idc_eor) or -- EOR (right_shift_out(i) and (idc_lsr or idc_ror or idc_asr)) or -- LSR/ROR/ASR (swap_out(i) and idc_swap); -- SWAP end generate; --@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALU FLAGS OUTPUTS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ alu_h_flag_out <= (adder_carry(3) and -- ADDER INSTRUCTIONS (idc_add or idc_adc or idc_sub or idc_subi or idc_sbc or idc_sbci or idc_cp or idc_cpc or idc_cpi)) or (not neg_op_carry(3) and idc_neg); -- H-flag problem with NEG instruction fixing -- NEG alu_s_flag_out <= alu_n_flag_out_int xor alu_v_flag_out_int; alu_v_flag_out_int <= (adder_v_flag_out and (idc_add or idc_adc or idc_sub or idc_subi or idc_sbc or idc_sbci or adiw_st or sbiw_st or idc_cp or idc_cpi or idc_cpc)) or ((alu_data_d_in(7) and neg_op_carry(6)) and idc_neg) or -- NEG (not alu_data_d_in(7) and incdec_op_carry(6) and idc_inc) or -- INC (alu_data_d_in(7) and incdec_op_carry(6) and idc_dec) or -- DEC ((alu_n_flag_out_int xor alu_c_flag_out_int) and (idc_lsr or idc_ror or idc_asr)); -- LSR,ROR,ASR alu_n_flag_out_int <= alu_data_out_int(7); alu_z_flag_out_int <= '1' when alu_data_out_int="00000000" else '0'; alu_c_flag_out_int <= (adder_out(8) and (idc_add or idc_adc or (idc_adiw or adiw_st) or idc_sub or idc_subi or idc_sbc or idc_sbci or (idc_sbiw or sbiw_st) or idc_cp or idc_cpc or idc_cpi)) or -- ADDER (not alu_z_flag_out_int and idc_neg) or -- NEG (alu_data_d_in(0) and (idc_lsr or idc_ror or idc_asr)) or idc_com; -- @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ end rtl;

Page 95: Structura Si Organizarea Calculatoarelor

26

7. Comportamente VHDL Comportamentul unui sistem digital poate fi descris in termenii unui limbaj de programare. Aspectele legate de paradigma secventiala a VHDL ca limbajj de programare au detaliate in capitolul 2. In acest capitol vom incerca sa descriem modul in care aceste caracteristici ale VHDL sint extinse pentru a include instructiuni ce permit modificarea valorilor unor semnale si mijloace de a raspunde la modificarea valorilor unor semnale. a)Atribuiri pentru semnale Sintaxa este: instructiune_atribuire_semnal ::= destinatie <= [ transport ] forma unda ; destinatie ::= nume | nume-compus forma unda ::= element forma unda , element forma unda element_forma_unda::= valoare_expresie [ after expresie_timp | null [ after expresie time ] Destinatia trebuie sa reprezinte un semnal sau un grup de semnale. Daca expresie timp ce corespunde intirzierii este omisa, atunci se va considera valoarea implicita de 0 fs. Aceasta inseamna ca se va considera ca tranzactia a avut loc simultan cu executia operatiei de atribuire. Asociem fiecarui semnal valoarea prevazuta a formei sale de unda. Atribuirile introduc tranzitii in aceasta forma de unda. De exemplu: s <= ‘0' after 10 ns; Aceasta atribuire va avea ca efect trecerea la '0' a valorii semnalului s la 10 ns dupa executia acesteia. Putem reprezenta valorile prevazute ale unui semnal dat, desenind tranzitiile care apar de-a lungul unei axe pe care consideram timpul. Spre exemplu, daca atribuirea de mai sus ar fi executata la momentul t=5 ns, atunci reprezentarea grafica ar fi cea de mai sus: Cind simularea a atins momentul de timp t=15ns, tranzitia corespunzatoare va fi procesata si valoarea semnalului va fi modificata. Sa presupunem in continuare ca la momentul de timp t=16 ns, executam atribuirea urmatoare: s <= ‘1' after 4 ns, '0' after 20 ns; Vor apare astfel doua not tranzitii. Trebuie notat faptul ca atunci cind intr-o atribuire sint prezente mai multe tranzitii, momentele de timp ce specifica intirzierea trebuiesc sa fie in ordine crescatoare. Este interesant de notat ce se intimpla in cazul executiei unor atribuiri de valori pentru semnale pentru care existau si alte atribuiri anterioare. Aici distingem doua cazuri, dupa cum cuvintul rezervat *transport* este sau nu inclus in instructiunea de atribuire. A stfel daca *transport* apare, atunci intirzierea se numeste intirziere de transport.In aceasta situatie, orice alte tranzitii anterioare tranzitiei cauzate de executia atribuirii curente vor fi sterse. Este ca si cum tranzitiile anterioare ar fi suprascrise de tranzitia cauzata de atribuirea curenta. daca nu se foloseste transport, atunci vom avea de-a face cu al doilea tip de intirziere ce se numeste intirziere inertiala. Acest tip de atribuire a valorii unui semnal corespunde dispozitivelor fizice care nu prezinta un raspuns la excitarea cu un impuls de durata mai mica decit intirzierea pe care o necesita propagarea semnalului de excitatie pina la iesire. In aceasta situatie, vor fi sterse toate acele tranzitii care ar fi trebuit sa aiba loc inainte de tranzitia nou introdusa si vor ramine numai cele care vor avea loc in timp de la momentul de timp corespunzator tranzitiei nou introduse inainte. Cind se executa o atribuire a valorii unui semnal in care se specifica mai multe tranzitii, prima tranzitie va fi considerata de tip inertial, iar restul de tip intirziere de transport. b)Procese. Instructiunea wait

Page 96: Structura Si Organizarea Calculatoarelor

27

Unitatea de baza intr-o descriere comportamentala de tip VHDL este procesul. Un proces este un corp de cod cu executie secventiala ce poate fi activat ca raspuns la o schimbare de stare. Atunci cind se executa mai mult de un proces la un moment dat, executia va avea loc concurent. Procesele sint specificate conform sintaxei urmatoare: instructiune_proces ::= [ eticheta proces : ]

process [ ( lista semnale ) ] parte declarativa proces

begin instructiuni_proces

end process [ eticheta proces ] ; parte_declarativa_proces :.= element declaratie proces element_declaratie_proces ::= declarare subprogram

corp_subprogram declarare_tip declarare_subtip declarare_constante declarare_variabile declarare_alias clauza_use

instructiuni proces ::= instructiune_secventiala instructiune secventiala ::= instructiune wait

instructiune_atribuire instructiune_atribuire_semnal instructiune_atribuire_variabile instructiune_if apel_procedura instructiune_case instructiune_loop instructiune_next instructiune_exit instructiune_return instructiune_nula

O instructiune de tip proces este o instructiune concurenta ce poate fi folosita in corpul unei arhitecturi sau al unui bloc. Partea declarativa defineste elementele ce pot fi folosite local in cadrul procesului. Trebuie notat ca variabilele definite intr-un proces pot fi folosite la pastrarea starii in cadrul unui model. Un proces poate contine instructiuni de atribuire a valorilor unui semnal dat. Aceste instructiuni de atribuire formeaza impreuna ceea ce se numeste un driver pentru acel semnal. In mod normal ar trebui sa existe un singur driver pentru orice semnal considerat, astfel incit codul ce defineste valorile pe care le poate avea un semnal sa fie restrins in interiorul unui singur proces. Un proces este activat initial in cadrul fazei de initializare a simularii. Procesul va executa toate instructiunile secventiale si apoi va relua executia de la inceput. Eventual, procesul va fi blocat in executia unei instructiuni de tip wait. Aceasta instructiune are urmatoarea sintaxa: instructiune wait wait [ clauza-semnale ] [ clauza-conditii ] [clauza timeout];

clauza_semnale::=on lista_semnale lista_semnale::= nume_semnal , nume-semnal clauza_conditii::= until conditie clauza_timeout::= for expresie_timp

Lista de semnale a unei instructiuni de tip wait specifica un set de semnale fata de care procesul respectiv este sensibil in timpul perioadei in care este blocat. Atunci cind se petrece un eveniment ce afecteaza oricare din aceste semnale - adica se schimba valoarea semnalului - procesul respectiv va iesi din blocare si va reevalua conditia. Daca conditia este adevarata, sau daca conditia este omisa, atunci executia va continua cu urmatoarea instructiune, altfel procesul se va reintoarce in starea de blocare in care se afla anterior.

Page 97: Structura Si Organizarea Calculatoarelor

28

Daca lista de semnale este omisa, atunci procesul respectiv este sensibil la valoarea tuturor semnalelor ce apar in expresia conditiei. Cu alte cuvinte, o modificare a valorii unui semnal dih expresia conditiei va duce la "trezirea" procesului respectiv si la reevaluarea conditiei. In cazul in care si lista de semnale si conditia sint omise dintr-un proces, este posibil ca acesta sa ramina blocat un timp nedefinit. Daca lista de semnale apare explicit in antetul unui proces, atunci se presupune ca acel proces va contine ca ultima instructiune o instructiune de tip wait a carei lista de semnale este identica cu lista specificata in antet. In acest caz este posibil ca procesul sa nu mai contina nici o alta instructiune de tip wait explicita. Iata in continuare un exemplu: process (reset, clock)

variable state : bit := false; begin

if reset then state := false; elsif clock = true then state := not state; end if q <= state after prop_delay; -- wait implicit pentru modificarea valorii semnalelor reset si

clock. end process; In faza de initializare a simularii procesul este activat si se executa atribuirea valorii initiale a semnalului q. Apoi procesul se va bloca la executia instructiunii wait implicite indicate in comentariu. La orice modificare a valorii unuia dintre semnalele reset sau clock, procesul va fi "trezit" si se va reevalua valoarea semnalului q. Urmatorul exemplu descrie comportarea unui circuit de sincronizare numit "Muller _C". Acest dispozitiv se foloseste in construirea circuitelor logice asincrone. Iesirea dispozitivului este initial '0' si ramine la aceasta valoare pina cind ambele intrari ale circuitului sint ' 1'. In acest moment iesirea devine ' 1' si ramine la aceasta valoare pina cind ambele intrari ale circuitului devin '0', moment in care va lua valoarea '0' din nou. Descrierea VHDL este urmatoarea: muller_c_2: process begin

wait until a='1' and b='1'; q<='1'; wait until a='0' and b='0';

q<=’0’; end process muller_c_2; Din cauza ca acest proces nu contine o lista de semnale este necesara folosirea explicita a instructiunilor de tip wait. In ambele instructiuni wait, lista semnalelor este formata din a si b, derivate din conditia testata. c)Instructiuni concurente de atribuire a valorilor unui semnal. Adesea, un proces ce descrie un driver pentru un semnal contine o singura instructiune de atribuire a valorii acelui semnal. Limbajul VHDL ofera posibilitatea de a folosi o notatie scurta pentru acest lucru. Aceasta notatie poarta numele de instructiune concurenta de atribuire a valorilor unui semnal. Sintaxa este: instructiune_concurenta_semnal ::= [eticheta : ] atribuire_conditionala_semnal | [ eticheta : ] atribuire_selectiva_semnal Pentru fiecare tip de atribuire concurenta a valorii unui semnal exista o varianta corespunzatoare cu lists de semnale in antetul unui proces. a)Atribuire conditionala Acest tip de atribuire a valorii unui semnal corespunde situatiei in care in cadrul unui proces se face atribuirea de valori unui semnal in interiorul unei instructiuni if. Sintaxa este:

atribuire_conditionals_semnal ::= destinatie <= optiuni forma_unda_conditionala ; optiuni ::= [ guarded ] [ transport ] forma_unda_conditionala :.= forma_unda when conditie else forma_unda

Page 98: Structura Si Organizarea Calculatoarelor

29

Daca se include cuvintul cheie *transport*, atunci atribuirile corespunzatoare din proces vor fi facute cu intirziere de tip transport. b)Atribuire selectiva O instructiune de atribuire selectiva a valorii unui semnal corespunde unei instructiuni de atribuire ce se executa in interiorul unei instructiuni de tip case. Sintaxa este: atribuire_selectiva ::= with expresie select

destinatie <= optiuni forma_unda_selectie; forma_unda_selectie ::= forma_unda when posibilitati , forma_unda when posibilitati posibilitati ::= posibilitate I posibilitate Optiunile sint aceleasi ca si pentru atribuirea conditionala. Cu alte cuvinte, daca cuvintul rezervat *transport* apare, atunci atribuirile corespunzatoare din proces vor fi facute cu intirziere de tip transport. Lista de semnale pentru instructiunea wait se determina in felul urmator: daca in instructiunea de atribuire selectiva nu apare nici o referinta explicita la vreun semnal, atunci lista de semnale pentru acea instructiune wait va fi vida. In caz contrar, lista de semnale a instructiunii wait va contine acele semnale care au fost referite in interiorul instructiunii de atribuire selectiva. Iata in continuare un exemplu de instructiune de atribuire selectiva: with alu_function select alu-result <= op1 + opt2 when alu_add I alu-incr, opl - op2 when alu_substract, opl and opt when alu_and, opl or opt when alu_or, opt and not opt alu mask; In acest exemplu, valoarea semnalului alu function este folosita pentru a selecta care dintre instructiunile de atribuire se va executa. Instructiunea contine in lista ei de semnale urmatoarele semnale alu function, op 1, opt, astfel incit oricare dintre aceste trei semnale isi va schimba valoarea, instructiunea de atribuire selectiva isi va relua executia. 8.Organizare model In acest capitol se va arata cum se poate scrie o descriere completa VHDL a unui sistem digital. a)Unitati si biblioteci de design Descrierile VHDL se scriu intr-un "design file" , se analizeaza cu un compiler care le introduce intrun "design library". O biblioteca este formata din mai multe unitati ("library units"). Unitatile de biblioteca primare sint declarathle de unitati, de package-uri si de configuratie. Unitatile de biblioteca secundare sint corpurile de package-uri si arhitecturile. Aceste unitati depind de specificarea interfetei lor, care se face in unitati primare. Deci unitatile de biblioteca primare trebuie analizate inaintea oricarei unitati secundare corespunzatoare. Un fisier de design ("design file") contine mai multe unitati de biblioteca. Sintaxa este:

fisier_design ::= unitate design unitate design unitate_design ::= clauza_context unitate_biblioteca clauza_context ::=context context ::= clauza biblioteca I clauza use clauza biblioteca ::= library lista nume logic ; lista_nume_logic ::= nume logic , nume_logic unitate_biblioteca ::= unitate primara unitate secundara unitate_primara ::=declaratie_entitate declaratie-configuratie declaratie_package unitate_secundara ::= arhitectura I corp_package

Bibliotecile sint referite folosind identificatori numiti NUME LOGICE. Numele logic trebuie tradus de sistemul de operare gazda in alt nume, dependent de implementare. De exemplu, bibliotecile pot fi niste fisiere de baze de date, numele logic reprezentind numele unui fisier de baze de date. Unitatile dintr-o biblioteca pot fi referite prin prefixarea numelui for cu numele logic al bibliotecii. "ttl lib.ttl_10" se poate referi h unitatea "ttl_10" din biblioteca "ttl lib".

Page 99: Structura Si Organizarea Calculatoarelor

30

Clauza care precede fiecare unitate specifica ce alte biblioteci sau package-uri sint folosite. Scopeul numelor specifcate in clauza de context se intinde pina la sfirsitul unitatii de design. Exista 2 biblioteci speciale care sint disponibile implicit tuturor unitatilor, si deci nu a necesar sa fie numite in clauze de context. WORK este biblioteca de lucru, in care vor fi plasate de catre analizor unitatile de design curente. Intr-o unitate se pot referi unitatile analizate anterior folosind numele bibliotecii "work". STD este o biblioteca de design care contine package-urile "standard" si "textio". "Standard" contine toate tipurile si functiile predefinite. Toate elementele din acest package sint implicit vizibile, deci nu e necesara clauza use pentru a le accesa. b)Configuratii. Am aratat cum se poate declara o specificare de componente intr-o descriere structurala, si cum se pot crea instante ale componentelor. Legatura dintre o entitate si componente se face prin declararea de configuratie. Intr-o astfel de declaratie se pot specifics constantele generice actuale pentru componente si blocuri. Sintaxa este: declarare_configuratie ::=configuration identificator of nume_entitate is

parte_declarativa_configuratie configuratie bloc end [ nume_configuratie ];

parte_declarativa_configuratie ::= declarare configuratie declarare_configuratie ::= clauza_use configuratie_bloc ::=

for specificare bloc clauza_use conf iguratie

end for ; specificare_bloc ::= nume-arhitectura | eticheta_instructiune_bloc configuratie ::= configuratie_bloc | configuratie_componenta configuratie_componenta ::= for specificare_componenta [ use legatura ; ] [ configuratie_bloc ] end for ; specificare_componenta ::= lista_instantieri nume_componenta lista_instantieri ::= eticheta_instantiere , eticheta_instantiere

others all legatura ::=

aspect_entitate [ map_generic ] [ map port ]

aspect_entitate :.= entity nume_entitate [(identificator arhitectura)] configuration nume-configuratie open map-generic ::= generic map (lista asociatii generic) map port ::= port map (lists asociatii port) Configuratia unei astfel de arhitecturi este: configuration test_config of processor is use work.processor_types. all for block_structure … … … … … … … … elemente configuratie … … … … … … … … end for end test_config; In acest exemplu, continutul package-ului "processor types" din biblioteca de lucru curenta este vizibil, iar configurarea de bloc se refera la arhitectura "block structure" a entitatii "processor". Se pot configura submodulele dintr-o arhitectura. Acestea contin blocuri si instante de componente. Iata o configurare de blocuri pentru arhitectura prezentata mai sus:

Page 100: Structura Si Organizarea Calculatoarelor

31

configuration test_config of processor is use work.processor_types. all for block_structure

for control_unit … … … … … … … … elemente_configuratie

… … … … … … … … end for; for data_path … … … … … … … … elemente_configuratie

… … … … … … … … end for;

end_for; end test_config; Daca submodulul este o instanta a unei componente, configuratia componentei este folosita pentru a lega o entitate de instanta componentei. Fie blocul "data-path", care contine o instanta a componentei "alu", declarata astfel: data_path: block port(lista porturi);

port map (lista asociatii); component alu

port(function: in alu_function; opl,op2: in bit_vector_32; result: out bit-vector-32); end component ; … … … … … … … alte declaratii pentru data_path … … … … … … … begin

data_alu:alu port map(function=>alu fn,opl=>bl,op2=>b2, result=>alu r); … … … … … … … alte declaratii pentru data_path … … … … … … … end block data_path; Fie biblioteca "project cells" cu entitatea "alu cell" definita astfel: entity alu_cell is generic(width : positive); port( function code : in alu_function; operand1, operand2 : in bit_vector(width-1 downto 0); result : out bit_vector(width-1 downto 0); flags : out alu_flags); end alu_cell; Entitatea are o arhitectura numita "behaviour". Aceasta entitate poate fi legata cu instanta "alu" daca porturile operanzi si rezultat pot fi puse in corespondenta cu porturile componentei, porturile "flags" putind fi lasate neconectate. for data_path for data_alu:alu use entity project cells.alu_cell (behaviour) generic map (width=>32) port map (function code=>function, operandi=>opl, operand2=>op2, result=>result, flags=> open ); end for ; … … … … … … … alte declaratii pentru data path … … … … … … … end for ; Daca biblioteca include si o configuratie "alu-struct" pentru o arhitectura a entitatii "alu_cell" atunci configuratia de bloc arata astfel: for data_path

for data alu:alu use configuration project_cells.alu_struct generic map (width => 32)

Page 101: Structura Si Organizarea Calculatoarelor

32

port map (function code=>function, operandi=>opl, operand2=>op2, result=>result, flags=> open );

end for ; … … … … … … … alte declaratii pentru data path … … … … … … …

end for ; c)Exemplu complet Prezentam in continuare un fisier de design pentru exemplul din capitolul 1. Fisierul contine mai multe unitati de design care sint analizate in ordine. Prima unitate reprezinta declararea entitatii "count2". Urmeaza 2 entitati secundare - arhitecturi ale entitatii "count2". Urmeaza o alta deeclarare de entitate, un test pentru numarator ("test bench"). Urmeaza o unitate secundara, care reprezinta descrierea structurala a bancii de test. Urmeaza o declarare de configuratie, care face referiri la unitatile de bibliteca definite anterior, din biblioteca de lucru si deci nu a nevoie de clauza de context. Se observa ca entitatea "cunt2" este referita in cadrul configuratiei cu numele "work. count2". Urmeaza o declrare de configuratie cu arhitectura "structure" a entitatii "count2". Ea utilizeaza 2 unitati("misc.t flipflop", "misc. inverter") din biblioteca separata "misc", deci e necesara o clauza de biblioteca. Aceasta descriere cuprinde toate unitatile intr-un singur fisier. Dar a posibil ca unitatile de design sa fie impartite pe mai multe fisiere ( cazul extrem fiind o unitate intrun fisiewr). Daca exista mai multe fisiere, ele trebuie compilate in ORDINEA corecta, si trebuie recompilate fisierele dependente de o unitate in care s-au operat modificari. --unitate primara: declaratia entitatii count2 entity count2 is

generic(prop_delay: Time := 10 ns); port(clock: in bit; q1,q0 . out bit);

end count2; --unitate secundara: architectura-comportament pentru count2 architecture behaviour of count2 is begin count_up: process (clock)

variable count-value: natural := 0; begin if clock='1' then

count value:=(count value+1) mod4; q0<=bit'val(count_value mod 2) after prop_delay; q1<=bit'val(count_value/2) after prop delay;

end if ; end process count_up; end behaviour ; --unitate secundara: architectura-structura pentru count2 architecture structure of count2 is

component t_flipflop port(ck: in bit; q: out bit); end component; component inverter port(a: in bit;y: out bit); end component; signal ffo,ffi,inv_ff0: bit;

begin bit-0: t-flipflop port map (ck=>clock, q=>ff0); inv: inverter port map (a=>ff0, y=>inv ff0); bit 1:t flipflop port map (ck=>inv-ff0, q=>ffl); q0<=ff0; q1<=ff1;

end structure ; --unitate primara: declaratia entitatii de testare entity test _count2 is end test count2;

Page 102: Structura Si Organizarea Calculatoarelor

33

--unitate secundara: arhitectura-structura pentru test architecture structure of test_count2 is

signal clock,q0,q1: bit; component count2

port(clock: in bit; q1,q0: out bit); end component; begin counter : count2 port map (clock => clock, q0 => q0, q1 => q1); clock driver : process

begin wait for 100 ns; end process clock_driver;

end structure; -- unitate primara: configuratie cu architectura comportament configuration test count2 behaviour of test_count2 is for structure pentru test_count2 for counter : count2 use entity work.count2(behaviour); end for; end for ; end test_count2_behaviour; -- unitate primara: configuratie cu architectura structura library misc; configuration test_count2_structure of test_count2 is

for structure --pentru test_count2 for counter : count2

use entity work.count2(structure); for structure --pentru count_2

for all :t_flipflop use entity misc.t_flipflop(behaviour);

end for; for all :inverter

use entity misc.inverter(behaviour); end for;

end for; end for;

end for; end test_count2_structure;

9.VHDL - notiuni avansate a) Rezolutie de semnale si magistrate In majoritatea sistemelor digitale magistralele conecteaza un numar de iesiri ale dispozitivelor pe aceeasi linie. VHDL de obicei permiteun singur dispozitiv pentru un semnal. Pentru a modela semnale pentru mai multe dispozitive VHDL foloseste notiunea de "resolved types"(tipuri rezolvate) pentru semnale. Un tip rezolvat include la definire o functie de rezolutie care is valori pentru toate dispozitivele legate la o linie, rezultind valoarea finala a semnalului. Un tip rezolvat pentru un semnal este declarat cu sintaxa pentru subtip:

subtip::=[ nume functie rezolutie ] tip [ constringere ] Functia de rezolutie trebuie definita anterior. Functia are ca parametru un tablou cu valori de subtipul semnalului si terbuie sa intoarca ca rezultat acelasi subtip. De exemplu: type logic_level is (L,Z,H); type logic_array is array (integer range < >) of logic_level; subtype resolved_level is resolve_logic logic_level;

Page 103: Structura Si Organizarea Calculatoarelor

34

In acest exemplu, tipul logic level reprezinta 3 posibile stari ale unui semnal digital : L(low), Z(high-impedance), H(high). Subtipul resolved-level este folosit pentru declararea semanalului rezolvat de acest tip. Functia de rezolutie poate fi implementata astfel: function resolve_logic(drivers:in logic array) return logic_level; begin

for index in drivers'range loop if (drivers(index) = L then return L; end if

end loop; return H;

end resolve logic; Aceasta functie 'bucleaza' pe un tablou de dispozitive, si daca unul dintre ele are valoarea L, functia intoarce valoarea L. Altfel functia intoarce H. b) Tranzitii in 0 VHDL furnizeaza facilitatea de a modela iesiri care pot trece in inalta impedanta. Un semnal de acest gen poate specifica absenta unei valori specificate pentru semnal, aceasta insemnind ca driveul poate fi deconectat. In scopul realizarii acestui lucru se folosesc elemente cu forma de unda nula. Sintaxa pentru forma de unda a elementului este:

waveform_element ::= value expresion [ after time_expresion | null [ after time expresion ] Un exemplu despre cum se face asignarea semnalului este:

d_out < = null after Toz; Daca toate drivere-le semnalului sint deconectate, se naste intrebarea care este valoarea semnalului ? Apar doua posibilitati, depinzind de tipul declararii semnalului: ca semnal de tip *register* sau *bus*. Pentru semnale de tip *registru*, valoarea cea mai recent determinata ramine ca valoare a semnalului. Pentru semnalele de tip bus, functia de rezolutie trebuie sa determine valoarea semnalului cind nici un driver nu este activ pe magistrala. Este o modalitate prin care magistrale de tip open-colector sau tri-state pot sa fie modelate. c) Instructiunea generate VHDL are in plus instructiuni concurente care pot fi folosite in arhitecturi pentru a descrie structuri regulate, precum vectori de blocuri, instante ale unor componente sau procese. Sintaxa este: instructiunea_generate ::=eticheta_generate

schema generare generate instructiune_concurenta end generate [eticheta-generate] ;

schena_generare ::= for generarespecificamet_paramie_rparametru-generare | if conditie

Schemele de generare for sint folosite pentru a descrie structurii repetitive. Schemele de generare if sint de obicei folosite pentru a descrie cazuri de exceptie in cadrul structurilor cum ar fi cum ar fi conditiile care apar la limita. Aceste sint exemplificate in exemplul urmator. Sa presupunem ca descriu structura unui sumator construit cu celule full_adder cu exceptia celulei care are repartizat bitul cel mai putin semnificativ, celula care este de tip half_adder. adder : for i in 0 to width-1 generate

is_bit : if i = 0 generate is_cell half_addre port map (a(0), b(0), sum(0), c_in(1));

end generate is_bit; middle bit: if = width -1 generate ms_cell : full adder port map (a(i), bn(i), sum(i), c in(i+1));

end_generate middle bit; ms_bit : if = width -1 generate

ms_cell : full adder port map (a(i), bn(i), sum(i), carry); end_generate ms_bit;

end generate adder;

Page 104: Structura Si Organizarea Calculatoarelor

35

Prima instructiune de generare iteraza dupa i de la 0 pina la width - 1. Pentru cel mai putin semnificativ bit (i = 0) se genereaza o instanta a unui "half adder". Bitii de intrare sint conectati la bitii cei mai putini semnificativi biti ai lui a si b, iar iesirea este conectata la cel mai putin semnificativ bit al sumei, carry find conectat carry-in al urmatorului nivel. Pentru bitii intermediari, se genereaza instante a "full adder-ului", cu intrarile si iesirile conectate in mod asemanator cu cele ale primului nivel. Pentru ultimul nivel se genereaza o noua instanta pen tru"full adder", dar carry este conectat la iesirea Carry a sumatorului. d) Asertiuni concurente si apeluri de proceduri Sint doua tipuri de instructiuni concurente care nu au fost discutate in capitolele anterioare: asertiuni concurente si apeluri de proceduri concurente. O asertiune concurenta este echivalenta cu un proces care contine o asertiune urmata de o instructiune wait. Sintaxa este: asertiune_concurenta :: = [ eticheta: ] asertiune Asertiunea concurenta de semnal este: L : assert conditie report eroare *severity* valoare si este echivalenta cu procesul: L : process

begin assert conditie report eroare severity valoare;

wait [clauza]; end process L;

Clauza instructiunii wait include toate semnalele care au fost referite in conditie. Daca nici un semnal nu este referit se poate spune despre proces ca a fost activat la initierea simularii, s-au verificat conditiitle si a fost suspendat. Cealalta instructiune concurenta, apel de procedura concurenta, este echivalenta cu un proces care contine un apel de procedura urmat de o instructiune de asteptare (wait). Sintaxa este: apel_procedura concurenta ::= [ eticheta: ] apel procedura Procedura nu trebuie sa aiba parametrii formali din clasa variable intrucit nu este posibil ca o variabila sa fie vizibila in orice loc unde estefolosita o instructiune concurenta. Lista de clauze a instructiunii de asteptare (wait) include toate semnalelele care sint parametrii actuali de tip in sau inout in apelul de procedura. Apelurile concurente sint pentru definirea acelor comportamente care pot fl folosite in locuri diferite sau in module diferite. De exemplu sa presupunem ca in package-ul bit_vect arith se declara procedura: procedure add(signal a,b : in bit vector; signal result : out bit vector); Un exemplu al apelului procedurii concurente este: adder : bit_vector_arith.add(sample, old accum, new accum); Aceasta declaratie este echivalenta cu procesul: begin

bit_vector_arith.add(sample, old accum, new accum); wait on sample, old accum;

end process adder; e) Instructiuni sub entitati Sintaxa pentru declararea unei entitati este: entitate ::= *entity* identificator is antet_entitate

parte_declarativa_entitate

Page 105: Structura Si Organizarea Calculatoarelor

36

[ begin instructiuni_entitate ] end [ nume_entitate ]; instructiuni entitate ::= instructiune entitate

instructiune_entitate ::= asertiune_concurenta | apel concurent_pasiv | proces-pasiv Instructiunile concurenta care sint permise intr-o declaratie de entitate trebuie sa fie fie pasive, aceasta insemna ca nu vor contine nici o asignare de semnal. Un rezulat al acestei reguli este ca asemenea procese nu pot modifica starea entitatii sau a circuitului in care este folosita entitatea. Ele pot monitoriza starea si deci pot fi folosite pentru a raporta conditii de operare eronate ale entitatii.