13.01.2013 Views

1.INTRODUCERE. 1.1. Scurt istoric privind dezvoltarea - 3x2CB - iNES

1.INTRODUCERE. 1.1. Scurt istoric privind dezvoltarea - 3x2CB - iNES

1.INTRODUCERE. 1.1. Scurt istoric privind dezvoltarea - 3x2CB - iNES

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>1.INTRODUCERE</strong>.<br />

<strong>1.1.</strong> <strong>Scurt</strong> <strong>istoric</strong> <strong>privind</strong> <strong>dezvoltarea</strong> echipamentelor de prelucrare a datelor.<br />

Un calculator modern reprezinta un sistem complex care inglobeaza in constructia sa<br />

tehnologii diverse: electronice, magnetice, electromecanice, electrono-optice etc. Astfel, in<br />

prezent, pentru realizarea unitatii centrale a unui calculator, care asigura stocarea<br />

programului si a datelor pe termen scurt, secventierea instructiunilor si efectuarea<br />

operatiilor de calcul, se utilizeaza, cu precadere, tehnologii microelectronice. Pentru<br />

stocarea datelor si a programelor pe termen lung se folosesc suporturi magnetice sub forma<br />

de benzi sau discuri, bazate pe diverse tehnologii magnetice/optice. Pentru implementarea<br />

operatiilor de intrare/iesire sunt folosite in principal tehnologiile electronice si<br />

electromecanice.<br />

Evolutia calculatoarelor este strans legata de progresele inregistrate de tehnologiile amintite<br />

mai sus. Cercetarile efectuate pentru realizarea de calculatoare cat mai performante au<br />

impulsionat aprofundarea unor noi aspecte in cadrul acestor tehnologii.<br />

Calculatoarele moderne reprezinta rezultatul unui indelungat proces de cautari ale unor<br />

mijloace tehnice adecvate pentru mecanizarea si automatizarea operatiilor de calcul.<br />

In evolutia mijloacelor de tehnica de calcul se pot evidentia mai multe etape.<br />

1. Etapa instrumentelor de calcul.<br />

• Secolul 12 en., China - abacul.<br />

• Sfarsitul sec. 17 si inceputul sec.18, J. Napier si R. Bissaker -rigla de calcul.<br />

2. Etapa masinilor mecanice de calcul ( bazate pe roti dintate angrenate: roata dintata<br />

joaca rolul elementului cu mai multe stari stabile, fiecare stare codifica o cifra zecimala. )<br />

• 1642. B. Pascal realizeaza o masina de adunat.<br />

• 1694. von Leibniz construieste o masina de adunat si inmultit.<br />

• 1823. Ch.Babbage proiecteaza primul calculator cu executie automata a programului.<br />

Proiectul prevedea principalele elemente ale calculatoarelor moderne (unitatile de:<br />

memorie, calcul, intrare, iesire si comanda ).<br />

• 1872 E. Barbour realizeaza prima masina de calcul cu imprimanta.<br />

• 1892. W. Burroughs construieste o masina de calcul de birou perfectionata.<br />

• 1912. F. Baldwin si J. Monroe incep productia de masa a masinilor mecanice de<br />

calculat, cu patru operatii aritmetice.<br />

3. Masini electromecanice de calculat (bazate pe roti dintate angrenate, actionate


electric ).<br />

• 1930. Productia de masa a masinilor electromecanice de calculat prevazute cu operatiile:<br />

adunare, scadere, inmultire, impartire, radacina patrata, subtotal etc.<br />

• 1937 - 1945. Masini electromecanice de calculat, bazate pe relee electromagnetice<br />

(Mark I ), cu program cablat. Releele electromagnetice si contactele lor joaca rolul<br />

elementelor bistabile. Cu ajutorul lor se pot codifica cifrele sistemului de numeratie binar.<br />

In 1937 Howard Aiken, de la Universitatea Harward, a propus proiectul Calculatorului cu<br />

Secventa Automata de Comanda. Acesta folosea principiile enuntate de Ch. Babbage si<br />

tehnologia de implementare pentru calculatoarele electromecanice produse de IBM.<br />

Constructia calculatorului Mark I a inceput in 1939 si s-a terminat la 7 august 1944, data ce<br />

marcheaza inceputul erei calculatoarelor.<br />

4. Masinile electronice de calcul cu program memorat, bazate la inceput pe tuburi<br />

electronice, apoi pe tranzistori si circuite integrate pe scara simpla (SSI: sub 20 de<br />

tranzistori pe pastila de Si), medie (MSI: 20 - 1000 de tranzistori pe pastila de Si), larga<br />

(LSI: 1000 – 50.000 de tranzistori pe pastila de SI), foarte larga (VLSI: 50.000 – 100.0000<br />

de tranzistori pe pastila de Si) si ultra larga (ULSI: peste 1.000.000 de tranzistori pe pastila<br />

de Si).<br />

Primele calculatoare realizate cu tuburi electronice:<br />

• 1943: la Universitatea din Pennsylvania a inceput constructia primului calculator bazat<br />

pe tuburi electronice ENIAC ( Electronic Numerical Integrator And Computer ), de catre o<br />

echipa avand in frunte pe J.P. Eckert, J.W. Mauchly si J. von Neumann. Cu aceasta ocazie<br />

s-a folosit ideea de a stoca in aceeasi memorie, atat datele, cat si programul, ceea ce a<br />

permis modificarea relativ usoara a programului;<br />

• 1945: a inceput constructia unui alt calculator electronic EDVAC (Electronic Discrete<br />

Variable Automatic Computer) pe baza lucrarii lui J.von Neumann: "Prima schita de Raport<br />

asupra lui EDVAC". Dupa elaborarea structurii logice de baza a calculatorului cu<br />

program memorat, au fost stabilite entitatile functionale care concurau la realizarea acestuia:<br />

- un mediu de intrare care sa permita introducerea unui numar nelimitat de operanzi si<br />

instructiuni;<br />

- o memorie din care se citesc operanzi sau instructiuni si in care se pot introduce, in<br />

ordinea dorita, rezultatele;<br />

- o sectiune de calcul, capabila sa efectueze operatii aritmetice sau logice asupra<br />

operanzilor cititi din memorie;


- un mediu de iesire, care sa permita livrarea unui numar nelimitat de rezultate catre<br />

utilizator;<br />

- o unitate de comanda, capabila sa interpreteze instructiunile citite din memorie si sa<br />

selecteze diverse variante de desfasurare a operatiilor, in functie de rezultatele obtinute<br />

pe parcurs.<br />

Marea majoritate a calculatoarelor construite pana in prezent se bazeaza pe aceste principii,<br />

purtand numele de calculatoare de tip von Neumann.<br />

Pe baza proiectului EDVAC, Eckert si Mauchly au produs, in 1951, in cadrul unei<br />

companii proprii, primul calculator comercial UNIVAC 1.<br />

La Universitatea Princeton, von Neumann a condus realizarea, in 1951, a calculatorului<br />

IAS, care dispunea de posibilitatea de a-si modifica partea de adresa din instructiune.<br />

Aceasta facilitate asigura reducerea spatiului ocupat in memorie de catre program, ceea ce<br />

permite prelucrarea unor seturi mai mari de date.<br />

Avand in vedere tehnologiile utilizate in constructia calculatoarelor, incepand cu anul 1946,<br />

se pot evidentia cinci generatii de calculatoare. Intrucit functia de prelucrare a datelor este<br />

legata si de cea de transmitere a datelor, printre caracteristicile specifice fiecarei generatii de<br />

calculatoare trebuie incluse si elementele reprezentative <strong>privind</strong> tehnologiile<br />

telecomunicatiilor.<br />

In tabelul de mai jos se prezinta caracteristicile generatiilor de sisteme de calcul si de<br />

telecomunicatii.<br />

Tabelul 1.<br />

Evolutia generatiilor de calculatoare si a telecomunicatiilor.<br />

Generatia I ( 1946-1956 ).<br />

1. Hardware calculatoare: relee, tuburi electronice, tambur mag netic, tub catodic.<br />

2. Software calculatoare: programe cablate, cod masina, autocod.<br />

3. Exemple de calculatoare: ENIAC, EDVAC, UNIVAC 1, IBM 650, CIFA 1-4 1 ,<br />

CIFA 101-102, MARICCA, MECIPT-1 .<br />

4. Tehnologia telecomunicatiilor: teletype, telefon.<br />

5. Performantele calculatoarelor: capacitate memorie 2 Koct, viteza de operare 10.000<br />

instr/s.<br />

1 Denumirile calculatoarelor produse in Romania sunt prezentate cu litere cursive


Generatia a II-a ( 1957 - 1963 ).<br />

1. Hardware calculatoare: tranzistoare, memorii cu ferite, cablaj imprimat, discuri<br />

magnetice.<br />

2. Software calculatoare: limbaje de nivel inalt (Algol, FORTRAN).<br />

3. Exemple de calculatoare: NCR 501, IBM 7094, CDC 6600, DACICC-1/2,<br />

CET 500/501, MECIPT-2,DACICC-200.<br />

4. Tehnologia telecomunicatiilor: transmisiuni numerice, modulatie in coduri de impulsuri.<br />

5. Performantele calculatoarelor: capacitatea memoriei 32 Koct,viteza de operare<br />

2.000.000 instr/s.<br />

Generatia a III-a ( 1964 -1981 )<br />

1. Hardware calculatoare: circuite integrate, memorii semiconductoare, cablaj imprimat<br />

multistrat, microprocesoare, discuri magnetice, minicalculatoare.<br />

2. Software calculatoare: limbaje de nivel foarte inalt, programare structurata, LISP,<br />

sisteme de operare orientate pe limbaje ( Algol, Pascal ),timp<br />

partajat, grafica pe calculator, baze de date.<br />

3. Exemple de calculatoare: IBM 360-370, PDP11/XX, Spectra 70, Honeywell 200,<br />

Cray-1, Illiac IV, Cyber 205, RIAD 1-2, Felix C-256/512/1024,<br />

Independent 100/102F, Coral 4001/4030.<br />

4. Tehnologia telecomunicatiilor: comunicatii prin satelit, microunde, retele, fibre optice,<br />

comutare de pachete.<br />

5. Performantele calculatoarelor: capacitatea memoriei 2 Moct, viteza de operare 5 mil.op/s.<br />

Generatia a IV-a ( 1982 - 1989 ).<br />

1. Hardware calculatoare: VLSI, sisteme distribuite, discuri optice, microcalculatoare de<br />

16/32 biti,superminicalculatoare, supercalculatoare.<br />

2. Software calculatoare: sisteme de operare evoluate, ADA, pachete de programe de larga<br />

utilizare, sisteme expert, limbaje orientate pe obiecte, baze de<br />

date relationale.<br />

3. Exemple de calculatoare: IBM-43xx, VAX-11/7xx, IBM-308x, RIAD3, Coral 4021,<br />

Independent 106, Felix 5000, Coral 8730.<br />

4. Tehnologia telecomunicatiilor: retele integrate de comunicatii numerice ( digitale ).<br />

5. Performantele calculatoarelor: capacitatea memoriei 8 Moct, viteza de operare 30<br />

mil.instr/s


Generatia a V-a ( 1990 - ).<br />

1.Hardware calculatoare: tehnici evoluate de impachetare si interconectare, ULSI,<br />

proiectare circuite integrate 3D, tehnologii Ga-AS si Josephson,<br />

componente optice, arhitecturi paralele pentru prelucrarea<br />

inferentelor, retele neuronale.<br />

2. Software calculatoare: sisteme de operare cu interfata evoluata cu utilizatorul, limbaje<br />

concurente, programare functionala, prelucrare simbolica<br />

(limbaje naturale, recunoasterea formelor: imagini/voce), Prolog,<br />

baze de cunostinte, sisteme expert evoluate, CAD, CAM, CAE,<br />

multimedia, realitate virtuala, web.<br />

3. Exemple de calculatoare: statii de lucru, super-calculatoare, retele de supercalculatoare,<br />

proiectul japonez si alte proiecte elaborate in unele tari sau<br />

grupuri de tari din Europa.<br />

4. Tehnologia telecomunicatiilor: <strong>dezvoltarea</strong> extensiva a sistemelor distribuite, retele<br />

locale, retele din fibra optica de mare capacitate retele de<br />

transmisii radio la frecvente de ordinul GHz cu spectru<br />

imprastiat, telefonie digitala mobila, fuzionarea<br />

tehnologiilor comunicatiilor si calculatoarelor, Internet.<br />

5. Performantele calculatoarelor: capacitatea memoriei zeci-sute Moct, viteza de operare<br />

1 Ginstr - 1 Tinstr/s.<br />

In prezent pentru circuitele integrate folosite in calculatoarele electronice se folosesc<br />

numeroase tehnologii care se pot grupa in tehnologii bipolare si tehnologii MOS<br />

Tehnologii bipolare:<br />

• TTL (Transistor Transistor Logic):<br />

- TTL-S (Schottky TTL),<br />

- TTL-LS (Low-Power Schottky TTL),<br />

- TTL-AS (Advanced Schottky TTL),<br />

- TTL-ALS (Advanced Low-power Schottky TTL),<br />

- FAST (Fairchild Advanced Schottky TTL).<br />

• ECL (Emitter Coupled Logic).<br />

• I2L (Integrated Injection Logic).<br />

Tehnologii MOS:


• PMOS (MOS canal P).<br />

• NMOS (MOS canal N):<br />

- HMOS (High performance MOS).<br />

• CMOS (Complementary MOS):<br />

- HCMOS (High density CMOS),<br />

- ACL (Advanced CMOS Logic).<br />

• MNOS (Metal Nitride Oxide Semiconductor):<br />

- FAMOS (Floating gate Avalanche injection MOS),<br />

- FLOTOX (FLOating gate Tunnel Oxid)e.<br />

Circuitele integrate care se folosesc in constructia calculatoreor se plaseaza in categoriile:<br />

standard, specifice aplicatiilor ( ASIC - Application Specific Integrated Circuits ) si<br />

programabile/configurabile.<br />

La rindul lor circuitele ASIC se impart in:<br />

• Circuite personalizate la cerere ( Semi-Custom ):<br />

- Circuite configurabile ( Programmable Logic Devices ),<br />

- Circuite predifuzate ( Gate Arrays ).<br />

• Circuite realizate la comanda ( Custom ):<br />

- Circuite precaracterizate ( Standard Cells ),<br />

- Circuite realizate complet la cerere ( Full Custom ).<br />

Se aminteste ca tranzistorul a fost inventat in anul 1947 si ca primele exemplare ocupau o<br />

suprafata de 3,5 mm 2 . La sfirsitul anilor 50 a aparut circuitul integrat care, grupand pe<br />

aceeasi pastila mai multi tranzistori, a avut o evolutie spectaculoasa in sensul dublarii<br />

numarului de componente pe pastila, la fiecare 18 luni. Aceasta s-a datorat in primul rand<br />

numeroaselor perfectionari ale proceselor tehnologice, care permit rezolutii de ordinul a<br />

2,5µm – 0,18 µm.<br />

In continuare se vor da unele date <strong>privind</strong> tehnologiile circuitelor VLSI, in general, evolutia<br />

memoriilor si a procesoarelor.


Reprezentarea sistemelor de calcul pe niveluri ierarhice.<br />

Nivelul PMS Structuri: retele, sisteme de procesoare multiple,<br />

(Processor, calculatoare.<br />

Memory Componente: procesoare, memorii, comutatoare,<br />

Switches ) traductoare, operatori asupra datelor,<br />

legaturi, controlere.<br />

Nivelul Subnivelul Aplicatii Structuri: pachete statis tice, ecuatii cu derivate<br />

Progra- Limbajelor partiale, simulatoare de sisteme<br />

melor. evoluate. energetice.<br />

Componente: biblioteci matemetice, rutine, rutine de<br />

formatare.<br />

Rutine Structuri: functii matematice, pachete pentru<br />

aplicative aplicatii grafice.<br />

Componente: subrutine, alocatoare de memorie.<br />

Pachete de Structuri: alocatoare de memorie, rutine de I/E,<br />

asistenta in sisteme de fisiere.<br />

in timpul Componente: apeluri ale sistemului de operare.<br />

executiei.<br />

Sisteme Structuri: planificatoare, alocatoare, comunicatii.<br />

Operare Componente: subrutine, corutine, programe.<br />

Subnivelul Structuri: set de instructiuni.<br />

ISP Componente: stare memorie, stare procesor, calcul<br />

(Instruction adresa efectiva, decodificare<br />

Set Processor) instructiuni, executie instructiuni.<br />

Nivelul Subnivelul Unitate Micropro- Structuri: microprogram, microrutina.<br />

proiec- transferu- de co- gramata Componente: microsecventi ator, memorie<br />

tarii rilor intre manda de microinstructiuni.<br />

registre<br />

Conven- Structuri: secventiator.<br />

tionala Componente: masini secventiale.<br />

Unitate de executie Structuri: unitate aritmetica, registre<br />

generale.<br />

Componente: registre, operatori asupra<br />

datelor.<br />

Subnivelul Circuite secventiale Structuri: numaratoare, genratoare<br />

circuitelor functionale, registre.<br />

de comuta- Componente: bistabile, latch-uri,linii de<br />

tie. intarziere


Circuite combina- Structuri: codificatoare, decodificatoare,<br />

tionale. operatori asupra datelor.<br />

Componente: porti logice.<br />

Nivelul circuitelor. Structuri: amplificatoare,elemente de intirziere,<br />

orologiu /ceas, porti.<br />

Componente: tranzistoare, relee, rezistente, capaci-<br />

tati.<br />

Bibliografie:<br />

1. A.Petrescu. Calculatoare numerice. Note de curs.1999- 2000-2001, ( site-ul: www.csitsun.pub.ro<br />

si pe suport magnetic).<br />

2. A.Petrescu. I. Francisc, Z. Racovita. Initiere in Structura Calculatoarelor Electronice.<br />

Editura Teora. 1996.<br />

3. A.S. Tanenbaum. Organizarea Structurata a Calculatoarelor. Editura AGORA, 1999.<br />

4. L.N. Vintan. Arhitecturi de Procesoare cu Paralelism la Nivelul Instructiunilor. Editura<br />

Academiei Romane. 2000.<br />

5. D. Grigoras. Calcul Paralel. De la sisteme la programarea aplicatiilor. AGORA. 2000.<br />

6. J. Hennessy, D. Paterson. Computer Architecture. A Quantitative Approach. 2 nd ed.<br />

1996. Morgan Kaufmann Publishers, Inc.<br />

7. Z.F. Baruch. Sisteme de intrare/iesire ale calculatoarelor. Editura Albastra. 2000<br />

8. S.G. Shiva. Computer Design and Architecture. 3 rd Ed. Marcel Dekker Publishing<br />

House. 2000.<br />

9. J. Hennessy, D. Paterson. Computer Organization and Design. The Hardware/Software<br />

Interface. 2 nd ed.. 1998. Morgan Kaufmann Publishers, Inc.<br />

10. R. Baron, L. Higbie. Computer Architecture. 1992. Addison Wesley Publishing<br />

Company.<br />

11. M. Morris Mano, Ch. R. Kime. Logic and Computer Design Fundamentals 2 nd ed.<br />

Prentice Hall International. Inc.<br />

12. David Van den Bout. The Practical XILINX ® Designer Lab Book.Version 1.5, 1999.<br />

Prentice Hall.<br />

13. V..P. Heuring, H. F. Jordan. Computer Systems Design and Architecture. Addison<br />

Wesley Longman, Inc. 1997.


1.2 Elemente introductive <strong>privind</strong> informatia.<br />

Memorarea, regasirea si prelucrarea informatiei reprezinta operatii de baza intilnite in<br />

studiul oricarui capitol al stiintei calculatoarelor.<br />

Din punct de vedere lexicografic, informatia reprezinta cunostintele transmise sau<br />

receptionate, care se refera la circumstante sau fapte particulare.<br />

Sub aspect filosofic informatia se afla in urmatoarea relatie, in raport cu entitatile:<br />

data, cunostinta, intelepciune: data < informatie < cunostinta < intelepciune.<br />

Domeniul ingineriei considera ca informatia inlatura/elimina incertitudinea. Astfel,<br />

informatia nu are nimic de-a face cu cunostinta sau semnificatia. Informatia este, in mod<br />

natural, “ceea ce nu se poate prezice”.<br />

In cadrul procesului edificarii domeniului teoriei informatiei s-au dat si precizat o serie<br />

de definitii formale <strong>privind</strong> continutul informational al unui mesaj ( Hartley - 1928,<br />

Kolmogorov - 1942, Wiener - 1948, Shannon - 1949 ).<br />

Se considera un sistem reprezentand o multime formata din n obiecte, avand proprietatea<br />

ca fiecare obiect poseda o probabilitate independenta pi de aparitie.<br />

Incertitudinea H asociata acestui sistem este definita ca:<br />

n<br />

H = - ∑ pi log2 (pi),<br />

i=1<br />

in timp ce valoarea –H, reprezinta cantitatea de informatie asociata sistemului<br />

Se presupune existenta unei urne cu 8 bile numerotate de la 1 la 8. Probabilitatea de a<br />

extrage o cifra data, in urma unei trageri, este egala cu 1/8. Incertitudinea medie asociata<br />

cu numarul selectat poate fi calculata cu ajutorul formulei de mai sus:<br />

8<br />

H = - ∑ 1/8. log2 (1/8) = - log2 (1/8) = log2 (1/8) = 3 biti.<br />

i=1<br />

Pentru a masura incertitudinea asociata sistemului s-a folosit o unitate de masura numita<br />

bit (binary digit). Un bit este o masura a incertitudinii sau a informatiei asociate unei<br />

conditii cu doua stari: fals/adevarat, inchis/deschis etc. Astfel, atunci cand se afirma ca<br />

rezultatul aruncarii unei monede este “pajura”, s-a comunicat o informatie de: log2(2/1) =<br />

1 bit.


Cantitatea de informatie care se castiga este egala cu cantitatea de incertitudine inlaturata<br />

(in cazul de fata prin aflarea numarului extras din urna).<br />

In situatia numarului selectat din urna s-a calculat ca sunt necesari trei biti de informatie<br />

pentru a afla numarul de pe bila extrasa. Din punctul de vedere al definitiei bitului,<br />

aceasta inseamna ca este permisa punerea a trei intrebari cu raspuns de tipul da - nu,<br />

pentru a cunoaste numarul extras:<br />

n


Legatura dintre mesaj si informatie reprezinta o aplicatie c:<br />

c<br />

M � I,<br />

care asociaza ( pune in corespondenta ) mesajului M, informatia I. Corespondenta c<br />

poarta numele de schema de codificare (cod, regula, de interpretare, cifru , cheie etc. ).<br />

Adesea se pune problema cantitatii medii de informatie continuta intr-un sir de date,<br />

reprezentand M mesaje. Aceasta poarta numele de entropie si poate fi calculata cu<br />

ajutorul urmatoarei formule:<br />

unde:<br />

N<br />

entropia = ∑ (Mi/N).log2(N/Mi),<br />

i=1<br />

- (Mi/N) reprezinta probabilitatea mesajului i, iar<br />

- log2(N/Mi) constituie informatia din mesajul i.<br />

Codificarea informatiei.<br />

Codificarea informatiei se refera la reprezentarea acesteia. Gasirea unei codificari<br />

corespunzatoare si eficiente constituie o problema extrem de importanta intrucat aceasta<br />

are un impact pe o serie de niveluri.<br />

Astfel, la nivelul echipamentelor de calcul si memorare, are influenta asupra numarului<br />

de componente. In ceea ce priveste nivelul eficientei, influenta se refera la numarul de biti<br />

utilizati. Sunt influentate, de asemenea, nivelul fiabilitatii, sub aspectul zgomotului si<br />

nivelul securitatii, in ceea ce priveste criptarea.<br />

Codificarea cu lungime fixa.<br />

In cazul in care evenimentele au aceeasi probabilitate de aparitie, se pot utiliza codurile<br />

de lungime fixa. Un asemenea cod trebuie sa foloseasca un numar suficient de biti pentru<br />

a putea reprezenta continutul informational. De exemplu, in cazul cifrelor zecimale<br />

{0,1,2,3,4,5,6,7,8,9} se foloseste un cod de 4 biti (binar-zecimal), denumit , in engleza,<br />

BCD (Binary Coded Decimal). Lungimea codului (numarul de biti) rezulta din<br />

urmatoarea expresie:


10<br />

∑ (1/10).log2(10) = 3,322 < 4 biti<br />

i=1<br />

De asemenea, pentru cele 84 de caractere din Engleza: {A-Z (26), a-z (26), 0-9 (10),<br />

punctuatie (9), matematice(9), financiare (4)} se foloseste un cod binar de 7 biti denumit<br />

ASCII (American Standard Code for Information Interchange). Lungimea codului ASCII<br />

rezulta din expresia de mai jos:<br />

84<br />

∑ (1/84).log2(84)= 6,392 < 7 biti.<br />

i=1<br />

In continuare se vor prezenta exemple de codificari de lungime fixa.<br />

Codificarea numerelor.<br />

Numerele pozitve se pot codifica direct, sub forma unei secvente de biti, carora li se<br />

asociaza ponderi diferite. De la dreapta la stanga, aceste ponderi reprezinta, in ordine<br />

crescatoare, puteri ale lui 2. Valoarea v a unui numar de n biti, codificat in acest mod,<br />

este data de expresia:<br />

n-1<br />

v = ∑ 2 i .bi<br />

i=0<br />

unde bi constituie rangul i (bitul i) al reprezentarii.<br />

Pentru numarul binar:<br />

2 11 2 10 2 9 2 8 2 7 2 6 2 5 2 4 2 3 2 2 2 1 2 0<br />

0<br />

1<br />

1 0<br />

1 0<br />

se va obtine valoarea 1721 in zecimal.<br />

1 1<br />

1 0<br />

0 1<br />

Adesea, reprezentarea numerelor in binar este greoaie, datorita numarului mare de<br />

ranguri. Reprezentari cu lungime mai scurta se obtin in cazul utilizarii unor baze, care<br />

sunt puteri ale lui 2. De exemplu: 8 si 16. In aceste situatii trecerea de la reprezentarea<br />

binara la cea octala/hexazecimala si invers se realizeaza mecanic, impartind numarul


inar, de la dreapta la stanga, in triade/tetrade binare, carora li se pun in corespondenta<br />

cifrele octale/hexazecimale corespunzatoare.<br />

Baza 8 Baza 16<br />

Triada binara Cifra octala Tetrada binara cifra hexa. Tetrada binara cifra hexa.<br />

000 - 0 0000 - 0 1000 - 8<br />

001 - 1 0001 - 1 1001 - 9<br />

010 - 2 0010 - 2 1010 - a<br />

011 - 3 0011 - 3 1011 - b<br />

100 - 4 0100 - 4 1100 - c<br />

101 - 5 0101 - 5 1101 - d<br />

110 - 6 0110 - 6 1110 - e<br />

111 - 7 0111 - 7 1111 - f<br />

Astfel, numarul binar:<br />

011010111001(2) va avea urmatoarele reprezentari:<br />

octala:<br />

3271(8) si<br />

hexazecimala:<br />

6b9(16),<br />

care sunt de trei ori si, respectiv, de patru ori mai scurte.<br />

Numere cu semn, reprezentarea in complementul fata de 2.<br />

Un numar cu semn, in reprezentarea pe n biti, complementara fata de 2, va avea<br />

urmatoarea structura:<br />

-2 n-1<br />

2 n-2<br />

…. ….<br />

n biti<br />

….<br />

bit de semn Gama de reprezentare:[ -2 n-1 , 2 n-1 -1] virgula zecimala<br />

(0 pentru ≥ 0,<br />

1 pentru < 0)<br />

Astfel, numerele zecimale 47(10) si –47(10), vor avea urmatoarele reprezentari binare, pe 8<br />

biti, in complementul fata de 2:<br />

47(10) 00101111(2)<br />

-47(10) 11010001(2)<br />

2 3<br />

2 2<br />

2 1<br />

2 0


Reprezentarea numerelor intregi cu semn, in complementul fata de 2, permite utilizarea<br />

aceleiasi proceduri mod 2 n , atat pentru adunare, cat si pentru scadere. De asemenea,<br />

procedura se utilizeaza si in cazul numerelor fara semn.<br />

Deplasand virgula zecimala spre stanga, se pot reprezenta si numerele fractionare, ca in<br />

exemplul urmator:<br />

1101,0001 = -2 3 + 2 2 + 2 0 + 2 -4 = -8 + 4 + 1 + 0,0625 = -2,9357<br />

Codificarea cu lungime variabila.<br />

In cazul unor evenimente cu probabilitati diferite de aparitie, se vor folosi secvente mai<br />

scurte pentru codificarea evenimentelor cu probabilitati mari de aparitie, in timp ce<br />

pentru codificarea evenimentelor cu probabilitati mici de aparitie se vor folosi secvente<br />

mai lungi.<br />

Exemplul 1.<br />

Se considera 4 evenimente: A, B, C, D, cu probabilitatile de aparitie si cu codurile<br />

asociate, conform tabelei de mai jos:<br />

Eveniment A B C D<br />

Prob. aparitie (pi) 1/2 1/4 1/8 1/8<br />

Codificare 0 11 100 101<br />

Informatia medie = (0,5).(1) + (0,25).(2) + (2).(0,125).(3) = 1,750 biti<br />

Transmiterea informatiei <strong>privind</strong> 1000 de evenimente necesita, in medie, 1750 biti.<br />

O schema de decodificare a unui mesaj ce contine codurile unei secvente de evenimente<br />

A, C, D, A, B, C etc. se conformeaza urmatoarei structuri arborescente:<br />

0 1<br />

A 0 1<br />

0 1 B<br />

C D


Pentru a realiza o codificare mai efeicienta, in mod current, se codifica secvente de<br />

evenimente si nu evenimente individuale. Aceasta abordare este intalnita in algoritmii de<br />

compresie a fisierelor.<br />

Exemplul 2.<br />

In cadrul acestui nou exemplu se considera suma a doua zaruri, in sensul evaluarii<br />

continutului de informatie existent in suma obtinuta la o aruncare. Rezultatele inregistrate<br />

in cadrul mai multor aruncari au probabilitati diferite. Posibilitatile de obtinere a<br />

diferitelor sume sunt prezentate mai jos:<br />

Informatia medie, la o aruncare, furnizata de suma a doua zaruri este urmatoare:<br />

12 12<br />

imed = ∑ (Mj/N).log2(N/Mj) = ∑ (pj).log2(1/pj) = 3,275 biti.<br />

j=2 j=2<br />

In continuare, se pune problema codificarii sumelor obtinute in cadrul aruncarilor a<br />

doua zaruri.<br />

Cel mai mare intreg dupa 3,274 este 4. Astfel, cu 4 biti, se pot codifica cele 11 valori ale<br />

sumelor. Vor mai ramane neutilizate 5 coduri, corespunzatoare lui 0, 1, 13, 14, si 15.<br />

Se pune problema daca exista o solutie de codificare mai buna?<br />

Avand in vedere continuturile informationale diferite, ale diferitelor combinatii obtinute<br />

la aruncarea zarurilor, se poate recurge la coduri de lungime diferita. Astfel, se poate<br />

construi un arbore binar, selectand recursiv cele doua simboluri cu cea mai mica


probabilitae, combinandu-le apoi intr-un nod si inserand acest nod ca un nou simbol a<br />

carui probabilitate de aparitie este egala cu suma probabilitatilor celor doi copii. Procesul<br />

se continua pana cand se ajunge la un singur simbol.<br />

Rezultatul acestei proceduri este arborele reprezentat mai jos, in cadrul caruia au fost<br />

atribuite codificari fiecarui smbol prin etichetarea fiecarui copil din extrema dreapta cu<br />

“1” si a fiecarui copil din extrema stanga cu ”0”.<br />

Codificarea pentru fiecare simbol particular se obtine prin parcurgerea arborelui pe o<br />

cale ce porneste de la radacina acestuia pana la simbolul care intereseaza. Aceasta forma<br />

de codificare cu lungime variabila poarta numele de codificare Huffman.<br />

Eficienta codificarii.<br />

Eficienta unei metode de codificare poate fi masurata prin diferenta intre continutul<br />

informational (entropia) al unui sir de simboluri si dimensiunea medie a codului.<br />

Dimensiunea medie a codului stabilit pentru sumele obtinute la aruncarea a doua zaruri<br />

se calculeaza astfel:<br />

dmed = (1/36).5 + (2/36).4 + (3/36).3 + (4/36).3 + (5/36).3 + (6/36).3 +<br />

+ (5/36).3 + (4/36).3 + (3/36).4 + (2/36).4 + (1/36).5 = 3,306<br />

Rezultatul obtinut: dmed = 3,306 se apropie destul de mult de imed = 3,275.<br />

In continuare se pune problema gasirii unor metode si mai eficiente de codificare.


Consideratii <strong>privind</strong> codificarea.<br />

Schemele de codificare, care isi propun sa corespunda continutului informational al unei<br />

secvente de date, se bazeaza pe reducerea redundantei. Acestea sunt in esenta tehnici de<br />

compresie a datelor.<br />

In multe cazuri insa se urmareste cresterea redundantei in vederea cresterii rezistentei<br />

(coduri detectoare si corectoare de erori)la zgomot a sirului de date sau a simplificarii<br />

manipularii datelor, prin stabilirea unor coduri de lungime fixa.<br />

Detectarea si corectarea erorilor.<br />

Se presupune ca se doreste transmisia sigura a rezultatului aruncarii unei monede, ceea ce<br />

corespunde unei informatii de un bit.. Daca pe parcursul transmisiei a aparut o eroare de<br />

un singur bit, un rezultat “0” va fi receptionat ca “1” si invers. Ambele coduri sunt valide<br />

si nu se poate stabili , la receptie, faptul ca, in timpul transmisiei, a aparut o eroare.<br />

In acest context se pune problema numarului de pozitii binare in cadrul carora bitii<br />

corespunzatori a doua coduri valide, de aceeasi lungime, sunt diferiti. Aceasta mai poarta<br />

numele de distanta Hamming. Astfel, modificarea unui bit, intr-un rang dat al unui cod,<br />

sa nu-l transforme pe acesta intr-un alt cod valid. In exemplul privitor la rezultatul<br />

aruncarii unei monede si al comunicarii acestuia, distanta Hamming intre cele doua<br />

coduri este egala cu unu.<br />

Detectarea erorii.<br />

In mod natural se doreste un sistem de codificare in cadrul careia o eroare de un singur<br />

bit sa nu produca un alt cod valid. Pentru a asigura detectarea unei erori de un singur bit ,<br />

in cadrul unui cod de lungime oarecare, se adauga un bit de paritate. In acest mod<br />

distanta Hamming minima intre doua coduri valide devine egala cu 2. Spre exemplificare<br />

se prezinta mai jos o diagrama de codificare a rezultaului aruncarii unei monede, folosind<br />

un bit suplimentar de paritate para, ceea ce inseamna ca bitul suplimentar va fi astfel ales<br />

incat numarul total de unitati din cuvantul cod sa fie par.


Daca D este distanta minima Hamming intre doua cuvinte-cod, se pot detecta pana la<br />

(D –1) erori la nivel de bit.<br />

Detectarea erorilor.<br />

Marind distanta Hamming intre doua cuvinte-cod valide la 3, se poate garanta ca<br />

perechile de cuvinte-cod, care se obtin in cazul unei erori de un bit, nu se suprapun. In<br />

cazul in care se detecteaza o eroare, aceasta se poate corecta intrucat pozitia bitului eronat<br />

poate fi localizata. Aceasta rezulta din diagrama- hipercub de mai jos.<br />

Daca D este distanta Hamming minima intre doua cuvinte-cod valide, se pot corecta<br />

⎣(D-1)/⎦ biti eronati.<br />

Intrebari:<br />

- se pot detecta in mod sigur doi biti eronati in timp ce se corecteaza o eroare de un<br />

bit?<br />

- intotdeauna este necesara triplarea numarului de biti?


Schema de codificare cu 4 biti.<br />

Prin folosirea a 4 biti se pot genera 8 codificari cu distanta Hamming egala cu 1, ceea ce<br />

permite detectarea unei erori la nivelul unui singur bit. Astfel, se pot codifica 3 biti de<br />

informatie cu 4 biti. Formatele de biti care contin o eroare difera de formatele codurilor<br />

valide prin paritate, adica numarul de unitati este impar. Aceasta rezulta din diagrama de<br />

mai jos, care constituie reprezentarea in plan a hipercubului corespunzator codificarii.<br />

Din pacate schema de codificare cu 4 biti nu este mai buna decat schema de codificare cu<br />

3 biti, din punctual de vedere al numarului de coduri separate la o distanta Hamming<br />

egala cu 3. Se pot gasi insa doua codificari cu distanta Hamming egala cu 4, ceea ce<br />

permite detectarea a doua erori de cate un bit si corectia unei singure erori de un bit.<br />

Dupa cum se vede din diagrama de mai sus exista doar doua coduri care sunt separate<br />

printr-o distanta Hamming egala cu 3.<br />

Schema de codificare cu 5 biti.<br />

Pentru a obtine mai mult de doua coduri separate printr-o distanta Hamming egala cu 3,<br />

trebuie utilizati 5 biti pentru codificare.


Mai jos se prezinta 5 coduri {0000, 01111, 10101, 1010} separate printr-o distanta<br />

Hamming ≤ 3.<br />

In aceste conditii se poate corecta o eroare de 1 bit si se pot detecta unele dintre erorile de<br />

2 biti (dar nu toate).<br />

Aplicatiile teoriei codurilor.<br />

Codificarea permite solutionarea multor probleme:<br />

- detectarea erorilor multi-bit: folosind verificarea redundantei ciclice (CRC);<br />

- corectarea erorilor in rafala: coduri reed-Solomon;<br />

- imbunatatirea raportului S/Z: codificari/decodificari Viterbi, PRML;<br />

In practica se utilizeaza combinatii de coduri diferite. Spre exemplu, in canalul numeric<br />

satelit-receptor (DBS TV):


3. Elemente introductive <strong>privind</strong> operarea si organizarea unui sistem numeric.<br />

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

de programe de sistem ( software de baza ), care asigura prelucrarea automata a<br />

informatiilor, in conformitate cu algoritmii specificati de catre utilizator, prin programele<br />

de aplicatii ( software de aplicatii - utilizator ).<br />

Conform principiilor stabilite de John von Neumann un calculator trebuie sa posede<br />

urmatoarele elemente:<br />

- un mediu de intrare, pentru instructiuni si date ( operanzi );<br />

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

- un ansamblu de prelucrare, capabil sa efectueze operatii aritmetice si logice, in<br />

conformitate cu un algoritm dat, specificat prin program;<br />

- un mediu de iesire, pentru extragerea rezultatelor si prezentarea acestora intr-o forma<br />

accesibila utilizatorului;<br />

- un element de decizie care, pe baza rezultatelor partiale obtinute pe parcursul<br />

prelucrarii, va selecta una din optiunile posibile de continuare a calculelor.<br />

Programul elaborat, pentru un calculator numeric, reprezinta descrierea algoritmului de<br />

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

poate executa calculatorul respectiv.<br />

Conform propunerii lui von Neumann, datele si programul sunt plasate in aceeasi<br />

memorie, ceea ce a permis, la calculatoarele din generatia I-a, efectuarea unor operatii<br />

aritmetice sau logice asupra unor campuri din instructiune, in vederea reducerii<br />

dimensiunilor programelor.<br />

Functionarea calculatorului are un caracter secvential, constand in citiri si executii<br />

succesive ale instructiunilor programului.<br />

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

informatii: fluxul datelor, care se prelucreaza, si fluxul instructiunilor, care controleaza,<br />

comanda procesul de calcul.<br />

Calculatoarele bazate pe principiile amintite mai sus se numesc calculatoare de tip von<br />

Neumann sau conventionale, fiind comandate de fluxul de instructiuni.


In prezent se studiaza si realizeaza sub forma de modele de laborator noi tipuri de<br />

calculatoare, neconventionale, bazate pe fluxul de date si fluxul de cereri.<br />

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

sunt disponibile datele implicate.<br />

In al doilea caz necesitatea unui rezultat activeaza toate operatiile de calcul asociate.<br />

Intrucat un calculator numeric este folosit, in esenta, pentru implementarea automata a<br />

unui algoritm, se reaminteste ca un algoritm reprezinta un set finit de reguli, care<br />

precizeaza o secventa de operatii, pentru solutionarea unei clase date de probleme.<br />

Un algoritm poseda cinci elemente mai importante:<br />

- caracter finit: trebuie sa se termine dupa un numar finit de pasi;<br />

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

care se executa trebuie sa fie specificate riguros, fara ambiguitati, pentru fiecare caz.<br />

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

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

anumita relatie cu intrarile;<br />

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

Printre altele, analiza algoritmilor are ca scop determinarea performantelor acestora, in<br />

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

ei este mai potrivit, sub aspectul numarului de operatii, al spatiului de memorie necesare<br />

si, uneori, al puterii consumate, pentru implementare.<br />

Teoria algoritmilor trateaza, in principal, problemele existentei sau nonexistentei<br />

algoritmilor eficienti,pentru efectuarea unor calcule particulare.<br />

Inainte de a incerca o descriere formala a unei metode de calcul se vor preciza unele<br />

notiuni:<br />

- variabilele de stare reprezinta marimi primare, care presupun unele valori bine definite<br />

(ele pot reprezenta parametrii unui sistem fizic);<br />

- un ansamblu de variabile de stare, in care fiecare poarta un nume, reprezinta multimea<br />

variabilelor de stare;<br />

- o atribuire data de valori pentru toate variabilele multimii variabilelor de stare poarta<br />

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


- ansamblul tuturor starilor posibile, pentru o multime data de variabile de stare,<br />

formeaza spatiul starilor pentru acea multime;<br />

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

al secventei reprezinta starea initiala, iar ultimul constituie starea finala.<br />

Din punct de vedere formal, metoda de calcul reprezinta un cuadruplu:<br />

< Q, I, E, f >,<br />

in care s-au facut urmatoarele notatii:<br />

Q -multimea starilor calculului,<br />

I - multimea intrarilor,<br />

E -multimea iesirilor,<br />

f - multimea functiilor de calcul, definite in Q.<br />

In plus:<br />

I⊂ Q si E⊂ Q,<br />

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

f(q) = q,<br />

Fiecare intrare x in multimea I defineste o secventa de calcul:<br />

x0, x1, x2,..,xk,...., dupa cum urmeaza:<br />

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

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

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

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

x(k+1) = xk.<br />

Unele secvente de calcul pot avea o lungime infinita.<br />

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

foarte mare) de pasi, pentru toate intrarile x ⊂ I.<br />

Exemplu: Algoritmul MAX.<br />

Acest algoritm gaseste elementul cu valoarea cea mai mare al multimii { A(i) },<br />

unde 1 ≤ i ≤ n, si o atribuie iesirii MAX.<br />

In cele ce urmeaza operatorul " " specifica atribuirea unei valori variabilei de stare<br />

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


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

ALGORITM: MAX.<br />

intrari: { A(i) }, 1 ≤ i ≤ n,<br />

iesiri: MAX,<br />

var.de stare: { xc, xm }.<br />

f: secventa de calcul:<br />

1. if n < 1 go to STOP<br />

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

3. xm A(1); xc A(2);<br />

4. if xm < xc then xm xc<br />

5. xc A(i)<br />

6. i i+1<br />

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

8. go to 4<br />

9. STOP<br />

Mecanizarea acestui algoritm presupune existenta unui modul, care dispune de<br />

urmatoarele resurse hardware:<br />

- RC: registru in care se aduce valoarea curenta A(i);<br />

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

- N si UNU: registre in care se pastreaza constantele n si 1;<br />

- CNT: contor pentru indexul i;<br />

- RD: registru in care se plaseaza rezultatul scaderii;<br />

- MAX: registru de iesire ( coincide ca nume cu iesirea MAX );<br />

- START: bistabil in care se inregistreaza comanda externa start;<br />

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

- un automat cu 10 stari distincte.<br />

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

stocate in modul. Astfel, se pot observa, in continuare, unele diferente nesemnificative<br />

functional in implementarea fizica a algoritmului, in raport cu prezentarea lui teoretica.<br />

Schema care va efectua automat algoritmul va purta numele MODULE: MAX si va<br />

opera cu numere binare intregi si pozitive.


Urmeaza descrierea modulului si a modului sau de operare (nu se specifica lungimea<br />

operanzilor ).<br />

Operatorul " " specifica fortarea valorii numerice, obtinuta ca urmare a evaluarii<br />

termenul din dreapta al expresiei, in registrul din termenul din stanga al expresiei.<br />

MODULE: MAX<br />

INTRARI: A(i); start; RESET; n;<br />

IESIRI: MAX;<br />

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

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

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

2. RC 0; RD 0; RM 0; N n; UNU 1; CNT 1;<br />

START 0 /* Initializare<br />

3. if N = 0 then go to 1<br />

4. RC A(CNT)<br />

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

6. if RD > 0 then RM RC<br />

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

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

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

10. go to 4<br />

ENDSEQ /* Sfarsit secventa<br />

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

/*secventa<br />

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

/*start = 1<br />

ENDMODULE /* Sfarsitul descrierii modulului<br />

Implementarea fizica a modulului presupune existenta urmatoarelor elemente:<br />

- un ceas, care asigura sincronizarea sistemului;<br />

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

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


Intrarea RESET este indicata la sfirsitul descrierii secventei de lucru, deoarece se aplica<br />

asincron.<br />

Descrierea secventei se termina cu marcajul ENDSEQ, modulul fiind cuprins intre<br />

numele MODULE si marcajul ENDMODULE.<br />

Stabilirea schemei modulului presupune evidentierea unitatii de executie, in care se<br />

prelucreaza fluxul de date, si a unitatii de comanda, care asigura fluxul de control,<br />

mentionindu-se resursele hardware asociate.<br />

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

jos:<br />

A[i]<br />

n<br />

RC SUM/DIF N<br />

RM RD UNU<br />

MAX CNT<br />

RESET Ceas RD … ….. Comenzi<br />

start<br />

START<br />

…… AUTOMAT<br />

DE<br />

COMANDA<br />

CEAS<br />

RESET<br />

Unitatea de Executie<br />

MAX<br />

Unitatea de Comanda


Evolutia automatului din unitatea de comanda poate fi ilustrata cu ajutorul grafului de<br />

mai jos, in care nodurile marcate cu cifre reprezinta starile automatului, iar arcele<br />

orientate marcheaza taranzitiile conditionate/neconditionate.<br />

RESET START=0<br />

1.<br />

start START=1<br />

2.<br />

3.<br />

4.<br />

5.<br />

6.<br />

7.<br />

8.<br />

9.<br />

10<br />

N ≠ 0<br />

N = 0<br />

RD ≥ 0<br />

RD < 0


Diagrama de stari prezentata mai sus se utilizeaza pentru proiectarea automatului de<br />

comanda, care asigura fluxul de control necesar derularii algoritmului MAX.<br />

Procesul de proiectare a sistemului numeric, corespunzator algoritmului dat, necesita mai<br />

multe etape, care vor fi ilustrate in cadrul cursului Calculatoare Numerice.<br />

Masina Turing. In literatura de specialitate consacrata studierii posibilitatilor de<br />

mecanizare a algoritmilor Masina Turing joaca un rol important.<br />

Masina Turing se caracterizeaza prin doua principii de baza:<br />

- descompunerea in operatii elementare a executiei unui algoritm este dusa la limita,<br />

de exemplu adunare se implementeaza prin incrementari repetate;<br />

- memoria masinii se prezinta sub forma unei benzi nelimitate, formata din<br />

compartimente succesive in care se poate afla un simbol, reprezentind o informatie;<br />

- conceptul de memorie infinita este pur matematic.<br />

Masina opereaza asupra informatiilor reprezentate prin simboluri luate dintr-un alfabet<br />

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

indica lipsa unei informatii.<br />

Fiecare compartiment al benzii, la un moment dat, contine un singur simbol.<br />

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

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

O instructiune defineste in fiecare ciclu starea dispozitivului de prelucrare. Unul din<br />

codurile de instructiuni, notat cu A, specifica oprirea masinii.<br />

In fiecare ciclu un simbol de pe banda este prelucrat pe baza unui operator Fi.<br />

In afara benzii infinite masina Turing mai contine:<br />

- un element de executie si comanda: operatorul Ω,<br />

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

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

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

"+" deplasare la stanga,<br />

"-" deplasare la dreapta,<br />

"0" fara deplasare.<br />

Schema bloc a masinii Turing este data mai jos:


Informatia de prelucrat Instructiunea curenta<br />

aI ai Fi<br />

.<br />

Cap citire/<br />

scriere<br />

. aj d Fj<br />

. Informatia prelucrata Instructiunea urmatoare<br />

. Banda infinita/Memoria<br />

.<br />

. -<br />

d<br />

0 Comanda deplasarii<br />

+<br />

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

operarea are loc in timp finit, adica se va intalni simbolul A, masina va prelucra<br />

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

informatia respectiva.<br />

Operarea masinii Turing este definita prin tabelul de corespondenta intre dubletii de<br />

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

efectueaza transformarea:<br />

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

simbolul ai fiind inlocuit cu simbolul aj.<br />

Banda este deplasata conform codului simbolului d, iar Fj este stocat in memoria M, pana<br />

in ciclul urmator.<br />

Operatorul Ω M<br />

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


Fi<br />

ai aj Fj d<br />

Structura acestui tablou este continuta in organizarea interna a operatorului Ω. Operarea<br />

poate fi amorsata cunoscand continutul celulei de pe banda, plasata in fata capului de<br />

citire/scriere, si instructiunea initiala.<br />

Pentru exemplificare, se va considera cazul unui numar zecimal n care va fi incrementat.<br />

Se presupune ca pe banda se afla, in celule succesive, cifrele unui numar zecimal,<br />

incadrate la stanga si la dreapta de simbolul V.Algoritmul consta in examinarea cifrelor<br />

incepand de la dreapta.<br />

Se incrementeaza prima cifra la dreapta si procesul se opreste daca rezultatul este diferit<br />

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

a benzii spre dreapta, incrementandu-se noua cifra.<br />

Alfabetul extern al masinii consta in 10 cifre zecimale si din simbolul vid V.<br />

Alfabetul instructiunilor Fi contine functia F, care asigura incrementarea si functia A<br />

care comanda oprirea.<br />

Tabelul de functionare este urmatorul<br />

Informatia ai Instructiunea Fi<br />

0 1 A 0<br />

1 2 A 0<br />

2 3 A 0<br />

3 4 A 0<br />

4 5 A 0<br />

5 6 A 0<br />

6 7 A 0<br />

7 8 A 0<br />

8 9 A 0<br />

9 0 F -<br />

V 1 A 0


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

procesul continua prin incrementarea simbolului si propagarea transportului, cu<br />

deplasarea benzii spre dreapta si incrementarea urmatorului simbol. Daca urmatorul<br />

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

lui cu 1 si masina se opreste.<br />

Concluzii. Masina Turing reprezinta cea mai simpla entitate care se poate imagina in<br />

vederea prelucrarii automate a informatiei.<br />

In masina Turing se pot regasi o serie de elemente comune cu calculatoarele numerice:<br />

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

pentru codificarea informatiilor manipulate de catre masina, si limbajul propriu al<br />

instructiunilor/functiilor masinii;<br />

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

- operarea masinii are un caracter secvential, executia instructiunii curente este insotita<br />

de pregatirea executiei operatiei urmatoare;<br />

- executia unui algoritm de catre masina se traduce prin examinarea unui tablou care<br />

contine toate situatiile posibile, ceea ce corespunde unui program cablat, reprezentand un<br />

algoritm independent de informatia care se trateaza;<br />

- unele informatii de baza pot avea un caracter conditional, evenimentul urmator va<br />

depinde de rezultatul operatiei curente;<br />

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

din calculatoarele conventionale;<br />

- masina Turing are un program fix; pentru a-l modifica trebuie reconstruita masina.<br />

Masina Turing nu are un caracter universal. Pentru a deveni universala trebuie sa<br />

indeplineasca urmatoarele conditii:<br />

- sa accepte toate alfabetele, conditie usor de realizat daca alfabetele se codifica binar, iar<br />

masina va trata toate codurile binare;<br />

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

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


4. Modalitati de reprezentare a calculatoarelor.<br />

Un calculator poate fi examinat, atat subaspect functional, cat si structural.<br />

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

prin tripletul:<br />

unde:<br />

< I, E, C >,<br />

- I constituie multimea intrarilor,<br />

- E corespunde multimii iesirilor,<br />

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

elementele multimii E. C realizeaza aplicatii din multimea intrarilor I, in multimea iesirilor E.<br />

Pentru a facilita studiul unui calculator sub aspect functional, adesea se recurge la reprezentarea<br />

lui sub forma unei ierarhii de niveluri imbricate.<br />

Un nivel este constituit din multimea aplicatiilor asupra elementelor multimii de intrare pentru<br />

nivelul dat, cat si asupra elementelor multimilor de intrare si iesire de la nivelul inferior,<br />

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

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

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

operatii elementare,<br />

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

- functiile construite de utilizator, pe baza instructiunilor masinii conventionale, pentru diverse<br />

tipuri de aplicatii concrete.<br />

Nivelul aplicatiilor/functiilor primitive<br />

masina de baza ( realizata in hardware )<br />

capabila sa execute operatii elementare.<br />

Nivelul functiilor standard/predefinite; nivelul<br />

instructiunilor masinii conventionale.<br />

Nivelul functiilor construite de utilizator pe baza functiilor de<br />

la nivelul inferior. Acesta este nivelul aplicativ al calculatorului.


La nivelul masinii conventionale se defineste notiunea de arhitectura a unui calculator numeric<br />

prin cuadruplul:<br />

A = < PI,PE,RG,I ><br />

unde:<br />

PI = { PI0,....,PIi } este multimea porturilor de intrare,<br />

PE = { PE0,....,PEj } este multime porturilor de iesire,<br />

RG = { RG0,....,RGk } este ansamblul registrelor generale din unitatea de executie,<br />

I = { I0,......,Il } este setul instructiunilor calculatorului.<br />

Porturile de intrare si iesire sunt utilizate pentru schimbul de informatii cu mediul inconjurator,<br />

prin intermediul echipamentelorperiferice, in timp ce registrele generale sunt folosite pentru<br />

stocarea diferitelor variabile de stare.<br />

Sub forma unui prim exemplu se prezinta mai jos arhitectura microprocesorului Intel 8080.<br />

7 0 7 0<br />

PI0<br />

……..<br />

PI255<br />

PE0<br />

…….<br />

PE255<br />

7 0<br />

PC<br />

15 0<br />

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

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

priveste utilizarea:<br />

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

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

folosite adesea pentru formarea unor adrese de operanzi pe 16 biti );<br />

F<br />

A<br />

B<br />

D<br />

- F este registrul indicatorilor de conditii, furnizati de unitatea de executie dupa fiecare operatie<br />

C<br />

E<br />

H L<br />

SP


( CY - transport in afara rangului de semn, AC - transportauxiliar intretetradele octetului<br />

rezultat, S - semnul rezultatului, Z - indicator de rezultat zero, P - indicator <strong>privind</strong><br />

paritatea numarului de unitati din rezultat ). Pozitiile ocupate de acesti indicatori de conditii in<br />

registrul F sunt date mai jos:<br />

7 6 5 4 3 2 1 0<br />

S 7 Z 6 * 5 AC 4 * 3 P 2 * 1 CY 0<br />

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

memorie;<br />

- PC contor program, pentru adresarea instructiunilor din memorie.<br />

Lista de instructiuni a microprocesorului 8080 contine 78 de instructiuni.<br />

Un alt exemplu il constituie arhitectura microprocesorului 8086:<br />

15 8 7 0<br />

AX: AH AL Acumulator<br />

BX: BH BL<br />

Registru - baza<br />

CX: CH CL<br />

Registru - contor<br />

DX: DH DL<br />

Registru - date<br />

SP<br />

BP<br />

SI<br />

DI<br />

Indicatorii de conditii<br />

Indicator - stiva<br />

Indicator - baza<br />

Indicator - sursa<br />

Indicator - destinatie<br />

15 12 11 10 9 8 7 6 5 4 3 2 1 0<br />

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


Semnificatiile indicatorilor de conditii sint urmatoarele: O - depasira aritmatica, D - directia la<br />

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

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

15 0<br />

15 0<br />

Registrul segmentului de cod<br />

Registrul segmentului de date<br />

Registrul segmentului stivei<br />

Registrul segmentului suplimentar<br />

Indicator de instructiune<br />

(Contorul Programului)<br />

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

octeti fiecare:<br />

65536 Porturi de Intrare organizate pe octe<br />

65536 Porturi de Iesire organizate pe octeti<br />

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

fiecare tablou de porturi.<br />

Tinand seama de toate modurile de adresare, microprocesorul 8086 dispune peste 300 de<br />

instructiuni diferite.<br />

CS<br />

SS<br />

DS<br />

ES<br />

IP<br />

PI0, ……………,.PI65536<br />

PE0, ……………,.PE65536<br />

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

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

cuvant dublu de stare program ( PSW Program Status Word ), care stocheaza contorul<br />

program si o serie de indicatori de conditii:


0 31<br />

Registrele Generale<br />

Cuvantul de stare program ( PSW ):<br />

0 ……………………………….8 9 ……………………………………………….31<br />

32 33 34 35 36 37 38 39 40 41<br />

42 43 44 ………….47 48 …………………..54 55 56 57 …63<br />

Campurile PSW au urmatoarele semnificatii:<br />

PC - contor program;<br />

Masti de depasire:<br />

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

- 64 < E < 64 , ( E = exponent );<br />

DD- depasire zecimala;<br />

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

Daca masca este unu atunci derutarea este interzsisa.<br />

Indicatorii de conditii ai rezultatului:<br />

Z = 1 - rezultat nul;<br />

S = 1 - rezultat < 0;<br />

D = 1 - depasire;<br />

C = 1 - transport.<br />

Masti de intrerupere:<br />

IS - masca intreruperi de I/E;<br />

RG0<br />

…………………………………………………..<br />

RG15<br />

DI DS DD DB Z S D C IS IE<br />

CE NP CA ……………………….. MR PM NIT<br />

PC


IE - masca intreruperi externe;<br />

CE - masca intreruperi contor nul.<br />

Daca masca este unu, intreruperea este inhibata si ramane in asteptare.<br />

Nivelul programului:<br />

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

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

sistem genereaza o derutare ).<br />

Cheia de acces:<br />

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

Masca de rotunjire:<br />

MR = 0 - se rotunjeste rezultatul operatiei in virgula mobila;<br />

MR = 1 - rezultatul nu se rotunjeste.<br />

Paritate memorie:<br />

PM = 0 - eroarea de paritate la memorie este tratata prin deru tare;<br />

PM = 1 - eroarea se trateaza prin intrerupere.<br />

Nivelul de intrerupere asociat programului:<br />

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

niveluri de prioritate ).<br />

Calculatorul FELIX 5000 are implementate 102 instructiuni, din 128 instructiuni posibile.<br />

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

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

programe la nivelul masinii conventionale ( in limbaj de asamblare ).<br />

Reprezentarea structurala a unui calculator pleaca de la ideea ca acesta reprezinta un<br />

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

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

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

poate fi masurata in biti, ranguri zecimale, caractere alfanumerice etc. Pe linga functiile<br />

specifice de prelucrare a informatiei, componentele primitive se mai caracterizeaza prin<br />

debit de transfer si capacitate de stocare ale informatiilor.


Aceste caracteristici prezintaimportantapentru studiul sistemelor de calcul cu ajutorul metodelor<br />

cercetarii operationale, in numeroase aplicatii ( multiprogramare, multiprelucrare, timp di-<br />

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

( buffer ), debite de transfer al datelor etc.<br />

Din punct de vedere structural sistemul de calcul poate fi descompus in:<br />

- unitatea de intrare ( UI ),<br />

- unitatea centrala ( UCe ),<br />

- unitatea de iesire ( UE ).<br />

I E<br />

Unitatile de intrare si de iesire asigura legatura sistemului cu echipamentele periferice primare<br />

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

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

informatiei prelucrate de calculator.<br />

Unitatea centrala asigura stocarea programului, a datelor si realizeaza prelucrarea automata a<br />

acestora pe baza interpretariiprogramului dat.<br />

Pentru a putea intelege organizarea si operarea unor sisteme complexe cum sunt calculatoarele<br />

se impune descompunerea lor in unitati functionale mai simple, cu precizarea semnalelor<br />

manipulate si al modului lor de dialog.<br />

Astfel, rafinarea structurii sistemului de calcul evidentiaza in zonele UI si UE:<br />

- subsistemul de intrare ( SI ),<br />

- subsistemul de iesire ( SE ),<br />

- echipamentele periferice de intrare ( EPI ) si echipamentele periferice de iesire ( EPE ).<br />

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

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

tare etc ).<br />

UI UCe UE


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

corespunzatoare destinatiei: semnale specifice diferitelor elemente de executie ( in cazul<br />

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

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

UCe si EP prin realizarea unei adaptari de debite de transfer ( vitezele de operare ale acestora<br />

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

formatului de reprezentare a datelor, validari, verificari etc.<br />

La nivelul UCe se pot distinge urmatoarele unitati functionale:<br />

- unitatea de memorie ( UM ),<br />

- unitatea de executie ( UE ),<br />

- unitatea de comanda ( UC ).<br />

Date/<br />

UCe<br />

EPI SI<br />

UM<br />

SE EPE<br />

Instr. Instr. Date<br />

date /adrese<br />

instructiuni<br />

comenzi,<br />

Conditii<br />

Comenzi<br />

conditii/indicatori de stare/stari.<br />

Date Rez. Comenzi<br />

Cond Cond<br />

UE UC<br />

Com<br />

Comenzi


Unitatea de memorie are functia de stocare a datelor initiale, a programului, a rezultatelor<br />

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

procesorul ( ansamblul unitate de comanda - unitate de executie ). Unitatea de memorie are o<br />

organizare liniara, constand in celule de stocare a informatiei, al caror continut poate fi<br />

manipulat prin specificarea adresei celulei date.<br />

(m-1) 0<br />

Registrul de adrese<br />

m<br />

Memoria<br />

(n-1) 0<br />

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

de adrese.<br />

Adresa i<br />

Unitatea de executie asigura, sub controlul unitatii de comanda, o succesiune de operatii<br />

aritmetice si logice asupra datelor preluate din unitatea de memorie sau din memoria locala-<br />

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

unitatea de memorie sau in registrele generale.<br />

Dupa fiecare operatie UE actualizeaza starea unor indicatori de conditii, care reflecta<br />

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

Unitatea de comanda prelucreaza fluxul de instructiuni, care constituie programul. Ea furnizeaza<br />

semnale de comanda pentru celelalte unitati, coordonind functionarea lor in conformitate cu<br />

cerintele programului. UC poate examina, in cadrul executiei unei instructiuni date, informatia<br />

de stare asociata fiecarei unitati, luand in continuare deciziile corespunzatoare pentru executia<br />

corecta a programului.<br />

Celula 0<br />

Celula 1<br />

Celula i<br />

(m -1)<br />

Celula 2


Unitatea de comanda se poate implementa sub forma conventionala ( ca automat secvential cu<br />

stari codificate sau cu stari complet decodificate ) sau sub forma microprogramata ( cu stocarea<br />

semnalelor de comanda, in maniera statica, intr-o memorie rapida ).<br />

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

de executie si de memorie sunt notate cu E si respectiv cu M.<br />

Astfel, un calculator C ( unitatea centrala ) poate fi reprezentat prin expresia:<br />

C = I [ E - M ].<br />

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

procesorul, M - memoria, S - comutatorul, D - operatorul asupra datelor, K - operatorul de<br />

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

C = M - P - T<br />

Prima notatie este utila in cazul sistemelor constituite din mai multe unitati de executie si<br />

memorii asociate, controlate de o singura unitate de comanda( Sisteme cu un singur Flux de<br />

Instructiuni si mai Multe Fluxuri de Date - SIMD - Single Instruction Stream Multiple Data<br />

Stream ).<br />

Sistemele obisnuite au un singur flux de instructiuni si un singur flux de date SISD - Single<br />

Instruction Stream Single Data Stream ).<br />

In rezumat se poate observa ca:<br />

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

- ansamblul: P + M = UC ( Unitate Centrala ),<br />

- ansamblul: UC + SI + SE + Software = Sistem de calcul.<br />

In continuare se vor prezenta cateva exemple de sisteme de calcul, folosind notatia PMS:<br />

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

intermediul p[rocesorului:<br />

M P S K1 T1<br />

K2 T2


- sistem de calcul in care unele terminale ( echipamentele de I/E ) transfera date cu memoria<br />

direct ( T1 ) sau prin intermediul procesorului ( T2, T3 ):<br />

M S1 P S2 K2 T2<br />

Instructiunile calculatorului reprezinta o colectie de informatii <strong>privind</strong> operatiile operatiile care<br />

se pot efectua intr-un calculator dat.<br />

Sub forma cea mai generala instructiunile se impart in doua categorii:<br />

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

- instructiuni cu caracter de decizie, care modifica secventa de executie a programului in mod<br />

conditionat de o serie de indicatori sau in mod neconditionat.<br />

Instructiunile sunt formate din mai multe cimpuri, dintre care se mentioneaza urmatoarele:<br />

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

aritmetica, logica, transfer de date, transfer al comenzii etc.;<br />

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

de date sau de la care se citeste o instructiune.<br />

In cazul instructiunilor cu caracter operational, structura instructiunii poate contine, pe linga<br />

campul codului de operatie, unul sau mai multe campuri pentru adrese.<br />

Instructiunea cu o adresa:<br />

COP ADRESA<br />

K1<br />

K3 T3<br />

T1


Instructiunea cu doua adrese:<br />

Instructiunea cu trei adrese:<br />

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

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

UE.<br />

In cazul al doilea sunt prezente adresele celor doi operanzi (adresa operandului destinatie si<br />

adresa operandului sursa - rezultatul operatiei se stocheazalaadresaoperandului destinatie).<br />

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

Instructiunile cu trei adrese sunt extrem de rar intilnite.<br />

Campul de adresa din instructiune poate avea mai multe semnificatii:<br />

- contine chiar operandul, in cazul operandului imediat;<br />

- reprezinta adresa unui operand din memorie, in situatia adresarii directe;<br />

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

indirecte.<br />

In unele situatii, la continutul cimpului de adresa din instructiune se aduna continuturile unor<br />

registre speciale:<br />

COP ADRESA1 ADRESA2<br />

COP ADRESA1 ADRESA2 ADRESA3<br />

- registrele baza, la adresarea bazata;<br />

- registrele index, la adresarea indexata.<br />

Cu ajutorulacestor facilitati se pot adresa diverse date stocate in memorie, care sunt structurate<br />

sub forma de masive, multidimensionale, in cazuri particulare: matrici si vectori.<br />

Registrul baza contine adresa de start ( baza ) a structurii, adresa din instructiune reprezinta o<br />

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


( incrementabile/decrementabile - eventual automat ).<br />

Adresa obtinuta in urma unor asemenea operatii, adesea combinate, poarta numele de adresa<br />

efectiva.<br />

In consecinta, instructiunea va contine campuri aditionale, care vor specifica adresarea bazata,<br />

indirecta, indexata etc, deci modul de calcul al adresei efective.<br />

Aceste artificii sunt impuse de faptul ca, in calculatoarele conventionale, memoria este<br />

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

moduri de adresare faciliteaza accesul la componentele acestor structuri.<br />

Trebuie mentionat faptul ca listele de instructiuni pentru cele mai multe calculatoare contin si<br />

instructiuni fara adresa. Acestea se bazeaza pe facilitatile implementate in hardware care permit<br />

adresarea si manipularea datelor plasate intr-o structura speciala numita stiva ( stack - LIFO -<br />

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

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

realizeaza numai prin intermediul varfului stivei, folosind doua operatii de baza: plasarea unui<br />

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

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

carui continut este automat incrementat dupa o operatie POP si respectiv - decrementat, dupa o<br />

operatie PUSH.<br />

Instructiunile, care afecteaza executia programului, trebuie sa specifice in campul codului de<br />

operatie conditiile testate, iar in campul de adresa deplasarea necesara calculului adresei efec-<br />

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

unor operatii combinate.<br />

Formatul instructiunii calculatorului FELIX 5000, contine in cadrul a 32 de biti mai multe<br />

campuri:<br />

unde:<br />

0 1 3 4 7 8 9 15 16 31<br />

I B Q X F D<br />

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


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

unul din registrele generale RG9 - RG15, iar pentru 0 adresarea nebazata;<br />

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

constanta sau un vector logic sau adresa de origine si lungimea unui operand, in cazul<br />

manipularii sirurilor ) si registrul general RG0 - RG15 folosit la indexare;<br />

- X ia valoarea 0, in cazul adresarii neindexate si valorea 1, in cazul adresarii indexate;<br />

- D specifica deplasarea, folosita pentru calculul adresei efective, prin adunarea cu registrul<br />

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

explorarea intregului spatiu de memorie se aduna in mod curent continutul lui D cu continutul<br />

registrului baza.<br />

Modurile de adresare intilnite la FELIX 5000:<br />

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

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

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

Prima adresa efectiva, Aef, calculata va reprezenta adresa unui cuvant din memorie in care se<br />

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

ca o instructiune. Astfel, la adresa efectiva:<br />

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

Daca I1 = 1, atunci se va calcula noua adresa efectiva:<br />

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

maximum 5 niveluri de adresare indirecta, pana cand Ii = 0.<br />

Adresarea indexata directa: I = 0; X = 1.<br />

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

Adresarea indexata indirecta: I = 1; X = 1.<br />

Aef1 = ( B + 8 ) + D,<br />

Aef(k+1) = ( Bk + 8 ) + Dk<br />

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


5. Conventii de proiectare.<br />

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

- sectiunea de date ( unitatea de executie ),<br />

- sectiunea de comanda ( unitatea de comanda ).<br />

Intrare: Date Registre si Logica aferenta Iesire: Date/Rezultate<br />

(Sectiunea /Unitatea de Date/Executie)<br />

Semnale de Conditii<br />

comanda<br />

Intrare: Conditii Circuit secvential de comanda Iesire: Comenzi<br />

(Sectiunea/Unitatea de Comanda)<br />

Unitatea de executie asigura prelucrarea datelor, reprezentate sub forma unor vectori binari,<br />

prin transferul acestora intre registrele sursa si registrele destinatie.Transferul se efectueaza prin<br />

intermediul unor retele/circuite logice combinationale.<br />

Transferurile intre registre.<br />

Intrucat prelucrarea datelor are la baza transferul intre registre, proiectarea unui sistem<br />

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

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

In continuare se prezinta mecanismele hardware de implementare a transferurilor intre registre<br />

si notatiile corespunzatoare folosite. Registrele sunt notate cu majuscule avand, de regula, o<br />

semnificatie mnemotehnica. Pe scurt, se vor folosi "mnemonice".<br />

Transferul continutului unui registru sursa intr-un registru destinatie, fara a afecta continutul<br />

sursei, se noteaza astfel:<br />

AC RD<br />

Daca registrul AC are patru biti, anularea/fortarea in unu a tuturor bistsbililor se pot nota dupa<br />

cum urmeaza:


AC 0,0,0,0<br />

AC 1,1,1,1<br />

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

si cu intrari de tip PRESET/CLR.<br />

Transferurile sincrone au loc sub controlul semnalului de ceas pe fronturile anterior, pentru<br />

bistabilele de tip D, sau pe frontul posterior, pentru bistabilele master-slave, de tip JK.<br />

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

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

frontul anterior al semnalului de ceas, reprezentarea simbolica si diagrama temporala de operare.<br />

Se observa ca datele la intrarea D sunt stabile inaintea aparitiei frontului crescator al semnalului<br />

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

o anumita intarziere in raport cu frontul crescator al semnalului de ceas.<br />

Data<br />

Ceas<br />

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

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

simbolul si diagrama temporala pentru operarea bistabilului JK.<br />

7476<br />

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

date, cat si pentru sectiunea de comanda.<br />

2<br />

3<br />

2<br />

Ceas (CLK)<br />

Data 4<br />

J Q<br />

15 Iesire<br />

Ceas 1<br />

CLK<br />

Data (J/K)<br />

Data 16<br />

K<br />

4<br />

D PRE<br />

CLK Q<br />

CLR<br />

PRE<br />

CLR<br />

Q<br />

7474<br />

Q<br />

5<br />

6<br />

14<br />

Iesire<br />

Ceas (CLK)<br />

Data (D)<br />

Iesire (Q)<br />

Iesire (Q)


Un circuit secvential de comanda furnizeaza, pentru sectiunea de date, diverse semnale de<br />

comanda, sincrone cu ceasul sistemului, cu perioade egale cu durata unei perioade de ceas sau<br />

cu multipli ai acesteia. Acestea sunt semnalele de comanda de tip nivel.<br />

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

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

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

activa corespunzatoare semnalului curent de ceas.<br />

Conditii<br />

Ceas<br />

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

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

destinatie RB[2] ( RB0:1 ):<br />

i. RB0:1 RA0:1<br />

Circuit Secvential (Unitate e Comanda)<br />

SCN(i-1) SCNi<br />

Ceas<br />

SCN(i-1)<br />

SCI(i-1)<br />

SCNi<br />

SCIi<br />

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

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

pentru implementarea acestui transfer vor fi urmatoarele:<br />

Ceas<br />

1<br />

2<br />

7408<br />

3<br />

SCIi


4<br />

1<br />

16<br />

4<br />

1<br />

16<br />

J<br />

2<br />

PRE<br />

CLK<br />

K<br />

CLR<br />

3<br />

2<br />

PRE<br />

3<br />

Q<br />

Q<br />

7476<br />

7476<br />

15<br />

14<br />

J<br />

15<br />

QRA1<br />

4<br />

J<br />

15<br />

QRB1<br />

CLK<br />

1<br />

CLK<br />

K<br />

CLR<br />

Q<br />

14<br />

4<br />

1<br />

16<br />

16<br />

J<br />

2<br />

PRE<br />

CLK<br />

K<br />

CLR<br />

3<br />

2<br />

PRE<br />

3<br />

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

Ceas<br />

SCNi<br />

SCIi<br />

SCN1<br />

Ceas<br />

SCN1<br />

Ceas<br />

1<br />

2<br />

2<br />

3<br />

2<br />

3<br />

1<br />

2<br />

4<br />

D PRE<br />

1<br />

RA0<br />

7408<br />

CLK Q<br />

CLR<br />

4<br />

D PRE<br />

Q<br />

CLK Q<br />

CLR<br />

1<br />

RA0<br />

7474<br />

Q<br />

3<br />

5<br />

6<br />

5<br />

6<br />

7474<br />

7408<br />

Vechea Valoare din RB \\<br />

3<br />

2<br />

3<br />

2<br />

3<br />

K<br />

CLR<br />

4<br />

1<br />

RB0<br />

Q<br />

Q<br />

7476<br />

Q<br />

D PRE<br />

7476<br />

CLK Q<br />

CLR<br />

4<br />

D PRE<br />

1<br />

Q<br />

CLK Q<br />

CLR<br />

15<br />

14<br />

14<br />

RB0<br />

5<br />

6<br />

7474<br />

RA1 RB1<br />

Noua Valoare din RB<br />

Q<br />

5<br />

6<br />

7474


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

surse.<br />

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

1, 2 a urmatoarelor transferuri:<br />

1. RC RA<br />

2. RC RB<br />

sub controlul semnalelor SCN1, SCN2.<br />

2<br />

3<br />

2<br />

3<br />

2<br />

3<br />

2<br />

3<br />

4<br />

D PRE<br />

CLK Q<br />

41<br />

CLR<br />

D PRE<br />

1<br />

Q<br />

CLK Q<br />

CLR<br />

4<br />

D PRE<br />

7474<br />

Q<br />

CLK Q<br />

CLR<br />

1<br />

4<br />

D PRE<br />

1<br />

Se cere implementarea hardware a transferurilor:<br />

1. RA 1,1<br />

2. RA 0,0<br />

3. RA RB<br />

5<br />

6<br />

5<br />

6<br />

7474<br />

Q<br />

CLK Q<br />

CLR<br />

RA0<br />

RA1<br />

RB0<br />

5<br />

6<br />

7474<br />

RB1<br />

Q<br />

5<br />

6<br />

7474<br />

1<br />

2<br />

1<br />

2<br />

SCN1<br />

1<br />

2<br />

1<br />

2<br />

SCN2<br />

7408<br />

7408<br />

7408<br />

7408<br />

3<br />

3<br />

3<br />

3<br />

SCN1<br />

SCN2<br />

1<br />

2<br />

1<br />

2<br />

Pentru a stabili expresia functiei logice combinationale, care reprezinta intrarea Di a bistabilului<br />

destinatie RAi, se utilizeaza diagrama Karnaugh, cu variabila RBi introdusa in diagrama:<br />

1<br />

2<br />

U9A<br />

7432<br />

U10A<br />

3 1<br />

CLK<br />

7432<br />

2<br />

3<br />

7432<br />

3<br />

7408<br />

3<br />

2<br />

3<br />

2<br />

3<br />

4<br />

D PRE<br />

CLK Q<br />

CLR<br />

1<br />

4<br />

D PRE<br />

1<br />

Q<br />

CLK Q<br />

CLR<br />

5<br />

6<br />

7474<br />

Q<br />

5<br />

6<br />

7474


SCN1, SCN2<br />

00 01 11 10<br />

SCN3 Functia de excitatie Di este data de expresia:<br />

* * * 1<br />

0 Di = SCN1 ∪ RBi .SCN3<br />

RBi * * *<br />

1<br />

Aceasta va duce la urmatoarea implementare:<br />

RB0<br />

RB1<br />

SCN1<br />

SCN3<br />

SCN2<br />

SCN1<br />

In cazul in care se urmareste implementarea operatiei elementare:<br />

j. RAi RBi.RCi<br />

se poate folosi schema de mai jos:<br />

RBi<br />

RCi<br />

SCNj<br />

Ceas<br />

1<br />

2<br />

1<br />

2<br />

1<br />

2<br />

1<br />

2<br />

1<br />

2<br />

8<br />

U41A<br />

7408<br />

7408<br />

7408<br />

3<br />

3<br />

3<br />

7408<br />

SCIj<br />

3<br />

SCN3<br />

CLK<br />

9<br />

1<br />

2<br />

1<br />

2<br />

1<br />

2<br />

2<br />

3<br />

U7A<br />

4<br />

D PRE<br />

CLK Q<br />

CLR<br />

1<br />

RAi<br />

Q<br />

7432<br />

7432<br />

7408<br />

5<br />

6<br />

7474<br />

3<br />

3<br />

3<br />

2<br />

3<br />

2<br />

3<br />

4<br />

D PRE<br />

CLK Q<br />

CLR<br />

1<br />

4<br />

D PRE<br />

1<br />

Q<br />

CLK Q<br />

CLR<br />

RA0<br />

5<br />

6<br />

7474<br />

RA1<br />

Q<br />

5<br />

6<br />

7474


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

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

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

combinationale, cat si secventiale standard, integrate pe scara simpla si medie. Pentru o tratare<br />

unitara a celor doua tipuri de componente, mai jos, se prezinta o modalitate de tratare unitara a<br />

acestora.<br />

Componentele combinationale.<br />

Sub forma cea mai generala o componenta combinationala (Circuit Logic Combinational – CLC)<br />

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

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

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

m X[m] Operatia Descrierea Comanda<br />

p CLC<br />

Functia C(p-1) ………C0<br />

C[p] F0 Z = F0(X) 0 …………0 0<br />

n Z[n] F1 Z = F1(X) 0 …………0 1<br />

….. ………… ………………<br />

F(2^p-1) Z = F(2^p-1)(X) 0 …………0 0<br />

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

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

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

poate lua vectorul de comanda C. In continuare sevor prezenta cateva cazuri particulare.<br />

Circuitul AND (7408).<br />

Modelul Componenta din Tabelul de descriere<br />

biblioteca<br />

A[4] B[4] Operatia Descrierea Comanda<br />

4 4 AND Z = A ∩ B ------<br />

1<br />

7408<br />

7408<br />

4 Z[4] ¼ din pastila 7408<br />

2<br />

3


Circuitul de mai sus poate fi reprezentat in conditiile in care intrarile A[4] sunt controlate de<br />

catre acelasi semnal si devin, astfel, intrari de comanda:<br />

A[1] 1 B[4] Operatia Descrierea Comanda<br />

4 A[4] 4 A[1]<br />

7408<br />

ZERO Z = 0000 0<br />

4 Z[4]<br />

Circuitul sumator 7483.<br />

TRUE Z = B 1<br />

Modelul Componenta din Tabelul de descriere<br />

biblioteca<br />

A[4] B[4] C0[1] Operatia Descrierea Comanda<br />

4 4 1 1<br />

14<br />

A4 C4<br />

ADD C4,S = ADD(A,B,C0) -----<br />

7483<br />

A3<br />

15<br />

C4[1] 1 4 S[4]<br />

Circuitul XOR (7486).<br />

7483A<br />

Modelul Componenta din Tabelul de descriere<br />

biblioteca<br />

A[4] B[4] Operatia Descrierea Comanda<br />

4 4 XOR Z = A ⊕ B ------<br />

1<br />

3<br />

7486<br />

2<br />

4 Z[4] ¼ din pastila 7486<br />

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

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

functiilor TRUE si NEG, conform tabelului de mai jos.<br />

3<br />

8<br />

10<br />

16<br />

4<br />

7<br />

11<br />

13<br />

A2 SUM4<br />

A1<br />

B4 SUM3<br />

B3<br />

B2 SUM2<br />

B1<br />

C0 SUM1<br />

7486<br />

2<br />

6<br />

9


A[1] 1 B[4] Operatia Descrierea Comanda<br />

4 A[4] 4 A[1]<br />

7486<br />

TRUE Z = B 0<br />

4 Z[4]<br />

Multiplexorul 74157<br />

NEG Z = B 1<br />

Modelul Componenta din Tabelul de descriere<br />

biblioteca<br />

A[4] B[4] Operatia Descrierea Comanda<br />

S=A/B 4 4 5<br />

1B 1Y<br />

G S=A/B<br />

7<br />

2Y<br />

74157<br />

SELA Z = A 0 0<br />

G 13<br />

4A<br />

12 SELB Z = B 0 1<br />

15<br />

4 Z[4] STROBEG STROB Z = 0000 1 *<br />

Intrarile active pe nivel coborat sunt marcate cu un cerc<br />

Circuite secventiale.<br />

2<br />

3<br />

6<br />

11<br />

10<br />

14<br />

1<br />

1A<br />

2A<br />

2B<br />

3A<br />

3B<br />

4B<br />

74157<br />

3Y<br />

4Y<br />

SELECTAB<br />

4<br />

9<br />

In cazul circuitelor secventiale intervine si semnalul de ceas, pe langa semnalul de comanda.<br />

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

intrare, atribuirea valorii expresiei logice din termenul din dreapta variablei din termenul din<br />

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

C[p] m X[m] Operatia Descrierea Comanda<br />

p CLS<br />

Functia C(p-1) ………C0<br />

CLK F0 Q F0(X) 0 ………..0 0<br />

n Q[n] F1 Q F1(X) 0 ………..0 1<br />

….. ………… ………………<br />

F(2^p-1) Q F(2^p-1)(X) 0 ………..0 0


Circuit bistabil JK (7473).<br />

Modelul Componenta din Tabelul de descriere<br />

biblioteca<br />

Operatia Descrierea Comanda<br />

J 14<br />

12<br />

J Q<br />

J K<br />

K 1<br />

Bistab.JK<br />

CLK<br />

NOP Q Q 0 0<br />

CLK K Q<br />

CLEAR Q 0 0 1<br />

Contor binar 74163<br />

4 Q[4] PRESET Q 1 1 0<br />

COMPL Q Q 1 1<br />

Modelul Componenta din Tabelul de descriere<br />

biblioteca<br />

ENT A[4] Operatia Descrierea Comanda<br />

CLR 3<br />

14<br />

CLR LOAD ENP<br />

4<br />

A QA<br />

13<br />

ENP 5<br />

B QB<br />

12 NOP Q Q 1 1 0<br />

6<br />

C QC<br />

74163<br />

11<br />

D QD<br />

15<br />

LOAD 2<br />

RCO INC Q ADD(Q,T) 1 1 1<br />

7<br />

CLK ENP LOAD Q A 1 0 *<br />

RC0 Q[4] CLEAR Q 0 0 * *<br />

Registru de deplasare 74178<br />

3<br />

10<br />

9<br />

CLR<br />

CLK<br />

ENT<br />

LOAD<br />

CLR<br />

7473<br />

13<br />

74163<br />

SER A[4] Operatia Descrierea Comanda<br />

SH 1 4 SH LOAD<br />

LOAD 74178<br />

NOP Q Q 0 0<br />

CLK LOAD Q A 0 1<br />

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


In cazul in care intrarea SEReste folosita drept intrare de comanda se realizeaza functiile din<br />

tabelul de mai jos:<br />

Modelul Componenta din Tabelul de descriere<br />

biblioteca<br />

A[4] Operatia Descrierea Comanda<br />

SER 9<br />

SERIAL<br />

4<br />

SER SH LOAD<br />

11<br />

LOAD QA<br />

SHIFT<br />

SH 6 NOP Q Q * 0 0<br />

2<br />

QB<br />

74178<br />

1<br />

A<br />

8<br />

LOAD 13<br />

B QC LOAD Q A * 0 1<br />

CLK SHIFT0 Q Q2:0, 0 0 1 0<br />

74178<br />

Q[4] SHIFT1 Q Q2:0, 1 1 1 0<br />

Registru cu doua intrari multiplexate 74298<br />

Modelul Componenta din Tabelul de descriere<br />

biblioteca<br />

A[4] B[4] Operatia Descrierea Comanda<br />

WS 4 4 3<br />

15<br />

WS<br />

2<br />

A1 QA<br />

CKL<br />

74298<br />

4<br />

A2<br />

14<br />

1<br />

B1 QB LOADA Q A 0<br />

4 Q[4]<br />

10<br />

9<br />

5<br />

7<br />

6<br />

11<br />

3<br />

12<br />

5<br />

C<br />

D<br />

WS<br />

CLK<br />

QD<br />

B2<br />

C1 QC<br />

C2<br />

D1 QD<br />

D2<br />

CLK<br />

13<br />

12<br />

74298<br />

10<br />

LOADB Q B 1


Scheme combinate.<br />

Schema unui sumator/scazator<br />

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

C4<br />

D<br />

1<br />

1<br />

Operatia Descrierea Comanda<br />

ADD Z = C4,ADD(A,B) 0<br />

SUB Z = C4,SUB(A,B) 1<br />

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

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

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

Conexiuni prin magistrale.<br />

In numeroase cazuri implementarea in hardware a unui algoritm de prelucrare a datelor impune,<br />

la diverse etape ale executiei sale, conectarea unor registre-sursa la anumite registre-destinatie.<br />

Conexiunile directe ofera posibilitatea unui inalt grad de paralelism al transferurilor de date. In<br />

schimb sunt neeconomice sub aspectul consumului de circuite logice.<br />

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

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

1. RC RA<br />

2. RD RB<br />

3. RC RB<br />

4. RD RA<br />

4<br />

A[4] B[4]<br />

7483<br />

4 4<br />

5. RC RA; RD RB<br />

6. RC RD; RC RA<br />

4<br />

Z[4]<br />

7486<br />

4<br />

C0 1<br />

D


Aceste transferuri se vor realiza sub controlul semnalelor de comanda de tip nivel: SCN1,<br />

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

SCI3, SCI4, SCI5, SCI6.<br />

O ilustrare a implementarii transferurilor de mai sus este prezentata in continuare, considerand,<br />

pentru simplificare, registre de cate un bit.<br />

SCN2<br />

1<br />

2<br />

SCN5<br />

SCN3<br />

1<br />

2<br />

SCN6<br />

SCN6<br />

1<br />

2<br />

SCN5<br />

SCN4<br />

1<br />

2<br />

SCN1<br />

2<br />

3<br />

2<br />

3<br />

4<br />

D PRE<br />

4<br />

D PRE<br />

1<br />

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

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

registru. Astfel,<br />

CLK Q<br />

CLR<br />

7432<br />

CLK Q<br />

CLR<br />

1<br />

7432<br />

7432<br />

7474<br />

- numarul de porti SI = s.d.n,<br />

- numarul de porti SAU = d.n<br />

RB<br />

Q<br />

Q<br />

7432<br />

Rezulta o functie de cost ≈ n.d.(s + 1)<br />

3<br />

7474<br />

RA<br />

5<br />

6<br />

3<br />

3<br />

5<br />

6<br />

3<br />

1<br />

2<br />

1<br />

2<br />

1<br />

2<br />

1<br />

2<br />

7408<br />

7408<br />

7408<br />

7408<br />

3<br />

3<br />

3<br />

3<br />

CLK<br />

SCN6<br />

SCN5<br />

SCN4<br />

SCN2<br />

SCN6<br />

SCN5<br />

SCN3<br />

SCN1<br />

CLK<br />

1<br />

2<br />

1<br />

2<br />

1<br />

2<br />

2<br />

3<br />

4<br />

5<br />

1<br />

2<br />

2<br />

3<br />

4<br />

5<br />

7432<br />

7408<br />

7432<br />

7408<br />

3<br />

3<br />

3<br />

3<br />

1<br />

1<br />

2<br />

3<br />

2<br />

3<br />

4<br />

D PRE<br />

CLK Q<br />

CLR<br />

1<br />

4<br />

D PRE<br />

1<br />

Q<br />

CLK Q<br />

CLR<br />

RD<br />

5<br />

6<br />

7474<br />

Q<br />

RC<br />

5<br />

6<br />

7474


Pentru a reduce costul conexiunilor intre surse si destinatii se utilizeaza magistralele. Acestea<br />

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

integrate pe siliciu. Modelul conexiunilor, prin intermediul magistralei, este ilustrat mai jos.<br />

RB<br />

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

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

realizeaza sub controlul unor semnale de comanda de tip nivel, specificate in desen prin<br />

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

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

desen prin expresiile: RC MAG/BUS si RD MAG/BUS.<br />

Magistrala joaca rolul unui circuit SAU, conform figurii de mai jos.<br />

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

secvential. Astfel, transferul:<br />

Q<br />

1<br />

2<br />

RAMAG/BUS<br />

= RB<br />

Q<br />

1<br />

2<br />

MAG/BUS = RA<br />

1. RC RA, se va efectua prin operatiile:<br />

1. MAG/BUS = RA; RC MAG/BUS,<br />

3<br />

OC<br />

3<br />

OC<br />

MAG/BUS<br />

CLK<br />

1<br />

2<br />

CLK<br />

1<br />

+5V<br />

2<br />

R<br />

RD


2<br />

3<br />

2<br />

3<br />

4<br />

D PRE<br />

CLK Q<br />

CLR<br />

1<br />

4<br />

Q<br />

Q<br />

D PRE<br />

Q<br />

CLK Q<br />

CLR<br />

1<br />

7474<br />

7474<br />

5 1<br />

6 2<br />

5 1<br />

6 2<br />

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

vectorilor transferati:<br />

MAG/BUS = RB<br />

RA<br />

MAG/BUS = RA<br />

- numarul de porti SI = s.n,<br />

- numarul de porti SAU = n<br />

Rezulta o functie de cost ≈ n.(s + 1)<br />

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

state”, care inlocuiesc circuitele de tip “OC”.<br />

3<br />

1<br />

2<br />

3<br />

MAG/BUS<br />

7432<br />

3<br />

CLK<br />

1<br />

2<br />

RD


6. INTRODUCERE IN LIMBAJUL DE PROGRAMARE HARDWARE AHPL.<br />

( AHPL - A Hardware Programming Language ).<br />

In functie de scopul urmarit, un calculator numeric poate fi descris folosind diverse mijloace.<br />

Astfel, la nivelul etapei de proiectare, se folosesc adesea diagrame bloc, organigrame, limbaje<br />

specializate, tabele de cablaj etc.<br />

In cadrul acestei lucrari calculatorul numeric este descris in termenii unor secvente de<br />

transferuri ale datelor intre diferitele primitive functionale ale calculatorului, in vederea imple-<br />

mentarii unui algoritm dat. Se considera ca, dupa terminarea acestei etape de proiectare,<br />

elaborarea schemelor logice si a schemelor de cablaj reprezinta operatii mecanice, de rutina, care<br />

se pot automatiza cu usurinta.<br />

Sistemele numerice de calcul prelucreaza in principal date structurate sub forma de vectori<br />

binari, stocati in registre sau memorii organizate sub forma de matrici, cu acces la linii.<br />

In acest context apare evidenta utilitatea unui limbaj prevazut cu facilitati pentru manipularea<br />

vectorilor si matricilor.<br />

Un asemenea limbaj a fost propus de K.E. Iverson in anul 1960 sub numele APL<br />

(A Programming Language ). Limbajul APL cunoaste o larga raspindire, ca limbaj<br />

conversational in sistemele cu multiacces IBM 360/370 si chiar in cadrul calculatoarelor<br />

personale IBM-PC compatibile. Trebuie mentionata, de asemenea, si implementarea realizata in<br />

tara noastra pe sistemele FELIX C-266/512.<br />

APL este un limbaj foarte puternic. El permite descrierea concisa a algoritmilor si verificarea lor<br />

prin executie, pe calculator. Pentru scopurile urmarite de proiectare, limbajul APL trebuie<br />

completat cu instructiuni si alte constructii, care permit o implementare directa in hardware.<br />

Un asemenea limbaj AHPL ( A Hardware Programming Language ) a fost propus de catre<br />

F. Hill si G. Peterson in 1974, fiind apoi perfectionat pe parcurs ( 1978, 1983 ). AHPL, ca limbaj<br />

de descriere a transferurilor intre registre, asigura o corespondenta directa intre notatia folosita<br />

si implementarea ei in hardware.<br />

AHPL foloseste, pe linga constructiile proprii, si un subset de constructii din APL, care isi<br />

gasesc un corespondent in hardware. Frecvent, in scopul facilitarii comunicarii si documenarii, in<br />

programele AHPL se mai utilizeaza unele notatii APL, care descriu algoritmul de operare al unui<br />

calculator numeric.


In momentul traducerii in hardware a descrierii AHPL a modulului numeric dat, aceste notatii<br />

nu sunt luate in consideratie.<br />

Autorii limbajului AHPL au elaborat si un compliator pentru hardware, care are ca intrare<br />

descrierea AHPL a sistemului numeric, iar ca iesire - schema sistemului, la nivel de diagrame.<br />

Indiferent de implementarea unui algoritm, este o buna practica aceea de a descrie mai intai<br />

algoritmul in APL si de a-l executa pe un calculator, prevazut cu un compliator de APL.<br />

In continuare algoritmul descris in APL poate fi implementat in hardware, firmware<br />

(microprogram) sau poate fi executat direct, fiind implementat in software.<br />

Conventii <strong>privind</strong> operanzii folositi in AHPL.<br />

Operanzii manipulati in limbajul AHPL reprezinta marimi constante sau variabile.<br />

Constantele sunt date numerice sau alfanumerice. Ele se reprezinta prin numere standard,<br />

respectiv - prin litere standard sau numere cuprinse intre semnele apostrof.<br />

Variabilele pot fi scalari, vectori, matrici.<br />

Este important de facut distinctie intre variabile si valori.In limbajele conventionale de<br />

programare o variabila reprezinta un nume prin care se face o referire la un operand; o valoare<br />

reprezinta marimea pe care o ia efectiv operandul. In AHPL, prin variabila se intelege numele<br />

unui registru al carui continut este manipulat printr-o instructiune a programului, iar prin valoare<br />

- data care se plaseaza in registru.<br />

Tipurile de operanzi in AHPL se vor deosebi prin conventii tipografice: litere mici pentru<br />

scalari, majuscule pentru vectori si majuscule ingrosate pentru matrici.<br />

Transferul unei constante ( binare - in cazul de fata ) intr-un registru AC se noteaza astfel:<br />

AC 0,1,1,1,1,0,1,0<br />

Transferul continutului unui registru RD, intr-un registru AC, fara a se modifica continutul lui<br />

RD se reprezinta prin instructiunea:<br />

AC ← RD<br />

Un vector constituie o colectie de operanzi avand o structura unidimensionala. Numarul<br />

componentelor vectorului reprezinta dimensiunea vectorului. Pentru a specifica dimensiunea<br />

unui vector oarecare (AC) se va folosi notatia ρAC, unde ρ reprezinta operatorul “dimensiune”.<br />

Daca AC are 16 biti (ranguri binare), atunci ρAC = 16. In aceasta lucrare, in cazul in care nu se


vor face mentiuni speciale, pozitiile bitilor individuali vor fi specificate prin indici cu originea 0,<br />

plasata in extrema stanga: AC0 ,AC1 ,......,ACρAC-1<br />

Trebuie observat ca aceasta notatie este destul de greoaie in textele dactilografiate, ceea ce<br />

face ca, in multe cazuri, indicii sa fie plasati pe aceeasi linie cu numele registrului, de exemplu:<br />

ACi - bitul de rang i din registrul AC. Pentru a specifica un grup de biti adiacenti, dintr-un<br />

registru se foloseste notatia: A i:j sau A(i:j), unde sunt inclusi si bitii i si j.<br />

Operanzii de tip matricial se reprezinta sub forma unui tablou bidimensional, constituit din<br />

elemente cu indici inferiori si superiori. Indicii inferiori specifica coloanele, iar cei superiori<br />

liniile. Se considera matricea M avind ρ1M coloane si ρ2M linii, unde ρ1 si ρ2 reprezinta<br />

notatiile pentru operatorii care aplicati lui M furnizeaza numarul de coloane si numarul de linii<br />

ale tabloului M.<br />

M 0 0 M 0 1 …….....….......M 0 ρ1M-1<br />

...................……..…..……....<br />

.......….……. M i j.......……….<br />

M ρ2M-1 0 M ρ2M-1 1........……. M ρ2M-1 ρ1M-1<br />

Linia i a matricii M se specifica prin notatia M i sau M, iar coloana j - prin notatia Mj sau<br />

M[j]. Liniile succesive i...k, ale matricii M se noteaza prin M i:k sau M, iar coloanele<br />

succesive j...l - prin Mj:l sau M[j:l].<br />

Conventii <strong>privind</strong> operatorii APL si AHPL.<br />

Operatorii folositi sunt operatorii primitivi si operatorii de tip mixt.<br />

Operatorii primitivi manipuleaza, de regula, operanzi de tip scalar, desi ei pot fi extinsi atat la<br />

vectori, cat si matrici. Acesti opeatori se pot referi la o singura variabila (operatori unari) sau la<br />

doua variabile (operatori binari). In cele ce urmeaza se prezinta operatorii primitivi aritmetici,<br />

logici si relationali. In scopul facilitarii comunicarii, in textele ce reprezinta programe AHPL pot<br />

fi intalniti toti acesti operatori. Implementari directe in hardware au insa numai operatorii logici.<br />

Operatorii aritmetici si relationali sunt specifici limbajului APL.


Operatorii aritmetici manipuleaza numere reale:<br />

x + y adunare; suma algebrica, ( APL ),<br />

x - y scadere; diferenta algebrica, ( APL ),<br />

x ∗ y inmultire; inmultire algebrica, ( APL ),<br />

x % y impartire algebrica; ( APL ).<br />

|x valoare absoluta; ( APL ).<br />

Operatorii logici manipuleaza numere binare ( vectori binari ):<br />

x NU (APL si AHPL),<br />

x ∩ y SI (APL si AHPL),<br />

x ∪ y SAU (APL si AHPL),<br />

x ⊕ y SAU-Exclusiv (APL si AHPL).<br />

Operatorii relationali sunt de forma:<br />

( x ℜ y ) unde ℜ ∈ { } ( APL ).<br />

In versiunile existente de APL, incercarea de a folosi alte tipuri de variabile, cu exceptia celor<br />

logice, conduce la eroare de domeniu.<br />

In raport cu operatorii aritmetici si relationali nu exista limitari <strong>privind</strong> folosirea variabilelor.<br />

In exemplele urmatoare se considera:<br />

x = 1, y = -3, W = ( 4,-5,0,2 ) si U = ( 1,2,1,-1 ).<br />

Instructiune: Rezultat:<br />

z ← x + y z = -2<br />

z ← x z = 0<br />

Z ← W + U Z = ( 5,-3, 1,1 )<br />

Z ← W * U Z = ( 4,-10,0,-2 )<br />

Z ← W % U Z = ( 4,-2.5,0,-2 )<br />

z ← ( x < y ) z = 0<br />

z ← ( x > y ) z = 1<br />

Operatorii de tip mixt sunt extrem de puternici, deoarece permit manipularea unor combinatii<br />

de scalari, vectori si matrici. In cele ce urmeaza se vor prezenta operatorii de tip mixt, cu<br />

specificarea limbajelor in care se utilizeaza.


Notatie Denumire Semnificatie Observatii<br />

X,Y Inlantuire/ X0 ,...,XρX-1 ,Y0 ,....,YρY-1 APL si AHPL<br />

Concatenare<br />

M!N Inlantuire O matrice cu ρ2M+ρ2N linii AHPL<br />

linii. cu liniile lui M peste liniile lui N.<br />

k↑X Extragere Se extrag primele k elemente APL<br />

din vextorul X.<br />

k↓X Eliminare Se elimina primele k elemente APL<br />

din vectorul X.<br />

⊥ X Decodificare Echivalentul zecimal al vectorului APL<br />

binar X<br />

nΤp Codificare Un vector cu n elemente binare, APL si AHPL<br />

binara. obtinut prin repre zentarea<br />

numarului zecimal p in baza doi.<br />

@/X Reducere X0 @X1 @X2 @............@XρX-1 APL si AHPL<br />

X ← @/M Reducere X i ← @/M i AHPL si APL<br />

linie<br />

X ← @//M Reducere Xj ← @/Mj AHPL si APL<br />

coloana<br />

X ← U/Y Comprimare Vectorul X este obtinut APL si AHPL<br />

din vectorul Y prin su- in descrierea<br />

primarea rangurilor Xi unitatilor logice<br />

pentu care Ui =0 combinationale<br />

U este vector binar.<br />

A ← U/M Comprimare Ai ← U/M i Idem linii.<br />

A ← U//M Comprimare Aj← U/Mj Idem coloane<br />

coloane<br />

Nota1: @ este un operator logic sau aritmetic.<br />

Nota2: A si M sunt matrici, iar U este un vector binar.


In exemplele care urmeaza se ilustreaza utilizarea operatorilor de tip mixt.<br />

Inlantuirea.<br />

Fie: X = ( 1,2,3,4 ) si Y = ( 5,6,7 ),<br />

daca Z ← X,Y atunci, rezulta: Z = ( 1,2,3,4,5,6,7 )<br />

Inlantuirea permite descrierea operatiilor de deplasare si rotire ale vectorilor si matricilor.<br />

In cele ce urmeaza se vor prezenta notatiile AHPL pentru deplasari si rotiri de vectori.<br />

Fie vectorul A = ( A0 ,A1 ,A2 ,......,AρA-1)<br />

Deplasare logica - dreapta (cu inserta unui zero in bitul 0).<br />

A ← 0, A0 ,A1 ,A2 ,......,AρA-2<br />

Deplasare logica - stanga (cu insertia unui zero in bitul de rang ρA-1).<br />

A ← A1 ,A2 ,......,AρA-1,0<br />

Deplasare aritmetica dreapta (cu extinderea bitului de rang 0 in bitul de rang 1).<br />

A ← A0, A0 ,A1 ,A2 ,......,AρA-2<br />

Deplasarea aritmetica stanga este identica cu deplasarea logica stanga.<br />

Rotire -dreapta.<br />

A ← AρA-1, A0 ,A1 ,A2 ,......,AρA-2<br />

Rotire - stanga.<br />

A ← A1 ,A2 ,......,AρA-1, A0<br />

In operatiile de deplasare si rotire, inaintea bitului de rang 0 si dupa bitul de rang ρA-1, se pot<br />

plasa biti individuali reprezentand indicatori de conditii ( de exemplu, din unitatea de executie,<br />

bitul de transport). Cele mai multe microprocesoare dispun de instructiuni care implementeaza<br />

asemenea operatii de deplasare. Ele sunt folosite pentru instructiunile de transfer conditionat al<br />

comenzii.<br />

In continuare sint ilustrate operatiile de rotire/deplasare circulara a liniilor unei matrici.<br />

Fie: 1 0 0<br />

M = 1 1 0<br />

0 1 1<br />

Deplasare circulara in sus.<br />

1 1 0<br />

Daca N ← M 1:2 ! M 0 , atunci rezulta: N = 0 1 1<br />

1 0 0


Deplasre circulara in jos.<br />

0 1 1<br />

Daca N ← M 2 ! M 0:1 , atunci rezulta: N = 1 0 0<br />

1 1 0<br />

Extragerea.<br />

Fie: X = (1,2,3,4,5,6)<br />

daca Y ← 4↑X, atunci rezulta: Y = ( 1,2,3,4 ) in APL<br />

Eliminarea.<br />

daca, Y ← 4↓X atunci rezulta: Y = ( 4,5,6 ) in APL.<br />

In AHPL notatiile echivalente vor fi urmatoarele:<br />

Y ← X0:3 ( extragere ) si respectiv Y← X4:6 ( eliminare )<br />

Decodificare binara.<br />

Fie: X = ( 1,1,0,1 ) si Y = ( 1,0,0,0,1 )<br />

daca: x ← ⊥ X si y ← ⊥ Y, atunci: x = 13 si y = 17<br />

Codificarea binara.<br />

Fie: x = 13 si y = 17<br />

daca: X ← 4 Τ x si Y ← 5 Τ y, atunci: X = ( 1,1,0,1 ) si Y = ( 1,0,0,0,1 ).<br />

Reducere.<br />

Fie @ un operator binar care se aplica unui vector binar X,rezultatul operatiei va fi de forma:<br />

x ← ( ....(( X0@X1 )@X2 )@.....XρX-1 )<br />

Expresia:<br />

x ← +/X este echivalenta cu :<br />

ρX-1<br />

x ← Σ Xi<br />

i=0<br />

Daca X este un vector logic ( cu componente binare ), atunci urmatoarele operatii vor furniza<br />

informatii <strong>privind</strong>:<br />

x ← +/X, numarul de unitati din vectorul X;<br />

x ← ∪ /X, prezenta a cel putin unei unitati diferita de zero, daca x 0;<br />

x ← ∩ X, prezenta tuturor componentelor egale cu unu, daca x = 1.


Fie matricea M:<br />

1 0 0 1<br />

M ← 0 1 0 0 , atunci: +/M = ( 2,1,3 ); +//M = ( 2,1,1,2,) si +/(+//(M)) = 6.<br />

1 0 1 1<br />

Comprimare.<br />

Fie U = ( 1,0,0,1 ) si A = ( 1,2,3,4 ), atunci: X ← U/A, conduce la rezultatul: X = ( 1,4 )<br />

Considerind matricea M si vectorul U de mai sus, comprimarea pe linii N ← U/M va furniza<br />

matricea N, de forma:<br />

1 1<br />

N ← 0 0<br />

1 1<br />

Comprimarea coloanelor va fi exemplificata cu un vector logic V, de forma: V = ( 1,1,0 ).<br />

N


Se poate observa ca vectorul U se pute genera simplu prin opeatia:<br />

U ← (M0 ∩ M1 ∩ M2 ∩ M3)<br />

Deci, tot programul secvential de mai sus se poate inlocui cuexpresia:<br />

N ← (M0 ∩ M1 ∩ M2 ∩ M3) // M<br />

Conventii AHPL pentru descrierea logicii combinationale.<br />

S-a aratat ca procesul de prelucrare a datelor consta in trans-ferul acestora intre registrele sursa<br />

si registrele destinatie prin intermediul unor retele logice combinationale. Acestea din urma<br />

reprezinta resurse hardware, care pot fi folosite in mod repetat, cu diverse argumente, in puncte<br />

diferite ale secventei AHPL, care descrie algoritmul.<br />

Se considera o retea logica combinationala, care realizeaza operatia NAND ( SI-NU ) asupra<br />

rangurilor a doi vectori de 4 biti.<br />

C ← ( A0 ∩ B0 , A1 ∩ B1 ,A2 ∩ B2 , A3 ∩ B3)<br />

Daca expresia de mai sus apare in mod repetat in secventa AHPL, se poate folosi o notatie<br />

prescurtata:<br />

C ← NAND(A;B), care este asemanatoare unei notatii de subrutina intr-un limbaj de<br />

programare. In contextul de fata NAND(A;B) va fi mentionata ca o functie sau o unitate logica<br />

combinationala.<br />

Intr-un program AHPL, ea va fi descrisa o singura data, dupa care poate fi apelata in mod<br />

repetat, cu diferite argumente.<br />

Sub forma generala descriera unei asemenea functii fi delimitata de titlu si de sfirsit ( END ).<br />

UNIT: NAND(A;B)<br />

END<br />

conexiuni<br />

.........<br />

conexiuni<br />

Dupa titlu pot urma declaratii <strong>privind</strong> vectorii manipulati, lungimea lor etc. Conexiunile sunt<br />

instructiuni care se traduc direct in hardware sub forma unor legaturi intre intrarile si iesirile<br />

unor circuite logice combinationale.<br />

Intr-un alt paragraf se vor da mai multe exemple <strong>privind</strong> descrierea unor unitati logice<br />

combinationale: BUSFN, DCD, ADD etc.


7. Descrierea sistemelor numerice la nivelul transferurilor<br />

intre registre folosind limbajul AHPL.<br />

Sistemele numerice de calcul au un caracter complex ceea ce conduce la o serie de dificultati,<br />

atat in privinta descrierii lor functionale, cat si a proiectarii lor.<br />

Plecand de la modul lor de functionare, ele pot fi partajate in subsisteme sau module mai<br />

simple, cu specificatii bine precizate in legatura cu semnalele de intrare si iesire, care vor<br />

reprezenta date, comenzi, stari, sincronizari etc, pe de-o parte, cat si in legatura cu algoritmul de<br />

operare.<br />

Sub aspect functional, un sistem numeric poate fi descris prin proceduri si functii, plecind de la<br />

algoritmul pe care trebuie sa-l execute. Astfel, intr-o prima etapa, descriera sistemului numeric<br />

va fi asemanatoare cu cea a unui program de mare complexitate.<br />

Procedurile vor avea ca implementari fizice modulele, in timp ce functiile vor fi realizate prin<br />

unitati logice combinationale.<br />

In cadrul modulelor pot fi evidentiate unitatile de executie si de comanda. In descrierea<br />

modulelor se intilnesc in mod frecvent functii a caror implementare conduce la scheme logice<br />

combinationale. Pentru prezentarea modalitatilor de descriere ale modulelor si functiilor se va<br />

folosi forma BNF ( Backus-Naur Form ).<br />

Structura unei proceduri ( modul ) este urmatoarea:<br />

MODULE: < nume modul ><br />

END<br />

< lista de declaratii ><br />

< lista de pasi AHPL ><br />

ENDSEQ<br />

< lista de instructiuni individuale nesincronizate si instructiuni ><br />

< lista de declaratii >:= < MEMORY ( memorii ) ><br />

< INPUTS ( intrari ) ><br />

< OUTPUTS ( iesiri ) ><br />

< BUSES ( magistrale ) ><br />

< LABELS ( etichete ) ><br />

< ONE-SHOTS ( monostabile ) ><br />

< COMBUSES ( magistrale decomunicatii)>


MEMORY >: < lista de bistabile >;< lista de registre >;<br />

< lista de bistabile >:= < nume bistabil >;...;< nume bistabil ><br />

< lista de registre>:= < nume registru[i]>;...;<br />

< i, j >:= dimensiunile registrelor<br />

< i, j >:= 1|2|.......|n<br />

< lista de memorii >:= < nume memorie[m;n] >;...;< nume memorie[r;q]<br />

< m,r >:= numar de cuvinte in memorii<br />

< n,q >:= numar de biti in cuvintele de memorie<br />

< m, n, q, r >:= 1|2|......|n<br />

< INPUTS >: < lista de vectori >;< lista de semnale individuale><br />

< lista de vectori >:= < nume vector[i] >;...;< nume vector[j] ><br />

< lista de semnale individuale >:= < nume semnal >;...;< nume semnal ><br />

: < lista de vectori >;...;< lista de semnale individuale ><br />

< BUSES >: < lista de magistrale ><br />

< lista de magistrale >:= < nume magistrala[i] >;...;< nume magistrala[j] ><br />

< i,j >:= dimensiunile magistralelor<br />

< LABELS >: < lista de etichete ><br />

< lista de etichete >:= < nume eticheta >;...; < nume eticheta ><br />

( etichetele sunt folosite pentru a referi campuri din anumite registre - subregistre etc )<br />

< ONE-SHOTS >: < lista de monostabili ><br />

< lista de monostabili >:= < numemonostabil[i] >;...;< nume monostabil[j] ><br />

< i,j >:= duratele semnalelor la iesirile monostabilelor, date in multipli ai perioadei de tact<br />

< COMBUSES >: < lista de magistrale de comunicatii ><br />

< lista de magistrale de comunicatii >:= < nume magistrala[i] >;< nume magistrala[j]<br />

( magistrala de comunicatii trebuie sa fie conectata la un set de linii de intrare/iesire in/din<br />

modul ><br />

Exemplu de declaratii: Se considera un modul FILTRU DE CUVINTE plasat intre doua<br />

sisteme numerice A ( emitator ) si B ( receptor ), care permite trecerea unor vectori binari ce<br />

indeplinesc anumite conditii. Modulul poseda registrele de intrare si iesire<br />

REGIN[16] si REGIES[16], registrul intern A[4] si bistabilul a,


intrarea X[16] si iesirile Z[16], gatain, gataies.<br />

Descrierea modulului va incepe astfel:<br />

MODULE: FILTRU DE CUVINTE<br />

MEMORY: REGIN[16]; REGIES[16]; A[4], a<br />

INPUTS: X[16]<br />

OUTPUTS: Z[16]; gatain; gataies<br />

In continuare se va prezenta secventa de pasi AHPL. Un pas AHPL contine toate operatiile<br />

elementare, sincrone cu o perioada a ceasului, care au loc la nivelurile resurselor unitatilor de<br />

executie si comanda. Fiecare pas de comanda va consta din instructiuni AHPL de atribuire<br />

(actiune si o instructiune AHPL de ramificare/control ).<br />

< secventa de pasi AHPL >:= < pas AHPL><br />

< pas AHPL ><br />

............<br />

< pas AHPL ><br />

< pas AHPL >:= < lista de instructiuni de atribuire >;< instructiune de ramificatie ><br />

< instructiune de atribuire >:= < nul >|< transfer sincron >|< conexiune >|< transfer sicron;<br />

conexiune ><br />

< instructiune de ramificare >:= < nul >|< → (F)/(Sj) >|< → (Sj) >|< DEAD END-fara<br />

continuare ><br />

< nul >:= < absenta instructiunii de atribuire >|< instructiune implicita de ramificare la pasul<br />

urmator ><br />

< transfer sincron >:= < VD |< VD ← MLCS*F >|< MD*F ← VLCS ><br />

VD - vector destinatie. El reprezinta fie un registru simplu, fie un vector format din unul sau<br />

mai multe elemente de memorie asamblate pe baza unor operatori de selectie. Indicii superiori si<br />

inferiori, care afecteaza operanzii, sunt in mod obligatoriu constante.<br />

Se folosesc urmatorii operatori de selectie:<br />

Aj - elementul j din vectorul<br />

A m:n - elementele m, pina la n, din vectorul A<br />

, - inlantuire ( concatenare )<br />

A ! B - inlantuire pe linii<br />

M j - linia j din matricea M


Mm:n - liniile m, pina la n, din matricea M.<br />

VLCS reprezinta un vector logic combinational sursa, constituit din expresii logice<br />

combinationale evaluate, ale caror argumente (operanzi) pot fi: elemente de memorie, intrari,<br />

functii logice, magistrale, constante binare.<br />

Operatorii din expresii sint de tip logic: ∩ (SI), ∪ (SAU), (NU), ∩ / ( SI aplicat<br />

elementelor vectorului ), ∪ / (SAU aplicat elementelor vectorului), ⊕ / (SAU-Exclusiv),<br />

SYN (sincronizare).<br />

In absenta parantezelor, in expresiile din VLCS, operatorii logici si de selectie vor avea<br />

urmatoarele prioritati:<br />

1. Negatia si Sincronizarea,<br />

2. Toti operatorii de selectie, cu exceptia inlantuirii,<br />

3. ∩<br />

4. ∪ sau ⊕ ,<br />

5. Inlantuirea.<br />

MD - matrice de memorie sau asamblaj de registre de memorare.<br />

MLCS - matrice logica combinationala sursa, constituita din asamblaje de vectori logici<br />

combinationali.<br />

F - vector de selectie, ale carui componente sint expresii logice combinationale evaluate, care se<br />

exclud mutual:<br />

F = ( f1 ( x1 ,...,xn ),.....,fm (x1 ,...,xn),<br />

unde: ( fi ∩ f j =0 ) si ( ∪ /F ) = 1; i,j = 1,...,n; i = j; xI ∈ { 0,1 }.<br />

Expresiile: MLCS*F si MD*F sint echivalente cu expresiile:<br />

F/MLCS si F/MD ( selectie pe linii ).<br />

< conexiune > := < BUS = VLCS >|< BUS = MLCS*F >|< Z = VLCS >|< Z = MLCS*F ><br />

Exemple:<br />

D ← Am:n , Bp:q<br />

D ← A + B,C<br />

Fie matricea logica combinationala sursa: ( A ! B ! C ), unde A, B, C sunt vectori logici<br />

combinationali, si vectorul logic:<br />

F = ( d, e, f ).


In aceste conditii se pot scrie urmatoarele instructiuni de atribuire:<br />

1. D ← ( A ! B ! C ) * ( d, e, f )<br />

echivalenta cu:<br />

D ← d ∩ A U e ∩ B U f ∩ C<br />

2. ( A ! B ! C ) * ( d, e, f ) ← D<br />

echivalenta cu:<br />

d ∩ A ∪ e ∩ B ∪ f ∩ C ← D<br />

3. BUS = ( A ! B ! C ) * ( d, e, f )<br />

reprezenand o conexiune conditionala la magistrala BUS a unuia dintre vectorii A, B, sau C.<br />

In instructiunea de tip ramificatie, F are semnificatia prezentata mai sus, iar E constituie un<br />

vector ale carui componente (Ei) sunt numere/etichete de pasi AHPL, din secventa data, la care<br />

poate avea loc ramificarea ( transferul comenzii ).<br />

De exemplu, ramificarea:<br />

→ ( x, x )/( Ei, Ej)<br />

asigura transferul comenzii la linia Ei , daca x = 1 sau la linia Ej , daca x = 0.<br />

DEAD END marcheaza sfirsitul comenzii, terminarea operarii in sensul ca instructiunea de<br />

comanda nu mai genereaza trecerea la pasul urmator din secventa, acesta lipsind.<br />

Dupa END SEQ ( sfirsitul secventei de pasi AHPL ), in descrierea modulului sint plasate<br />

instructiunile individuale de atribuire nesincronizate, conexiunile permanente, operatiile de<br />

comanda asincrone, cum ar fi operatia RESET(1), care forteaza reluarea secventei numerotate<br />

de pasi AHPL de la linia 1.<br />

Descrierea AHPL a unei functii.<br />

UNIT: < nume de functie >( )<br />

< declaratii ><br />

< secventa de instructiuni de conexiune, contorizare,<br />

transfer al comenzii ><br />

END<br />

< parametri > := < lista de intrari ><br />

< lista de intrari >:= < VLC >|< MLC ><br />

< declaratii >: < INPUTS ><br />

< OUTPUTS >


INPUTS >: < lista de intrari separate prin ; ><br />

< OUTPUTS >:< vector logic combinational ><br />

< secventa de instructiuni > := < conexiune >| < atribuire de valoare unui indice >|< transfer<br />

conditionat al comenzii ><br />

< atribuire de valoare unui indice > := < nume indice ⇐ valoare binara | zecimala ><br />

< transfer conditionat al comenzii >:= < ⇒ (F)/(S) ><br />

Efectul executiei unui program AHPL, ce descrie o unitate, reprezinta compilarea - generarea<br />

schemei hardware pentru acea unitate combinationala. Numai instructiunile de conexiune<br />

genereaza efectiv hardware. Instructiunile care manipuleaza indici si cele de transfer asigura<br />

efectuarea unor operatii de ciclare pentru generarea unor copii multiple ale aceleiasi scheme.<br />

Folosirea functiilor, in cadrul unor module, presupune descrierea lor ca unitati, o singura data,<br />

in vederea compilarii/generarii schemei logice combinationale specifice. Unitatea poate fi apelata<br />

ca functie, in cadrul instructiunilor de atribuire ( transfer | conexiune ), din secventa de pasi<br />

AHPL, a unui modul.<br />

In rezumat structura bloc a unui sistem numeric consta din module si functii:<br />

Sistem Numeric<br />

*) Specifica o conexiune<br />

Modul<br />

Nume modul<br />

Declaratii Pas secv.<br />

Procedura Modul Secventa de comanda Pas secv.<br />

Sfarsit secventa Pas secv.<br />

Transferuri si conexiuni<br />

Modul Sfarsit<br />

Unitate<br />

Nume unitate<br />

Declaratii Pas secv.<br />

Functie Unitate Secventa de conexiuni Pas secv.<br />

Sfarsit Pas secv<br />

Unitate<br />

* )


Sintaxa unui pas de comanda din secventa:<br />

NUL<br />

Instructiune de conectare<br />

Actiune Transfer sincron<br />

Transferuri si conexiuni<br />

Pas din secventa<br />

de comanda → (F)/(E)<br />

→ (Ej)<br />

Ramificatie NUL<br />

Fara continuare (DEAD END)<br />

Transferul sincron poate avea unul din urmataoarele formate:<br />

VD ← VLCS<br />

Transfer sincron VD ← MLCS * F<br />

MD * F ← VLCS<br />

Instructiunea de conectare poate avea unul din urmatoarele formate:<br />

BUS = VLCS<br />

Instructiune de conectare BUS = MLCS*F<br />

z = VLCS<br />

z = MLCS * F<br />

Exemple de descrieri AHPL ale unor UNITATI (Circuite Logice Combinationale) si ale<br />

unor module.<br />

1. Sumatorul Complet (FULLADD).<br />

Sumatorul Complet reprezinta un circuit logic combinational cu trei intrari: x, y, cin si doua<br />

iesiri: sum, cout. Intrarile x si y sunt intrari de date de cate un bit (corespunzatoare unui rang<br />

oarecare i, in cazul adunarii a doi vectori binari X si Y), iar cin este intrarea de transport (din<br />

rangul inferior). Iesire sum corespunde sumei, pentru rangul curent, iar cout constituie<br />

transportul in rangul urmator. x y<br />

cout cin<br />

FULLADD<br />

sum


Ecuatiile logice pentru sum si cout sunt urmatoarele:<br />

sum = ( x ∩ y ∩ cin ) ∪ ( x ∩ y ∩ cin ) ∪ ( x ∩ y ∩ cin ) ∪ ( x ∩ y ∩ cin )<br />

cout = ( x ∩ y ) ∪ ( x ∩ cin ) ∪ ( y ∩ cin )<br />

Aceste ecuatii se pot implementa cu ajutorul portilor SI, SAU, NU.<br />

Folosind si porti SAU-EXCLUSIV, expresiile de mai sus devin mai simple:<br />

sum = x ⊕ y ⊕ cin<br />

cout = ((x ⊕ y) ∩ cin ) ∪ ( x ∩ y )<br />

Cu ajutorul ecuatiilor de mai sus se poate prezenta o secventa AHPL, de descriere a Sumatorului<br />

Complet, sub forma unei Unitati:<br />

UNIT: FULLADD(x ; y ; cin)<br />

END<br />

INPUTS: x ; y ; cin<br />

OUTPUTS: FULLADD[2]<br />

1. a = x ⊕ y<br />

2. b = x ∩ y<br />

3. sum = a ⊕ cin<br />

4. c = a ∩ cin<br />

5. cout = b ∪ c<br />

6. FULLADD0 = cout<br />

7. FULLADD1 = sum<br />

Primele cinci instructiuni reprezinta pasi de conectare, iar ultimele doua instructiuni constituie<br />

iesirile.<br />

Se poate observa ca secventa care descrie un Sumator Complet are un caracter “spatial”, in<br />

sensul ca pasii reprezentati corespund iesirilor/intrarilor portilor logice, care intra in componenta<br />

unei retele spatiale. Pasii 1-7 nu sunt legati de vreun mecanism de temporizare. Elementul timp<br />

intervine, in acest context, numai in legatura cu intarzierea in propagarea semnalelor prin porti..<br />

Intrarile x, y si cin trebuie sa fie stabile pana la obtinerea rezultatelor sum si cout.<br />

Pe baza Unitatii FULLADD se poate genera un sumator cu transport succesiv pentru numere<br />

binare de cate 16 biti.


Sumator, ADD, cu transport succesiv, pentru numere binare de cate 16 biti.<br />

Pentru realizarea unui asemenea sumator, se vor utiliza, in caltate de blocuri constructive,<br />

componentele Sumatorului Complet: FULLADD0 si FULLADD1. Acestea vor fi chemate<br />

succesiv, in cadrul unor cicluri, pentru fiecare bit al sumatorului ADD. In cadrul programului<br />

AHPL, pentru controlul ciclurilor se va introduce un indice i, care va fi initializat, decrementat si<br />

testat. Operatiile corespunzatoare manipularii indicelui i vor fi marcate cu sageti cu corp dublu,<br />

care vor fi tratate intr-o maniera specifica de catre compilatorul, care va genera schema lui ADD.<br />

UNIT: ADD( X; Y )<br />

END<br />

INPUTS X[16]; Y[16]<br />

OUTPUTS: ADD[17]<br />

1. C16 = 0<br />

2. i ⇐ 15<br />

3. Ci = FULLADD0 ( Xi; Yi; Ci+1)<br />

4. Si = FULLADD1 ( Xi; Yi; Ci+1)<br />

5. i ⇐ i – 1<br />

6. ⇒ ( i ≥ 0)/(3)<br />

7. ADD = C0, S0:17<br />

Compilarea manuala a acestui program AHPL, va genera elementele schemei sumatorului ADD,<br />

in maniera prezentata mai jos la nivelul primelor doua si al ultimei parcurgeri a programului.


X15 Y15<br />

1. C15 C16<br />

2. X14 Y14 X15 Y15<br />

S15<br />

C14 C15 C16<br />

S14 S15<br />

3. X0 Y0 X14 Y14 X15 Y15<br />

2. Decodificatorul DCD.<br />

C0 C14 C15 C16<br />

C0 S0 S14 S15<br />

ADD0 ADD1 ADD14 ADD15<br />

Decodificatorul DCD(A), unde A este un vector binar de n biti, este un circuit combinational cu<br />

n intrari si 2 n iesiri. Pentru oricare vector binar, aplicat la intrare, numai o singura iesirea<br />

decodificatorului va fi activa.<br />

A0 DCD0<br />

A1 DCD1<br />

DCD<br />

FADD<br />

An DCD2 n -1<br />

Descrierea DCD(A) in AHPL este urmatoarea:<br />

UNIT: DCD(A)<br />

INPUTS: A[n]<br />

OUTPUTS: DCD( 2 n )<br />

1. i ⇐ 0<br />

2. DCDi = ∩ /(( n Τ i ) / A), ( n Τ i ) / A)<br />

3. i ⇐ i + 1<br />

4. i ⇒ ( i < 2 n )/(2)<br />

END<br />

FADD<br />

FADD<br />

FADD<br />

FADD<br />

FADD


Primul pas initializeaza indexul i, pentru a stabili iesirea decodificatorului, care urmeaza sa fie<br />

evaluata. Operatiile inceteaza dupa evaluarea tuturor iesirilor decodificatorului DCD.<br />

Pentru a intelege cum se evalueaza iesirile decodificatorului, sa considera cazul particular n = 4<br />

si i = 5.<br />

DCD5 = ∩ /(( 4 Τ 5 ) / A), ( 4 Τ 5 ) / A )<br />

= ∩ /((0,1,0,1) / A), (0,1,0,1) / A)<br />

= ∩ /(( A1, A3 ), (A0, A2)) = A0 ,A1, A2, A3<br />

In cazul in care A = A0 ,A1, A2, A3 = (0, 1, 0, 1) se obtine DCD5 =1. Celelalte iesiri DCDj, pentru<br />

care j ∈ {0, 1, 2,….., 2 n-1 } ∩ j ≠ 5, vor lua valoarea 0.<br />

3. Circuitul, BUSFN, de citire a unui cuvant dintr-o memorie M.<br />

Se considera o memorie M, alcatuita din mai multe registre M 0 , M 1 , ……, M 2↑m –1 . Memoria<br />

primeste informatiile de adresa de la un registru RA si efectueaza operatiile de citire/scriere prin<br />

intermediul unui registru RD.<br />

Adresa<br />

Scrie Citeste<br />

Data<br />

Memoria M dispune de o unitate de comanda, care asigura controlul operatiilor de scriere si<br />

citire, pe baza semnalelor primite din exterior.<br />

Operatiile de citire si scriere se pot descrie, la nivelul transferurilor intre registre, dupa cum<br />

urmeaza:<br />

• Citire<br />

R<br />

A<br />

Comnada<br />

( DCD),<br />

(BUSFN)<br />

i. RA ← Adresa<br />

(i +1). RD ← BUSFN( M; DCD(RA)); Citeste = 1<br />

• Scriere<br />

j. RA ← Adresa; RD ← Data<br />

(j +1). M* DCD(RA) ← RD; Scrie = 1<br />

M 0<br />

M 1<br />

…..<br />

2↑m -1<br />

M<br />

RD


BUSFN(M; DCD(RA)) reprezinta o functie logica combinationala, care are ca argumente o<br />

matrice M, cu ρ2M linii si ρ1M coloane, pe de-o parte si un vector DCD(RA), cu 2 m<br />

componente, pe de alta parte, unde ρ2M = 2 m .<br />

Daca in locul vectorului DCD(RA) se utilizeaza un vector R[r], iar ρ1M este egal cu p, se poate<br />

obtine urmatoarea descriere AHPL:<br />

UNIT: BUSFN( M ; R )<br />

END<br />

INPUTS: M[ r : p ]<br />

OUTPUTS: BUSFN[ p ]<br />

1. N 0 = M 0 ∩ R0<br />

2. i ⇐ 1<br />

3. N i = ( M i ∩ Ri ) ∪ N i-1<br />

4. i ⇐ i + 1<br />

5. i ⇒ ( i < r )/(3)<br />

6. BUSFN = N r-1<br />

O schita a implementarii unitatii BUSFN, in contextul operatiei de citirere, este data mai jos.<br />

SCNi<br />

citeste<br />

M0 M1 Mp2M-1<br />

DCD0 DCD1<br />

DCDp2M-1<br />

0 1<br />

N N<br />

BUSFN(M;DCD(RA))<br />

MAG/BUS


4. Implementarea secventei start/reset (PRESET).<br />

Implementarea primilor pasi dintr-o secventa AHPL, din cadrul descrierii unui modul a carui<br />

operare este lansata de semnalul start, este prezentata mai jos. Primul bistabil (1), cat si celelalte<br />

bistabile (2), (3), (4) ale schemei de comanda au fost fortate, printr-un semnal reset/PRE/CLR<br />

asincron, in starile Q1 = 1 si, respectiv, Q2 =0, Q3 =0, Q4 =0. Comanda reset, in cazul de fata<br />

PRESET, are un caracter asincron si apare, in secventa AHPL, intre specificatiileENDSEQ si<br />

END, sub forma: PRESET(1), unde (1) constituie linia AHPL, la care se efectueaza saltul (un<br />

GO TO 1 asincron).<br />

Ceas<br />

PRESET<br />

Ceas<br />

start<br />

SYN(start)<br />

SCN1<br />

SCN2<br />

SCN3<br />

PRE<br />

D Q<br />

C<br />

D Q<br />

D Q<br />

D Q<br />

1 2 3 4<br />

C<br />

CLR<br />

C<br />

CLR<br />

C<br />

CLR<br />

SYN(start)<br />

SCN2 SCN3 SCN4


In continuare, operarea automatului cu stari complet decodificate, la nivelul primului bistabil,<br />

este prezentata sub forma diagramei de tranzitii:<br />

SYN(start) PRESET(1)<br />

1<br />

SYN(start)<br />

Dupa cum se constata, automatul va parasi starea (1) numai in conditiile in care semnalul<br />

SYN(start) va trece pe nivel ridicat. In caz contrar, starea (1) se va extinde pe un numar indefinit<br />

de perioade de ceas.<br />

5. Sincronizarea semnalului start.<br />

In cele prezentate mai sus, s-a vazut necesitatea existentei unui semnal de start, pentru activarea<br />

automatului de comanda al unui modul. De cele mai multe ori semnalul start este dat manual,<br />

ceea ce face ca el sa fie asincron cu ceasul sistemului si sa aibe o durata relativ mare.<br />

Sincronizarea semnalului start, specificata prin operatorul SYN(start), se poate realiza cu<br />

ajutorul diferitelor scheme. Mai jos se prezinta una dintre acestea, impreuna cu diagramele de<br />

semnale.<br />

start<br />

ceas<br />

ceas<br />

start<br />

SYN(start)<br />

SYNI(start)<br />

SNP(SYN(start))<br />

PRE<br />

D Q<br />

C<br />

2<br />

SYN(start)<br />

PRE<br />

D Q<br />

C<br />

SYNI(start)<br />

SNP(SYN(start))


Se poate usor observa ca, cel de-al doilea bistabilul reproduce sub forma negata, la iesirea Q,<br />

semnalul SYN(start), intarziat cu o perioada de ceas. Prin efectuarea produsului logic intre<br />

SYN(start) si semnalul SYNI(start) se obtine un semnal de start sincronizat, de tip nivel, cu<br />

durata unei perioade de ceas: SNP(SYN(start)).<br />

6. Comanda citirii instructiunii dintr-o memorie principala asincrona.<br />

Memoriile principale ale calculatoarelor numerice reprezinta module, care opereaza asincron, de<br />

cele mai multe ori.<br />

Secventa AHPL, pentru citirea unei instructiuni dintr-o memorie M, prevazuta cu registrele de<br />

adresa RA si registrul de date RD, in registrul de instructiuni RI, are urmatorul aspect:<br />

2. RA ← CP /* CP este contorul programului<br />

3. RD ← BUSFN(M;DCD(RA))<br />

4. RI ← RD<br />

In cazul unei memorii asincrone, al carei model logic este dat mai jos, adresele si datele<br />

presupun, pe de-o parte, folosirea unor magistrale: ADR, DATIN, DATIES, iar comanda, pe de<br />

alta parte, utilizarea unor semnale de control citeste, scrie si de stare ocupat.<br />

ADR<br />

R<br />

A<br />

M<br />

DATIN<br />

citeste<br />

Comanda<br />

scrie ocupat<br />

DATIES MAG<br />

Modelul logic al modulului memoriei principale.<br />

R<br />

D


In aceste conditii secventa AHPL, de citire a unei instructiuni, din memorie, capata urmatorul<br />

aspect:<br />

2. ADR ← CP; citeste = 1<br />

→ SYN(ocupat)/(2)<br />

3. nul<br />

→ SYN(ocupat)/(3)<br />

4. FARA INTARZIERE<br />

(1)<br />

ceas<br />

ceas<br />

MAG = DATIES; RI ← MAG<br />

SCN2<br />

citeste<br />

ocupat<br />

SYN(ocupat)<br />

SCN3<br />

SCN4<br />

citeste<br />

D Q<br />

ADR


7. Exemple de module descrise in AHPL.<br />

Umatoarele doua exemple de module sunt preluate din lucrarea Calculatoare numerice.<br />

Hardware-structura si proiectare, autori F.J. Hill si G.R.Peterson, Editura Tehnica 1981.<br />

7.1.Unitate de comanda pentru o masina unealta.<br />

Se cere proiectarea unei unitati de comanda, pentru o masina unealta, care foloseste o memorie<br />

ROM[1024:18] pentru a stoca patru secvente, de cate 256 cuvinte x 18 biti, structurati sub<br />

forma a trei campuri, pentru a specifica pozitia uneltei in trei dimensiuni. Pozitia curenta a<br />

uneltei este memorata intr-un registru PR[18], care furnizeaza, conform structurarii sale pe cele<br />

trei campuri, vectori binari, de cate sase biti, pentru trei convertoare numeric/analogice CN/,<br />

care comanda echipamentul de actionare al masinii unelte. Comunicarea cu operatorul se<br />

realizeaza cu ajutorul unui bistabil start/stop ss (controlat din exterior de catre semnalele de<br />

comanda start si stop) si al unui registru RSECV[2] (comandat di exterior prin semnalul<br />

SECV[2], in care se memoreaza numarul secventei, care se executa: 00, 01, 10, 11.<br />

Prin fortarea in unu a bistabilului ss, se va lansa in executie secventa al carei numar este stocat in<br />

RSECV.<br />

Daca, pe parcursul functionarii sistemului, operatorul forteaza in unu intrarea stop, bistabilul ss<br />

va lua valoarea zero, secventa curenta se va termina si in registrul RP se va stoca un vector binar<br />

cu 18 componente egale cu zero, iar unitatea de comanda va trece in starea initiala (1).<br />

In cazul terminarii normale a secventei curente vor avea loc operatiile:<br />

ss ← 0 ; PR ← 18 Τ 0 ; → (1)<br />

Modificarile continuturilor lui ss si RSECV vor fi sincronizate cu ceasul.<br />

Solutie: Pentru implementare, pe langa resursele mentionate mai sus, se va mai introduce un<br />

registru de adrese RA[10] de 10 biti. Cele patru secvente sunt notate cu A, B, C, D si vor avea,<br />

in zecimal, urmatoarele adrese de start: 0, 256, 512, 768. Frecventa ceasului este compatibila cu<br />

rata impusa de citirile efectuate de masina unealta. Un cuvant se citeste din memeorie intr-o<br />

singura perioada de tact.<br />

SECV<br />

RSECV<br />

start R ROM<br />

R IESRP<br />

A<br />

P<br />

ss<br />

stop


MODULE: Unitate_de _comanda_pentru_o_masina_unealta<br />

MEMORY: ROM[1024:18]; RP[18]; RA[10]; RSECV[2]; ss<br />

INPUTS: SECV[2]; start; stop<br />

OUTPUTS: IESRP[18]<br />

1. RSECV ← SECV<br />

→ (ss, ss)/(1,2)<br />

2. RA ← RSECV0, RSECV1, 8 Τ 0<br />

3. RP ← BUSFN(ROM; DCD(AR))<br />

4. RA ← INC(RA)<br />

→ (( ∩ /RA 2:9 ∩ ss ), ss, ( ∩ /RA 2:9 ∩ ss ))/(5, 6 ,3)<br />

5. ss ← 0<br />

6. RP ← 18 Τ 0<br />

→ (1)<br />

ENDSECV<br />

END<br />

ss ← (1 ! 0) * (start, stop)<br />

IESRP = RP<br />

Plecand de la descrierea AHPL, de mai sus, sa se detalieze sectiunea de executie si sectiunea de<br />

comanda la nivelul schemelor cu porti, bistabile, registre, inclusiv semnalele de comanda.<br />

71. Verificator de caractere duble.<br />

Sa se proiecteze un modul numeric destinat verificarii caracterelor duble, prezente intr-un sir de<br />

caractere de cate 8 biti. Modulul poseda o linie de intrare, data, care va fi activata, pe nivel<br />

ridicat, de catre sursa de caractere, atunci cand un nou caracter este disponibil pe cele 8 linii de<br />

intrare CAR. Tranzitiile pe intrarile data si CAR[8] sunt sincronizate cu ceasul verificatorului de<br />

caractere. O linie de iesire, accept, va furniza un semnal de tip nivel, cu durata unei perioade de<br />

tact, dupa acceptarea caracterului de la intrarea CAR. O linie de iesire, y, conectata la un<br />

vistabil, Y, va fi activa pe nivel ridicat, in cazul in care cel mai recent caracter receptionat<br />

reprezinta o dublura a oricarui alt caracter din sirul de 16 caractere receptionate anterior. Iesirea


y va trece in 0 atunci cand accept este fortat in 1, ceea ce indica receptionarea unui nou caracter.<br />

Intervalul intre spsirile a doua caractere succesive este suficient de mare pentru a permite<br />

verificarea seriala a existentei vreunei dubluri.<br />

Sa se prezinte descrierea in AHPL a verificatorului de caractere duble.<br />

CAR[8]<br />

data y<br />

accept<br />

Solutie: Verificatorul de caractere duble va contine un tablou de 8 registre de deplasare, a cate<br />

16 biti fiecare. Acest tablou de registre va fi vazut ca o memorie MRD de 16 cuvinte a cate 8<br />

biti: MRD[16:8]. In schema trebuie prevazute un registru de intrare RIN[8] si un contor<br />

CNT[4], de caractere. Caracterul curent, receptionat in RIN, este comparat cu fiecare caracter,<br />

stocat in MRD, in procesul rotirii caracterelor catre linia superioara. CNT va contoriza<br />

verificarea celor 16 caractere din MRD. Dupa terminarea verificarii ultimului caracter din MRD,<br />

caracterul curent, din RIN, este fortat in MRD 15 , in timp ce cuvantul, inregistrat de cel mai mult<br />

timp, care se afla in MRD 0, este pierdut. La detectarea unui caracter dublu semnalul y este fortat<br />

in 1.<br />

Descrierea AHPL a modulului.<br />

MODULE: Verificator_de_caractere_duble<br />

MEMORY: MRD[16:8]; RIN[8]; CNT[4]; Y[1]<br />

INPUTS: CAR[8]; data<br />

OUTPUTS: accept; y<br />

1. → (data, data)/(1, 2)<br />

2. accept = 1; y ← 0<br />

RIN[8]<br />

CNT[4]<br />

RIN ← CAR; CNT ← 4Τ 0<br />

MRD[16:8] Y[1]


3. Y * ∪ /(RIN ⊕ MRD 0 ) ← 1<br />

CNT ← INC(CNT)<br />

MRD ← (MRD 1:15 ! MRD 0 )<br />

→ ( ∩ /CNT, ∩ /CNT )/(4,3)<br />

4. MRD ← (MRD 1:15 ! RIN)<br />

→ (1)<br />

ENDSEQUENCE<br />

y =Y<br />

END


module calculator;<br />

// declaratii registre, memorie etc<br />

reg [7:0] ac, ri, rd;<br />

reg [3:0] ra, cp;<br />

reg z,s,c,reset;<br />

reg [7:0] m[0:15];<br />

//incarcarea programului<br />

initial begin: incarca_prog<br />

//incarcarea programului<br />

$readmemb("prog2.v",m);<br />

//afisarea rezultatelor simularii sub forma tabelara<br />

$display(" timp cp ra rd ri ac z s reset");<br />

$monitor("%d %d %h %h %h %h %h %h %h",<br />

$time, cp,ra,rd,ri,ac,z,s,reset);<br />

//afisarea formelor de unda<br />

$vw_dumpvars();<br />

$vw_group("all",$time,cp,ra,rd,ri,ac,z,s,reset);<br />

//aplicarea semnalului reset (vezi task-ul apply_reset)<br />

apply_reset;<br />

end<br />

//oprire simulare<br />

initial begin: stop_at<br />

#300; $stop;<br />

end<br />

//bucla principala<br />

always begin:bucla_principala<br />

if (!reset)<br />

begin<br />

#10; fetch;<br />

#10; execute;<br />

end<br />

else<br />

#10;<br />

end<br />

// mijloace de depanare<br />

task apply_reset;<br />

begin<br />

reset = 1;<br />

#10;


eset = 0;<br />

cp = 0;<br />

ac = 0;<br />

end<br />

endtask<br />

// Task-urile principale: fetch, execute<br />

task fetch;<br />

begin<br />

rd = m[cp];<br />

cp = cp + 1;<br />

end<br />

endtask<br />

task execute;<br />

begin<br />

ri = rd;<br />

case(ri[7:4])<br />

4'b0000:begin // LAC<br />

ra = ri[3:0];<br />

rd = m[ra];<br />

ac = rd;<br />

end<br />

4'b0001:begin // SAC<br />

ra = ri[3:0];<br />

rd = ac;<br />

m[ra] = rd;<br />

end<br />

4'b0010:begin // ADN<br />

ra = ri[3:0];<br />

rd = m[ra];<br />

ac = ac+rd;<br />

s = ~ac[7];<br />

z = ~(|ac);<br />

end<br />

4'b0011:begin //SCD<br />

ra = ri[3:0];<br />

rd = m[ra];<br />

ac = ac-rd;<br />

s = ~ac[7];<br />

z = ~(|ac);<br />

end<br />

4'b0100: begin//AND<br />

ra = ri[3:0];<br />

rd = m[ra];


ac = ac & rd;<br />

end<br />

4'b0101:begin // OR<br />

ra = ri[3:0];<br />

rd = m[ra];<br />

ac = ac | rd;<br />

end<br />

4'b0110:begin // XOR<br />

ra = ri[3:0];<br />

rd = m[ra];<br />

ac = ac ^ rd;<br />

end<br />

4'b0111:begin // NAC<br />

ac = ~ac;<br />

end<br />

4'b1000:begin // JMP<br />

cp = ri[3:0];<br />

end<br />

4'b1001:begin // JPZ<br />

if(z)begin<br />

cp = ri[3:0];<br />

end<br />

else<br />

cp = cp;<br />

end<br />

4'b1010:begin // JN<br />

if(~z) begin<br />

cp = ri[3:0];<br />

end<br />

else<br />

cp = cp;<br />

end<br />

4'b1100:// HLT<br />

begin<br />

$display("halt");<br />

$stop;<br />

end<br />

default: $display("cod de operatie inexistent");<br />

endcase<br />

end<br />

endtask<br />

endmodule


prog2.v<br />

00001100<br />

01001101<br />

00001100<br />

01011101<br />

00001100<br />

01101110<br />

11000000<br />

00000000<br />

00000000<br />

00000000<br />

00000000<br />

00000000<br />

10100101<br />

01011010<br />

10101010<br />

00000000<br />

Veriwell -k C:\Program Files\VeriWell\exe\VeriWell.key -l C:\Program<br />

Files\VeriWell\exe\VeriWell.log calculator2.V<br />

VeriWell for Win32 HDL Tue Nov 21 08:19:37 2000<br />

This is a free version of the VeriWell for Win32 Simulator<br />

Distribute this freely; call 1-800-VERIWELL for ordering information<br />

See the file "!readme.1st" for more information<br />

Copyright (c) 1993-96 Wellspring Solutions, Inc.<br />

All rights reserved<br />

Memory Available: 0<br />

Entering Phase I...<br />

Compiling source file : calculator2.V<br />

The size of this model is [7%, 7%] of the capacity of the free version<br />

Entering Phase II...<br />

Entering Phase III...<br />

No errors in compilation<br />

Top-level modules:<br />

calculator<br />

timp cp ra rd ri ac z s reset<br />

0 x x xx xx xx x x 1<br />

10 0 x xx xx 00 x x 0<br />

20 1 x 0c xx 00 x x 0<br />

30 1 c a5 0c a5 x x 0


40 2 c 4d 0c a5 x x 0<br />

50 2 d 5a 4d 00 x x 0<br />

60 3 d 0c 4d 00 x x 0<br />

70 3 c a5 0c a5 x x 0<br />

80 4 c 5d 0c a5 x x 0<br />

90 4 d 5a 5d ff x x 0<br />

100 5 d 0c 5d ff x x 0<br />

110 5 c a5 0c a5 x x 0<br />

120 6 c 6e 0c a5 x x 0<br />

130 6 e aa 6e 0f x x 0<br />

140 7 e c0 6e 0f x x 0<br />

halt<br />

Stop at simulation time 150<br />

C1>


CSCI 320 Computer Architecture<br />

Handbook on Verilog HDL<br />

By<br />

Dr. Daniel C. Hyde<br />

Computer Science Department<br />

Bucknell University<br />

Lewisburg, PA 17837<br />

Copyright 1995<br />

By Daniel C. Hyde<br />

August 25, 1995<br />

Updated August 23, 1997


1. Tabla de materii<br />

1. Introducere …….............................................................…………….................<br />

1.1 Ce este Verilog?...................................................................…..……….....<br />

1.2 Ce este VeriWell?...............................................................…........………<br />

1.3 De ce se utilizeaza Verilog HDL? ....................................…..........……...<br />

2. Limbajul Verilog…….. ……...........................................................……………<br />

2.1 Primul Program Verilog....................................................…..........………<br />

2.2 Conventii Lexicale.....................................................…....…..........………<br />

2.3 Structura unui Program .....................................................…..........………<br />

2.4 Tipuri de Date……...............................................................….......……….<br />

2.4.1 Tipuri de Date Fizice.........................................................….…......<br />

2.4.2 Tipuri de Date Abstracte................................................….……......<br />

2.5 Operatori…................................................................................…..………..<br />

2.5.1 Operatori Arithmetici. Binari...................................................……..<br />

2.5.2 Operatori Arithmetici. Unari......................................................……<br />

2.5.3 Operatori Relationali.....................................................................….<br />

2.5.4 Operatori Logici ...............................................................................<br />

2.5.5 Operatori la Nivel de Bit...................................................................<br />

2.5.6 Operatori Unari de Reducere............................................................<br />

2.5.7 Alti Operatori....................................................................................<br />

2.5.8 Operator de Precedenta.....................................................................<br />

2.6 Constructii de Control................................................................………........<br />

2.6.1 Selectia: Instructiunile - if si case.......................…...........................<br />

2.6.2 Repetarea: Instructiunile - for, while si repeat...................................<br />

2.7 Alte Instructiuni......................................................................……………...<br />

2.7.1 Instructiunea - parameter .................................................................<br />

2.7.2 Atribuirea Continua .........................................................................<br />

2.7.3 Atribuiri Procedurale Blocante si Non – blocante............................<br />

2.8 Task-uri si Functii ...........................................................….....……….......<br />

2.9 Controlul Sincronizarii (Timing)................................................………......<br />

2.9.1 Controlul Intarzierii (#) ...................................................................<br />

2.9.2 Evenimente........................................................................................<br />

2.9.3 Instructiunea wait....................................................................…......<br />

2.9.4 Instructiunile fork and join...............................................................<br />

2.10 Examplu: Semafor de Trafic......................................................……........<br />

3.Utilizarea simulatorului Veriwell.....................................…………….………....<br />

3.1Crearea Fisierului Model ...........................................................………......<br />

3.2 Pornirea simulatorului..........................................................……..……......<br />

3.3 Cum se iese din Simulator? . ........................................................………...<br />

3.4 Optiunile Simulatorului..................................................................……......<br />

3.5 Depanarea ...............................................................................…………....<br />

4. Functiile si Task-urile de Sistem........................................……………………..<br />

4.1 $cleartrace................................................................…………….................<br />

4.2 $display ..............................................................................……………......<br />

4.3 $finish........................................................................……………...............<br />

4.4 $monitor .......................................................................……………............


4.5 $scope ..............................................................................……………........<br />

4.6 $settrace........................................................................……………............<br />

4.7 $showscopes.............................................................................…………....<br />

4.8 $showvars................................................................................………….....<br />

4.9 $stop......................................................................................……………....<br />

4.10 $time ....................................................................................……………..<br />

Bibliografie..............................................................................………………….…<br />

1. Introducere<br />

Verilog reprezinta un Limbaj de Descriere a Hardware-lui (Hardware Description<br />

Language -HDL).<br />

Un asemenea limbaj este utilizat pentru descrierea sistemelor numerice, de exemplu, un<br />

calculator sau o componenta a acestuia. Un sistem numeric poate fi descris, la niveluri diferite,<br />

in functie de aspectele care intereseaza. Astfel, un HDL poate descrie amplasarea traseelor de<br />

legatura (firele), a rezistoarelor si tranzistoarelor pe un circuit integrat, adica la nivel de<br />

comutator. Limbajul HD poate descrie sistemul numeric avand in vedere portile logice si<br />

bistabilele componente, adica la nivel de poarta. La un nivel mai ridicat sistemul numeric poate<br />

fi descris in termenii transferurilor vectorilor de informatie intre registre. Acesta reprezinta<br />

Nivelul Transferurilor intre Registre (Register Transfer Level - RTL). Limbajul Verilog<br />

suporta toate aceste niveluri. In cele ce urmeaza se va pune accent pe aspectele limbajului<br />

Verilog, care se refera nivelul RTL.<br />

<strong>1.1.</strong> Ce este Verilog?<br />

Verilog reprezinta unul dintre cele doua limbaje importante HDL, folosite de catre proiectantii<br />

din industrie si din mediile academice. VHDL reprezinta cel de-al doile limbaj. In ceea ce<br />

priveste industria parerile sunt impartite. Unii cred ca Verilog este mai usor de invatat si de<br />

utilizat decat VHDL. Standardul IEEE, pentru VHDL, a aparut in 1987, in timp ce standardul<br />

IEEE, pentru Verilog, a fost elaborat in 1995. Verilog este asemanator limbajului C, care este<br />

foarte raspandit in randurile inginerilor electronisti si de calculatoare. VHDL este asemanator cu<br />

limbajul Ada, mai putin cunoscut de catre inginerii amintiti mai sus.<br />

Verilog a fost lansat, in 1985, de catre Gateway System Corporation, care a fost preluata de<br />

catre Cadence Design Systems, Inc.’s Systems Division. Pana in 1990, cand a luat fiinta Open<br />

Verilog International (OVI), HDL Verilog a fost proprietatea companiei Cadence. Ulterior,<br />

Cadence a plasat Verilog in Domeniul Public, cu speranta deschiderii unei piete de produse<br />

software legate de Verilog VHDL, in conditiile in care acesta se va bucura de o larga raspandire.


Cadence a realizat faptul ca utilizatorii de Verilog HDL doresc alt software si alte servicii, care<br />

sa se bazeze pe pe acest limbaj, in vederea elaborarii de unelte de dezvoltare.<br />

Verilog HDL permite proiectantului de hardware sa descrie proiectele, atat la un inalt nivel de<br />

abstractizare, cum ar fi cel al arhitecturii sau comportamental, cat si la niveluri mai joase de<br />

implementare ( nivelurile portii si comutatorului), conducand la mastile/sabloanele pentru<br />

Circuitele Integrate pe Scara Foarte Larga (Very Large Scale Integration –VLSI-Integrated<br />

Circuits –IC- ) si la fabricarea circuitului.<br />

O prima utilizare a HDL-eurilor este acea legata de simularea proiectelor inainte de a fi<br />

introduse in fabricatie. Textul de fata nu acopera toate aspectele ce privesc Verilog HDL, ci<br />

numai acelea ce privesc nivelurile arhitectural si comportamental. Textul se axeaza pe<br />

proiectarea la nivel RTL.<br />

1.2. Ce este VeriWell?<br />

VeriWell reprezinta o implementare cuprinzatoare a lui Verilog HDL, dezvoltata initial de catre<br />

Wellspring Solutions, Inc. VeriWell suporta limbajul Verilog, conform specificatiilor<br />

Manualului de Referinta a limbajului, eleborat de catre OVI. VeriWell a fost lansat in decembrie<br />

1992 si a fost elaborat pentru a fi compatibil, atat cu standardul OVI, cat si cu Verilog-XL, al<br />

companiei Cadence. VeriWell este distribuit si vandut de catre SynaptiCAD Inc.<br />

Pentru platformele Windows 95/NT, Windows 3.1,Macintosh, SunOS si Linux, SynaptiCAD<br />

Inc.ofera versiuni “free” ale produsului, care sunt identice cu cele ale produsului comercial, cu<br />

exceptia limitarii la 1000 de linii de cod HDL<br />

1.3. De ce se utilizeaza Verilog HDL?<br />

Sistemele numerice sunt extrem de complexe. La nivelul celor mai mici detalii, ele constau in<br />

sute de miloane de elemente de tipul tranzistoarelor sau al portilor. De aceea, pentru sistemele<br />

numerice mari, proiectarea la nivelul portilor este practic imposibila. Pe durata mai multor<br />

decade, schemele logice au servit ca lingua franca pentru proiectarea logica, ceea ce nu mai este<br />

cazul, in conditiile de astazi. In prezent, complexitatea hardware-lui a devenit atat de mare incat<br />

o schema la nivelul portilor logice este aproape inutila. Schema devine un paienjenis de<br />

conexiuni, care nu mai arata functionalitatea proiectului.<br />

Incepand cu 1970, inginerii de calculatoare si inginerii electronisti au apelat la limbajele de<br />

descriere a hardware-lui (HDL). Cele mai raspandite HDL-euri in industrie sunt Verilog si<br />

VHDL. In urma cu 5 ani Verilog se afla pe primul loc cu peste 10.000 de utilizatori/proiectanti<br />

la companii de renume cum sunt: Sun Microsystems, Apple Computer, Motorola s.a.


Limbajul Verilog ofera proiectantului mijloace de descriere a unui sistem numeric in cadrul unei<br />

largi game de niveluri de abstractizare si, in acelasi timp, ii asigura accesul la uneltele de<br />

proiectare asistata de calculator, la nivelurile avute in vedere.<br />

Verilog permite proiectantilor de hardware sa descrie proiectele cu ajutorul constructiilor<br />

comportamentale, amanand detaliile de implementare pentru stadiile ulterioare ale procesului de<br />

proiectare. O reprezentarea abstracta ajuta proiectantul in explorarea alternativelor arhitecturale<br />

prin simulari, pentru a detecta congestiile proiectului inaintea inceperii proiectarii detaliate.<br />

Desi nivelul comportamental Verilog reprezinta un nivel inalt de descriere a unui sistem<br />

numeric, el reprezinta o notatie precisa. Exista unelete de proiectarea asistata, materializate prin<br />

programe, care vor “compila” programele elaborate in Verilog pana la nivelul circuitelor<br />

constand in porti si bistabile.<br />

Astfel, se poate merge in laborator pentru a se conecta circuitele logice prin cablaje in vederea<br />

obtinerii unui sistem functional. Alte unelte de proiectare pot “compila” programele descrise in<br />

Verilog intr-o descriere a mastilor de circuite integrate , pentru Integrarea pe Scara Larga<br />

(VLSI). De aceea, cu ajutorul unor unelte automatizate corespunzatoare se poate crea o<br />

descriere a proiectului VLSI in Verilog, in vederea transmiterii ei prin posta electronica, catre o<br />

“topitorie de siliciu”, pentru a primi ulterior, in cateva saptamani, circuitul integrat.<br />

Verilog permite, de asemenea, proiectantului sa specifice proiectele la nivelul portii logice,<br />

folosind constructiile porti si la nivelul tranzistorului, utilizand constructiile comutator.<br />

Scopul urmarit, in materialul de fata, nu este acela de a crea circuite VLSI, ci de a folosi<br />

limbajul Verilog pentru a descrie precis functionalitatea oricarui sistem numeric, de exemplu,<br />

un calculator.<br />

In orice caz, un circuit VLSI, proiectat pe baza constructiilor comportamentale din Verilog, va fi<br />

destul de lent si va ocupa o arie importanta pe pastila de siliciu. Nivelurile mai coborate ale<br />

limbajului Verilog permit inginerilor sa optimizeze circuitele logice si mastile/sabloanele VLSI<br />

pentru a maximiza viteza si a minimiza aria circuitului VLSI<br />

2. Limbajul Verilog.<br />

Aceste note de curs nu isi propun o descriere completa a limbajului Verilog. Vor fi descrise<br />

numai acele elemente ale linbajului, care vor permite studentului sa exploreze aspectele<br />

arhitecturale ale calculatoarelor. De fapt, aceste note acopera numai o fractiune a limbajului.


Pentru o descriere completa a Verilog HDL se pot examina lucrarile date la bibliografie, cat si<br />

standardul IEEE.<br />

Studiul limbajului Verilog va fi inceput prin parcurgerea unui exemplu, constand intr-un<br />

program simplu Verilog<br />

Examinarea instructiunilor de atribuire permite observarea similitudinii limbajului Verilog cu<br />

limbajul C. Comentariile sunt asemanatoare cu cele din C++, adica “//”, la inceputul liniei.<br />

Limbajul Verilog descrie un sistem numeric sub forma unui set de module, dar, in cele ce<br />

urmeaza va fi prezent un singur modul numit “simple”<br />

2.1 Primul program Verilog.<br />

//Dan Hyde; August 9, 1995<br />

// Un prim model numeric in Verilog<br />

module simple;<br />

// Exemplu simplu la nivel RTL, pentru a demonstra Verilog.<br />

// Registrul A este incrementat cu unu. Apoi primii patru biti ai registrului B sunt incarcati cu<br />

// valorile negate ale ultimilor patru biti din A. C reprezinta o reducere “and” a ultimilor doi biti<br />

// din A.<br />

//declare registers and flip-flops<br />

reg [0:7] A, B;<br />

reg C;<br />

// Cele doua constructii “initial” si always” opereaza concurent<br />

initial begin: stop_at<br />

// Va opri executia dupa 20 unitati de simulare.<br />

#20; $stop;<br />

end<br />

// Aceste instructiuni sunt executate la timpul simulat 0 ( nu exista #k).<br />

initial begin: Init<br />

// Initializeaza registrul A. Celelalte registre au valori “x”.<br />

A = 0;<br />

// Antetul de afisare.<br />

$display("Time A B C");<br />

// Afisaza valorile A, B, C in cazurile in care acestea se modifica.<br />

$monitor(" %0d %b %b %b", $time, A, B, C);


end<br />

//main_process va cicla pana la terminarea simularii.<br />

always begin: main_process<br />

// #1 insemna executia dupa o unitate de timp de simulare.<br />

#1 A = A + 1;<br />

#1 B[0:3] = ~A[4:7]; // ~ este operatorul "not" la nivel de bit<br />

#1 C = &A[6:7]; // reducerea "and" a ultimilor doi biti ai registrului<br />

end<br />

endmodule<br />

In module simple au fost declarate doua registrea A si B de cate 8 biti si un registru C, de un bit<br />

sau bistabil. In interiorul modulului, o constructie “always” si doua constructii “initial” descriu<br />

firele de control, care se executa in acelasi timp sau concurent. In constructia initial<br />

instructiunile sunt executate secvential ca in C sau in alte limbaje imperative traditionale.<br />

Constructia always este asemanatoare cu constructia initial cu exceptia ca aceasta cicleaza<br />

continuu, cat timp opereaza simulatorul.<br />

Notatia #1 semnifica faptul ca instructiunea care urmeaza se va executa cu o intarziere de o<br />

unitate de timp simulat. De aceea, firul de control, provocat de catre prima constructie initial,<br />

va intarzia, cu 20 unitati de timp simulat, chemarea task-ului de sistem $stop si va opri<br />

simularea.<br />

Task-ul de sistem $display permite proiectantului sa tipareasca mesajele in maniera in care<br />

printf o face in limbajul C. La fiecare unitate de timp simulat, cand una dintre variabilele listate<br />

isi modifica valoarea, task- ul de sistem $monitor tipareste un mesaj. Functia de sistem $time<br />

intoarce valoarea curenta a timpului simulat.<br />

Mai jos se prezinta iesirea Simulatorului VeriWell: ( A se vedea Sectiunea 3, referitoare la<br />

utilizarea Simulatorului VeriWell).<br />

Time A B C<br />

0 00000000 xxxxxxxx x<br />

1 00000001 xxxxxxxx x<br />

2 00000001 1110xxxx x<br />

3 00000001 1110xxxx 0<br />

4 00000010 1110xxxx 0<br />

5 00000010 1101xxxx 0


7 00000011 1101xxxx 0<br />

8 00000011 1100xxxx 0<br />

9 00000011 1100xxxx 1<br />

10 00000100 1100xxxx 1<br />

11 00000100 1011xxxx 1<br />

12 00000100 1011xxxx 0<br />

13 00000101 1011xxxx 0<br />

14 00000101 1010xxxx 0<br />

16 00000110 1010xxxx 0<br />

17 00000110 1001xxxx 0<br />

19 00000111 1001xxxx 0<br />

Stop at simulation time 20<br />

Acest program, cat si rezultatele simularii trebuie studiate cu atentie. Structura programului este<br />

tipica pentru programele Verilog, care vor fi scrise in acest curs: o constructie initial, pentru a<br />

specifica durata simularii, o alta constructie initial, pentru initializarea registrelor si pentru a<br />

specifica registrele care se monitorizeaza si o constructie always, pentru sistemul numeric<br />

modelat. De observat ca toate instructiunile din cea de-a doua constructie initial sunt efectuate la<br />

timpul time = 0, deoarece nu sunt prevazute instructiuni de intarziere: #.<br />

2.2 Conventii Lexicale.<br />

Conventiile lexicale sunt asemanatoare cu cele din limbajul C++. Comentariile sunt specificate<br />

prin // la inceputul liniei, fiind valabile pentru acea linie. Comentariile pe mai multe linii incep<br />

cu /* si se termina cu */. Cuvintele cheie, de exemplu, module, sunt rezervate si utilizeaza<br />

literele mici ale alfabetului. Limbajul este sensibil la literele mici si la majuscule. Spatiile sunt<br />

importante prin aceea ca delimiteaza obiectele in limbaj.<br />

Numerele sunt specificate sub forma traditionala ca o serie de cifre cu sau fara semn, in maniera<br />

urmatoare:<br />

< format baza><br />

unde contine cifre zecimale care specifica dimensiunea constantei ca numar de<br />

biti.<br />

Campul este optional. Campul are un singur caracter ’ urmat<br />

de unul dintre urmatoarele caractere b, d, o si h, care specifica baza de numeratie: binara,


zecimala, octala si hexazecimala. Campul contine cifre care corespund lui < format<br />

baza>.<br />

Exemple:<br />

549 // numar zecimal<br />

'h 8FF // numar hexzecimal<br />

'o765 // numar octal<br />

4'b11 // numarul binar cu patru biti 0011<br />

3'b10x // numar binar cu 3 biti, avand ultimul bit necunoscut<br />

5'd3 // numar zecimal cu 5 ranguri<br />

-4'b11 // complementul fata de 2, pe patru ranguri al numarului 0011 sau 1101<br />

Campul poate sa nu aibe semn. Oricare semn trebuie sa fie plasat la inceput.<br />

Un sir reprezinta o secventa de caractere plasate intre ghilimele: “acesta este un sir”.<br />

Operatorii pot fi exprimati prin unul, doua sau trei caractere (sectiunea 2.5).<br />

Un identificator este specificat printr-o litera sau “underscore” urmat de zero sau mai multe<br />

litere, cifre, semne dolar sau “underscores”. Identificatorii pot avea pana la 1024 caractere.<br />

2.3 Structura unui Program.<br />

Limbajul Verilog descrie un sistem numeric ca un set de module. Fiecare dintre aceste module<br />

are o interfata cu alte module, pentru a specifica modul in care sunt interconectate. De regula se<br />

plaseaza un modul intr-un fisier, fara ca aceasta sa fie o cerinta obligatorie. Modulele opereaza<br />

concurent. In general, exista un modul pe nivelul cel mai inalt, care specifica un sistem inchis ce<br />

contine, atat datele de test, cat si modelele hardware. Modulul de pe nivelul cel mai inalt invoca<br />

aparitii ale celorlalte module.<br />

Modulele reprezinta parti hardware, care pot fi de la simple porti pana la sisteme complete ex.,<br />

un microprocesor. Modulele pot fi specificate, fie comportamental, fie structural (sau o<br />

combinatie a celor doua). O specificare comportamentala defineste comportarea unui sistem<br />

numeric (modul) folosind constructiile limbajelor de programare traditionale, de exemplu: if,<br />

instructiuni de atribuire. O specificare structurala exprima comportarea unui sistem numeric<br />

(modul) ca o conectare ierarhica de submodule. La baza ierarhiei componentele trebuie sa fie<br />

primitive sau sa fie specificate comportamental.<br />

Primitivele Verilog includ atat porti, cat si tranzistoare de trecere (comutatoare).<br />

Structura unui modul este urmatoarea:<br />

module ();


<br />

endmodule<br />

Mai sus reprezinta un identificator care, in mod unic, denumeste modulul. De<br />

asemenea, constituie o lista de porturi de intrare (input), iesire (output) sau<br />

intrare/iesire (inout), care sunt folosite pentru conectarea cu alte module. Sectiunea<br />

specifica obiectele de tip date ca registre (reg), memorii si fire (wire), cat si<br />

constructiile procedurale ca function-s si task-s<br />

Sectiunea poate contine: constructii initial, constructii always,<br />

atribuiri continue sau aparitii/instante ale modulelor.<br />

Semantica constructiei unui module in Verilog este diferita de cea a subrutinelor, procedurilor<br />

si a functiilor din alte limbaje. Un modul nu este chemat niciodata. Un modul are o instanta la<br />

inceputul unui program si este prezent pe intreaga durata a programului. O instanta a unui modul<br />

Verilog este utilizata ca model al unui circuit hardware la care se presupune ca nu se efectueaza<br />

modificari de cablaj. La fiecare instanta a modulului, acesteia i se da un nume.<br />

De exemplu NAND1 si NAND2 sunt nume de instante ale porti NAND, in exemplul de mai jos.<br />

In acest exemplu este data o specificare comportamentala a unui modul NAND.<br />

Iesirea out este negatia produsului and al intrarilor in1 si in2.<br />

// Modelul Comportamenta al portii Nand.<br />

// Dan Hyde, August 9, 1995<br />

module NAND(in1, in2, out);<br />

input in1, in2;<br />

output out;<br />

// instructiune de atribuire continua. o<br />

assign out = ~(in1 & in2);<br />

endmodule<br />

Porturile in1, in2 si out sunt etichete pe fire. Atribuirea continua assign urmareste in<br />

permanenta eventualele modificari ale variabilelor din membrul drept, pentru reevaluarea<br />

expresiei si pentru propagarea rezultatului in membrul stang (out).<br />

Instructiunea de atribuire continua este utilizata pentru a modela circuitele combinationale la<br />

care iesirile se modifica ca urmare a modificarilor intrarilor.


Specificarea structurala a unui modul AND, obtinuta ca urmare a conectarii iesirii unui NAND<br />

la cele doua intrari ale altui NAND.<br />

module AND(in1, in2, out);<br />

// Modelul structural al unei porti AND formata din doua porti NAND.<br />

input in1, in2;<br />

output out;<br />

wire w1;<br />

// doua instante ale modulului NAND<br />

NAND NAND1(in1, in2, w1);<br />

NAND NAND2(w1, w1, out);<br />

endmodule<br />

Acest modul are doua instante ale lui NAND, numite NAND1 si NAND2, conectate printr-un fir<br />

intern w1<br />

Forma generala pentru invocarea unei instante este urmatoarea:<br />

();<br />

unde are valorile parametrilor, care sunt transferate catre instanta. Un<br />

exemplu de parametru transferat ar fi intarzierea pe o poarta.<br />

Urmatorul modul reprezinta un modul de nivel inalt, care stabileste anumite seturi de date si<br />

care asigura monitorizarea variabilelor.<br />

module test_AND;<br />

// Modul de nivel inalt pentru testarea altor doua module.<br />

reg a, b;<br />

wire out1, out2;<br />

initial begin // Datele de test<br />

a = 0; b = 0;<br />

#1 a = 1;<br />

#1 b = 1;<br />

#1 a = 0;<br />

end<br />

initial begin // Activarea monitorizarii<br />

$monitor("Time=%0d a=%b b=%b out1=%b out2=%b",<br />

$time, a, b, out1, out2);


end<br />

// Instantele modulelor AND si NAND<br />

AND gate1(a, b, out2);<br />

NAND gate2(a, b, out1);<br />

Endmodule<br />

De notat ca valorile a si b trebuie mentinute pe toata durata operarii. De aceea este necesara<br />

utilizarea unor registre de cate un bit. Variabilele de tip reg stocheaza ultima valoare care le-a<br />

fost atribuita procedural. Firul, wire, nu are capacitatea de memorare. El poate fi comandat in<br />

mod continuu, de exemplu, prin instructiunea de atribuire continua sau prin iesirea unui modul<br />

Daca firele de intrare nu sunt conectate, ele vor lua valoarea x – necunoscuta.<br />

Atribuirile continue folosesc cuvantul cheie assign in timp ce atribuirile procedurale au forma<br />

= unde trebuie sa fie un registru sau o memorie<br />

Atribuirile procedurale pot aparea numai in constructiile initial si always<br />

Instructiunile din blocul primei constructii initial vor fi executate secvential, dintre care unele<br />

vor fi intarziate de #1 cu o unitate de timp simulat. Constructia always se comporta in acelasi<br />

mod ca si constructia initial cu exceptia ca ea cicleaza la infinit (pana la terminarea simularii).<br />

Constructiile initial si always sunt utilizate pentru modelarea logicii secventiale (automate cu<br />

stari finite)<br />

Verilog face o importanta distinctie intre atribuirile procedurale si atribuirea continua assign.<br />

Atribuirile procedurale modifica starea unui registru, adica a logicii secventiale, in timp ce<br />

atribuirea continua este utilizata pentru a modela logica combinationala. Atribuirile continue<br />

comanda variabile de tip wire si sunt evaluate si actualizate atunci cand un operand de intrare<br />

isi modifica valoarea. Este important de inteles si de memorat aceste diferente.<br />

Toate cele trei module vor fi plasate intr-un fisier, care va fi executat de catre simulator pentru a<br />

produce urmatoarea iesire:<br />

Time=0 a=0 b=0 out1=1 out2=0<br />

Time=1 a=1 b=0 out1=1 out2=0<br />

Time=2 a=1 b=1 out1=0 out2=1<br />

Time=3 a=0 b=1 out1=1 out2=0<br />

Intrucat simulatorul iese din cadrul evenimentelor, nu a mai fost necesara oprirea explicita a<br />

simularii.


2.4 Tipuri de Date<br />

2.4.1 Tipuri de Date Fizice.<br />

Intrucat scopul limbajului Verilog este acela de a modela hardware-ul numeric, tipurile primare<br />

de date vor fi destinate modelarii registrelor (reg) si firelor (wire). Variabilele reg stocheaza<br />

ultima valoare, care le-a fost atribuita procedural, in timp ce variabilele wire reprezinta<br />

conexiuni fizice intre entitati structurale cum ar fi portile. Un fir (wire) nu stocheaza o valoare.<br />

O variabila wire reprezinta numai o eticheta pe un fir. Trebuie remarcat faptul ca tipul de date<br />

wire reprezinta unul dintre tipurile de date net prezente in Verilog in care mai sunt incluse:<br />

“and cablat (wand)”, “or cablat (wor)” si “magistrala cu trei stari (tri)”. Aceste note se<br />

limiteaza numai la tipul de date wire.<br />

Obiectele reg si wire , care reprezinta date, pot lua urmatoarele valori:<br />

0 valoarea logica zero sau fals<br />

1 unu logic sau adevarat<br />

x valoare logica necunoscuta<br />

z impedanta ridicata a unei porti “tristate”.<br />

La inceputul simularii variabilele reg sunt initializate la valoarea x. Oricare variabila wire<br />

neconectata la ceva are valoarea x.<br />

In declaratii se poate specifica dimensiunea unui registru sau a unui fir. De exemplu,<br />

declaratiile:<br />

reg [0:7] A, B;<br />

wire [0:3] Dataout;<br />

reg [7:0] C;<br />

specifica registrele A si B ca avand 8 biti, cu cel mai semnificativ bit avand indicele zero, in<br />

timp ce registrul C, de opt biti, are indicele sapte, pentru cel mai semnificativ bit. specify<br />

Firul Dataout are 4 biti.<br />

Bitii unui registru sunt specificati prin notatia:[:].<br />

De exemplu, in cea de-a doua atribuire procedurala, din secventa:<br />

initial begin: int1<br />

A = 8'b01011010;<br />

B = {A[0:3] | A[4:7], 4'b0000};<br />

end


B este fortat la o valoare egala cu suma logica a primilor patru biti din A si a ultimilor patru<br />

biti din A, concatenata cu 0000. B are acum valoarea 11110000. Parantezele {} specifica faptul<br />

ca bitii a doua sau ai mai multor argumente, separati prin virgule sunt concatenati impreuna.<br />

Un argument poate fi replicat prin specificarea numarului de repetitii sub forma:<br />

{numar_repetitii{exp1, exp2, ... , expn}}<br />

Iata cateva exemple:<br />

C = {2{4’b1011}}; //lui C I se asigneaza vectorul de biti: 8’b10111011<br />

C = {{4{A[4]}}, AA[4:7]}; // primii 4 biti reprezinta extensia semnului.<br />

Intr-o expresie gama de referire trebuie sa aibe, pentru indici, expresii constante. Un singur bit<br />

poate fi referit ca o variabila. De exemplu:<br />

reg [0:7] A, B;<br />

B = 3;<br />

A[0: B] = 3'b111; // ILEGAL – indicii trebuie sa fie constanti!!<br />

A[B] = 1'b1; // Referirea la un singur bit este LEGALA.<br />

Aceasta cerinta stricta <strong>privind</strong> valorile constante pentru indici, la referirea unui registru, este<br />

impusa de faptul ca se doreste ca expresia sa fie realizabila fizic, in hardware.<br />

Memoriile sunt specificate ca vectori de registre. De exemplu Mem are 1K cuvinte de cate 32<br />

de biti.<br />

reg [31:0] Mem [0:1023];<br />

Notatia Mem[0] asigura referirea la cuvantul cua adresa zero din memorie. Tabloul de indici<br />

pentru o memorie (vector de registre) poate fi un registru. De remarcat faptul ca o memorie nu<br />

poate fi accesata la nivel de bit, in Verilog. Pentru a realiza aceasta operatie, cuvantul din<br />

memorie trebuie transferat mai intai intr-un registru temporar.<br />

2.4.2 Tipuri de Date Abstracte.<br />

Intr-un model de hardware, pe landga variabilele, care modeleaza hardware-ul, se gasesc si alte<br />

tipuri de variabile. De exemplu, proiectantul doreste sa foloseasca o variabila integer, pentru a<br />

contoriza numarul de aparitii ale unui eveniment. Pentru comoditatea proiectantului, Verilog<br />

HDL poseda mai multe tipuri de date carora nu le corespund realizari hardware. Aceste tipuri de<br />

date include integer, real si time. Tipurile de date integer si real se comporta ca si in alte<br />

limbaje, de exemplu C.


Trebuie subliniata faptul ca variabila reg este fara semn, in timp ce variabial integer reprezinta<br />

un intreg de 32 de biti cu semn. Acest fapt are o mare importanta la scadere.<br />

Variabila time specifica cantitati, pe 64 de biti, si sunt folosite in conjunctie cu functia de<br />

sistem $time. Sunt acceptate tablouri de variabile integer si time , dar nu de reali. In Verilog<br />

nu sunt permise tablouri multidimensionale Iata cateva exemple:<br />

integer Count; // intreg simplu, cu semn, pe 32 de biti.<br />

integer K[1:64]; // un tablou de 64 intregi.<br />

time Start, Stop; // doua variabile timp de 64 de biti.<br />

2.5 Operatori<br />

2.5.1 Operatori Aritmetici binari.<br />

Operatorii aritmetici binari opereaza cu doi operanzi. Operanzii de tip reg si net sunt tratati ca<br />

fara semn. Operanziide tip real si integer pot avea semn. Daca un bit oarecare, al unui operand,<br />

este necunoscut (‘x’), atunci rezultatul este necunoscut.<br />

Operator Nume Comentarii<br />

+ Adunare<br />

- Scadere<br />

* Inmultire<br />

/ Impartire Impartirea cu zero furnizeaza un x, necunoscut<br />

% Modul<br />

2.5.2 Operatori Aritmetici Unari.<br />

Operator Nume Comentarii<br />

- Minus Unar Modifica semnul operandului sau<br />

2.5.3 Operatori Relationali.<br />

Operatorii relationali compara doi operanzi si intorc o valoare logica, adica TRUE(1) sau<br />

FALSE(0). Daca un bit oarecare este necunoscut, relatia este ambigua si rezultatul este<br />

necunoscut.<br />

Operator Nume Comentarii<br />

> Mai mare decat<br />

>= Mai mare decat sau egal<br />

< Mai mic decat<br />


!= Inegalitae logica<br />

2.5.4 Operatori Logici<br />

Operatorii logici opereaza cu operanzi logici si intorc o valoare logica, adica TRUE(1) sau<br />

FALSE(0). Sunt utilizati in instructiunile if si while. A nu se confunda cu operatorii logici<br />

Booleeni la nivel de bit. De exemplu, ! este un NOT logic iar ~ este NOT la nivel de bit. Primul<br />

neaga, ex., !(5 == 6) este TRUE. Al doile complementeaza bitii, de exemplu: ~{1,0,1,1} este<br />

0100.<br />

Operator Nume Comentarii<br />

! Negatia logica<br />

&& AND logic<br />

|| OR logic<br />

2.5.5 Operatori la nivel de bit.<br />

Opeartorii la nivel de bit opereaza pe bitii operandului sau operanzilor. De exemplu, rezultatul<br />

lui A& B este AND pentru bitii corespunzatori din A si B. Operand pe un bit necunoscut, se<br />

obtine un bit necunoscut (x) in valoarea rezultatului. De exemplu, AND-ul unui x cu un FALSE<br />

este un x. OR-rul unui x cu un TRUE este un TRUE.<br />

Operator Nume Comentarii<br />

~ Negatia la nivel de bit<br />

& AND la nivel de bit<br />

| OR la nivel de bit.<br />

^ XOR la nivel de bit<br />

~& NAND la nivel de bit<br />

~| NOR la nivel de bit<br />

~^ sau ^~ Echivalenta la nivel de bit NOT XOR<br />

2.5.6 Operatori unari de reducere.<br />

Operatorii unari de reducere furnizeaza un rezultat de un singur bit prin aplicarea operatorului<br />

la toti bitii operandului. de exemplu, &A va efectua AND pe toti bitii lui A.<br />

Operator Nume Comentarii<br />

& reducere AND<br />

| reducere OR<br />

^ reducere XOR<br />

~& reducere NAND


2.5.7 Alti Operatori.<br />

~| reducere NOR<br />

~^ reducere XNOR<br />

Operatorul conditional se comporta ca si in limbajul C.<br />

Operator Nume Comentarii<br />

=== Egalitatea Case. Comparatia la nivel de bit include compararea<br />

valorilor x si z. Toti bitii trebuie sa se potriveasca,<br />

pentru egalitate. Intoarce TRUE sau FALSE.<br />

!== Inegalitatea Case Comparatia la nivel de bit include compararea<br />

valorilor x si z. Oricare diferenta intre bitii<br />

comparati produce o inegalitate. Intoarce TRUE sau<br />

FALSE.<br />

{ , } Concatenarea Reuneste bitii separati, furnizati de doua sau mai<br />

multe expresii separate prin virgule, de exemplu:<br />

{A[0], B[1:7]} concateneraza bitul zero din A cu<br />

bitii 1pana la 7 din B.<br />

Deplasare la dreapta Pozitiile din stanga eliberate se incarca cu zero<br />

?: Conditional Atribuie una dintre cele doua valori, in functie de<br />

2.5.8 Precedenta operatorilor.<br />

Conditional, de exemplu: A = C>D ? B+3 : B-2<br />

semnifica faptul ca daca C > D, atunci valoarea lui<br />

A este B+3 altfel B-2.<br />

Precedenta operatorilor este prezentata mai jos: Varful tabelei corespunde celei mai ridicate<br />

precedente, in timp ce baza corespunde celei mai coborate precedente.Operatorii de pe aceeasi<br />

linie au aceeasi precedenta si asociaza termenul stang celui drept intr-o expresie. Parantezele<br />

sunt utilizate pentru a modifica precedenta sau pentru a clarifica situatia. Pentru a usura<br />

intelegerea, se recomanda utilizarea parantezelor.


operatori unari: ! & ~& | ~| ^ ~^ + - (cea mai ridicata precedenta)<br />

2.6 Constructiile de Control.<br />

* / %<br />

+ -<br />

><br />

< > =<br />

== != === ~==<br />

& ~& ^ ~^<br />

| ~|<br />

&&<br />

||<br />

?:<br />

Verilog poseda o bogata colectie de instructiuni de control, care pot fi utilizate in sectiunile<br />

procedurale de cod, adica in cadrul blocurilor initial si always. Cele mai multe sunt familiare<br />

programatorului, care cunoaste limbajele traditionale de programare, cum ar fi limbajul C.<br />

Principala diferenta consta in aceea ca in locul parantezelor { }, din limbajul C, Verilog<br />

utilizeaza begin si end. In Verilog, parantezele { } sunt utilizate pentru concatenarea sirurilor de<br />

biti. Deoarece cei mai multi utilizatori sunt familiarizati cu limbajul C, urmatoarele subsectiuni<br />

vor contine numai cate un exemplu din fiecare constructie.<br />

2.6.1 Selectia – Instructiunile if si case.<br />

Instructiunea if este usor de utilizat:<br />

if (A == 4)<br />

else<br />

begin<br />

end<br />

begin<br />

end<br />

B = 2;<br />

B = 4;<br />

Spre deosebire de instructiunea case din C, prima care se potriveste cu valoarea lui


este selectata si instructiunea asociata este executata, apoi controlul este transferat<br />

dupa endcase, adica nu sunt necesare instructiuni break ca in C.<br />

case ()<br />

: <br />

: <br />

default: <br />

endcase<br />

In urmatorul exemplu se verifica valoarea semnalului de 1 bit .<br />

case (sig)<br />

1'bz: $display("Semnal flotant");<br />

1'bx: $display("Semnal necunoscut");<br />

default: $display("Semnalul este %b", sig);<br />

endcase<br />

2.6.2 Repetitia – Instructiunile for, while si repeat.<br />

Instructiunea for este foarte apropiata de instructiunea for din C, cu exceptia ca operatorii ++ si<br />

– nu sunt prezenti in Verilog. De aceea se va folosi i = i + 1.<br />

for(i = 0; i < 10; i = i + 1)<br />

begin<br />

end<br />

$display("i= %0d", i);<br />

Instructiunea while opereaza in forma normala:<br />

i = 0;<br />

while(i < 10)<br />

begin<br />

end<br />

$display("i= %0d", i);<br />

i = i + 1;<br />

Instructiunea repeat repeta urmatorul bloc de un numar fixat de ori, in exemplul urmator de 5<br />

ori:<br />

repeat (5)<br />

begin<br />

$display("i= %0d", i);


end<br />

i = i + 1;<br />

2.7 Alte Instructiuni.<br />

2.7.1 Instructiunea parameter.<br />

Instructiunea parametru permite programatorului sa dea unei constante un nume. In mod tipic se<br />

utilizeaza pentru a specifica numarul de biti ai unui registru sau intarzierile. De exemplu, se pot<br />

parametriza declaratiile unui model:<br />

parameter byte_size = 8;<br />

reg [byte_size - 1:0] A, B;<br />

2.7.2 Atribuirea Continua.<br />

Atribuirea continua comanda variabile de tip wire, fiind evaluate si actualizate ori de cate ori o<br />

intrare operand isi modifica valoarea. In cele ce urmeaza valorile de pe firele in1 si in2 sunt<br />

inmultite pentru a comanda iesirea out. Cuvantul cheie assign este utilizat pentru a face<br />

distinctia intre atribuirea continua si atribuirea procedurala. Instructiunea urmatoare efecteaza<br />

produsul semnalelor de pe firele in1 si in2, neaga rezultatul si comanda continuu firul out.<br />

assign out = ~(in1 & in2);<br />

2.7.3 Atribuiri Procedurale Blocante si Nonblocante.<br />

Limbajul Verilog are doua forme pentru instructiunea de atribuire procedurala: blocanta si<br />

nonblocanta. Cele doua forme se deosebesc prin operatorii de atribuire = si


A = 3;<br />

#1 A


unde este o lista de expresii, care corespund prin pozitie lui din definitie. Porturi argumente, in definitie pot fi: input, inout sau output.<br />

Deoarece din definitia task-ului arata ca si alte declaratii, programatorul<br />

trebuie sa fie atent, in ceea ce priveste adaugarea declaratiilor la inceputul task-ului.<br />

// Testarea task-urilor si a functiilor<br />

// Dan Hyde, Aug 28, 1995<br />

module tasks;<br />

task add; // definitia task-ului<br />

input a, b; // doua porturi de intrare argumente<br />

output c; // un port de iesire argument<br />

reg R; // declaratie de registru<br />

begin<br />

end<br />

endtask<br />

R = 1;<br />

if (a == b)<br />

else<br />

c = 1 & R;<br />

c = 0;<br />

initial begin: init1<br />

end<br />

reg p;<br />

add(1, 0, p); // invocarea task-ului cu 3 argumente<br />

$display("p= %b", p);<br />

endmodule<br />

Parametri input si inout sunt transferati prin valoare catre task, iar parametrii output si inout<br />

sunt transferati inapoi prin valoare, catre constructia care a invocat task-ul. Chemarea prin<br />

referire nu este disponibila. Alocarea tuturor variabilelor este statica. Astfel, un task se poate<br />

autoinvoca, dar la fiecare invocare se va folosi aceeasi memorie, ceea ce inseamna ca variabilele<br />

locale nu sunt fortate in stiva. Deoarece firele concurente pot invoca acelasi task, programatorul<br />

trebuie sa fie atent la natura statica a alocarii spatiului de memorie, pentru a evita suprascrierea<br />

spatiului partajat de memorie.


Scopul unei functii este acela de a returna o valoare care urmeaza sa fie folosita intr-o expresie.<br />

Definitia unei functii trebuie sa contina cel putin un argument de intrare, input. Transferul<br />

argumentelor in functii este asemanator ca si la task-uri.<br />

Definitia unei functii este urmatoarea:<br />

function ; //Nota: nu exista lista de parametri sau ().<br />

< porturi argumente><br />

<br />

<br />

endfunction<br />

unde este tipul rezultatelor returnate expresiei, care a chemat<br />

functia. In interiorul functiei, trebuie sa se asigneze o valoare numelui functiei. Mai jos este<br />

prezentata o functie, care este similara task-ului de mai sus.<br />

// Testarea functiilor<br />

// Dan Hyde, Aug 28, 1995<br />

module functions;<br />

function [1:1] add2; // definitia functiei<br />

input a, b; // doua porturi argumente de intrare<br />

reg R; // declararea registrului<br />

begin<br />

end<br />

R = 1;<br />

if (a == b)<br />

else<br />

endfunction<br />

add2 = 1 & R;<br />

add2 = 0;<br />

initial begin: init1<br />

end<br />

reg p;<br />

p = add2(1, 0); // invocarea unei functii cu doua argumente<br />

$display("p= %b", p);<br />

endmodule


2.9 Control Sincronizarii/Timing-ului.<br />

Limbajul Verilog ofera doua tipuri explicite de control al sincronizarii, atunci cand urmeaza sa<br />

apara instructiuni procedurale.<br />

Primul tip il reprezinta comanda intarzierii in care o expresie specifica durata de timp intre<br />

prima aparitie a instructiunii si momentul in care ea se executa.<br />

Al doilea tip de comanda a intarzierii il reprezinta expresia eveniment, care permite executia<br />

instructiunii.<br />

A treia sectiune descrie instructiunea wait, care asteapta modificarea unei variabile specifice..<br />

Verilog constituie un simulator bazat pe evenimente in timp discret, adica evenimentele sunt<br />

planificate la momente discrete de timp si plasate intr-o coada de asteptare, ordonata in timp.<br />

Cel mai timpuriu eveniment se afla in fruntea cozii de asteptare iar evenimentele ulterioare sunt<br />

dupa el. Simulatorul inlatura toate evenimentele pentru timpul curent de simulare si le<br />

prelucreaza. In timpul prelucrarii, pot fi create mai multe evenimente si plasate in locul<br />

corespunzator, in coada pentru prelucrarea ulterioara. Cand toate evenimentele pentru timpul<br />

curent au fost procesate, simulatorul trece la urmatorul pas in timp si prelucreaza urmatoarele<br />

evenimente din fruntea cozii. Daca nu exista controlul sincronizarii, timpul de simulare nu<br />

evolueaza. Timpul de simulare poate progresa numai in una din urmatoarele situatii:<br />

1. specificarea intarzierii pe poarta sau fir;<br />

2. un control al intarzierii, introdus prin simbolul #;<br />

3. un eveniment de control, introdus prin simbolul @;<br />

4. instructiunea wait.<br />

Ordinea executiei evenimentelor in acelasi interval de timp/ceas este impredictibila.<br />

2.9.1 Controlul Intarzierii (#)<br />

O expresie de control al intarzierii specifica durata de timp intre prima aparitie a instructiunii<br />

si momentul executiei acesteia. De exemplu:<br />

#10 A = A + 1;<br />

specifica o intarziere de 10 unitati de timp inainte de a executa instructiunea de asignare<br />

procedurala. Simbolul # poate fi urmat de o expresie cu variabile.<br />

2.9.2 Evenimente.<br />

Executia unei instructiuni procedurale poate fi amorsat de o schimbare de valoare pe un fir sau<br />

intr-un registru sau de aparitia unui eveniment cu nume.:


egin<br />

end<br />

@r begin // controlat printr-o modificare a valorii in registrul r<br />

end<br />

A = B&C;<br />

@(posedge clock2) A = B&C; // controlat de frontul pozitiva al lui clock2<br />

@(negedge clock3) A = B&C; // controlat de frontul negativ al lui clock3<br />

forever @(negedge clock) // controlat de frontul negativ<br />

A = B&C;<br />

In formele care folosesc posedge si negedge, trebuie sa fie urmate de o expresie de un bit, de<br />

regula un semnal de ceas. La o tranzitie de la 1 la 0 ( sau necunoscut), se detecteaza un negedge<br />

Un posedge este detectat la o tranzitie de la 0 la 1 (sau necunoscut). Verilog furnizeaza, de<br />

asemenea, facilitati pentru a denumi un eveniment si apoi sa amorseze aparitia acelui eveniment.<br />

Mai intai trebuie sa se declare acel eveniment:<br />

event event6;<br />

Pentru a amorsa un eveniment se va folosi simbolul → :<br />

→ event6;<br />

Pentru a controla un bloc de cod, se va folosi simbolul @, dupa cum se arata mai jos:<br />

@(event6) begin<br />

<br />

end<br />

Se va presupune ca evenimentul apare intr-un fir de control, adica concurent, iar codul de<br />

control se afla in alt fir. Mai multe evenimente pot fi sumate logic in interiorul parantezelor.<br />

2.9.3 Instructiunea wait.<br />

Instructiunea wait permite intarzierea unei instructiuni procedurale sau a unui bloc, pana ce<br />

conditia specificata devine adevarata:<br />

wait (A == 3)<br />

begin<br />

end<br />

A = B&C;


Diferenta intre comportamentul unei instructiuni wait si un eveniment este aceea ca<br />

instructiunea wait este sesizeaza nivelul, in timp ce un @(posedge clock); este amorsat de catre<br />

o tranzitie a semnalului sau sesizeaza frontul.<br />

2.9.4 Instructiunile fork si join.<br />

Folosind constructiile fork si join, Verilog permite existenta mai multor fire de control in cadrul<br />

constructiilor initial si always. De exemplu, pentru a avea trei fire de control, se ramifica (fork)<br />

controlul in trei si apoi fuzioneaza (join), dupa cum se va vedea mai jos:<br />

fork: trei // desface firul in trei; cate unul pentru fiecare begin-end<br />

begin<br />

end<br />

// codul pentru firul1<br />

begin<br />

end<br />

// codul pentru firul2<br />

begin<br />

end<br />

// codul pentru firul3<br />

join // fuziunea firelor intr-un singur fir.<br />

Fiecare instructiune intre fork si join, in acest caz cele trei blocuri begin-end, este executata<br />

concurent. Dupa terminarea celor trei fire, este executata urmatoarea instructiune dupa join.<br />

Trebuie sa existe certitudinea ca intre cele trei fire diferite nu exista interferente. De exemplu,<br />

nu se poate modifica continutul unui registru, in aceeasi perioada de ceas, in doua fire diferite.<br />

2.10 Exemplu: Comanda semaforului de trafic.<br />

Pentru a demonstra task-urile si evenimentele, se va prezenta un model de controlor de semafor<br />

de trafic.<br />

// Model numeric pentru un controlul unui semafor de trafic.<br />

// By Dan Hyde August 10, 1995<br />

module traffic;<br />

parameter on = 1, off = 0, red_tics = 35,<br />

amber_tics = 3, green_tics = 20;<br />

reg clock, red, amber, green;<br />

// va opri simularea dupa 1000 unitati de timp


initial begin: stop_at<br />

#1000; $stop;<br />

end<br />

// initializeaza luminile si seteaza monitorizarea registrelor.<br />

initial begin: Init<br />

red = off; amber = off; green = off;<br />

$display(" Timpul green amber red");<br />

$monitor("%3d %b %b %b", $time, green, amber, red);<br />

end<br />

// task de asteptare pentru aparitiile fronturilor pozitive ale ceasului<br />

// inainte de a stinge (off) luminile<br />

task light;<br />

output color;<br />

input [31:0] tics;<br />

begin<br />

repeat(tics) // asteapta detectarea fronturilor pozitive ale ceasului<br />

@(posedge clock);<br />

color = off;<br />

end<br />

endtask<br />

// forma de unda pentru o un ceas cu o perioada de doua unitati de timp<br />

always begin: clock_wave<br />

#1 clock = 0;<br />

#1 clock = 1;<br />

end<br />

always begin: main_process<br />

red = on;<br />

light(red, red_tics); // cheama task-ul de asteptare<br />

green = on;<br />

light(green, green_tics);<br />

amber = on;<br />

light(amber, amber_tics);


end<br />

endmodule<br />

Iesirea simulatorului de semafor de trafic este urmatoarea:<br />

Time green amber red<br />

0 0 0 1<br />

70 1 0 0<br />

110 0 1 0<br />

116 0 0 1<br />

186 1 0 0<br />

226 0 1 0<br />

232 0 0 1<br />

302 1 0 0<br />

342 0 1 0<br />

348 0 0 1<br />

418 1 0 0<br />

458 0 1 0<br />

464 0 0 1<br />

534 1 0 0<br />

574 0 1 0<br />

580 0 0 1<br />

650 1 0 0<br />

690 0 1 0<br />

696 0 0 1<br />

766 1 0 0<br />

806 0 1 0<br />

812 0 0 1<br />

882 1 0 0<br />

922 0 1 0<br />

928 0 0 1<br />

998 1 0 0<br />

Stop at simulation time 1000<br />

3. Utilizarea Simulatorului.<br />

3.1 Crearea Fisierului Model<br />

Se introduce codul Cerilog, generat cu ajutorul unui editor oarecar, de exemplu Edit. Ca<br />

extensie pentru fisierul sursa se va folosi “.v”.<br />

3.2 Pornirea Simulatorului.<br />

VeriWell este executat din fereastra UNIX shell. Se tasteaza"veriwell" urmat de numele<br />

fisierelor care contin modelele si optiunile. Optiunile pot aparea intr-o ordine oarecare, oriunde<br />

in linia de comanda. De exemplu:


host-name% veriwell cpu.v bus.v top.v -s<br />

Aceasta va incarca fiecare fisier in memorie, le va compila si va intra in modul interactiv. Prin<br />

inlaturarea optiunii "-s" , simularea va incepe imediat. Optiunile sunt prelucrate in ordinea in<br />

care apar in linia de comanda.Fisierele sunt prelucrate in ordinea in care ele apar dupa<br />

prelucrarea optiunilor.<br />

3.3 Iesirea din Simulator.<br />

Pentru a iesi din simulator se tasteaza $finish; sau Control-d.<br />

Pentru a stopa simularea se tasteaza Control-c. Executia unui task de sistem $stop; in cadrul<br />

codului Verilog va stopa simularea.<br />

3.4Optiunile Simulatorului.<br />

Optiunile utilizate in mod curent, in linia de comanda, sunt prezentate mai jos. Pentru alte<br />

optiuni se recomanda consultarea lucrarii: VeriWell User’s Guide.<br />

-i <br />

Specifica un fisier care contine comenzi interactive, care urmeaza sa fie executate imediat ce se<br />

intra in modul interactiv. Aceasta optiune trebuie sa fie utilizata cu optiunea "-s". Aceasta poate<br />

fi utilizata pentru a initializa variablele si pentru a stabili limitele timpului de simulare.<br />

-s<br />

Asigura intrarea in modul interactiv inaintea inceperii simularii.<br />

-t<br />

Realizeaza trasarea/urmarirea tuturor instructiunilor. Acest mod poate fi dezactivat prin task-ul<br />

de sistem $cleartrace.<br />

3.5 Depanarea in Modul Interactiv VeriWell.<br />

VeriWell este interactiv. Dupa lansare, simularea poate fi controlata prin comenzi simple. De<br />

asemenea, VeriWell accepta oricare instructiune Verilog statement (dar nu pot fi adaugate noi<br />

module sau declaratii).<br />

Modul interactiv poate fi introdus pe trei cai:<br />

1). La folosirea optiunii "-s" in linia de comanda sau in fisierul de comanda, se lanseaza modul<br />

interactiv, inaintea inceperii simularii.<br />

2). Cand simularea intalneste task-ul de sistem $stop.<br />

3). Atunci cand utilizatorul tasteaza Control-c, in timpul simularii (nu in timpul compilarii).<br />

Comenzi Interactive.<br />

Continua ('.') [period]


Relanseaza executia de la locatia curenta.<br />

Pas singular cu urmarire (',') [comma]<br />

Executa o singura instructiune si afisaza rezultatul trasarii.<br />

Pas singular fara trasare (';') [semicolon]<br />

Executa o singura instructiune fara urmarire.<br />

Locatia curenta (':') [colon]<br />

Afisaza locatia curenta.<br />

Control-d sau $finish;<br />

Iesirea din simulatorul VeriWell.<br />

In mod tipic, instructiunile Verilog executate interactiv sunt utilizate pentru depanare si<br />

colectare de informatii. $display si $showvars pot fi tastate, in modul interactiv, pentru a arata<br />

valorile variabilelor. De remarcat faptul ca trebuie tastate task-ul de sistem, parametrii si (‘;’).<br />

$scope(); si $showscopes; pot fi tastate pentru a traversa ierarhia modelului. $settrace;<br />

si $cleartrace; vor activa/dezactiva modul de urmarire. Tastarea "#100; $stop;" va opri<br />

executia dupa 100 unitati de timp simulat.<br />

4. Task-urile de Sistem si Functiile.<br />

Task-urile de sistem nu sunt parti ale limbajului Verilog. Ele reprezinta task-uri construite si<br />

pastrate in biblioteca. Cateva dintre cele mai des utilizate task-uri de sistem sunt prezentate mai<br />

jos.<br />

4.1 $cleartrace<br />

Task-ul de sistem $cleartracedezactiveaza urmarirea.. A se vedea task-ul de sistem $settrace<br />

pentru activarea trasarii.<br />

4.2 $display<br />

$cleartrace;<br />

Afisaza text pre ecran ca si printf pentru limbajul C. Forma generala este:<br />

$display(, , ... );<br />

unde poate fi un sir intre ghilimele, o expresie care intoarce o valoare sau un<br />

parametru nul. De exemplu, afisarea unui antet:<br />

$display("Registre: A B C");<br />

Caracterul special % indica faptul ca urmatorul caracter reprezinta o specificatie de format.<br />

Pentru fiecare caracter %, care apare in sir, trebuie sa fie furnizata o expresie corespunzatoare


dupa sir. De exemplu, urmatoarele instructiuni vor tipari valoarea lui A in binar, octal, zecimal<br />

si hexazecimal:<br />

$display("A=%b binar %o octal %d zecimal %h hex",A,A,A,A);<br />

generandu-se urmatoarea iesire:<br />

A=00001111 binar 017 octal 15 zecimal 0f hex<br />

Specificatorii uzuali de format sunt:<br />

%b afisaza in format binar<br />

%c afisaza in format ASCII<br />

%d afisaza in format zecimal<br />

%h afisaza in format hexazecimal<br />

%o afisaza in format octal<br />

%s afisaza in format sir<br />

Un 0 intre % si specificatorul de format aloca numarul exact de caractere cerut pentru afisarea<br />

rezultatului evaluarii expresiei, in locul numarului necesar pentru valoarea cea mai mare pe care<br />

ar lua-o expresia. De exemplu, aceasta este utila la afisarea timpului, dupa cum se va observa<br />

din exemplele de mai jos, care contin doua instructiuni $display.<br />

$display("Timp = %d", $time);<br />

$display("Timp = %0d", $time);<br />

si care genereaza uramatoarele iesiri:<br />

Timp = 1<br />

Timp = 1<br />

Intr-un sir pot fi introduse secvente “Escape”. Secventele “Escape” mai frecvent folosite sunt<br />

urmatoarele:<br />

\n caractelul linie noua<br />

\t caracterul tab<br />

\\ caracterul \<br />

\ caracterul " the "<br />

%% semnul procent<br />

Parametrul nul genereaza un spatiu de un caracter, la afisare. Un parametru nul este caracterizat<br />

prin doua virgule adiacente in lista de parametri. $display adauga autoamat un caracter linie-<br />

noua, la sfarsitul iesirii. A se vedea $write, in “Verilog Language Reference Manual” , daca nu<br />

se doreste o linie noua.


4.3 $finish<br />

Task-ul de sistem $finish asigura iesirea din simulator catre sistemul de operare gazda. A nu se<br />

uita tastarea (‘;’), in modul interactiv.<br />

$finish;<br />

4.4 $monitor<br />

Task-ul de sistem $monitor permite monitorizarea si afisarea valorilor oricarei variabile sau<br />

expresii specificate ca parametru al task-ului. Parametrii sunt specificati ca si in cazul task-ului<br />

de sistem $display. Cand se invoca task-ul $monitor simulatorul stabileste un macanism prin<br />

care, de fiecare data cand o variabila sau o expresie, din lista de parametri, isi modifica valoarea,<br />

cu exceptia lui $time, intreaga lista a parametrilor este afisata la sfarsitul pasului de timp, ca si<br />

cand ar fi fost raportata de catre task-ul $display. Daca doi sau mai multi parametri isi schimba<br />

valoarile in acelasi timp se va realiza o singura afisare. De exemplu, instructiunea urmatoare va<br />

afisa o linie ori de cate ori se modifica unul dintre registrele A, B sau C.<br />

$monitor(" %0d %b %b "%b, $time, A, B, C);<br />

La un moment dat numai o instructiune $monitor trebuie sa fie activa. Monitorizarea poate fi<br />

activata/dezactivata prin urmatoarele instructiuni:<br />

4.5 $scope<br />

$monitoroff;<br />

$monitoron;<br />

<br />

Task-ul de sistem $scope ofera utilizatorului posibilitatea de a atribui, ca domeniu interactiv, un<br />

nivel particular al ierarhiei, pentru identificarea obiectelor. $scope este util in timpul depanarii<br />

intrucat utilizatorul poate modifica domeniul, pentru a inspecta valorile diverselor variabile, din<br />

diferite module, task-uri si functii.<br />

$scope();<br />

Parametrul trebuie sa fie numele complet ierarhic al unui modul, task, functii sau bloc<br />

cu nume. A se vedea task-ul de sistem $showscopes, pentru afisarea numelor.<br />

4.6 $settrace<br />

Task-ul de sistem $settrace activeaza urmarirea activitatii de simulare. Urmarirea consta in<br />

obtinerea diferitelor informatii, inclusiv a timpului curent de simulare, a numarului liniei, a<br />

numelui fisierului, a modulului si a oricarui rezultat al instructiunii care se executa.<br />

$settrace;


urmarirea se poate dezactiva prin task-ul de sistem $cleartrace .<br />

4.7 $showscopes<br />

Task-ul de sistem $showscopes afisaza o lista completa a tuturor modulelor, task-urilor,<br />

functiilor si a modulelor cu nume din domeniul curent.<br />

4.8 $showvars<br />

$showscopes;<br />

Task-ul de sistem $showvars furnizeaza informatia de stare pentru variabilele registre si fire,<br />

atat scalari, cat si vectori. Invocat fara parametri, $showvars afisaza starile tuturor variabilelor<br />

din domeniul curent. Invocat cu o lista de variabile, el arata numai stareaacelora specificate.<br />

4.9 $stop<br />

$showvars;<br />

$showvars();<br />

Task-ul de sistem $stop opreste simulatorul, trece la modul interactiv si transfera comanda catre<br />

utilizator.<br />

4.10 $time<br />

$stop;<br />

Functia de sistem $time system intoarce timpul curent de simulare sub foma unui intreg de 64<br />

de biti. $time trebuie utilizat intr-o expresie.<br />

Bibliografie<br />

1. Cadence Design Systems, Inc., Verilog-XL Reference Manual.<br />

2. Open Verilog International (OVI), Verilog HDL Language Reference Manual (LRM), 15466<br />

Los Gatos Boulevard, Suite 109-071, Los Gatos, CA 95032; Tel: (408)353-8899, Fax: (408)<br />

353-8869, Email: OVI@netcom.com, $100.<br />

3. Sternheim, E. , R. Singh, Y. Trivedi, R. Madhaven and W. Stapleton, Digital Design and<br />

Synthesis with Verilog HDL, published by Automata Publishing Co., Cupertino, CA, 1993,<br />

ISBN 0-9627488-2-X, $65.<br />

4. Thomas, Donald E., and Philip R. Moorby, The Verilog Hardware Description Language,<br />

second edition, published by Kluwer Academic Publishers, Norwell MA, 1994, ISBN 0-7923-<br />

9523-9, $98, includes DOS version of VeriWell simulator and programs on diskette.<br />

5. Bhasker, J., A Verilog HDL Primer, Star Galaxy Press, 1058 Treeline Drive, Allentown, PA<br />

18103, 1997, ISBN 0-9656277-4-8, $60.


6. Wellspring Solutions, Inc., VeriWell User’s Guide 1.2, August, 1994, part of free distribution<br />

of VeriWell, available online.<br />

7. World Wide Web Pages:<br />

FAQ for comp.lang.verilog - http://www.comit.com/~rajesh/verilog/faq/alt_FAQ.html<br />

comp.lang.verilog archives - http://www.siliconlogic.com/Verilog/<br />

Cadence Design Systems, Inc. - http://www.cadence.com/<br />

Wellspring Solutions - ftp://iii.net/pub/pub-site/wellspring<br />

Verilog research at Cambridge, England - http://www.cl.cam.uk/users/mjcg/Verilog/


9.1. Introducere.<br />

9. Bazele Aritmetice ale Calculatoarelor Numerice.<br />

Intrucat elementele de memorare sunt constituite din dispozitive cu doua stari stabile, iar iar<br />

elementele de prelucrare a informatiei sunt bazate pe circuite logice, care opereaza pe baza<br />

logicii bivalente, intr-un calculator numeric datele sunt reprezentate in binar, sub forma unor<br />

succesiuni de unitati si zerouri. Exista numeroase posibilitati pentru reprezentarea datelor, care<br />

se deosebesc intre ele prin expresibilitate, cost de implementare, usurinta conversiilor de la un<br />

format la altul, cat si prin alte considerente.<br />

Astfel, in cadrul unui calculator numeric, la nivel hardware, se folosesc mai multe tipuri de date:<br />

- Bit: 0,1<br />

- Sir de biti: secvente de biti de lungimi date:<br />

- Caracter:<br />

- Zecimal:<br />

- tetrada: 4 biti,<br />

- octet/byte: 8 biti,<br />

- semicuvant: 16 biti,<br />

- cuvant: 32 de biti,<br />

- cuvant dublu: 64 de biti<br />

- ASCII: cod de 7 biti<br />

- cifrele zecimale 0-9 codificate binar 00002 -10012 (doua cifre zecimale pot fi<br />

impachetate pe un octet sau intr-un octet se poate plasa o singura cifra zecimala);<br />

- Intreg (Virgula fixa):<br />

- fara semn,<br />

- cu semn, reprezentare in:<br />

- Real (Virgula mobila):<br />

- precizie simpla,<br />

- precizie dubla,<br />

- precizie extinsa.<br />

- semn si modul (cod direct),<br />

- complementul fata de 1 (cod invers),<br />

- complementul fata de 2 (cod complementar).


Calculatoarele poseda elemente de stocare a datelor, de tipul registrelor sau al celulelor de<br />

memorie, care dispun de un numar finit de elemente/ranguri, ceea ce afecteaza precizia<br />

calculului. Astfel, la programarea unor aplicatii numerice, trebuie avute in vedere aspectele<br />

legate de precizia limitata a reprezentarii informatiei.<br />

9.2. Sisteme de numeratie.<br />

9.2.1. Reprezentarea numerelor.<br />

Un sistem de numeratie consta in totalitatea regulilor si simbolurilor/cifrelor folosite pentru<br />

reprezentarea numerelor. Sistemele de numeratie pot fi de doua tipuri: pozitionale si<br />

nepozitionale. Intr-un sistem pozitional valoarea/ponderea unui simbol depinde de pozitia pe<br />

care o ocupa in reprezentarea unui numar dat, in timp ce intr-un sistem nepozitional acest lucru<br />

nu are loc. Ca exemplu de sistem nepozitional se poate da sistemul de numeratie roman.<br />

Sistemele de numeratie pozitionale mai poarta numele si de sisteme de numeratie ponderate,<br />

intrucat valoarea unei cifre depinde de pozitia ei in reprezentarea numarului dat.<br />

Un numar intreg N este reprezentat, intr-un sistem de numeratie pozitional, in baza b, sub<br />

forma unui n-tuplu de simboluri xi,<br />

Nb = xn-1 xn-2 xn-3 … xi… x1 x0<br />

unde xi reprezinta o cifra a sistemului de numeratie.<br />

O cifra xi poate lua valori intregi cuprinse intre 0 si b-1, baza b reprezentand numarul valorilor<br />

posibile pe care le poate lua o cifra oarecare xi.<br />

In general, un numar, constituit dintr-o parte intreaga si o parte subunitara are umatoarea<br />

reprezentare in baza b:<br />

Nb = xn-1 xn-2 xn-3 … xi… x1 x0 , x-1 x-2 x-3 … x-i… x-m , (o ≤ xi ≤ b-1).<br />

Valoarea N a numarului Nb se calculaeza cu ajutorul urmatoarei expresii:<br />

n-1<br />

N = Σ xi. b i<br />

i=-m<br />

Fie numarul (435,25)10, in baza 10 (n=3, m=2 si b=10).<br />

4 x 10 2 + 3 x 10 1 + 5 x 10 0 + 2 x 10 -1 + 5 x 10 -2 =<br />

(400)10 + (30)10 + (5)10 (1) + (2/10)10 + (5/100)10 = (435,25)10


In continuare se considera numarul (1011,01)2, pentru care: n = 4, m = 2 si b = 2:<br />

1 x 2 3 + 0 x 2 2 + 1 x 2 1 + 1 x 2 0 + 0 x 2 -1 + 1 x 2 -2 =<br />

(8)10 + (0)10 + (2)10 + (1)10 + (0/2)10 + (1/4)10 = (11,25)10<br />

In ultimul exemplu se prezinta metoda polinomiala de conversie a numerelor, reprezentate in<br />

baza 2, in numere reprezentate in baza 10.<br />

9.2.2. Conversia numerelor dintr-o baza in alta.<br />

Intr-un sistem de calcul datele sunt reprezentate in mai multe sisteme de numeratie. Astfel,<br />

datele de la intrare si cele de la iesire sunt, in general, reprezentate in baza 10. In memoria<br />

calculatorului si in unitatea de prelucrare datele sunt reprezentate in baza 2. Sunt situatii in care<br />

datele, care se prelucreaza, sunt reprezentate in baza 10, cifrele zecimale fiind codificate prin<br />

tetrade binare. Pentru a usura operatiile de programare, uneori, numerele binare sunt convertite<br />

in numere reprezentate in baza 8 sau baza 16.<br />

Plecand de la reprezentarea numerelor sub forma coeficientilor dezvoltarii polinomiale, in<br />

raport cu baza, conversia se poate efectua prin operatii repetate de impartire/inmultire in<br />

conditiile numerelor intregi/subunitare.<br />

Se presupune un numar N constituit dintr-o parte intreaga Ni si o parte subunitara Nf :<br />

Astfel:<br />

N = Ni + Nf<br />

Ni = xn-1 xn-2 xn-3 … xi… x1 x0 si<br />

Nb = 0, x-1 x-2 x-3 … x-i… x-m<br />

Conversia numerelor intregi din baza b in baza q presupune impartirea repetata a catului de la<br />

impartirea precedenta la noua baza si retinerea restului, mai mic decat noua baza, pana cand<br />

catul curent devine mai mic decat noua baza. Ca prim cat se ia numarul Ni , care urmeaza sa fie<br />

convertit. Resturile obtinute formeaza cifrele noului numar, incepand cu cea mai putin<br />

semnificativa. Toate operatiile se efectueaza in baza de plecare b.<br />

Din punctul de vedere al valorii exprimate:<br />

(Ni)b = (Ni)q<br />

(Ni)q se poate scrie ca un p-tuplu astfel:<br />

Ni = yp-1 yp-2 yp-3 … yi… y1 y0


Pentru a obtine coeficientii yi, ai dezvoltarii in baza q, se va recurge la urmatoarea secventa de<br />

operatii:<br />

Exemplu:<br />

(Ni)b : q = (Ni)b 1 + y0 /q , cifra curenta a noului numar este y0<br />

(Ni)b 1 : q = (Ni)b 2 + y1 /q , cifra curenta a noului numar este y1<br />

………………………………………………………………..<br />

(Ni)b p-2 : q = (Ni)b p-1 + yp-2 /q , cifra curenta a noului numar este yp-2<br />

unde 0 ≤ (Ni)b p-1 ≤ q reprezinta cifra cea mai semnificativa a noii reprezentari<br />

(17)10 = ( ? )2<br />

17 : 2 = 8 +1/2 , y0 = 1;<br />

8 : 2 = 4 +0/2 , y1 = 0;<br />

4 : 2 = 2 +0/2 , y2 = 0;<br />

2 : 2 = 1 + 0/2 , y3 = 0;<br />

( 17 )10 = 100012<br />

y4 = 1<br />

Conversia numerelor subunitare din baza b in baza q presupune inmultirea repetata a partii<br />

subunitare, care rezulta de la inmultirea precedenta, cu noua baza si retinerea partii intregi, pana<br />

cand partea subunitara curenta devine 0 sau pana cand se epuizeaza rangurile de reprezentare in<br />

noua baza. Ca prima parte subunitara se ia numarul Nf , care urmeaza sa fie convertit. Intregii<br />

obtinuti formeaza cifrele noului numar, incepand cu cea mai semnificativa. Toate operatiile se<br />

efectueaza in baza de plecare b.<br />

Din punctul de vedere al valorii exprimate:<br />

(Nf)b = (Nf)q<br />

(Nf)q se poate scrie ca un m-tuplu astfel:<br />

Nf = y-1 y-2 y-3 … y-i… y-m<br />

Pentru a obtine coeficientii y-i ai dezvoltarii in baza q se va recurge la urmatoarea secventa de<br />

operatii:<br />

(Nf)b × q = (Nf)b -1 + y0-1 , cifra curenta a noului numar este y-1<br />

(Nf)b -2 × q = (Nf)b -2 + y-2 , cifra curenta a noului numar este y-2<br />

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


(Nf)b -m+1 × q = 0 + y-m , cifra curenta a noului numar este y-m<br />

In cazul in care (Nf)b -i = 0, procesul se opreste. Se poate constata faptul ca procesul de<br />

conversie a numerelor subunitare poate fi insotit de erori, in cazul unui numar limitat de ranguri<br />

pentru reprezentarea in noua baza sau in cazul aparitiei unor secvente repetate de unitati si<br />

zerouri.<br />

Exemplu:<br />

(0,125)10 = (0,001)2<br />

Se considera urmatorul exemplu:<br />

(0,1)10 = ( ? )2<br />

0,1 × 2 = 0 + 0,2 ; y-1 = 0;<br />

0,2 × 2 = 0 + 0,4 ; y-2 = 0;<br />

0,4 × 2 = 0 + 0,8 ; y-3 = 0;<br />

0,8 × 2 = 1 + 0,6 ; y-4= 1;<br />

0,6 × 2 = 1 + 0,2 ; y-5 = 1;<br />

0,2 × 2 = 0 + 0,4 ; y-6 = 0;<br />

0,4 × 2 = 0 + 0,8 ; y-7 = 0;<br />

0,8 × 2 = 1 + 0,6 ; y-8 = 1;<br />

0,6 × 2 = 1 + 0,2 ; y-9 = 1;<br />

0,2 × 2 = 0 + 0,4 ; y-6 = 0;<br />

………………………………<br />

(0,1)10 = ( 0,00011000110.... )2<br />

Se poate observa ca, in acest ultim caz, conversia nu se efectueaza exact.<br />

Conversiile intre baze, care reprezinta puteri ale lui 2, constituie cazuri particulare, si se<br />

efectueaza mecanic. Astfel, in cazul numerelor reprezentate in octal/hexazecimal, cifrele<br />

octale/hexazecimale se inlocuiesc cu triadele/tetradele binare corespunzatoare si invers.<br />

Numerele octale/hexazecimale se exploreaza, pentru conversia in binar, de la dreapta la stanga.<br />

Mai jos se prezinta un tabel de corespondenta intre cifrele octale, zecimale si hexazecimale, pe<br />

de-o parte si echivalentele lor binare, pe de alta parte.


Exemple:<br />

binar octal zecimal hexazecimal<br />

(011101)2 = (011)2(101)2 = (3)8 (5)8 = (35)8<br />

(011101)2 = (0001)2(1101)2 = (1)16 (D)16 = (1D)16<br />

9.2.3. Reprezentarea informatiei numerice in calculatoare.<br />

Calculatoarele moderne opereaza atat cu numere intregi (cu semn si fara semn), cat si cu<br />

numere reale.<br />

In cazurile numerelor intregi cu semn si al mantisei numerelor reale semnul este codificat prin<br />

bitul plasat in extrema stanga. Semnul “-“ este codificat prin “1”, iar semnul “+” prin “0”.<br />

Pentru numerele intregi cu semn:<br />

Ni = xn-1 xn-2 xn-3 … xi… x1 x0<br />

semnul este codificat prin bitul xn-1.<br />

Un numar real Nr se reprezinta prin doua campuri: mantisa/fractia f, cu semn, si exponent e:<br />

unde:<br />

Nr = s e f<br />

- s reprezinta semnul mantisei, codificat printr-un bit, conform conventiei mentionate mai<br />

sus,<br />

- f constituie mantisa sub forma unui numar subunitar normalizat ( |m | ≤ 1/2 ),<br />

- e specifica exponentul, de regula, deplasat cu o anumita cantitate pentru a-l face ≥ 0 .<br />

O discutie mai amanuntita, <strong>privind</strong> reprezentarea numerelor reale se va face intr-un paragraf<br />

ulterior.


9.3. Coduri de reprezentare a numerelor intregi, cu semn, in calculatoare.<br />

Numerele intregi, cu semn, se pot reprezenta in calculatoare in trei moduri diferite, numite<br />

uneori si coduri de reprezentare:<br />

- semn si modul (cod direct),<br />

- complementul fata de 1 (cod invers),<br />

- complementul fata de 2 (cod complementar).<br />

Codul direct (semn si modul).<br />

[x]d = semn |x|<br />

[x]d = 0 xn-2 xn-3 … xi… x1 x0 , pentru x > 0;<br />

[x]d = 1 xn-2 xn-3 … xi… x1 x0 , pentru x < 0<br />

Se poate observa ca, in acest cod, 0 are doua reprezentari, daca este afectat de semn:<br />

[+0]d = 0 0000..000 si<br />

[-0]d = 11111..111<br />

Astfel, un numar x in cod direct, reprezentat pe n ranguri, poate lua valori in gama:<br />

ceea ce face ca pentru:<br />

-2 n-1 + 1 ≤ x ≤ 2 n-1 - 1,<br />

- n = 8 valorile minime/maxime sa fie –127 / +127, iar<br />

- n = 16 valorile minime/maxime sa fie –32767 / +32767.<br />

Reprezentarea in modul si semn este utila pentru implementarea operatiei de inmultire, dar<br />

prezinta unele dificultati la adunare si scadere.<br />

Codul invers (complementul fata de unu).<br />

Denumirea de complementul fata de unu provine de la faptul ca, reprezentarea in virgula fixa<br />

s-a realizat in calculatoare, mai intai, pentru numere subunitare, numerele negative fiind stocate<br />

sub forma complementului fata de 2, diminuat cu 1, prin scaderea lui |x| din 1. In cazul<br />

numerelor binare negative intregi, reprezentate pe n ranguri, codurile inverse se obtin prin<br />

scaderea modulelor acestora din 2 n – 1.<br />

unde: xi reprezinta inversul lui xi<br />

[x]i = 0 xn-2 xn-3 … xi… x0 , pentru x > 0;<br />

[x]i = 1 xn-2 xn-3 … xi… x0 , pentru x < 0<br />

Se poate observa ca, in acest cod, 0 are doua reprezentari, daca este afectat de semn:


[+0]i = 0 0000..000 si<br />

[-0]i = 11111..111<br />

Astfel, un numar x in cod invers, reprezentat pe n ranguri, poate lua valori in gama:<br />

ceea ce face ca pentru:<br />

-2 n-1 + 1 ≤ x ≤ 2 n-1 - 1,<br />

- n = 8 valorile minime/maxime sa fie –127 / +127, iar<br />

- n =16 valorile minime/maxime sa fie –32767 / +32767.<br />

Reprezentarea in codul invers este identica cu reprezentarea in cod direct, in cazul numerelor<br />

pozitive. Pentru a obtine codul invers al unui numar se inverseaza valorile binare ale tuturor<br />

rangurilor, operatie extrem de usor de realizat in hardware.<br />

Codul complementar (complementul fata de doi).<br />

Denumirea de complementul fata de doi provine de la faptul ca reprezentarea in virgula fixa<br />

s-a realizat in calculatoare mai intai pentru numere subunitare, iar numerele negative se stocau<br />

sub forma complementului fata de 2, prin scaderea lui |x| din 2. In cazul numerelor binare,<br />

intregi negative, reprezentate pe n ranguri, codurile inverse se obtin prin scaderea modulelor<br />

acestora din 2 n .<br />

[x]c = 0 xn-2 xn-3 … xi… x0 , pentru x ≥ 0;<br />

~ ~ ~ ~<br />

[x]c = 1 xn-2 xn-3 … xi… x0 , pentru x < 0<br />

unde: ~ ~ ~ ~<br />

1 xn-2 xn-3 … xi… x0 se obtine ca urmare a operatiei: 2 n - |x|<br />

Se poate observa ca, in acest cod, 0 are o singura reprezentare:<br />

[0]c = 0 0000..000<br />

Astfel, un numar x in cod complementar , reprezentat pe n ranguri, poate lua valori in gama:<br />

ceea ce face ca pentru:<br />

-2 n-1 ≤ x ≤ 2 n-1 - 1,<br />

- n = 8 valorile minime/maxime sa fie –128 / +127, iar<br />

- n = 16 valorile minime/maxime sa fie –32768 / +32767.<br />

Pentru: x > 0 [x]d = [x]i = [x]c<br />

Pentru: x < 0 [x]c = [x]i + 1 = 2 n - |x| .


Se poate observa usor ca, prin mijloace hardware, codul complementar al unui numar negativ se<br />

poate obtine adunand, la inversul numarului (obtinut prin negarea logica a tuturor rangurilor), o<br />

unitate in cel mai putin semnificativ rang.<br />

Reprezentarea in cod complementar faciliteaza realizarea hardware-lui necesar operatiilor de<br />

adunare si scadere in calculatoare.<br />

Reprezentarea in exces.<br />

Reprezentarea in exces este cunoscuta si sub numele de reprezentare deplasata. Ideea de baza<br />

consta in aceea de a atribui celui mai mic numar (numar negativ) valoarea cea mai mica intreaga<br />

ce se poate reprezenta in calculator, manipuland in acest mod numere fara semn. In cazul<br />

reprezentarii numerelor (14)10 si (-14)10 sub forma unor numere pe binare pe 8 biti, folosind<br />

forma excess 128 va trebui sa se obtina corespondentele binare ale numerelor (128 + 14 = 142)10<br />

si (128 + - 14 = 114)10. Astfel, codul binar in exces 128 pentru (-14)10 este (01110010)2.<br />

Nu exista o semnificatie numerica a valorii in excess, ea are ca efect deplasarea reprezentarii in<br />

complementul fata de doi. Pentru cazul studiat valoarea exces a fost astfel aleasa incat sa aibe<br />

acelas sablon de biti ca si cel mai mare numar negativ, ceea ce face ca numerele sa apara ca si<br />

cand ar fi sortate ca numere binare fara semn. Celui mai mic numar negativ (-128)10 ii va<br />

corespunde (00000000)2, in timp ce celui mai mare numar pozitiv (127)10 ii va corespunde<br />

(11111111)2. Aceasta reprezentare simplifica efectuarea operatiei de comparare a numerelor,<br />

ceea ce este esential pentru realizarea hardware-lui necesar operarii asupra exponentilor, la<br />

reprezentarea in virgula mobila.<br />

9.4. Codul binar-zecimal.<br />

Numerele pot fi reprezentate in sistemul de numeratie cu baza 10, in conditiile in care rangurile<br />

zecimale sunt codificate prin tetrade binare. Acesta este codul binar-zecimal sau BCD (Binary<br />

Coded Decimal). Posibilitatile de codificare oferite de catre o tetrada binara nu sunt epuizate in<br />

cazul BCD, deoarece raman neutilizate 6 tetrade dintr-un total de 16.<br />

In cazurile in care se doreste o codificare BCD cu semn, tetradele binare: (1100) si (1101) se<br />

folosesc pentru codificarea semnelor “+” si “-“, in timp ce tetradele binare (0000),….., (1001)<br />

se utilizeaza pentru codificarea cifrelor zecimale.<br />

Pe un octet/byte, in bitii cei mai putin semnificativi, poate fi plasata o singura tetrada: BCD<br />

“neimpachetat”. In cazul plasarii a doua tetrade BCD pe un singur octet, se spune ca BCD este<br />

“impachetat” .


Codurile BCD se utilizeaza in calculatoarele destinate calculelor comerciale, financiare,<br />

inlaturand necesitatea conversiilor zecimal-binar si binar-zecimal.<br />

Un numar negativ in baza 10, cu mai multe ranguri, se poate reprezenta in BCD in<br />

complementul fata de 9 sau fata de 10.<br />

In cazul numerelor (+402)10 si (-402)10 se pot da reprezentarile lor in complementul fata de 9<br />

si fata de 10:<br />

0000 0100 0000 0010 (+402)10<br />

a) (0)10 (4)10 (0)10 (2)10<br />

1001 0101 1001 0111 (-402)10 complementul fata de 9<br />

b) (9)10 (5)10 (9)10 (7)10<br />

1001 0101 1001 1000 (-402)10 complementul fata de 10<br />

c) (9)10 (5)10 (9)10 (8)10<br />

In ultimul exemplu numerele pozitive vor fi reprezentate in gama 0 – 4999, iar numerele<br />

negative in gama 5000 – 9999.<br />

9.5. Reprezentarea in virgula mobila.<br />

Reprezentarea numerelor in virgula fixa precizeaza un numar de ranguri la stanga virgulei,<br />

pentru partea intreaga, si un alt numar de ranguri la dreapta virgulei, pentru partea subunitara.<br />

In vederea asigurarii unei game largi de reprezentare, cat si a unei precizii convenabile, in cazul<br />

virgulei fixe trebuie sa se aloce un numar mare de ranguri. Astfel, in cazul in care se doreste<br />

manipularea numerelor cu valori pana la 1 trilion (10 12 ) sunt necesare 40 de ranguri binare ,<br />

intrucat 10 12 ≈ 2 40 . Acelasi numar de 40 ranguri binare este necesar in cazul asigurarii unei<br />

precizii de o trilionime. Numerele ar fi astfel reprezentate pe 80 de biti. In practica solicitarile<br />

<strong>privind</strong> gama si precizia pot fi si mai mari.<br />

Virgula mobila ofera posibilitatea reprezentarii cu un numar mic de ranguri binare a unei game<br />

largi de numere exprimabile, prin efectuarea unui compromis intre numarul de rangur, care<br />

asigura precizia, si numarul de ranguri, care asigura gama.<br />

In numarul, reprezentat in virgula mobila, de mai jos:<br />

0,36542 × 10 4


gama este stabilita de catre numarul de ranguri ale exponentului si de catre baza, care, in cazul<br />

de fata, este 10. Precizia este asociata cu numarul de ranguri ale partii subunitare, 5 in exemplul<br />

de mai sus. Precizia si gama impun un numar de 6 ranguri zecimale, la care se mai adauga unul<br />

pentru codificarea semnului partii subunitare/mantisei:<br />

+ 4 . 3 6 5 4 2<br />

semnul mantisei virgula<br />

exponent mantisa<br />

In afara compromisului intre precizie si gama, bazat pe modificarea numarului de biti din<br />

reprezentarile exponentului si mantisei, pentru marirea gamei de reprezentare, se mai poate<br />

actiona, si asupra bazei, in sensul cresterii acesteia. Prin aceasta creste precizia pentru numerele<br />

mici, iar pentru numerele mari scade.<br />

Reprezentarea normalizata. Un numar poate fi reprezentat, in virgula mobila, in mai multe<br />

moduri:<br />

3654,2 × 10 0 = 36,542 × 10 2 = 0,36542 × 10 4<br />

Pentru a evita reprezentarile multiple ale aceluiasi numar se introduce forma normalizata.<br />

Aceasta se obtine prin deplasarea spre stanga a mantisei, astfel incat, imediat la dreapta virgulei<br />

sa se afle o cifra diferita de 0. Pe masura deplasarii mantisei la stanga se incrementeaza si<br />

exponentul. Operatia nu are sens atunci cand mantisa are toate rangurile egale cu 0.<br />

Un exponent este, de regula, rezervat pentru reprezentarea lui zero si a altor cazuri speciale,<br />

cum ar fi ∞. Cu exceptia cazului cand este egala cu zero, mantisa poseda in bitul cel mai<br />

semnificativ o unitate, pentru o baza egala cu 2. Acest bit, egal cu 1, este prezent in mod<br />

implicit, ceea ce permite deplasarea mantisei spre stanga cu un bit, in scopul maririi preciziei.<br />

Bitul in cauza poarta numele de “bit ascuns".<br />

Terminologia folosita in legatura cu erorile de calcul.<br />

In analiza erorilor posibile <strong>privind</strong> prelucrarea datelor se folosesc o serie de termeni si concepte<br />

specifice.<br />

Precizia. Constituie un termen asociat cu lungimea cuvantului, numarul de biti disponibili intr-<br />

un cuvant pentru reprezentarea unui numar dat. In cazul unui registru de 8 biti, considerand ca<br />

se reprezinta numai numere naturale, precizia de reprezentare va fi de 1/256. Precizia nu trebuie<br />

confundata cu acuratetea.<br />

Acurateta. Aceasta reprezinta o masura a apropierii unei aproximatii fata de valoarea exacta.<br />

Acest termen nu trebuie confundat cu precizia. Ca exemplu se poate considera reprezentarea nu-


marului natural 6 in binar, pe 4 biti. Reprezentarea exacta, fara nici o eroare va fi 0110. Daca se<br />

ia numarul binar fractionar 0,10101010101,care trebuie reprezentat pe 8 biti se va obtine:<br />

0,1010101. Ultima forma constituie o reprezentare cu eroare a numarului initial. Astfel, in al<br />

doile caz reprezentarea, care contine o eroare, este mai precisa (8 biti in loc de 4), dar are o<br />

acurateta mai mica .<br />

Gama. Gama reprezinta multimea numerelor reprezentabile intr-un sistem dat. Astfel, in<br />

reprezentarea numerelor intregi in complementul fata de doi, pe patru biti, gama de reprezentare<br />

va fi de la -8 la + 7, adica (+7) - (-8) = 15.<br />

Rezolutia. Aceasta constituie marimea diferentei/distantei intre doua numere sau cifre adiacente.<br />

Pentru reprezentarea cu patru cifre zecimale, gama fiind intre 0000 si 9999, rezolutia este<br />

constanta si egala cu 1.<br />

In cazul reprezentarii in virgula mobila rezolutia nu mai este constanta in cadrul gamei. Ea este<br />

dependenta de valoarea exponentului utilizat.<br />

Trunchierea. Cunoscuta si sub denumirea de rotunjire prin lipsa, aceasta tehnica este utilizata in<br />

cazurile in care precizia nu este suficienta pentru reprezentarea corecta a numarului stocat.<br />

Considerand stocarea valorii lui pi = 3,141592654 intr-un dispozitiv capabil sa memoreze numai<br />

6 cfre zecimale, numarul pi = 3,14159 se va reprezenta cu o eroare de trunchiere egala cu<br />

0,000002654.<br />

Rotunjirea. Metoda prin care se cauta sa se selecteze valoarea cea mai apropiata de valoarea<br />

initiala a numarului poarta numele de rotunjire. In zecimal, daca cifra aflata la dreapta<br />

ultimei cifre, care intra in reprezentare, este mai mare sau egala cu 5 atunci ultima cifra se<br />

incrementeaza cu 1, in caz contrar se lasa neschimbata. In binar, daca cifra aflata la dreapta ulti-<br />

mei cifre, care intra in reprezentare, este 1 atunci la ultima cifra se adauga o unitate, in caz<br />

contrar cifra nu se modifica.<br />

Depasirea. Situatia de depasire apare cind rezultatul unui calcul este prea mare pentru a putea fi<br />

reprezentat in sistem. Spre exemplu, daca se lucreaza in binar cu numere intregi reprezentate in<br />

complementul fata de doi, pe 4 biti, gama de reprezentare fiind -8 la +7, orice rezultat care<br />

depaseste gama va conduce la depasire.<br />

Depasirea superioara si depasirea inferioara. Aceste situatii apar la reprezentarea numerelor in<br />

virgula mobila, atunci cand rezultatul este mai mare sau mai mic decat cel mai mare sau cel mai<br />

mic numar care poate sa fie reprezentat in sistem. Pentru a preveni obtinerea unor rezultate<br />

false/eronate/pseudorezultate se elaboreaza tehnici prin care se semnalizeaza aparitia unor


asemenea situatii.<br />

Erori introduse la conversia numerelor din baza zece in baza doi. Aceste erori apar datorita<br />

faptului ca cele mai multe numere nu reprezinta multipli ai unor fractii binare. Situatia se intal-<br />

neste in mod frecvent la introducerea datelor in calculator. De regula, numarul rangurilor binare<br />

este destul de mare pentru a se putea reprezenta numarul necesar de cifre zecimale.<br />

Reprezentarea numerelor reale.<br />

Calculatoarele destinate calculelor stiintifice si ingineresti opereaza in principal cu numere<br />

reale. Se cunoaste ca multimea numerelor reale este convexa, adica in oricare interval, indife-<br />

rent de marimea sa, exista un numar infinit de valori reale. Intr-un calculator pot fi reprezentate<br />

precis valori discrete, dintr-o multime finita, deoarece fiecare informatie/data poate fi<br />

reprezentata numai printr-un numar fix de biti. Astfel, oricare reprezentare a unor numere reale,<br />

intr-un calculator, constituie o aproximare a valorilor exacte.<br />

Un aspect important se refera la faptul ca datele reale presupun in acelasi timp atat o gama mare<br />

de valori, cat si o anumita precizie.<br />

In principiu numerele reale se pot reprezenta in doua moduri: in virgula fixa si in virgula<br />

mobila.<br />

Reprezentarea in virgula fixa presupune un numar dat de ranguri pentru partea intreaga si pentru<br />

partea subunitara:<br />

X = xn-1 xn-2 … xi… x1 x0 , x-1 x-2 … x-i… x-m<br />

Desi prin aceasta reprezentare se poate asigura o precizie satisfacatoare, in multe cazuri<br />

(in functie de numarul de ranguri n + m ) apar dificultati importante in privinta gamei de<br />

reprezentare a datelor de intrare, a rezultatelor partiale si finale in cadrul unui program executat<br />

pe un calculator. Aceasta implica introducerea unor factori de scara, care sa asigure limitarea<br />

valorilor maxime la posibilitatile reale de reprezentare, in calculatorul dat.<br />

Reprezentarea in virgula mobila sau notatia stiintifica foloseste in principal doua campuri:unul<br />

pentru exponent (e) si altul pentru mantisa/parte subunitara/fractie (f). Astfel, numarul real X se<br />

poate scrie:<br />

X = f.r e<br />

unde r este baza, f - mantisa, iar e - exponentul.<br />

Baza se ia egala cu 2 sau o putere a acestuia (64).


Mantisa f se reprezinta ca un numar subunitar, normalizat afectat de semn ( | f | ≥1/2 , pentru a<br />

nu pierde din precizie); numarul de biti din mantisa asigura precizia de reprezentare.<br />

Exponentul stabileste gama de reprezentare; pentru simplificarea algoritmilor de efectuare a<br />

operatiilor aritmetice, in virgula mobila, se utilizeaza numai exponenti pozitivi (deplasati), prin<br />

adunarea unei cantitati date, astfel incat, cel mai mic exponent sa nu ia o valoare negativa (sa fie<br />

zero).<br />

Daca exponentul are k biti si mantisa m biti (exclusiv semnul s), numarul X se va putea<br />

reprezenta astfel:<br />

X = s ek-1ek-2 ….e0 f-1 f-2 …..e-m<br />

Semnul s, al mantisei, va fi plasat in rangul cel mai semnificativ al reprezentarii binare.<br />

Stabilirea formatului de reprezentare a numerelor reale, in virgula mobila, a constituit obiectul a<br />

numeroase studii, care s-au concretizat prin elaborarea unui standard (IEEE 754). Astfel, au<br />

fost alese doua formate standard:<br />

- formatul scurt sau de baza, pe un cuvant de 32 de biti, care asigura o viteza mai mare de<br />

operare;<br />

- formatul lung sau dublu de baza, pe un cuvant de 64 de biti, care asigura o precizie mai mare<br />

de lucru.<br />

In alegerea bazei s-a plecat de la observatia ca aceasta trebuie sa permita cea mai buna precizie<br />

posibila si pentru formatul scurt. S-a demonstrat ca o baza egala cu 2 asigura o precizie mai<br />

buna in cazul rotunjirii mantisei rezultatului unei operatii aritmetice, decat alte baze (4, 8, 16),<br />

cel putin cu un rang in raport cu baza 16.<br />

In privinta reprezentarii se considera ca folosirea codului direct ( semn si modul ) este<br />

superioara codului complementar.<br />

Daca lungimea cuvintului este fixata gama si precizia se influenteaza reciproc.<br />

O gama de 10 +/-75 este insuficienta, in timp ce o gama de 10 +/-300 corespunde cerintelor<br />

celor mai multe aplicatii. De aceea in cazul formatului scurt a fost sacrificata gama, intr-o<br />

oarecare masura, pentru a asigura o buna precizie.<br />

Daca se foloseste aceeasi unitate aritmetica, atat pentru operatiile in formatul scurt, cat si pentru<br />

operatiile in formatul lung, in primul caz nu se vor inregistra depasiri de tip superior sau<br />

inferior. De asemenea, se poate observa ca numarul de biti (52) din mantisa in formatul lung<br />

este mai mare decat dublul numarului de biti (2 × 24) ai mantisei in formatul scurt. Aceasta<br />

face ca la inmultirea in formatul scurt adunarea produselor partiale sa nu fie afectata de erori.


Formatul scurt ( simplu - de baza ).<br />

s e f<br />

0 1 8 9 31<br />

- bitul 0: s = semnul mantisei ( s = 1 - mantisa negativa );<br />

- bitii 1-8: e = exponentul deplasat ( deplasarea este 2 7 - 1 );<br />

- bitii 9-31: f = mantisa/fractia ( cand e ≠ 0, se presupune un<br />

bit egal cu 1, la stanga lui f; virgula se plaseaza intre acest bit si primul bit explicit al mantisei;<br />

valoare: numarul reprezentat intr-un format scurt este:<br />

( -1 ) s 2 e-(2↑7- 1) .( 1 + f ), cu conditia e ≠0.<br />

Valoarea/marimea numerelor reprezentate este in gama: -2 -126 .(1,0) pana la 2 127 .( 2 – 2 -23 ),<br />

ceea ce reprezinta aproximativ –1,8 × 10 -38 pana la 3,40 × 10 38<br />

Formatul lung ( dublu - de baza ).<br />

s e f<br />

0 1 1112 63<br />

- bitul 0: s = semnul mantisei ( s = 1 - mantisa negativa );<br />

- bitii 1-11: e = exponentul deplasat ( deplasarea este 2 10 - 1 );<br />

- bitii 12-63: f = mantisa/fractia ( cand e ≠ 0, se presupune un<br />

bit egal cu 1, la stanga lui f; virgula se plaseaza intre acest bit si primul bit explicit al mantisei;<br />

valoare: numarul reprezentat intr-un format lung este:<br />

( -1 ) s 2 e-(2↑10 - 1) .( 1 + f ), cu conditia e ≠0.<br />

Observatii <strong>privind</strong> formatele.<br />

1. Baza a fost aleasa din considerente de echilibrare a gamei, cu restrictia ca toate<br />

numerele mici sa aibe valori reciproce reprezentabile. Contrar altor practici, gama<br />

obtinuta este deplasata pentru a putea asigura depasirea inferioara (underflow),<br />

deoarece aceasta situatie se poate rezolva mai usor, prin hardware, decat depasirea<br />

superioara (overflow)


2. S-a constatat ca prezenta unui prim bit implicit, inaintea bitilor mantisei, asigura<br />

depasirea inferioara gradata. Mai jos se va arata cum au fost rezolvate aspectele<br />

mentionate la punctele 1 si 2.<br />

3. Cazuri speciale.<br />

3.1 In conditiile unui exponent egal cu zero s-a rezervat un camp pentru:<br />

- zero: toti bitii sunt zero;<br />

- date initializate: bitul de semn este unu, iar ceilalti biti sunt zero;<br />

- numere denormalizate: toate formatele de biti cu exponent zero si mantisa diferita<br />

de zero se interpreteaza ca numere denormalizate; in efectuarea operatiilor<br />

aritmetice bitul cel mai semnificativ este fortat la zero iar bitul implicit unu este<br />

adunat la exponent, ceea ce va permite implementarea gradata a depasirii<br />

inferioare.<br />

Valoarea denormalizata va fi: ( -1 ) s 2 1-(2↑7- 1) .( 0 + f )<br />

3.2 In conditiile unui exponent cu toti bitii egali cu unu s-a rezervat un camp pentru:<br />

- +∞: semnul este zero, iar celalti biti sunt unu;<br />

- -∞: toti bitii sunt unu:<br />

- nedefinit: semnul si mantisa sunt zero, iar exponentul este format din unitati;<br />

- alte situatii: celelalte combinatii sunt rezervate pentru utilizari inca nedefinite.<br />

Standardul IEEE 754 pentru reprezentarea numerelor in virgula mobila.<br />

Acest standard a fost acceptat de numerosi producatori de microprocesoare si de unitati centrale<br />

pentru minicalculatoare si calculatoare de capacitate medie-mare.<br />

In aceste conditii se vor putea transporta, fara dificultati majore, pachetele de programe<br />

stiintifice intre diferite tipuri de echipamente de calcul.<br />

A. Formate.<br />

Formatele prezentate mai sus fac parte din standardul IEEE 754. In plus standardul mai contine<br />

formatul extins cu formele scurta (simpla) si lunga (dubla), in care mantisa este prevazuta cu<br />

un bit j, pentru specificarea explicita a partii intregi, care in formatul de baza discutat a fost<br />

presupus implicit. In acest format se dau alte valori minime si maxime pentru exponenti si<br />

mantise, in raport cu formatul de baza.<br />

In cele ce urmeaza se prezinta in rezumat caracteristicele tuturor formatelor.


Formatul simplu - de baza.<br />

Acest format este organizat pe 32 de biti: 1 bit pentru semnul mantisei, 8 biti pentru exponent si<br />

32 de biti pentru mantisa.<br />

Valoarea V a numarului se calculeaza astfel:<br />

- daca e = 255 si f ≠ 0, atunci V = NaN ( nu este un numar -Not a Number - simbol<br />

codificat in format );<br />

- daca e = 255 si f = 0, atunci V = (-1) s .∞<br />

- daca 0 < e < 255, atunci V = (-1) s .2 e-127 .(1,f);<br />

- daca e = 0 si f ≠0, atunci V = (-1) s .2 -126 .(0,f);<br />

- daca e = 0 si f = 0, atunci V = (-1) s .0 (zero).<br />

Formatul dublu - de baza.<br />

Acest format este organizat pe 64 de biti: 1 bit pentru semnul mantisei, 11 biti pentru exponent<br />

si 52 de biti pentru mantisa.<br />

Valoarea V a numarului se determina dupa cum urmeaza:<br />

- daca e = 2047 si f ≠ 0, atunci V = NaN ( nu este un numar -Not a Number - simbol<br />

codificat in format );<br />

- daca e = 2047 si f = 0, atunci V = (-1) s .∞<br />

- daca 0 < e < 2047 atunci V = (-1) s .2 e-1023 .(1,f);<br />

- daca e = 0 si f ≠0, atunci V = (-1) s .2 -1022 .(0,f);<br />

- daca e = 0 si f = 0, atunci V = (-1) s .0 (zero).<br />

Formatul simplu - extins.<br />

Acest format este structurat astfel: 1 bit de semn, 1 bit pentru partea intreaga (j) a mantisei, cel<br />

putin 31 de biti pentru partea fractionara a mantisei (f) si un exponent ce poate lua<br />

valori cuprinse intre minimum m = -1022 si maximum M = 1023.<br />

Valoarea V a numarului se determina dupa cum urmeaza:<br />

- daca e = M si f ≠0, atunci V = NaN;<br />

- daca e = M si f = 0, atunci V = (-1) s .∞;<br />

- daca m < e < M, atunci V = (-1) s .2 e .(j,f);<br />

- daca e = m si j = f = 0, atunci V = (-1) s . 0 (zero);<br />

- daca e = m si j ≠ 0 sau f ≠ 0, atunci V = (-1) s .2 e* .(j,f);<br />

unde e* este egal cu m sau m + 1, selectat la implementare.


Formatul dublu extins.<br />

Acest format are caracteristici identice cu formatul simplu extins, cu exceptia ca exponentul ia<br />

valori intre m = -16382 si M =16383, avand cel putin 63 de biti pentru partea fractionara (f).<br />

B.Rotunjirea.<br />

Operatia de rotunjire trateaza numarul ca avand o precizie infinita si il modifica pentru a<br />

corespunde formatului destinatie.<br />

Schema hardware va emite un semnal pentru a arata daca rezultatul este corect sau incorect.<br />

Standardul IEEE 754 include atat un mecanism standard-implicit de rotunjire, cat si alte trei<br />

metode ce pot fi selectate de utilizator.<br />

Mecanismul standard rotunjeste numarul la cea mai apropiata valoare reprezentabila. Daca sunt<br />

posibile doua valori, formatul este rotunjit la valoarea para, care face ca eroarea de rotunjire<br />

sa fie egala cu jumatate din valoarea celui mai putin semnificativ bit.<br />

Celelalte trei mecanisme de rotunjire selectabile sunt urmatoarele:<br />

- rotunjirea catre +∞ asigura cea mai apropiata valoare dar nu mai mica decat a<br />

numarului dat;<br />

- rotunjirea catre -∞ furnizeaza cea mai apropiata valoare, dar nu mai mare decat<br />

numarul dat;<br />

- rotunjirea catre 0 ( trunchiere ) asigura valoarea cea mai apropiata, dar nu mai mare<br />

decat numarul dat in modul.<br />

Operatia de rotunjire se aplica formatului destinatie. In formatul dublu sau formatul extins<br />

standardul permite utilizatorului sa specifice daca rotunjirea trebuie sa se efectueze in formatul<br />

simplu - de baza. Aceasta permite ca pe o masina, care are numai formatul dublu de baza sau<br />

formatul extins, sa se emuleze si formatul simplu de baza.<br />

C. Valori speciale.<br />

Standardul de reprezentare in virgula mobila suporta aritmetica cu numere infinite folosind<br />

modalitatile afina si proiectiva, selectabile de utilizator.<br />

Modalitatea infinit-afina este definita prin relatia:<br />

-∞ < ( oricare numar finit ) < +∞


Modalitatea infinit-proiectiva compara intotdeauna numerele egale, indiferent de semn.<br />

Standardul defineste un set de operatii astfel incat folosirea unui operand infinit nu va conduce<br />

la un rezultat eronat; pentru detectarea unor asemenea cazuri nu sunt prevazute capcane. In<br />

calculele cu valori infinite toate exceptiile care se vor discuta in continuare raman valabile.<br />

NaN constituie o valoare speciala, introdusa pentru a semnaliza operatii invalide sau operatii<br />

care produc rezultate invalide cu o valoare speciala. Standardul defineste posibilitatile de utili-<br />

zare si neutilizare ale capcanelor pentru NaN. Folosirea capcanei asigura activarea unei exceptii,<br />

la efectuarea unei operatii cu un operand NaN. Neutilizarea capcanei conduce numai la<br />

pozitionarea indicatorilor corespunzatori de eroare (conditii).<br />

D. Operatii.<br />

In standard sunt definite operatiile aritmetice de baza: adunarea, scaderaea, inmultirea si<br />

impartirea; radacina patrata si gasirea restului la impartire; conversia formatului in: virgula mo-<br />

bila, numere intregi si numere zecimale codificate binar BCD ( cu exceptia numerelor BCD<br />

extinse EBCD ); compararea numerelor in virgula mobila.<br />

Operatia de comparare conduce la unele situatii particulare, cand se folosesc operanzi NaN sau<br />

cu valori infinite. Relatiile permise sunt: "mai mic decat", "egal cu", "mai mare decat" si<br />

"neordonat". Ultimul caz apare cand cel putin un operand este NaN si cand un numar infinit este<br />

comparat in modalitatea proiectiva cu un numar finit. Relatia "neordonat" afirma predicatele<br />

"neordonat" si "< >", negand insa pe toate celelalte. Atunci cand se testeaza daca un numar are<br />

valoarea NaN, nu va fi posibila verificarea intre o constanta NaN si un numar, deoarece relatia<br />

este intotdeauna "neordonat".<br />

E. Exceptii si capcane.<br />

Standardul IEEE754 defineste atat exceptiile, care trebuie detectate, cat si informatiile necesare<br />

elementului, care manipuleza capcana, pentru gasirea exceptiilor. Implementarea va asigura<br />

cate un indicator pentru fiecare tip de exceptie. Raspunsul standard la exceptie consta in<br />

continuarea operatiei, fara activarea capcanei.<br />

Operatie invalida. Acest tip de exceptie se incadreaza in doua clase: exceptii de operand<br />

invalid si rezultat invalid. In ambele cazuri, daca nu este activata o capcana, rezultatul va fi<br />

NaN.<br />

Exceptiile de operand sunt provocate de urmatoarele evenimente:<br />

- un operand este NaN, fara a se genera un semnal pentru capcana si fara a se activa<br />

capcana;


- se executa una din urmatoarele operatii:<br />

- (∞) + (∞) - ( modalitatea proiectiva ),<br />

- (∞) + (-∞) - ( modalitatea afina ),<br />

- (∞)/(∞), 0/0 si 0 × ∞;<br />

- in operatia xREMy, de aflare a restului la impartire, fie x este infinit, fie y este zero;<br />

- cand se incearca extragerea radacinii patrate dintr-un numar negativ;<br />

- la conversia de la formatul in virgula mobila la intreg sau BCD, cand conversia corecta<br />

conduce la o depasire, la o valoare infinita sau NaN;<br />

- la comparatiile ce folosesc predicatele sau negatiile lor, cand relatia este de<br />

"neordonare" si cand nici un operand nu este"neordonat".<br />

Exceptiile de rezultat invalid apar cand rezultatul unei operatii nu este corect in raport cu<br />

formatul destinatie.<br />

Alte exceptii. Exceptiile standard sunt urmatoarele:<br />

- impartire cu zero;<br />

- depasire superioara;<br />

- depasire inferioara;<br />

- rezultat inexact, atunci cand nu se genereaza alte exceptii si cand valoarea rotunjita<br />

pentru rezultat conduce la depasire superioara, fara a activa capcana.<br />

Parametrii pentru capcana. Capcanele, care corespund fiecarei exceptii pot fi<br />

activate/dezactivate de utilizator. Cand este activata, exceptia transfera controlul la o rutina<br />

pentru manipularea capcanei (furnizata de utilizator sau de catre sistem).<br />

O asemenea rutina trebuie sa primeasca urmatoarele informatii:<br />

- tipul exceptiei, care a aparut,<br />

- tipul operatiei, care s-a executat,<br />

- formatul destinatiei,<br />

- rezultatul corect rotunjit ( in cazul depasirii superioare/inferioare, rezultatului<br />

inexact/invalid), pe langa alte informatii referitoare la faptul ca rezultatul nu<br />

corespunde formatului destinatie,<br />

- valorile operandului, in cazurile impartirii cu zero si exceptiilor de operand invalid.


Standardul aritmetic.<br />

Scopul urmarit prin aritmetica in virgula mobila este acela de a pune la dispozitia utilizatorului<br />

un sistem convenabil de reprezentare a numerelor prin care se obtin rezultate precise ca urmare<br />

a efectuarii operatiilor aritmetice. D. Knuth a sugerat un model de aritmetica in virgula mobila,<br />

care permite obtinerea unor rezultate in virgula mobila foarte apropiate de rezultatul corect.<br />

Algoritmii propusi de Knuth conduc la implementari extrem de costisitoare si nu ofera solutii<br />

pentru cazul rezultatelor aflate exact intre doua numere in virgula mobila.<br />

In continuare se prezinta atat un set de reguli, care specifica toate cazurile, cat si algoritmii de<br />

implementare ai acestui set de reguli.<br />

Reguli.<br />

1. Multimea numerelor in virgula mobila trebuie sa contina 0 si 1 (identitati aditive si<br />

multiplicative), iar daca x apartine multimii atunci si -x va apartine multimii.<br />

2. Daca rezultatul corect al unei operatii in virgula mobila esteun numar in virgula mobila,<br />

atunci acel numar trebuie sa fie generat de operatia respectiva, in caz contrar rezultatul va fi<br />

rotunjit conform regulei 3.<br />

3. Daca rezultatul corect se afla exact la mijlocul intervalului dintre doua numere in virgula<br />

mobila, atunci aritmetica respectiva trebuie sa genereze numarul cu mantisa para.<br />

Regulile de mai sus ( regula de rotunjire poarta numele de "rotunjire la par" ) asigura maximum<br />

de precizie.<br />

In continuare vor fi ilustrate metodele de implementare ale operatiilor aritmetice in virgula<br />

mobila (adunare, scadere, inmultire si impartire), care utilizeaza "rotunjirea la par", in ve-<br />

derea obtinerii rezultatului final.<br />

Pentru exemplificare se va considera un acumulator cu urmatoarea structura, pentru efectuarea<br />

operatiilor aritmetice cu numere avand mantisa de patru biti:<br />

D F1 F2 F3 F4 G R ST<br />

cu urmatoarele notatii:<br />

- D: bitul de depasire,<br />

- F1 - F4: cei 4 biti ai mantisei,<br />

- G: Bitul de garda,<br />

- R: bitul de rotunjire,


- ST: bitul de legatura/lipitura, "stiky".<br />

Bitul ST este pozitionat in unu, daca in procesul de denormalizare are loc transferul unei unitati<br />

din bitul R spre dreapta. Daca ST este pozitionat in unu el va ramane in aceasta stare pe toata<br />

durata operatiilor. Toate deplasarile in acumulator implica bitii D, G, R si ST. Bitul ST nu este<br />

modificat de deplasarea la stinga. Deplasarea la dreapta introduce zero in bitul D.<br />

In algoritmii de mai jos se considera ca acumulatorul este initializat la zero si ca operanzii au<br />

fost verificati daca sunt invalizi sau egali cu zero. Astfel, se considera numai operanzii valizi,<br />

normalizati, diferiti de zero. De asemenea, se considera ca operatiile aritmetice, <strong>privind</strong><br />

exponentii pentru inmultire, imparire si ajustare prin deplasare, sunt evidente, fara a necesita<br />

detalieri, si ca semnul rezultatului este stabilit in mod corespunzator.<br />

Adunarea si scaderea in virgula mobila vor fi tratate impreuna, evidentiind doua cazuri:<br />

- adunarea modulelor, atunci cand se aduna numere cu acelasi semn sau cand se scad<br />

numere cu semne diferite;<br />

- scaderea modulelor, atunci cand se scad numere cu acelasi semn sau se aduna numere<br />

cu semne diferite.<br />

1.Adunarea modulelor.<br />

<strong>1.1.</strong>Denormalizarea: numarul cu exponent mai mic se incarca in acumulator si se deplaseaza<br />

cu un numar de pozitii spre dreapta, egal cu diferenta exponentilor. Daca exponentii sunt egali<br />

oricare dintre numere/operanzi poate fi incarcat in acumulator, fara a se efectua vreo deplasare.<br />

1.2.Adunarea: cel de-al doilea operand este adunat la acumulator.<br />

1.3.Normalizarea: daca s-a pozitionat in unu bitul D atunci se deplaseaza continutul<br />

acumulatorului cu un bit spre dreapta.<br />

1.4.Rotunjirea: se aduna 1 la pozitia G, dupa care, daca G = R = ST = 0, se forteaza F4 ← 0.<br />

1.5.Renormalizarea: daca D este pozitionat in unu se face deplasarea continutului<br />

acumulatorului spre dreapta.<br />

1.6.Depasirea: se verifica daca a avut loc o depasire a exponenului.<br />

2.Scadera modulelor.<br />

2.1.Denormalizarea: se incarca numarul cu modulul cel mai mic in acumulator si se deplaseaza<br />

la dreapta, daca este necesar. Rezultatul va fi zero daca si numai daca operanzii sunt egali, aban-<br />

donadu-se operatiile urmatoare.<br />

2.2.Scadearea: se scade continutul acumulatorului din celalalt operand, pastrand rezultatul in<br />

acumulator ( daca ST = 1 se va genera un imprumut );


2.3.Normalizarea: se deplaseaza acumulatorul la stanga pana cand F1 devine egal cu 1;<br />

2.4.Rotunjirea: se aduna 1 la bitul G si apoi, daca G = R = 0 si ST = 0, se forteaza F4 ← 0; nu<br />

este necesara rotunjirea daca pentru normalizare au fost necesare mai multe deplasari la stanga;<br />

2.5.Renormalizarea: in cazul in care rotunjirea a condus la depasire, se efectueaza o<br />

deplasare spre dreapta.<br />

Inmultirea.<br />

In algoritmul pentru inmultirea in virgula mobila se considera prezente resursele hardware<br />

necesare pentru a forma produsul la doua numere in lungime dubla. In caz contrar se poate<br />

folosi algoritmul "aduna si deplaseaza la dreapta" in acumulator, pentru a forma produsul,<br />

incepand cu rangul inferior. In continuare partea mai putin semnificativa este pierduta pe masura<br />

ce este deplasata in afara bitului ST.<br />

1.Inmultirea: se formeaza produsul in lungime dubla;<br />

2.Normalizarea: pentru o eventuala normalizare a produsului se face o deplasare cu un bit;<br />

3.Pozitionarea bitilor G, R, ST: fie produsul normalizat in lungime dubla:<br />

F1 F2 F3 F4 F5 F6 F7 F8<br />

atunci G = F5, R = F6, ST = F7 ∪ F8.<br />

4.Rotunjirea: se realizeaza dupa cum s-a aratat mai sus;<br />

5.Renormalizarea: se realizeaza dupa cum s-a aratat mai sus;<br />

6.Erori: se verifica depasirea superioara/inferioara a expnentului.<br />

Impartirea.<br />

Se considera ca, in procesul efectuarii impartirii, restul este disponibil in orice moment.<br />

1.Impartirea: se formeaza primii sase biti ai catului normalizat:<br />

F1 F2 F3 F4 F5 F6<br />

2.Pozitionarea bitilor G, R, ST: se forteaza:<br />

G = F5, R = F6 si ST = rest;<br />

3.Rotunjirea: se efectueaza dupa regulile mentionate mai sus;<br />

4.Renormalizarea: se efectueaza dupa regulile mentionate mai sus.<br />

Prezenta bitului ST permite implementarea rotunjirii directionate, adica la dreapta sau la stanga<br />

pe un numar standard de biti.<br />

In algoritmii de mai sus s-a cautat obtinerea unei precizii maxime cu pretul reducerii vitezei,<br />

intr-o oarecare masura.


Erori in reprezentarea numerelor in virgula mobila.<br />

Precizia finita introduce erori, care pot sau nu pot sa fie acceptabile pentru aplicatia data. Spre<br />

exemplu, se considera reprezentarea unui milion, in virgula mobila, dupa care se scade 1, din<br />

aceasta. In cazul in care eroarea este mai mare decat 1, restul va fi tot de 1 milion.<br />

Pentru a caracteriza eroarea, gama si precizia, se vor face urmatoarele notatii:<br />

b – baza;<br />

f - numarul rangurilor semnificative ale mantisei/fractiei, in baza data;<br />

E - cel mai mare exponent;<br />

e - cel mai mic exponent.<br />

Numarul rangurilor semnificative din fractie este diferit de numarul de biti in cazul in care baza<br />

este diferita de 2. De exemplu, o baza egala cu 16 foloseste 4 biti pentru fiecare rang. Daca baza<br />

este de forma 2 k (o putere a lui 2), atunci sunt necesari k biti pentru fiecare rang exprimat in<br />

baza data. Utilizarea lui 1 ascuns mareste f cu 1 bit, chiar daca nu conduce la cresterea<br />

numarului de numere reprezentabile.<br />

In cadrul analizei reprezentarii in virgula mobila intereseaza urmatoarele aspecte:<br />

- numarul numerelor reprezentabile;<br />

- numarul care are valoarea/marimea cea mai mare;<br />

- numarul diferit de zero, care are valoare/marimea cea mai mica;<br />

- dimensiunea celei mai mari distante intre doua numere succesive;<br />

- dimensiunea celei mai mici distante intre doua numere succesive.<br />

Numarul numerelor reprezentabile se poate calcula luand in considerare numarul de valori pe<br />

care le pot lua campurile distincte ale reprezentarii in virgula mobila:<br />

- semnul poate lua doua valori;<br />

- numarul de exponenti este dat de expresia: ((M – m) + 1);<br />

- primul rang al fractiei: b-1;<br />

- celelalte ranguri ale fractiei: b f-1 ;<br />

- zero.<br />

Astfel, se obtine urmatoarea expresie:<br />

2 × ((M – m) + 1) × (b-1) × b f-1 + 1<br />

Trebuie aratat ca, in cazul exponentului, nu toate combinatiile de biti sunt valide. Spre exemplu,<br />

in standardul IEEE 754, desi sunt rezervati 8 biti pentru exponent, cel mai mic exponent este<br />

-126 si nu –128. Exponentii interzisi sunt folositi pentru reprezentari speciale: zero si infinit.


Se vor considera, in continuare, numarul care are valoarea/marimea cea mai mare si numarul<br />

diferit de zero, care are valoare/marimea cea mai mica;<br />

Numarul cu marimea cea mai mica are, de asemenea, cel mai mic exponent b m si cea mai mica<br />

fractie normalizata (diferita de zero), care va fi egala cu b -1 . Astfel, numarul cel mai mic va fi:<br />

b m-1 . In mod similar numarul cel mai mare va avea cel mai mare exponent b M si cea mai mare<br />

fractie (1 - b -f ), ceea ce conduce la valoarea b M . (1 - b -f ).<br />

Cea mai mica distanta si cea mai mare distanta intre doua numere consecutive sunt calculate<br />

intr-o maniera similara. Cea mai mica distanta apare atunci cand exponentul are cea mai mica<br />

valoare b m si cand se modifica cel mai putin bit semnificativ al fractiei, b -f . Aceasta conduce la o<br />

valoare minima a distantei egala cu b m-f . Cea mai mare distanta apare atunci cand exponentul are<br />

cea mai mare valoare b M si cand se modifica cel mai putin bit semnificativ al fractiei,b - f .<br />

Aceasta conduce la o valoare minima a distantei egala cu b M-f .<br />

Se va considera un exemplu, de reprezentare in virgula mobila, in care exista un bit de semn, un<br />

exponent pe 2 biti in exces 2, o fractie pe 3 biti normalizat, fara 1 ascuns. Reprezentarea lui zero<br />

este 000000. In figura de mai jos este data reprezentarea in acest format:<br />

Observatii:<br />

- au aparut distante mari intre zero si primele numere reprezentabile, deoarece<br />

reprezentarea normalizata nu permite structuri de biti in mantisa, care sa corespunda<br />

acestor distante;<br />

- cel mai mic exponent este –2 si cea mai mica fractie normalizata este (0,100)2, ceea ce<br />

face ca modulul celui mai mic numar reprezentabil, diferit de zero, sa fie 1/8.<br />

- cel mai mare exponent este 2 1 , iar cea mai mare fractie este (1 – 2 -3 ), ceea ce conduce<br />

la o valoare de 7/4 pentru cel mai mare numar reprezentabil;<br />

- cel mai mic exponent este –2, iar valoarea celui mai putin semnificativ bit al fractiei<br />

este 2 -3 , conducand la o valoare minima a distantei intre doua numere consecutive<br />

egala cu 2 -5 , adica 1/32;


- cel mai mare exponent este 1, iar valoarea celui mai putin semnificativ bit al fractiei<br />

este 2 -3 , conducand la o valoare maxima a distantei intre doua numere consecutive<br />

egala cu 2 -2 , adica 1/4;<br />

- datorita normalizarii numarul reprezentarilor valide este mai mic decat numarul<br />

reprezentarilor posibile;<br />

- numarul reprezentabile este dat de expresia:<br />

2 × ((M – m) + 1) × (b-1) × b f-1 + 1 = 2 × ((1 – (- 2) + 1) × (2-1) × 2 3-1 + 1= 33.<br />

- erorile relative sunt aproximativ aceleasi, comparand rapoartele intre distantele<br />

minime/maxime, intre doua numere consecutive, si valorile maxime ale celor mai<br />

mici/mari numere reprezentabile:<br />

( b m-f ) / (b × (1 - b -f ))= 1/( b f -1), pentru numerele mici<br />

distanta valoarea maxima pentru numarul cu exponent minim<br />

( b M-f ) / (b M × (1 - b -f ))= 1/( b f -1), pentru numerele mari<br />

distanta cel mai mare numar<br />

Observatie: Standardul IEEE 754 utilizeaza numere denormalizate pentru a umple distanta intre<br />

numerele plasate in apropierea zeroului.<br />

Exemplu. Sa se reprezinte in virgula fixa numarul (0,9375)10. Convertit in binar, in virgula fixa,<br />

acest numar va avea urmatoarea forma: (0,0011)2. Valoarea sa exprimata in virgula mobila va fi:<br />

1,1 × 2 -4 .<br />

Studiu de caz <strong>privind</strong> pierderea de precizie la conversia de la intregi la virgula mobila.<br />

In timpul razboiului din Golf, 1991-1992, s-au utilizat baterii de rachete Patriot, pentru<br />

urmarirea si distrugerea rachetelor irakiene Scud. Bateriile, prevazute cu radare si tehnica de<br />

calcul operau numai cateva ore, pentru a se evita detectarea lor. In 5 februarie, 1991, baracile<br />

armatei SUA, de la Dhahran au fost atacate cu rachete, inregistrandu-se 28 de morti, datorita<br />

unor erori in partea de prelucrare a datelor de la sistemele radar.<br />

Tintele sunt urmarite de radar, stabilindu-se, pe baza parametrilor calculati, pozitia viitoare a<br />

acesteia. Astfel, se genereaza o “poarta” in care se considera a fi plasata tinta, ceea ce va permite<br />

eliminarea altor zgomote, din afara “portii”.


Predictia urmatoarei pozitii a rachetei Scud se calcula pe baza vitezei acesteia. Viteza este<br />

determinata prin modificarea pozitiei in raport cu timpul. Timpul in sistemul Patriot este<br />

actualizat de catre ceasul intern la intervale de 100 ms. Viteza este reprezentata in virgula<br />

mobila pe 24 de biti, iar timpul ca un intreg pe 24 de biti. Pentru a calcula noua pozitie, timpul si<br />

viteza trebuie sa fie reprezentate in virgula mobila, pe 24 de biti. Conversia de la intreg la<br />

virgula mobila, pentru timp, s-a facut cu erori, care cresc proportional cu timpul de operare al<br />

sistemului. Astfel, poarta pentru noua pozitie a fost calculata eronat, eroarea depinzand de viteza<br />

rachetei si de durata de timp de cand sistemul era operational. In acea zi Patriot opera de peste<br />

100 de ore, eroarea stabilirii portii fiind de 687 metri, ceea ce a condus la pierderea tintei.<br />

Situatia fusese semnalata cu doua saptamani anterior de catre israelieni. Software-ul a fost<br />

modificat, a fost transmis pe campul de lupta, dar nu fusese instalat. O solutie simpla, pe<br />

moment, ar fi constat in “reboot-area” a sistemului, la intervale de cateva ore, pentru<br />

eliminarea erorilor acumulate la conversia timpului.


Coduri alfanumerice<br />

Spre deosebire de numerele reale, care au o gama infinita, numarul caracterelor alfanumerice<br />

este limitat, ceea ce permite ca un intreg set de caractere sa fie codificat cu un numar redus de<br />

biti pe caracter. In practica se utilizeaza doua sisteme de codificarea a caracterelor alfa<br />

numerice: ASCII ( American Standard Code for Information Interchange) si EBCDIC<br />

(Extended Binary Coded Decimal Interchange Code)<br />

Codul ASCII.<br />

Acest cod, utilizat pentru reprezentarea carcterelor alfanumerice, utilizeaza 7 biti pe caracter.<br />

Toate cele 2 7 coduri posibile reprezentand caractere valide. In tabela de mai jos se prezinta in<br />

hexazecimal codurile ASCII alfanumerice.<br />

Caracterele din pozitiile 00 – 1F si 7F, sunt caractere de control utilizate pentru transmisie,<br />

controlul afisaii/tiparirii, cat si pentru alte scopuri. Toate celelalte caractere sunt afisabile si<br />

incluzand: literele, cifrele, semnele de punctuatie si spatiul. Cifrele 0 – 9 apar in secventa ca si<br />

literele mici si mari, ceea ce simplifica manipularea caracterelor. Pentru a transforma<br />

reprezentarea alfanumerica a unei cifre zecimale in valoarea sa numerica este suficient sa se<br />

scada (30)16 din ea. Pentru a transforma codul unei majuscule in codul corespunzator al literei<br />

mici se va aduna la primul (20)16.


Codul EBCDIC.<br />

Codul ASCII permite reprezentarea a 128 de caractere, ceea ce reprezinta o limitare pentru cele<br />

mai multe tastaturi moderne. Aceste tastaturi contin, pe langa tastele alfanumerice si taste<br />

dedicate unor caractere speciale. Codul EBCDIC este un cod pe 8 biti utilizat de catre IBM. In<br />

tabelul de mai jos se prezinta, in codificare hexazecimala codurile EBCDIC.<br />

Adesea codul ASCII, pe 7 biti, este reprezentat pe un octet, avand 0 sau 1 in bitul cel mai<br />

semnificativ, care este folosit drept bit de paritate. Aceasta nu este de natura sa favorizeze codul<br />

ASCII in raport cu codul EBCDIC. In schimb, la transmisia seriala a datelor codurile pe 8 biti<br />

necesita mai mult timp, decat cele pe 7 biti.


Coduri detectoare de erori.<br />

Datele stocate, transmise si prelucrate in cadrul sistemelor numerice sunt reprezentate sub forma<br />

unor succesiuni de unitati si zerouri. Reprezentarea lor fizica se realizeaza prin niveluri ale unor<br />

tensiuni electrice, care pot fi afectate de diverse zgomote, avand cauze diferite. Zgomotele pot<br />

modifica unii biti din 0 in 1 si invers, ceea ce conduce la distorsionarea informatiei, la erori. Pe<br />

baza unui model statistic al erorilor este posibila crearea unei astfel de reprezentari a datelor<br />

incat sa fie posibile, atat detectarea, cat si corectarea erorilor.<br />

Daca se considera codul ASCII, in care sunt utilizate toate posibilitatile de codificare ale<br />

caracterelor, oricare modificare a unui bit intr-un cod al unui caracter dat va conduce la codul<br />

valid al altui caracter. Aceasta observatie sta la baza introducerii redundantei, sub forma unor<br />

biti suplimentari, ceea ce va permite detectarea si corectarea erorilor.<br />

Detectarea si corectarea erorilor.<br />

Distanta Hamming defineste distanta logica intre doua coduri de caractere valide si este<br />

masurata prin numarul de biti prin care difera acestea. Pentru codul ASCII aceasta distanta este<br />

egala cu 1. Adugand un singur bit redundant, la codul ASCII al fiecarui caracter alfanumeric, se<br />

poate detecta o singura eroare, intrucat codul eronat se va plasa intre doua coduri valide ASCII.<br />

O metoda de recodificare a codului ASCII, pentru a obtine o distanta Hamming egala cu 2,<br />

consta in introducerea unui bit de paritate, plasat la stanga codului normal ASCII. Acest bit va fi<br />

calculat pe baza sumei modulo 2 a bitilor egali cu 1 din codul ASCII. In cazul conventiei de<br />

paritate para, bitul de paritate va fi egal cu rezultatul sumei modulo 2, amintita mai sus, iar in<br />

cazul paritatii impare acesta va fi egal cu valoarea negata a acesteia.<br />

P 2 6 2 5 2 4 2 3 2 2 2 1 2 0 Caracterul<br />

1 1 1 0 0 1 0 0 d<br />

0 1 1 0 0 1 0 1 e<br />

0 1 1 0 0 1 1 0 f<br />

1 1 1 0 0 1 1 1 g<br />

0 1 0 0 0 1 0 0 D<br />

Bit de paritate Codul ASCII


In aceste conditii tabela codurilor ASCII, cu bit de paritate, va avea 256 de intrari/coduri, dintre<br />

care jumatate vor fi invalide. In cazul receptionarii unui caracter invalid se poate cere<br />

retransmisia, ceea ce in multe situatii nu este convenabil. O solutie ar fi aceea prin care se poate<br />

detecta si corecta aparitia unei reori. In acest scop trebuie sa se mareasca numarul bitilor<br />

redundanti din codul ASCII.<br />

Pentru detectarea si corectarea unei erori in cadrul fiecarei pozitii a unui cod ASCII, fiecarui<br />

cod valid ASCII trebuie sa i se asocieze alte 7 coduri invalide, in care se va modifica exact un<br />

singur bit. Acest lucru trebuie sa se intample cu fiecare cod valid ASCII, iar codurile invalide<br />

asociate fiecarui cod valid trebuie sa fie diferite. Spre exemplu codului ASCII valid pentru<br />

caracterul d i se vor asocia codurile invalide de mai jos:<br />

11001100 cod valid pentru d<br />

01001100<br />

10001100<br />

11101100<br />

11011100 coduri invalide pentru d<br />

11000100<br />

11001010<br />

11001101<br />

Problema se pune in legatura cu numarul necesar al bitilor redundanti. Pentru un cod de k biti,<br />

se considera ca numarul bitilor redundanti egal cu r. Pentru fiecare cele 2 k cuvinte initiale exista<br />

caractere de k biti, in care cate un bit este modificat, la care se adauga caracterele de r biti, cu<br />

cate un bit modificat plus caracterul nemodificat. Astfel, vor exista 2 k x (k + r + 1) coduri in<br />

total. Pentru a suporta toate aceste coduri trebuie sa fie suficiente combunatii de k + r biti.<br />

Relatia care trebuie indeplinita este data mai jos:<br />

2 k × (k + r + 1) ≤ 2 k+ r sau<br />

(k + r + 1) ≤ 2 r<br />

In cazul k = 7, daca se cauta intregul r care satisface relatia de mai sus, rezulta r = 4, ceea ce<br />

conduce la un cod ASCII, prevazut cu caractere redundante, de 7 + 4 = 11 biti.<br />

Asignarea celor 4 biti redundanti la cuvintele originale se va face astfel incat sa poata fi<br />

identificata o eroare la un singur bit. Fiecarui bit din cuvantul codificat, incluzand bitii de<br />

verificare/redundanti, ii este asignata o combinatie data de biti de verificare C8 C4 C2 C1.


Combinatiile sunt calculate, in figura de mai jos, ca reprezentari binare ale pozitiilor bitilor care<br />

sunt verificati, incepand cu pozitia 1. C1 este in pozitia de bit1, C2 in pozitia de bit 2, C4 in<br />

pozitia 4 samd. Plasarea lor in pozitii corespunzatoare puterilor lui 2 faciliteaza procesul de<br />

localizare a erorii. Acest mod particular de amplasare poarta numele de Cod de Corectare a unei<br />

Erori Singulare (CCES) sau SEC (Single Error Correcting)<br />

C8 C4 C2 C1 Bit verificat<br />

0 0 0 0 1<br />

0 0 0 1 2<br />

0 0 1 0 3<br />

0 0 1 1 4<br />

0 1 0 0 5<br />

0 1 0 1 6<br />

0 1 1 0 7<br />

0 1 1 1 8<br />

1 0 0 0 9<br />

1 0 0 1 10<br />

1 0 1 0 11<br />

Intrucat pozitiile unitatilor sunt unice in fiecare combinatie a bitilor de verificare, o eroare se<br />

poate localiza prin observarea bitilor redundanti eronati. Pentru exemplificare se considera codul<br />

ASCII al caracterului ‘a’<br />

Pozitia bitilor Bitii de verificare<br />

Valorile bitilor de verificare se stabilesc conform tabelului de mai sus. Bitul de verificare C1= 0<br />

realizeaza paritatea para pentru grupul de biti {1, 3, 5, 7, 9, 11}. Membrii acestui grup sunt luati<br />

din pozitiile, care au 1 in coloana lui C1, din tabela de mai sus. Bitul de verificare C2 = 0<br />

furnizeaza paritatea para pentru grupul de biti {2, 3, 6, 7, 10, 11}. In mod similar bitul de<br />

verificare C4 = 0 asigura paritatea para pentru grupul de biti {4, 5, 6, 7}. In final C8 = 0 stabileste<br />

paritatea para pentru grupul de biti {8, 9, 10, 11}. O posibilitate de cautare in tabela membrilor<br />

grupului de paritate, consta in aceea ca bitul n al cuvantului codificat este verificat prin bitii din


pozitiile 1,….,i a caror suma este egala cu n. De exemplu bitul 7 este verificat de bitii din<br />

pozitiile 1, 2, 4, deoarece 1+ 2 + 4 = 7.<br />

Se considera ca receptorul primeste sirul de biti 10010111001, in conditiile CCES pentru<br />

ASCII. Ce caracter a fost transmis?<br />

Se vor calcula paritatile pentru fiecare din bitii de verificare<br />

Bit eronat<br />

Paritate<br />

C1 verifica biti bitii{1, 3, 5, 7, 9, 11} para<br />

C2 verifica biti bitii{2, 3, 6, 7, 10, 11} impara<br />

C4 verifica biti bitii{4, 5, 6, 7} para<br />

C8 verifica biti bitii{8, 9, 10, 11} impara<br />

Pentru a localiza eroarea, se vor aduna pozitiile bitilor de verificare cu paritate impara:<br />

1 + 4 = 5. Astfel cuvantul care a fost transmis este: 10010101001. Daca se inlatura bitii de<br />

verificare, se va obtine codul ASCII al caracterului’D’.<br />

Schema de detectare si corectare a unei erori poate fi vizualizata pe un hipercub, in varfurile<br />

caruia sunt plasate codurile valide si invalide. Distanta Hamming separa codurile valide, in timp<br />

ce un cod invalid esteplasat la o distanta mai mica de un cod valid, ceea ce faciliteaza detectarea<br />

si corectarea erorii.<br />

In cazul aparitiei a doua erori, schema de mai sus permite detectarea lor, fara a oferi<br />

posibilitatea de a le corecta. In cazul a doua erori, care ar putea fi corectate, distanta minima<br />

Hamming trebuie sa fie egala cu 5.<br />

In general, pentru a detecta p erori distanta Hamming minima trebuie sa fie p + 1, iar o distanta<br />

Hamming de 2p + 1 permite corectarea a p erori<br />

Verificare prin redundanta verticala.<br />

Schema prezentata mai sus s-a referit la detectarea si corectarea unei erori singulare intr-un<br />

caracter individual. Aceasta mai poarta numele de verificarea redundanta<br />

orizontala/longitudinala (VRO).


O alternativa o reprezinta verificarea redundanta verticala/longitudinala (VRV) in cadrul<br />

careia, la sfarsitul unui grup de cuvinte transmise, se adauga o suma de control. In acest caz,<br />

paritatea este calculata pe coloane, suma de control fiind atasata, in final, la mesaj. La receptie,<br />

se calculaeaza din nou suma de contro, care se compara cu cea receptionata. Daca apare o eroare<br />

se solicita retransmiterea mesajului intrucat nu exista suficienta redundanta pentru identificarea<br />

pozitiei unei erori. Tehnicile VRO si VRV se pot utiliza pentru a imbunatati verificarea aparitiei<br />

unor erori.<br />

In unele cazuri erorile apar in rafala, modificand mai multi biti consecutivi, atat pe linii, cat si<br />

pe coloane, in cadrul unui mesaj. Pentu asemenea situatii se recomanda o schema mai puternica<br />

de verificare denumita Verificare Redundanta Ciclica (VRC sau CRC - Cyclic Redundancy<br />

Checking). VRC reprezinta o varianta a VRV.<br />

Problema. Sa se calculeze numarul necesar de biti de verificare pentru corectarea unei erori<br />

duble in codul ASCII.<br />

Solutie. In codul ASCII sunt folositi, pentru fiecare caracter, k = 7 biti, la care se vor mai<br />

adauga r biti redundanti de verificare. Pentru fiecare dintre cele 2 k caractere ASCII vor exista<br />

(k+ r) caractere eronate la nivelul unui bit si [(k+ r)( k+ r-1)]/2 caractere eronate la nivelul a doi<br />

biti, la care se mai adauga caracterul corect. Numarul caracterelor codificate cu (k+ r) biti este<br />

egal cu 2 (k+ r) . In aceste conditii trebuie sa se indeplineasca conditia de mai jos:<br />

2 k (k+ r)<br />

x { (k+ r) + [(k+ r)( k+ r-1)]/2 +1 }≤ 2<br />

Inlocuind k cu valoarea sa 7, rezulta ca valoarea cea mai mica pentru r, care satisface relatia de<br />

mai sus este r = 7.<br />

Intrucat, pentru corectarea a p erori trebuie pastrata o distanta Hamming egala cu 2p + 1, rezulta<br />

ca in acest caz, unde p = 2, distanta va fi egala cu 5. In cazul in care se mentine aceeasi distanta<br />

si pentru detectarea a erorilor, cunoscand ca distanta Hamming este egala cu numarul erorilor<br />

detectate p + 1, rezulta ca numarul erorilor detectate este egal cu 4.


Probleme.<br />

x


x) SEC inseamna Single Error Correcting


2.2.Inmultirea.<br />

Inmultirea numerelor consta in generarea si adunarea produselor partiale obtinute prin<br />

inmultirea rangului curent al inmultitorului cu deinmultitul. In cazul numerelor binare, produsul<br />

partial curent este egal cu deinmultitul, deplasat spre stanga conform pozitiei rangului<br />

inmultitorului, daca bitul curent al inmultitorului este unu, sau egal cu zero, daca bitul curent al<br />

inmultitorului este zero. Daca produsul partial curent este diferit de zero, el se aduna la suma<br />

produselor partiale anterioare.<br />

Exista si posibilitatea ca, dupa fiecare adunare, suma produselor partiale sa fie deplasata spre<br />

dreapta cu un rang.<br />

1.2.1 Inmultirea in cod direct.<br />

Inmultirea in cod direct/semn si modul presupune tratarea separata a semnelor si inmultirea<br />

modulelor.<br />

Fie numerele X si Y,<br />

X ≡ xn-1 xn-2… ………………. x1 x0,<br />

Y ≡ yn-1 yn-2… ………………. y1 y0,<br />

care urmeaza sa fie inmultite, pentru a furniza produsul Z:<br />

Z ≡ z2n-2 z2n-3… ……………z1 z0.<br />

Semnul produsului z2n-1 va fi obtinut astfel:<br />

z2n-2 = xn-1 ⊕ yn-1.<br />

Produsele partiale: P0,… ….,Pn-3, Pn-2 se obtin dupa cum urmeaza:<br />

P0 = |x| . y0. 2 0<br />

P1 = |x| . y1. 2 1<br />

… ……………….<br />

Pn-2 = |x| . yn-2. 2 n-2<br />

iar suma lor va conduce la produsul modulelor:<br />

z2n-3… ……………z1 z0<br />

Fie cazul a doua numere reprezentate in cod direct pe 5 biti:<br />

- deinmultitul x = 11000 si<br />

- inmultitorul y = 01000<br />

Pentru semn rezulta: z8 = 1 ⊕ 0 = 1,<br />

in timp ce modulul produsului se va obtine dupa cum se arata mai jos:


1000<br />

× 1001<br />

1000<br />

0000<br />

0000<br />

1000<br />

01001000<br />

z7… ……z1 z0 = 01001000.<br />

Astfel, produsul celor doua numere va avea 9 biti:<br />

z8 z7… ……z1 z0 = 101001000.<br />

In exemplul de mai sus produsele partiale s-au obtinut prin deplasarea spre stanga a<br />

deinmultitului, inmultit cu rangul corespunzator al inmultitorului.<br />

Solutie paralela.<br />

O implementare combinationala presupune utilizarea sumatoarelor complete si a unor porti<br />

AND. Astfel, se obtine un sumator modificat, pentru un rang, conform schemei de mai jos:<br />

SPi,j-1<br />

Yj<br />

Xi<br />

1<br />

2<br />

a) Sumator modificat b) Schema bloc a sumatorului modificat<br />

x3 0 x2 0 x1 0 x0 0 y0<br />

sumator<br />

modificat<br />

sumator<br />

modificat<br />

sumator<br />

modificat<br />

x3 x2 SP0,3 x1 SP0,2 x0 SP0,1 SP0,0 y1<br />

sumator<br />

modificat<br />

3<br />

1<br />

2<br />

3<br />

CI<br />

A0<br />

B0<br />

sumator<br />

modificat<br />

Cj Cj<br />

Z0<br />

CO<br />

4 SPi,j Sumator SPi,j<br />

Yj modificat<br />

5<br />

Xi<br />

sumator<br />

modificat<br />

SPi,j-1<br />

Ci+1 Ci+1<br />

sumator<br />

modificat<br />

SP1,4 SP1,3 SP1,2 SP1,1 SP1,0<br />

z4 z3 z2 z1 z0<br />

0<br />

sumator<br />

modificat<br />

0


S-a notat cu SPi,j bitul i al sumei produselor partiale j. Schema prezinta numai primele doua<br />

etaje ale dispozitivului paralel de inmultire.<br />

Sumatorul modificat poate fi utilizat in cadrul unei structuri de inmultire paralela, ca in figura de<br />

mai sus. Din punctul de vedere al implementarii algoritmului, se poate afirma ca, in acest caz,<br />

este vorba de o “programare spatiala”, care conduce la viteza ridicata de operare. Solutia<br />

necesita, pentru implementare, (n-1) 2 sumatoare modificate. In cel mai defavorabil caz,<br />

rezultatul inmultirii se obtine dupa propagarea semnalelor prin 4.(n – 1) porti.<br />

Se lasa pe seama cititorului elaborarea unei solutii bazate pe “sumatoare cu salvare a<br />

transportului” si sumatoare cu transport anticipat.<br />

Solutie seria l- paralela.<br />

In scopul reducerii cantitatii de hardware, dispozitivele de inmultire se realizeaza sub forma<br />

unei structuri paralele hardware, pentru un pas de inmultire, cu operare secventiala.<br />

Daca se noteaza produsul partial j cu ppj, atunci un pas de inmultire va avea urmatoarea forma:<br />

ppj = ppj-1 + x . yj. 2 j<br />

O schema bloc, pentru solutia mentionata mai sus, este prezentata in continuare:<br />

0<br />

x3 x2 x1 x0<br />

… ………<br />

… ………<br />

Operarea se efectueaza conform urmatoarei secvente:<br />

yj<br />

registru de deplasare dreapta cu 2.(n-1) ranguri<br />

in care se acumuleaza sumele produselor partiale.<br />

1. anuleaza continutul registrului in care se acumuleaza sumele produselor partiale;<br />

2. initializeaza numarul rangului bitului inmultitorului j = 0;<br />

3. formeaza produsul partial x . yj.<br />

Generator de produse partiale<br />

Sumator pe n biti<br />

… ……. … ……………<br />

4. aduna produsul partial la jumatatea superioara a registrului sumei produselor partiale;


5. efectueaza j = j + 1 si daca j = n treci la 8.<br />

6. deplaseaza la dreapta cu un rang continutul registrului sumei produselor partiale;<br />

7. treci la pasul 3;<br />

8. produsul cu 2.(n –1) ranguri s-a obtinut in registrul de deplasare.<br />

Rezultatul se poate stoca fie sub forma unui singur cuvant, pastrand jumatatea superioara, fie<br />

sub forma unui cuvant dublu. In primul caz va fi afectata precizia.<br />

Inmultirea numerelor in cod complementar.<br />

Intrucat, in marea majoritate a cazurilor, numerele negative se reprezinta in calculatoare in codul<br />

complementar, in continuare, vor fi examinate cateva metode de inmultire in acest cod.<br />

Mai intai se vor examina deplasarile aritmetice la stanga si la dreapta in cod complementar.<br />

Se considera urmatoarele cazuri:<br />

1. x > 0.<br />

[x]c = 0 xn-2… ………………. x1 x0,<br />

Deplasarea la stanga:<br />

[2.x]c = xn-2… ………………. x1 x00,<br />

Deplasarea la dreapta:<br />

[2 -1 .x]c = 00xn-2… ………………. x1,<br />

2. x < 0.<br />

~ ~ ~<br />

[x]c = 1xn-2… ………………. x1 x0,<br />

Deplasarea la stanga:<br />

~ ~<br />

[2.x]c = xn-2… ………………. x1 0,<br />

Deplasarea la dreapta:<br />

~ ~<br />

[2 -1 .x]c = 11xn-2… ………………. x1.<br />

Cateva metode pentru inmultirea numerelor reprezentate in cod complementar.<br />

Metoda 1.<br />

- Se modifica , daca este cazul, inmultitorul si deinmultitul astfel incat inmultitorul sa fie<br />

pozitiv.<br />

- Produsele partiale se calculeaza in mod obisnuit.


- Deplasarea spre stanga/ dreapta a deinmultitului/sumei produselor partiale se realizeaza<br />

conform regulilor de deplasare in cod complementar.<br />

Metoda 2.<br />

Aceasta metoda presupune inmultirea numerelor cu semn in maniera obisnuita, ca si cand ar fi<br />

vorba de numere intregi fara semn. Rezultatul va fi corect numai in cazul in care cei doi<br />

operanzi sunt pozitivi. In caz contrar sunt necesare corectii, care se incadreaza in trei cazuri.<br />

1. x > 0, y > 0.<br />

[x]c . [y]c = |x| . |y| = [x . y]c<br />

2. x < 0, y > 0; [x]c = 2 n - |x|; [y]c = |y|;<br />

[x]c . [y]c = 2 n .|y| - |x| . |y|; rezultat incorect<br />

[x]c . [y]c = 2 2n - |x| . |y|; rezultat corect<br />

Rezulta necesitatea unei corectii egala cu: 2 2n - 2 n .|y|, care se va aduna la rezultatul incorect.<br />

3. x > 0, y < 0; [x]c = |x|; [y]c = 2 n - |y|;<br />

[x]c . [y]c = 2 n .|x| - |x| . |y|; rezultat incorect<br />

[x]c . [y]c = 2 2n - |x| . |y|; rezultat corect<br />

Rezulta necesitatea unei corectii egala cu: 2 2n - 2 n .|x|, care se va aduna la rezultatul incorect.<br />

4. x < 0, y < 0; [x]c = 2 n - |x|; [y]c = 2 n - |y|;<br />

[x]c . [y]c = 2 2n - 2 n .|y| - 2 n .|x| + |x| . |y|; rezultat incorect<br />

[x]c . [y]c = |x| . |y|; rezultat corect<br />

Rezulta necesitatea unei corectii egala cu: -2 2n + 2 n .|y| + 2 n .|x|, care se va aduna la rezultatul<br />

incorect.<br />

Metoda este greoaie si are un caracter pur teoretic.<br />

Metoda 3. Algoritmul lui Booth.<br />

In acest caz se pleaca de la observatia ca, valoarea unui numar Y, reprezentat in cod<br />

complementar, se poate calcula astfel:<br />

Y = - yn-1 . 2 n-1 + yn-2 . 2 n-2 + yn-3 . 2 n-3 +… ……+ y1 . 2 1 + y0. 2 0 =<br />

unde:<br />

n-1<br />

= S (yi-1 - yi) .2 i<br />

i=0<br />

- yn-1 reprezinta rangul de semn, codificat cu 0/1 in cazul numerelor pozitive/negative;<br />

- y-1 constituie rangul aflat la dreapta rangului 0, avand initial valoarea 0.<br />

In aceste conditii valoarea produsului X.Y se va exprima dupa cum urmeaza:


n-1<br />

X.Y = S x. (yi-1 - yi) .2 i<br />

i=0<br />

Pe baza formulei de mai sus se poate calcula produsul partial de rang i :<br />

yi-1 yi produsul partial.<br />

0 0 0<br />

0 1 - x .2 i<br />

1 0 x .2 i<br />

1 1 0<br />

Pentru implementarea hardware se considera resursele corespunzatoare unei structuri orientate<br />

pe un singur acumulator:<br />

Deinmultit (X) Inmultitor (Y)<br />

RD RD<br />

Resursele hardware:<br />

n-1 .. RD.. 0 n-1 .. AC.. 0 n-1 .. MQ.. 0 MQq<br />

0 1 0/1<br />

MUX 0/1<br />

- AC – registrul acumulator;<br />

- RD – registrul de date al memoriei;<br />

activare<br />

selectare<br />

- MQ – registru de extensie al acumulatorului;<br />

- MQq – registru de un bit, extensia lui MQ;<br />

- CNT – contor de cicluri ( ρCNT = ⎡log2n⎤ );<br />

Sumator 0/1 CNT<br />

SL


- SL – structura logica pentru activarea si selectarea intrarilor multiplexorului, cat si pentru<br />

controlul transportului la sumator;<br />

- Sumator- sumator combinational cu n ranguri binare.<br />

Descrierea operarii dispozitivului se poate face cu ajutorul urmatoarei organigrame:<br />

MQ ← AC; AC ← n T 0<br />

0,1 MQ0,MQq 0,0; 1,1<br />

AC←ADD(AC,RD)<br />

Start<br />

RD ← Deinmultit<br />

AC ← Inmultitor<br />

CNT ← ⎡log2n⎤ T n<br />

MQ ← n T 0<br />

MQq ← 0<br />

AC←SUB(AC,RD)<br />

CNT←DEC(CNT)<br />

CNT = 0 ?<br />

NU<br />

AC,MQ,MQq← AC0, AC,MQ<br />

DA<br />

Z = AC,MQ(n-1:1)<br />

Stop


Programul AHPL:<br />

MODULE: Dispozitiv_de_inmultire<br />

MEMORY: RD[n]; AC[n]; MQ[n]; MQq; CNT[⎡log2n⎤]<br />

INPUTS: X[n]; Y[n]<br />

OUTPUTS: Z[2n-1]<br />

// se considera operanzii X si Y adusi in RD si AC<br />

1. MQ ← AC; MQq ← 0; CNT ← ⎡log2n⎤ T n<br />

2. AC ← n T 0<br />

3. → (MQ0 MQq , MQ0 MQq , MQ0 MQq , MQ0 MQq)/(6, 4, 5, 6)<br />

4. AC←ADD(AC,RD)<br />

→ (6)<br />

5 AC←SUB(AC,RD)<br />

6 CNT←DEC(CNT)<br />

7 → ( ∪/CNT, ∪/CNT )/(9,8)<br />

8 AC,MQ,MQq← AC0, AC,MQ<br />

→ (3)<br />

9 ENDSEQ<br />

Z = AC,MQ(n-1:1)<br />

END<br />

In continuare se va prezenta un program Verilog pentru simularea unui dispozitiv de inmultire.<br />

//Simularea unui dispozitiv de inmultire a numerelor reprezentate in complementul fata de doi,<br />

//folosind Algoritmul lui Booth<br />

module inmultitorb;<br />

parameter n=8;<br />

reg [n-1:0] RD,AC,MQ;<br />

reg [2*n-1:0] Z;<br />

reg [2:0] CNT;<br />

reg MQq;<br />

initial begin: init<br />

AC=-7;RD=-5;MQ=0;MQq=0;CNT=n-1;<br />

$display("timp RD AC MQ MQq CNT");


$monitor("%0d %b %b %b %b %b",$time,RD,AC,MQ,MQq,CNT);<br />

wait (CNT==0)<br />

end<br />

begin<br />

$monitor("Produs= %b",{AC[n-1],AC,MQ[n-1:1]});<br />

#1 $stop;<br />

end<br />

always<br />

begin<br />

#1; MQ=AC;<br />

#1; AC=0;<br />

while(CNT>0)<br />

begin<br />

case({MQ[0],MQq})<br />

2'b00:begin<br />

#1;{AC,MQ,MQq}={AC[n-1],AC,MQ};<br />

end<br />

2'b01:<br />

begin<br />

#1;AC=AC+RD;<br />

#1;{AC,MQ,MQq}={AC[n-1],AC,MQ};<br />

end<br />

2'b10:<br />

begin<br />

#1;AC=AC-RD;<br />

#1;{AC,MQ,MQq}={AC[n-1],AC,MQ};<br />

end<br />

2'b11:<br />

begin<br />

#1;{AC,MQ,MQq}={AC[n-1],AC,MQ};<br />

end<br />

endcase


#1;CNT=CNT-1;<br />

end<br />

end<br />

endmodule<br />

Veriwell -k C:\Program Files\VeriWell\exe\VeriWell.key -l C:\Program<br />

Files\VeriWell\exe\VeriWell.log inmultitorb.V<br />

VeriWell for Win32 HDL Tue Dec 19 16:26:21 2000<br />

This is a free version of the VeriWell for Win32 Simulator<br />

Distribute this freely; call 1-800-VERIWELL for ordering information<br />

See the file "!readme.1st" for more information.<br />

Copyright (c) 1993-96 Wellspring Solutions, Inc.<br />

All rights reserved<br />

Memory Available: 0<br />

Entering Phase I...<br />

Compiling source file : inmultitorb.V<br />

The size of this model is [3%, 2%] of the capacity of the free version<br />

Entering Phase II...<br />

Entering Phase III...<br />

No errors in compilation<br />

Top-level modules:<br />

inmultitorb<br />

//Cazul: RD = 5; AC = 7;<br />

timp RD AC MQ MQq CNT<br />

0 000101 00000111 00000000 0 111<br />

1 00000101 00000111 00000111 0 111<br />

2 00000101 00000000 00000111 0 111<br />

3 00000101 11111011 00000111 0 111<br />

4 00000101 11111101 10000011 1 111<br />

5 00000101 11111101 10000011 1 110<br />

6 00000101 11111110 11000001 1 110<br />

7 00000101 11111110 11000001 1 101<br />

8 00000101 11111111 01100000 1 101<br />

9 00000101 11111111 01100000 1 100<br />

10 00000101 00000100 01100000 1 100<br />

11 00000101 00000010 00110000 0 100<br />

12 00000101 00000010 00110000 0 011<br />

13 00000101 00000001 00011000 0 011<br />

14 00000101 00000001 00011000 0 010<br />

15 00000101 00000000 10001100 0 010


16 00000101 00000000 10001100 0 001<br />

17 00000101 00000000 01000110 0 001<br />

Produs= 0000000000100011<br />

Stop at simulation time 19<br />

C1> $finish;<br />

Top-level modules:<br />

inmultitorb<br />

// Cazul: RD = 5; AC = -7;<br />

timp RD AC MQ MQq CNT<br />

0 00000101 11111001 00000000 0 111<br />

1 00000101 11111001 11111001 0 111<br />

2 00000101 00000000 11111001 0 111<br />

3 00000101 11111011 11111001 0 111<br />

4 00000101 11111101 11111100 1 111<br />

5 00000101 11111101 11111100 1 110<br />

6 00000101 00000010 11111100 1 110<br />

7 00000101 00000001 01111110 0 110<br />

8 00000101 00000001 01111110 0 101<br />

9 00000101 00000000 10111111 0 101<br />

10 00000101 00000000 10111111 0 100<br />

11 00000101 11111011 10111111 0 100<br />

12 00000101 11111101 11011111 1 100<br />

13 00000101 11111101 11011111 1 011<br />

14 00000101 11111110 11101111 1 011<br />

15 00000101 11111110 11101111 1 010<br />

16 00000101 11111111 01110111 1 010<br />

17 00000101 11111111 01110111 1 001<br />

18 00000101 11111111 10111011 1 001<br />

Produs= 1111111111011101<br />

Stop at simulation time 20<br />

C1> $finish;<br />

// Cazul: RD = -5; AC = -7;<br />

timp RD AC MQ MQq CNT<br />

0 11111011 11111001 00000000 0 111<br />

1 11111011 11111001 11111001 0 111<br />

2 11111011 00000000 11111001 0 111<br />

3 11111011 00000101 11111001 0 111<br />

4 11111011 00000010 11111100 1 111<br />

5 11111011 00000010 11111100 1 110<br />

6 11111011 11111101 11111100 1 110<br />

7 11111011 11111110 11111110 0 110<br />

8 11111011 11111110 11111110 0 101<br />

9 11111011 11111111 01111111 0 101


10 11111011 11111111 01111111 0 100<br />

11 11111011 00000100 01111111 0 100<br />

12 11111011 00000010 00111111 1 100<br />

13 11111011 00000010 00111111 1 011<br />

14 11111011 00000001 00011111 1 011<br />

15 11111011 00000001 00011111 1 010<br />

16 11111011 00000000 10001111 1 010<br />

17 11111011 00000000 10001111 1 001<br />

18 11111011 00000000 01000111 1 001<br />

Produs= 0000000000100011<br />

Stop at simulation time 20<br />

C1><br />

2.3.Impartirea.<br />

Ca regula generala, impartirea numerelor se realizeaza prin scaderea repetata a impartitorului,<br />

deplasat spre dreapta cu un rang, din restul de la scaderea precedenta, pana la obtinerea unui rest<br />

egal cu zero sau mai mic decat impartitorul; ca prim rest se considera deimpartitul.<br />

In general se practica doua metode:<br />

- metoda bazata pe refacerea ultimului rest pozitiv (metoda cu restaurare) si<br />

- metoda in care nu se reface ultimul rest pozitiv (metoda fara restaurare).<br />

Pentru prima metoda se prezinta exemplul urmator, in care deimpartitul este 22, iar impartitorul<br />

este 9:<br />

22 : 9 = q0, q-1q-2<br />

22 40 40<br />

- 9 - 9 - 9<br />

13 31 31<br />

- 9 - 9 - 9<br />

4 22 22<br />

- 9 - 9 - 9<br />

- 5 13 13<br />

q0 = 2 - 9 - 9<br />

22 : 9 = 2,44…<br />

4 4<br />

- 9 - 9<br />

- 5 - 5<br />

q-1 = 4 q-2 = 4


Cea de-a doua metoda pleaca de la ideea ca, in loc de a scadea impartitorul deplasat la dreapta<br />

cu un rang, din ultimul rest pozitiv, se va aduna impartitorul deplasat la dreapt, la la ultimul rest<br />

negativ. Metoda se va ilustra prin exemplul de mai jos:<br />

22 : 9 = q0, q-1q-2<br />

22 -50 40<br />

- 9 + 9 - 9<br />

13 - 41 31<br />

- 9 + 9 - 9<br />

4 - 32 22<br />

- 9 + 9 - 9<br />

- 5 - 23 13<br />

q0 = 3 + 9 - 9<br />

- 14 4<br />

+ 9 - 9<br />

- 5 - 5<br />

+ 9<br />

4<br />

q-1 = 6 q-2 =<br />

Catul va avea forma: 3, 6 5 6 5 6… … , in care termenii cu bara sunt negativi [3, (-6)5(-6)5(-6)],<br />

ceea ce va impune efectuarea unei corectii care va aduce rezultatul la forma:<br />

22 : 9 = 2,44444…<br />

Multima metoda necesita un numar mai mare de pasi, astfel incat, in continuare se va examina<br />

implementarea metodei bazata pe restaurarea ultimului rest pozitiv.<br />

Algoritmul impartirii numerelor reprezentate in complementul fata de doi, cu restaurarea<br />

ultimului rest pozitiv.<br />

Pentru ilustrarea algoritmului se vor considera urmatoarele resurse hardware:<br />

- AC – acumulator;<br />

- RD – registrul de date al memoriei;<br />

- MQ – registrul de extensie a acumulatorului;


- CNT – registru incrementator, contor de cicluri.<br />

Impartitorul Y va fi incarcat in RD, iar deimpartitul X in AC. In MQ se va acumula catul.<br />

n-1| RD |0 n-1| AC |0 n-1| MQ |0 CNT<br />

Descrierea algoritmului:<br />

1. Se deplaseaza continutul lui RD cu p ranguri spre stanga, in conditiile in care 2 p este prima<br />

incercare de multiplu binar al impartitorului.<br />

Se verifica daca RD = 0, in caz afirmativ operatia se termina cu semnalizarea unei erori.<br />

Daca RD ≠ 0, se incarca CNT cu vectorul binar avand valoarea p .<br />

2. Daca deimpartitul si impartitorul au semne identice/diferite se scade/se aduna impartitorul<br />

din/la deimpartit, pentru a obtine restul.<br />

3. a) Daca restul si deimpartitul au semne identice sau restul este egal cu zero, se introduce o<br />

unitate in bitul cel mai putin semnificativ a lui MQ, iar restul va lua locul deimpartitului.<br />

b) Daca restul si deimpartitul au semne diferite si restul curent nu este zero, se introduce un<br />

zero in bitul cel mai putin semnificativ al lui MQ, fara a mai modifica deimpartitul.<br />

4. Se deplaseaza continutul registrului imparitorului cu un rang spre dreapta, extinzand rangul<br />

de semn.<br />

Se decrementeaza CNT.<br />

Se deplaseaza MQ spre stanga cu un bit.<br />

5. Se repeta pasii 2- 4 pana cand continutul lui CNT devine egal cu zero.<br />

6. Daca deimpartitul si impartitorul au avut semne identice rezultatul se afal in registrul MQ. In<br />

cazul in care semnele celor doi operanzi au fost diferite, rezultatul se obtine prin<br />

complementarea continutului registrului MQ.<br />

Realizarea practica a algoritmului impune introducerea unor resurse hardware suplimentare,<br />

fata de AC, RD, MQ, CNT si anume:<br />

- R[n] – registrul in care se obtine restul curent;<br />

- z[1] – bistabil in care se stocheaza informatia (1/0) referitoare la semnele identice/diferite<br />

ale celor doi operanzi;<br />

- e[1] – bistabil care semnalizeaza conditia de eroare/non-eroare (1/0);<br />

- S – unitate logica combinationala, care genereaza semnalul de sfarsit al operatiilor de<br />

deplasare spre stanga in registrul RD;


S = RDn-1 .RDn-2 . RDn-3 ∪ RDn-1 .RDn-2<br />

- F- unitate logica combinationala, care calculeaza identitatea/neidentitatea semnelor<br />

operanzilor;<br />

F = ACn-1 ⊕ RDn-1<br />

- V – unitate logica combinationala, care verifica semnele operanzilor din acumulator<br />

(deimpartit) si din registrul restului curent R;<br />

V = ACn-1 ⊕ Rn-1<br />

- U – unitate logica combinationala, care verifica existenta unui rest curent egal cu zero;<br />

U = ∪ ⁄ R.<br />

Structura generala, la nivel de schema bloc, a dispozitivului de impartire:<br />

n-1| AC |0 n-1| n-2| n-3| RD |0<br />

z<br />

n-1| ADD |0<br />

n-1| R |0 CNT<br />

V U<br />

n-1| MQ |0<br />

F<br />

e<br />

Deplasare stanga<br />

RD RD<br />

MUX<br />

S<br />

S


Programul AHPL pentru dispozitivul de impartire.<br />

MODULE: Dispozitiv_de_impartire<br />

MEMORY: RD[n]; AC[n]; MQ[n]; R[n]; CNT[ ⎡log2n⎤ ]; z[1]; e[1]<br />

INPUTS: X[n]; Y[n]<br />

OUTPUTS: Z[n]<br />

// se considera operanzii X si Y adusi in AC si RD.<br />

1. MQ ← n T 0; CNT ← ⎡log2n⎤ T 0; Z ← 0; e ← 0<br />

→ ( ∪/RD)/(12) // eroare<br />

2. → (S)/(4)<br />

3. RD ← RDn-2:0, 0; CNT←INC(CNT)<br />

→ (2)<br />

4. z ← F<br />

5. R ← (ADD(AC,RD) ! SUB(AC,RD)) * ( F, F )<br />

6. → ( V ∪ U )/(8)<br />

7. MQ ← MQn-2:0, 0<br />

→ (9)<br />

8. MQ ← MQn-2:0, 1<br />

9. → ( ∪/CNT)/(11)<br />

10. RD ← RDn-1,RDn-1:1 ; CNT←DCR(CNT)<br />

→ (5)<br />

11. MQ← (MQ ! ADD(MQ,1)) * ( z, z )<br />

12. e ← ( 0 ! 1) * (∪/RD, ∪/RD)<br />

ENDSEQ<br />

END<br />

Z = MQ


3. Operatii aritmetice in virgula mobila.<br />

Operatiile aritmetice in virgula mobila vor fi examinate la nivelurile schemei bloc, pentru<br />

unitatea aritmetica, si organigramelor pentru adunare/scadere si inmultire. In analiza care<br />

urmeaza se considera operanzii de intrare X ,Y si rezultatul Z, care vor avea urmatoarele<br />

formate:<br />

X ← xs, XE, XF ; Y ← ys, YE, YF; Z ← zs, ZE, ZF<br />

3.1. Schema bloc a unitatii aritmetice in virgula mobila.<br />

Schema bloc a unitatii aritmetice in virgula mobila, in cazul de fata, se bazeaza pe structura<br />

schemei unitatii aritmetice in virgula fixa, la care s-au mai adaugat o serie de resurse, pentru<br />

manipularea exponentilor (registre si unitate aritmetica).<br />

Prelucrari mantise/fractii<br />

RE2 RE1<br />

…<br />

Conditii<br />

… ..<br />

Conditii<br />

UALE<br />

Partea care prelucreaza exponentii contine urmatoarele resurse:<br />

ees Prelucrare<br />

RD AC MQ<br />

es<br />

DEP. LOGICA DEP. LOGICA<br />

UAL<br />

exponenti


- E1 si RE2 - registre pentru exponenti;<br />

- ees- bistabil de extensie a registrului exponentului la stanga;<br />

- UALE- Unitate Aritmetica Logica pentru Exponenti.<br />

In partea care prelucreaza mantisele/fractiile, fata de resursele hardware pentru prelucrarea in<br />

virgula fixa au mai aparut doua circuite de deplasare logica si un bistabil de extensie a<br />

acumulatorului la stanga es.<br />

Cele doua unitati aritmetice logice sunt prevazute cu circuite logice pentru generarea<br />

indicatorilor de conditii si de eroare.<br />

Operanzii de prelucrat se afla initial in registrele AC si RD. Din acestea se extrag exponentii<br />

(operatia de despachetare), care sunt incarcati in RE1 si RE2. Fractiile sunt deplasate spre stanga<br />

in AC si RD, pentru a beneficia de o precizie maxima.<br />

Dupa terminarea operatiilor asupra exponentilor si fractiilor, are loc o insertie (operatia de<br />

impachetare) a exponentului rezultatului in registrul AC, prin deplasarea fractiei din AC spre<br />

dreapta.


3.2 Organigrama adunarii/scaderii in virgula mobila.<br />

> <<br />

=<br />

Da Da<br />

Dif exp> dim F<br />

Dif exp> dim F<br />

Nu Nu<br />

Iesire Iesire<br />

Iesire<br />

Z←X<br />

Da Da<br />

Exponent<br />

maxim?<br />

Pozitioneaza<br />

eof<br />

Deplaseaza YE<br />

Pozitioneaza semn, deplaseaza<br />

fractia, incrementeaza<br />

exponent<br />

Da<br />

Pozitioneaza<br />

zero curat<br />

⊥ZE←⊥XE-⊥YE<br />

Nu<br />

Da<br />

⊥ZE: 0<br />

Nu<br />

Nu<br />

Exponent<br />

minim?<br />

Da<br />

ZE←⊥XE-⊥YE<br />

Deplaseaza XE<br />

ZE←XE ZE←YE<br />

Aduna<br />

fractiile<br />

Depasire<br />

superioara?<br />

Suma zero?<br />

Normalizat?<br />

Iesire Iesire<br />

Nu<br />

Z←Y<br />

Deplaseaza fractia,<br />

decrementeaza exponent<br />

Pozitioneaza<br />

euf


3.3. Organigrama inmultirii in virgula mobila.<br />

Pozitioneaza<br />

zero curat<br />

Da<br />

Da<br />

Nu iesire cu<br />

Da<br />

Nu<br />

Iesire<br />

Operand<br />

zero?<br />

Aduna exponentii<br />

Exp eof?<br />

Exp euf?<br />

Restaureaza exponentul<br />

deplasat<br />

Valoarea absoluta<br />

a fractieilor<br />

Inmulteste fractiile<br />

Pozitioneaza<br />

semnul produsului<br />

Da eroare<br />

Da<br />

Pozitioneaza eof<br />

Pozitioneaza euf<br />

Prod


Intarzierile in circuitele numerice.<br />

• Tehnologia CMOS - tehnologia de baza.<br />

• CMOS: Semiconductor Metal Oxid Complementar.<br />

- Tranzistor NMOS (Semiconductor Metal Oxid de tip N)<br />

- Tranzistor PMOS (Semiconductor Metal Oxid de tip P)<br />

• Tranzistorul NMOS<br />

- Tranzistorul conduce daca la poarta lui se aplica<br />

un potential electric ridicat (Vdd)<br />

- Tranzistorul este blocat daca la poarta lui se aplica<br />

un potential electric coborat (GND)<br />

• Tranzistorul PMOS<br />

- Tranzistorul este blocat daca la poarta lui se aplica<br />

un potential electric ridicat (Vdd)<br />

- Tranzistorul conduce daca la poarta lui se aplica<br />

un potential electric coborat (GND)<br />

• Componentele de baza: Inversorul CMOS


• Componentele de baza: Portile logice<br />

• Porti logice: comparatie.<br />

a) Daca tranzistoarele PMOS sunt rapide:<br />

- Se recomanda conectarea lor in serie<br />

- Se prefera poarta NOR<br />

- Se prefera, de asemenea, NOR daca tranzitia H→L este mai critica<br />

decat tranzitia L→H.<br />

b) Daca tranzistoarele NMOS sunt rapide:<br />

- Se recomanda conectarea lor in serie<br />

- Se prefera poarta NAND<br />

- Se prefera, de asemenea, NAND daca tranzitia L→H este mai critica<br />

decat tranzitia H→L.<br />

• Comportarile ideala si reala.<br />

a) Cand intrarea 0 → 1, iesirea 1 → 0, dar NU instantaneu.<br />

- Iesirea efectueaza tranzitia 1 → 0 : tensiunea de iesire tranziteaza de<br />

la Vdd (5V) la 0V.<br />

b) Cand intrarea 1 → 0, iesirea 0 → 1 dar NU instantaneu.<br />

- Iesirea efectueaza tranzitia 0 → 1 : tensiunea de iesire tranziteaza de<br />

la 0V la Vdd (5V).<br />

c) Tensiunea nu se modifica instantaneu.


• Analogia temporala cu fluidul.<br />

- Apa ↔ Sarcina Electrica; Capacitatea Rezervorului ↔ Capacitatea (C).<br />

- Nivelul Apei ↔Tensiunea; Debitul Apei ↔ Curentul (Sarcina/Timp).<br />

- Dimensiunea Conductelor; Conductanta Tranzistoarelor (G).<br />

- Timpul de umplere a rezervorului este proportional cu C/G.<br />

• Conectarea in serie a portilor.<br />

- Intarzierea Totala de propagare =<br />

Suma Intarzierilor Individuale = d1 + d2<br />

- Capacitatea C1 are doua componente:<br />

� Capacitatea firelor care leaga cele doua porti<br />

� Capacitatea de intrare a celui de-al doilea inversor.


• Calculul intarzierilor.<br />

- Suma intarzierior pe caile seriale<br />

- Intarzierea (Vin → V2) ≠ Intarzierea (Vin → V3)<br />

� Intarzierea (Vin → V2) = Intarzierea (Vin → V1) + Intarzierea (V1 → V2)<br />

� Intarzierea (Vin → V3) = Intarzierea (Vin → V1) + Intarzierea (V1 → V3)<br />

- Drumul Critic = Calea cea mai lunga dintre cele N cai paralele<br />

- C1 = Capacitatea C a firelor + Cin a portii G2 + Cin a portii G3<br />

• Modelul general al intarzierii in circuitele combinationale.<br />

- O Celula Logica Combinationala (simbol) este complet specificata prin:<br />

� Comportarea functionala (intrare →iesire):<br />

Tabele de adevar, ecuatii logice, VHDL, Verilog etc.<br />

� Factorul de incarcare pentru fiecare intrare.<br />

� Intarziere critica in propagarea de la fiecare intrare la fiecare iesire, pentru<br />

fiecare tranzitie:<br />

THL (A,O) = Intarzierea interna fixa + Intarzierea dependenta de sarcina × sarcina<br />

- Modelul liniar


• Caracterizarea unei porti.<br />

- Capacitatea de intrare pentru fiecare intrare.<br />

- Pentru fiecare cale intrare-iesire se considera,<br />

� pentru fiecare tip de tranzitie: H → L, L → H, H → Z, L → Z …etc:<br />

o Intarzierea interna (ns)<br />

o Intarzierea dependenta de sarcina (ns/fF)<br />

- Exemplu: Poarta NAND cu 2 Intrari<br />

• Exemplu: Multiplexor 2:1.<br />

- Sarcina capacitiva de Intrare (1 S.I.):<br />

� A,B: S.I. (NAND) = 61 fF<br />

� S: S.I. (INV) + S.I. (NAND) = 50 fF + 61 fF = 111 fF<br />

- Intarzierea Dependenta de Sarcina (I.D.S.): identica cu cea a portii G3:<br />

� TAYlhf = 0,0021 ns/fF TAYhlf = 0,0020 ns/fF<br />

� TBYlhf = 0,0021 ns/fF TBYhlf = 0,0020 ns/fF<br />

� TSYlhf = 0,0021 ns/fF TSYhlf = 0,0020 ns/fF<br />

- Intarzierea Interna (I.I.):<br />

� A la Y: I.I.G1 + (C.Fir1 + S.I.G3)*I.D.S.G1 + I.I.G3<br />

� B la Y: I.I.G2 + (C.Fir2 + S.I.G3)*I.D.S.G2 + I.I.G3<br />

� S la Y (cazul cel mai defavorabil): I.I.Inv + (C.Fir0 +<br />

S.I.G1)*I.D.S.Inv + I.I.A la Y<br />

- Efectul “C.Fir1” se poate aproxima prin:<br />

� presupunerea ca Fir1 are o capacitate egala cu capacitatile C ale<br />

portilor conectate la el<br />

- Exemplu de calcul al I.I.:<br />

� TAYlh = TPhl G1 +(2.0*61 fF) * TPhlf G1 + TPlh G3<br />

= 0.1ns + 122 fF*0,0020 ns/fF + 0,5 ns = 0,844 ns


• Abstractie: Multiplexor 2:1.<br />

- Sarcina de Intrare: A = 61 fF, B = 61 fF, S = 111 fF<br />

- Intarzierea dependenta de sarcina:<br />

� TAYlhf = 0,0021 ns/fF TAYhlf = 0,0020 ns/fF<br />

� TBYlhf = 0,0021 ns/fF TBYhlf = 0,0020 ns/fF<br />

� TSYlhf = 0,0021 ns/fF TSYhlf = 0,0020 ns/fF<br />

- Intarzierea Interna:<br />

� TAYlh = TPhl G1 +(2.0*61 fF) * TPhlf G1 + TPlh G3<br />

= 0.1ns + 122 fF*0,0020 ns/fF + 0,5 ns = 0,844 ns<br />

- Exercitii: Sa se calculeze: TAYhl, TBYlh, TSYlh, TAYhl.<br />

• Elemente logice utilizate in cadrul cursului.<br />

- NAND2, NAND3, NAND4<br />

- NOR2, NOR3, NOR4<br />

- INV1 (inversor normal)<br />

- INV4 (inversor cu capacitate mare de comanda)<br />

- XOR2<br />

- XNOR2<br />

- MUX (Multiplexoare rapide)<br />

- Sursa de alimentare (Sursa pentru unitati)<br />

- GND (Sursa de zerouri)<br />

- Bistabile de tip D comandate pe front negativ de ceas<br />

• Modelul de Sincronizare (Timing) pentru elementele cu memorie.<br />

- Setup Time (Timp de Stabilire): Intrarea trebuie sa fie stabila inaintea<br />

frontului negativ al semnalului de ceas ceas.<br />

- Hold Time (Timp de Mentinere): Intrarea trebuie sa ramana stabila dupa<br />

frontul negativ al semnalului de ceas.


- Clock-to-Q Time (Timpul Ceas-la-Q):<br />

� Iesirea nu se poate modifica instantaneu la frontul semnalului de ceas<br />

� Ca si la portile logice exista doua componente ale intarzierii:<br />

o Intarzierea Interna Clk-to-Q<br />

o Intarzierea dependenta de sarcina Clk-to-Q.<br />

� Pentru exemplificare se considera Setup = 1ns, Hold = 0,5ns.<br />

• Metodologia de Sincronizare (Clocking).<br />

- Toate elementele de memorare sunt sincronizate cu acelasi semnal de ceas.<br />

- In ceea ce priveste blocurile logice combinationale:<br />

� Toate intrarile sunt actualizate la fiecare semnal de ceas<br />

� Toate iesirile trebuie sa fie stabile inaintea sosirii urmatorului semnal<br />

de ceas.<br />

• Drumul Critic si Perioada/Ciclul Ceasului.<br />

- Drumul Critic: Calea cea mai lenta intre doua elemente de memorare.<br />

- Perioada/Ciclul Ceasului este o functie de drumul critic si trebuie sa fie<br />

mai mare decat:<br />

Clk-to-Q + Intarzierea corespunzatoare Drumului Critic prin<br />

Circuitul Combinational + Setup


• Efectul Alunecarii (Skew) Ceasului asupra Ciclului.<br />

- Scenariul cel mai defavorabil pentru Ciclu:<br />

� Registrul de intrare foloseste CLK1<br />

� Registrul de iesire foloseste CLK2<br />

- Ciclul – Alunecarea Ceasului ≥ Clk-to-Q + Intarzierea cea mai mare +<br />

+ Setup<br />

⇒ Ciclul ≥ Clk-to-Q + Intarzierea cea mai mare + Setup +<br />

+ Alunecarea Ceasului<br />

• Metode pentru reducerea Ciclului.<br />

- Reducerea numarului de niveluri logice:<br />

- Folosirea metodelor dinamice de sincronizare.<br />

- Examinarea Incarcarii:<br />

� O poarta nu trebuie sa comande mai multe porti.<br />

� Trebuie evitata comanda unui fir lung de catre o poarta de mici<br />

dimensiuni<br />

- Folosirea mai multor etaje pentru comanda sarcinilor capacitive mari.


• Evitarea violarii timpului Hold.<br />

- Cerinta pentru Timpul Hold:<br />

� Intrarea registrului nu trebuie sa se schimbeimediat dupa modificarea<br />

ceasului.<br />

- Aceasta se poate realiza usor in schemele de sincronizare pe fronturi de<br />

ceas.<br />

- Timpul Hold, pentru cele mai multe bistabile, este ≤ 0 ns.<br />

- CLK-to-Q + Intarzierea pe Calea cea mai scurta > Timpul Hold.<br />

• Efectul Alunecarii Ceasului asupra Timpului Hold.<br />

- Scenariul cel mai defavorabil pentru Timpul Hold:<br />

� Registrul de Intrare (FF1) este sincronizat cu CLK2<br />

� Registrul de Iesire(FF2) este sincronizat cu CLK1<br />

� Iesirea lui FF2 rapid nu trebuie sa modifice intrarea lui FF1, pe<br />

aceeasi tranzitie a ceasului.<br />

- (CLK-to-Q + Intarzierea pe calea cea mai scurta – Alunecarea<br />

Ceasului) > Timpul Hold


1. Procesorul Aritmetic.<br />

OPERATIILE ARITMETICE<br />

Un procesor aritmetic reprezinta un dispozitiv capabil sa efectueze operatii simple sau complexe<br />

asupra unor operanzi furnizati in formate corespunzatoare. Ca exemple se pot da:<br />

- Unitatea Aritmetica simpla;<br />

- Incrementatorul;<br />

- Dispozitivul pentru Transformata Fourier Rapida etc.<br />

Procesorul Aritmetic poate fi examinat atat din punctul de vedere al utilizatorului, cat si al<br />

proiectantului.<br />

1. Din punctul de vedere al utilizatorului, procesorul aritmetic reprezinta o cutie neagra, cu un<br />

numar de intrari si iesiri, capabila sa efectueze o serie de operatii asupra unor operanzi cu<br />

formate specificate. Rezultatele se obtin intr-un timp care depinde de tipul operatiei si de<br />

formatul operanzilor si sunt insotite de indicatorii de conditii.<br />

Operanzi: X, Y Rezultat: Z<br />

Operatia: * Procesor Aritmetic Conditii: Ci<br />

Formate: φ Singularitai: Si<br />

Timp: T(*,φ)<br />

Intrari:<br />

- una sau mai multe marimi numerice: X, Y;<br />

- un simbol al operatiei, operatorul: *;<br />

- un simbol de format: φ.<br />

Operanzii de la intrare sunt caracterizati prin trei proprieteti:<br />

- apartin unei multimi finite M de marimi numerice, caracterizate printr-o gama:<br />

Xmin ≤ X ≤ Xmax<br />

- sunt cunoscute cu o precizie data:<br />

X - Δ Xl ≤ X ≤ X + Δ Xh


- sunt reprezentate cu ajutorul unor simboluri/cifre, in cadrul unui sistem de numeratie, sub<br />

forma unor n-tupluri:<br />

xn-1 xn-2…………………. x1 x0,<br />

care sunt interpretate ca marimi/valori numerice, pe baza unor reguli date.<br />

Operatorii sunt codificati cu ajutorul unor simboluri *, care corespund unui set redus sau extins<br />

de operatii aritmetice:<br />

∗ ∈ {+, -, ×, : }<br />

Formatul. Atunci cand sunt posibile mai multe formate, pentru reprezentarea operanzilor, acest<br />

lucru poate fi specificat la intrarea format, printr-un simbol dat φ.<br />

Iesiri:<br />

- una sau mai multe marimi numerice Z, care reprezinta rezultatul;<br />

- unul sau mai multe simboluri Ci, reprezentand conditiile in care apare rezultatul;<br />

- unul sau mai multe simboluri Si, reprezentand singularitati.<br />

Iesirile numerice poseda aceleasi proprietati ca si operanzii de la intrare: gama, precizie si<br />

reprezentare.<br />

Conditiile specifica caracteristici ale rezultatului: < 0, = 0, > 0 etc.<br />

Singularitatile sunt asociate cu situatiile in care rezultatul obtinut este invalid:<br />

- depasire: rezultatul depaseste posibilitatile hardware de reprezentare a numerelor, in<br />

sistemul numeric dat;<br />

- pierderea excesiva de precizie, la operatiile in virgula mobila;<br />

- erori datorate hardware-lui.<br />

In aceste situatii apare un pseudo-rezultat Z(Si), impreuna cu singularitatea Si, care sunt tratate<br />

atat prin hardware, cat si cu ajutorul unor rutine specifice ale sistemului de operare.<br />

Timpul de operare T(*) este dat pentru fiecare operatie (*), efectuata de catre procesor. Timpul<br />

de operare, in unele cazuri, poate fi variabil:<br />

Observatii:<br />

T(*)min ≤ T(*) ≤ T(*)max<br />

- definitia data procesorului aritmetic cuprinde un spectru larg de “cutii negre”, de la un<br />

contor simplu (ADD-ONE), pana la un generator de functii trigonometrice sau un procesor<br />

FFT.


- structura interna este specificata in termenii timpului asociat cu executia diferitelor operatii,<br />

cat si cu formatul de reprezentare a datelor.<br />

2. Din punctul de vedere al proiectantului intereseaza specificarea detaliata a structurii interne.<br />

Aceasta specificare trebuie sa considere:<br />

- algoritmii aritmetici (proiectarea aritmetica),<br />

- structura logica a procesorului (proiectarea logica).<br />

Proiectarea aritmetica pleaca de la specificatiile date de catre utilizator si le transforma in<br />

specificatii de operatii aritmetice detaliate la nivel de ranguri individuale/bit, in cadrul<br />

reprezentarii concrete a datelor. Aceste specificatii, la nivel de rang individual, reprezinta, in<br />

continuare, datele initiale (tabele de adevar, diagrame etc) pentru proiectarea logica.<br />

Proiectarea logica pleaca de la specificatiile furnizate de catre proiectarea aritmetica si, in<br />

cadrul unei tehnologii date, selecteaza tipurile de circuite logice, pe care le interconecteaza, in<br />

mod corespunzator, in vederea implementarii operatiilor aritmetice impuse de catre algoritmii<br />

aritmetici. In cazul in care algoritmii aritmetici nu se pot executa intr-un singur pas, se<br />

proiecteaza secvente, constand in pasi aritmetici elementari, efectuati sub controlul unor<br />

semnale de comanda. Astfel, proiectantul logic trebuie sa elaboreze atat proiectul unitatii de<br />

executie, cat si proiectul unitatii de comanda.<br />

Specificatiile de tip “black box”, pentru proiectarea unui procesor aritmetic, se obtin prin<br />

transformarea specificatiilor date de catre utilizator, astfel incat, ele sa corespunda posibilitatilor<br />

de implementare. In acest context trebuie sa se aibe in vedere ca:<br />

- datele se reprezinta sub forma unor vectori binari;<br />

- la baza circuitelor, care efectueaza operatiile aritmetice, se afla circuite logice, ce opereaza<br />

cu semnale binare.<br />

Avand in vedere cele de mai sus:<br />

- intrarile X si Y vor deveni:<br />

X ≡ xn-1 xn-2…………………. x1 x0,<br />

Y ≡ yn-1 yn-2…………………. y1 y0,<br />

- operatorul (*) va fi codificat printr-un cod de operatie:<br />

Ω ≡ ωn-1 ωn-2………………..ω1 ω0,<br />

care va indica atat operatia, cat si formatul.<br />

- iesirile reprezinta vectori numerici:


Z ≡ zn-1 zn-2…………………. z1 z0, rezultatul;<br />

C ≡ cp-1 cp-2…………………. c1 c0, indicatorii de conditii<br />

S ≡ sq-1 sq-2…………………. s1 s0, indicatorii de pseudorezultat.<br />

In continuare se vor examina operatiile aritmetice in virgula fixa si in virgula mobila.<br />

2. Operatiile aritmetice in virgula fixa.<br />

2.1. Adunarea si scaderea.<br />

Operatiile de adunare si scadere ale numerelor in virgula fixa se implementeaza, in majoritatea<br />

covarsitoare a cazurilor, cu numere reprezentate in complementul fata de doi. Astfel, operatiile<br />

de adunare si scadere se reduc la operatia de adunare a codurilor complementare ale celor doi<br />

operanzi. Adunarea se efectueaza rang cu rang, incepand cu rangurile mai putin semnificative,<br />

inclusiv rangurile de semn. Transportul, care apare la stanga rangului de semn, se neglijeaza.<br />

Fie operanzii:<br />

in conditiile :<br />

x = +/- xn-2…………………. x1 x0,<br />

y = +/- yn-1 yn-2…………… y1 y0,<br />

-2 n-1 ≤ x ≤ 2 n-1 -1<br />

-2 n-1 ≤ y ≤ 2 n-1 -1<br />

La adunarea/scaderea celor doi operanzi, de mai sus, apar urmatoarele situatii:<br />

a) x > 0, y > 0, dar x + y ≤ 2 n-1 –1<br />

[x]c + [y]c = |x| + |y| = [x + y]c<br />

Exemplu:<br />

[+3]c + [+2]c = |0011| + |0010| = |0101| = [0101]c<br />

b) x 0, dar 0 < x + y ≤ 2 n-1 –1<br />

[x]c + [y]c = 2 n - |x| + |y| = [x + y]c<br />

transport,<br />

se neglijeaza > 0<br />

Exemplu:<br />

[-6]c + [+7]c = 2 4 - |0110| + |0111| =<br />

transport, se neglijeaza<br />

10000 - |0110| + |0111| =<br />

1010 + 0111 = 1 0001 = 0001


c) x 0, dar x + y < 0<br />

[x]c + [y]c = 2 n - |x| + |y| = [x + y]c<br />

Exemplu:<br />

< 0<br />

[-7]c + [+6]c = 2 4 - |0111| + |0110| =<br />

10000 - |0111| + |0110| =<br />

1001+ 0110 = [1111]c<br />

d) x


Pozitionarea indicatorilor de conditii.<br />

Indicatorii de conditii specifica o serie de proprietati ale rezultatului, care apare in registrul<br />

acumulator al rezultatului AC. De regula, ei sunt stocati in bistabile notate cu mnemonice, care<br />

formeaza un registru, incorporat in cuvantul de stare al programului/procesului. Indicatorii de<br />

conditii specifica diverse situatii:<br />

- rezultat = 0 - mnemonica Z, ( Z ← ∪ / AC );<br />

- semnul rezultatului > 0 sau < 0 - mnemonica S, ( S ← ACn-1);<br />

- aparitia transportului, la stanga rangului de semn, mnemonica C, (Cn ← 1);<br />

- rezultatul verificarii paritatii - mnemonica P, ( P ← ⊕ / AC ).<br />

Pozitionarea indicatorilor de pseudo-rezultat.<br />

Printre situatiile care conduc la un pseudo-rezultat, in cazul operarii in virgula fixa, este si aceea<br />

cand apare o depasire. Depasirea se manifesta in conditiile in care cei doi operanzi care se aduna<br />

au acelasi semn. Daca rezultatul obtinut are un semn diferit de semnul comun, al celor doi<br />

operanzi, s-a inregistrat o depasire. Depasirea poate constitui o cauza de intrerupere/suspendare<br />

a programului in cadrul careia a aprut. Aceasta situatie este semnalizata sistemului de operare, in<br />

vederea luarii unei decizii corespunzatoare.<br />

Situatia de depasire se semnaleaza prin generarea unui semnal D egal cu suma modulo doi intre<br />

transportul in rangul de semn si transportul in afara rangului de semn, in cadrul registrului<br />

acumulator, al rezultataului:<br />

Implementari.<br />

D ← Cn ⊕ Cn-1<br />

Operatia de adunare pe un singur rang se realizeaza prin generarea sumei si a transportului,<br />

folosind circuitele logice necesare realizarii fizice a expresiilor logice de mai jos:<br />

Couti = (xi . Cini) ∪ (yi . Cini) ∪ (xi . yi)<br />

Sumi = (xi . yi . Cini) ∪ (xi . yi . Cini) ∪ (xi . yi . Cini) ∪ (xi . yi . Cini),<br />

se concretizeaza intr-un circuit de tip “schema bloc”, denumit SUM, prezentat in continuare:


Ciin<br />

Xi<br />

Yi<br />

CI<br />

A0<br />

B0<br />

Cu ajutorul sumatorului la nivel de bit se poate realiza un sumator pe n biti:<br />

Sumatorul la nivel de bit poate fi extins si cu operatiile logice SI/AND, SAU/OR, ca in figura de<br />

mai jos, in cadrul careia iesiriele sumatorului, circuitului AND si circuitului OR sunt aplicate la<br />

intrarile unui multiplexor MUX. Codul de operatie, pentru selectarea operatorului, se forteaza la<br />

intrarea Sel, a multiplexorului.<br />

1<br />

2<br />

3<br />

Cin 1<br />

X0<br />

Y0<br />

X1<br />

Y1<br />

Xn-1<br />

Yn-1<br />

2<br />

3<br />

1<br />

2<br />

3<br />

1<br />

2<br />

3<br />

CI<br />

A0<br />

B0<br />

CI<br />

A0<br />

B0<br />

CI<br />

A0<br />

B0<br />

SUM<br />

Z0<br />

CO<br />

Z0<br />

CO<br />

Z0<br />

CO<br />

Z0<br />

CO<br />

4<br />

5<br />

4<br />

5<br />

4<br />

5<br />

4<br />

Rezi<br />

Ciout<br />

Rez0<br />

Rez1<br />

Rez(n-1)<br />

5 Cout


Xi<br />

Yi<br />

CI<br />

A0<br />

B0<br />

CO<br />

In conditiile in care se doreste si implementarea operatiei de scadere, este necesar sa se creeze<br />

posibilitatea inversarii intrarii yi, dupa cum se prezinta in continuare:<br />

Xi<br />

Yi<br />

Ciin<br />

InvY<br />

Z0<br />

Inversarea lui y se realizeaza sub controlul semnalului de selectie InvY, aplicat la intrarea de<br />

selectie a celui de-al doilea multiplexor<br />

1<br />

2<br />

3<br />

1 2<br />

Ciout<br />

SUM<br />

1<br />

2<br />

3<br />

CI<br />

A0<br />

B0<br />

4<br />

5<br />

Sel<br />

Z0<br />

CO<br />

MUX<br />

Ciin Sel<br />

MUX2<br />

SUM<br />

Less 4<br />

Ciout<br />

4<br />

5<br />

1<br />

2<br />

3<br />

Rez<br />

MUX1<br />

Rez


Operatiile ADD, SUB, AND si OR se regasesc in Unitatile Aritmetice Logice ale oricarui<br />

procesor. Exista unele procesoare care au implementata instructiunea “set-on-less-than”,<br />

ce se traduce prin “forteaza in (1), bitul cel mai putin semnificativ al rezultatului, daca<br />

operandul x este mai mic decat operandul y”, in conditiile in care toti ceilalti biti ai rezultatului<br />

vor fi 0. Astfel, in figura de mai sus a aparut o noua intrare la multiplexor “less”.<br />

Structura poate fi completata cu detalierea schemei UAL, pentru bitul cel mai semnificativ, in<br />

care se pune in evidenta depasirea aritmetica.<br />

Implementarea operatiei “set-on-less-than” presupune efectuarea scaderii lui y din x.<br />

Daca x < y, se va pozitiona in unu semnul rezultatului, la iesirea sumatorului, adica Sum(n-1) .<br />

Acest lucru trebuie sa se reflecte insa in fortarea in unu a bitului cel mai semnificativ al<br />

rezultatului Rez0 si in zero a bitilor Rez(n-1)….. Rez1. Aceasta solutie este ilustrata in urmatoarea<br />

schema bloc.<br />

Xi<br />

Yi<br />

InvY<br />

1 2<br />

Ciin Sel<br />

1<br />

2<br />

3<br />

CI<br />

A0<br />

B0<br />

Z0<br />

CO<br />

Less 4<br />

InvY<br />

MUX2<br />

SUM<br />

Detectie Depasire<br />

4<br />

5<br />

1<br />

2<br />

3<br />

Ciout<br />

MUX1<br />

Rez<br />

Set<br />

Depasire


In figura de mai sus a fost implementa si pozitionarea in “1” , an indicatorului de conditii, care<br />

specifica aparitia unui rezultat egal cu “0”, la iesirea unitatii arimetice logice. Bistabilul Z se<br />

pozitioneaza in “1”.<br />

Sumatoare performante.<br />

Sumatorul cu transport succesiv.<br />

Tipul cel mai simplu de sumator paralel este sumatorul cu transport succesiv, obtinut prin<br />

interconectarea unor sumatoare complete. Ecuatiile pentru transport si suma, la nivelul unui<br />

etaj, sunt date mai jos:<br />

InvY Cin0 Operatia<br />

X0<br />

Y0<br />

X1<br />

Y1<br />

0<br />

X(n-1)<br />

Y(n-1)<br />

0<br />

LESS<br />

LESS<br />

Cout0<br />

Cout1<br />

LESS<br />

Cout(n-1)<br />

Couti = (xi . Cini) ∪ (yi . Cini) ∪ (xi . yi)<br />

Rez(n-1)<br />

Depasire<br />

Sumi = (xi . yi . Cini) ∪ (xi . yi . Cini) ∪ (xi . yi . Cini) ∪ (xi . yi . Cini),<br />

Set<br />

Rez0<br />

Rez1<br />

Se poate observa ca cele doua functii combinationale se implementeaza pe doua niveluri logice.<br />

In conditiile in care intarzierea pe un nivel logic este Δt, rezulta ca intarzierea minima pe rang va<br />

1<br />

2<br />

3<br />

4<br />

5<br />

Zero


fi 2.Δt. Intrucat, in cazul cel mai defavorabil, transportul se propaga de la rangul cel mai putin<br />

semnificativ pana la iesirea celui mai semnificativ rang, rezulta o intarziere egala cu 2.n.Δt, unde<br />

n este numarul de ranguri. Este evident ca o asemenea solutie nu este acceptabila.<br />

Sumatorul cu intarziere minima.<br />

Considerand ecuatia sumei , Sum0 , de la iesirea celui mai putin semnificativ rang, se incearca<br />

stabilirea unei expresii a acesteia ca functie de intrarile pentru rangul curent (n-1), cat si de<br />

intrarile pentru rangurile mai putin semnificative (n-2),…,1,0. In acest mod se va obtine o<br />

expresie logica implementabila in doua trepte.<br />

Sum0 = [x0. y0 . Cin0] ∪ [x0 . y0 . Cin0] ∪<br />

[x0 . y0 . Cin0] ∪ [x0 . y0 . Cin0]<br />

Pentru iesirea, care reprezinta transportul, din rangul 0 s-a inlocuit Cout0 cu Cin1, pentru a<br />

simplifica relatiile, care urmeaza a se obtine.<br />

Cin1= [x0 . Cin0] ∪ [y0 . Cin0] ∪ [x0 . y0]<br />

Pentru rangul urmator 1, se obtine urmatoarea expresie a sumei:<br />

Sum1 = [x1. y1 . Cin1] ∪ [x1 . y1 . Cin1] ∪<br />

[x1 . y1 . Cin1] ∪ [x1 . y1 . Cin1]<br />

In expresia lui Sum1 se va inlocui Cin1 cu componentele care-l alcatuiesc, conform formulei<br />

precedente. Calculul lui Cin1 conduce la urmatoarea expresie:<br />

Cin1= [x0 . Cin0] ∪ [y0 . Cin0] ∪ [x0 . y0],<br />

Astfel, pentru Sum1 se va obtine o expresie formata prin adunarea logica a 12 produse logice de<br />

cate 4 variabile fiecare.Aceasta presupune utilizarea unei porti OR cu 12 intrari si a 12 porti<br />

AND, cu cate 4 intrari. Extinzand procedeul la urmatoarele ranguri se vor obtine expresii cu<br />

numerosi termeni de tip produs, care, la randul lor, vor avea multe componente. Un calcul<br />

simplu arata ca, in cazul unui sumator pe 64 de biti, vor fi necesare circa 10 12 porti, practic de<br />

nerealizat in prezent.<br />

Principiul anticiparii transportului.<br />

Intrucat sumatorul cu transport succesiv este lent, iar sumatorul cu intarziere minima este<br />

imposibil de realizat, se cauta o solutie intermediara. Aceasta grupeaza relatiile obtinute la<br />

sumatorul cu intarziere minima, astfel incat sa se obtina dimensiuni rezonabile.


Ideea de baza este aceea de a caracteriza comportarea unui rang al sumatorului din punctul de<br />

vedere al generarii/propagarii unui transport. Astfel, rangul j al unui sumator genereaza, Gj ,<br />

transport daca are loc relatia:<br />

Gj = xj . yj<br />

De asemenea, rangul j al unui sumator propaga, Pj , transport in situatia de mai jos:<br />

Pj = xj ⊕ yj = (xj . yj) ∪ (xj . yj).<br />

In aceste conditii se pot elabora noi expresii pentru transportul C(j+1) si pentru suma Sumj , la<br />

nivelul fiecarui rang al sumatorului:.<br />

C(j+1) = Gj ∪ (Pj . Cj)<br />

Sumj = (Pj . Cj) ∪ (Pj . Cj)<br />

Astfel, un sumator complet va consta in doua parti: partea P/G si partea Sum<br />

/Xj<br />

/Yj<br />

Xj<br />

Yj<br />

Relatiile de mai sus se pot structura la nivelul a 4 sectiuni ale unui sumator, bazat pe ideea<br />

mentionata anterior. Incepand cu rangul cel mai putin semnificativ se obtin:<br />

- pentru sume:<br />

Sum0 = (P0 . C0) ∪ (P0 . C0)<br />

Sum1 = (P1 . C1) ∪ (P1 . C1)<br />

Sum2 = (P2 . C2) ∪ (P2 . C2)<br />

Sum3 = (P3 . C3) ∪ (P3 . C3),<br />

si:<br />

Partea P/G Partea Sum<br />

1 2<br />

Gj Pj<br />

Cj<br />

1 2<br />

Sumj


- pentru transporturi:<br />

C1 = G0 ∪ (P0 . C0)<br />

C2 = G1 ∪ (P1 . C1) = G1 ∪ (P1 . G0 ) ∪ (P1 . P0 . C0)<br />

C3 = G2 ∪ (P2 . C2) = G2 ∪ (P2 . G1) ∪ (P2 . P1 . G0 ) ∪ (P2 . P1 . P0 . C0)<br />

C4 = G3 ∪ (P3 . C3) = G3 ∪ (P3 . G2) ∪ (P3 . P2 . G1) ∪<br />

∪ (P3 . P2 . P1 . G0 ) ∪ (P3 . P2 . P1 . P0 . C0)<br />

Aceste relatii sunt implementate in unitatea de anticipare a transportului UAT.<br />

Pentru o sectiune de 4 biti, sumatorul cu transport anticipat arata astfel:<br />

Sum3 x3 y3 Sum2 x2 y2 Sum1 x1 y1 Sum0 x0 y0<br />

GP C3 P3 G3 C2 P2 G2 C1 P1 G1 C0 P0 G0<br />

GG<br />

Sum3 P/G 3 Sum2 P/G 2 Sum1 P/G 1 Sum0 P/G 0<br />

Efectuand un calcul al intarzierii, se obtine, pe 4 biti de sumator, o intarziere de 6.Δt, in<br />

comparatie cu intarzierea de 8.Δt, pentru sumatorul cu transport succesiv. Din schema bloc, de<br />

mai sus, rezulta ca Logica de Anticipare a Transportului mai genereaza doua semnale la nivel<br />

de grup. Grupul consta intr-un ansamblu de patru ranguri de sumator. Astfel, grupul poate<br />

genera transport (GG =1) sau poate propaga transport (GP = 1).<br />

Ideea anticiparii transportului se poate fi extinsa atat la nivel de grup, cat si la nivel de sectiune<br />

(ansamblu de patru grupuri), realizand o structura piramidala de UAT-uri.<br />

Unitatile de anticipare la nivel de grup si la nivel de sectiune sunt identice cu logica de<br />

anticipare a transportului la nivelul sumatorului cu patru biti.<br />

Analiza performantelor arata ca in cazul unui sumator pe 16 biti, cu transport de grup, se<br />

inregistreaza o intarziere de 8.Δt, fata de intarzierea de 32.Δt, pentru sumatorul cu transport<br />

succesiv. In cazul unui sumator pe 64 de biti, in situatia anticiparii transportului pe sectiuni, se<br />

obtine o intarziere maxima de 14.Δt, comparativ cu intarzierea de 128.Δt, pentru sumatorul cu<br />

transport succesiv.<br />

Logica de Anticipare a Transportului<br />

C0


Se poate aprecia ca numarul de terminale de intrare si iesire ale portilor poate reprezenta un<br />

criteriu de cost, intr-o implementare data. Comparatia cost/performanta pentru cele doua<br />

implementari, de mai sus, arata ca in cazul unui sumator pe 64 de biti, la o crestere a numarului<br />

de terminale cu 50%, pentru solutia cu transport anticipat, se obtine o viteza de 9 ori mai mare,<br />

decat in cazul transportului succesiv.<br />

Sumatorul cu salvare a transportului.<br />

In cazul adunarii mai multor vectori binari simultan se poate recurge la o schema mai rapida,<br />

constand in utilizarea mai multor sumatoare in cascada.<br />

Fie cazul adunarii a patru numere de cate 4 biti, notate cu a, b, e, f. Rangurile numerelor b, e, f<br />

se vor aduna intr-un sumator cu salvare a transportului, care va avea iesiri pentru suma si<br />

transport. Acestea, la randul lor, se vor aduna cu rangurile numarului a, intr-un alt sumator cu<br />

salvare a transportului. Iesirile reprezentand rangurile sumei si rangurile transportului se vor<br />

aduna intr-un sumator obisnuit.<br />

a b e f<br />

Sumator cu salvare a<br />

transportului<br />

Sumator cu salvare a<br />

transportului<br />

C’ S’<br />

Sumator obisnuit<br />

Sum<br />

Detaliile de implementare sunt lasate pe seama cititorului.<br />

Comparatie intre cateva tipuri de sumatoare, pe n biti, in privinta intarzierii si a ariei ocupate:<br />

Tip sumator Intarziere Aria ocupata<br />

Transport succesiv 2.n.Δt 9.n<br />

Intarziere minima 2.Δt 2 (2n+1) /(2n+1)<br />

Transport anticipat 2.(log2n + 1).Δt 7.n + 22.log2n


Secvente de microinstructiuni pentru controlul operatiilor in Unitatea de Executie AMD2901<br />

23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0<br />

M I8 I7 I6 M I2 I1 I0 Cn I5 I4 I3 A3 A2 A1 A0 B3 B2 B1 B0 D3 D2 D1 D0<br />

U Selectie U Selectie Operatie Adresa “A” Adresa “B” Data “D”<br />

X destinatie X sursa UAL<br />

1 2<br />

0 1 1 1 1 1 0 1 1 0 0 0 0 0 0 1 0 LOAD R0, 02H<br />

0 0 1 0 1 1 0 1 1 0 0 0 0 READ R0<br />

0 1 1 1 1 1 0 1 1 0 0 0 1 0 1 0 0 LOAD R1, 04H<br />

0 1 1 1 1 0 1 1 0 1 1 0 0 0 1 ROTUP R1<br />

0 1 0 1 1 0 1 1 0 1 1 0 0 0 1 ROTDWN R1<br />

0 0 0 0 1 0 1 0 0 CLR Q<br />

1 1 1 0 0 0 1 1 0 1 1 0 0 0 1 DBLROTUP R1,Q<br />

1 1 0 0 0 0 1 1 0 1 1 0 0 0 1 DBLROTDWN R1,Q<br />

0 0 1 0 1 1 0 1 1 NOP<br />

0 1 1 0 1 1 1 0 0 0 0 0 1 CLR R1<br />

0 1 1 0 1 1 1 0 0 0 0 0 0 1 INCR R1<br />

0 1 1 0 1 1 0 0 0 1 0 0 0 1 DCR R1<br />

0 1 1 1 1 1 0 1 1 0 0 1 1 0 1 0 1 LOAD R3, 05H<br />

0 1 1 0 0 1 0 0 0 0 0 0 1 1 0 0 0 1 ADD R1, R3<br />

Observatii<br />

Descrierea microinstructiunilor<br />

individuale la nivel de mnemonice


Secvente de microinstructiuni pentru controlul operatiilor in Microsecventiatorul AMD2909<br />

Adresa de<br />

memorie, in<br />

memoria de<br />

control<br />

31 30 29 28 27 26 25 24<br />

R3 R2 R1 R0 P3 P2 P1 P0<br />

Adresa de Obtinerea μI<br />

salt urmatoare<br />

0 1 0 0 1 0 0 0 1 JR 09H<br />

. . . . . . . . . ……….<br />

3 0 0 0 0 0 0 0 1 JR 00H<br />

. . . . . . . . . ……….<br />

6 1 0 1 0 0 0 0 1 JR 0AH<br />

. . . . . . . . . ……….<br />

9 0 1 1 0 0 0 0 1 JR 06H<br />

A 0 0 1 0 CONT<br />

B 0 0 1 0 CONT<br />

C 0 0 1 0 CONT<br />

D 0 0 1 0 CONT<br />

E 0 0 1 0 CONT<br />

F 0 0 1 1 0 0 0 1 JR 03H<br />

Secventa: 0, 9, 6, A, B, C, D, E, F, 3, 0, 9, 6,….etc.<br />

Observatii<br />

Descrierea microinstructiunilor<br />

individuale la nivel de mnemonice


Secvente de microinstructiuni pentru controlul operatiilor in Microsecventiatorul AMD2909<br />

Adresa de<br />

memorie, in<br />

memoria de<br />

control<br />

31 30 29 28 27 26 25 24<br />

R3 R2 R1 R0 P3 P2 P1 P0<br />

Adresa de Obtinerea μI<br />

salt urmatoare<br />

0 0 0 1 0 CONT<br />

1 0 0 1 0 CONT<br />

2 1 0 0 1 PUCONT<br />

3 0 0 1 0 CONT<br />

4 0 0 1 0 CONT<br />

5 0 0 1 0 CONT<br />

6 0 0 1 0 CONT<br />

7 0 0 1 0 CONT<br />

8 0 0 1 0 CONT<br />

9 0 0 1 0 CONT<br />

C 0 0 1 0 CONT<br />

D 0 0 1 0 CONT<br />

E 0 1 1 0 JSTV<br />

Ciclare in microprogram. Secventa: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, 3, 4, 5,….etc.<br />

Observatii<br />

Descrierea microinstructiunilor<br />

individuale la nivel de mnemonice


Secvente de microinstructiuni pentru controlul operatiilor in Microsecventiatorul AMD2909<br />

Adresa de<br />

memorie, in<br />

memoria de<br />

control<br />

31 30 29 28 27 26 25 24<br />

R3 R2 R1 R0 P3 P2 P1 P0<br />

Adresa de Obtinerea μI<br />

salt urmatoare<br />

0 0 0 1 0 CONT<br />

1 0 0 1 0 CONT<br />

2 0 0 1 0 CONT<br />

3 1 1 0 0 0 1 0 1 JSR 0CH<br />

4 0 0 1 0 CONT<br />

5 0 0 1 0 CONT<br />

6 0 0 0 0 0 0 0 1 JR 00H<br />

7 . . . . . . . . ……….<br />

8 . . . . . . . . ……….<br />

9 . . . . . . . . ……….<br />

C 0 0 1 0 CONT<br />

D 0 0 1 0 CONT<br />

E 0 1 1 0 RS<br />

Salt la subrutina Secventa: 0, 1, 2, 3, C, D, E, 4, 5, 6, 0, 1, 2, 3, C, D,….etc.<br />

Observatii<br />

Descrierea microinstructiunilor<br />

individuale la nivel de mnemonice


Microsubrutine imbricate<br />

μP Principal μSUB 0 μSUB 3<br />

D CONT 0 JSR 0CH 3 JSR 0CH<br />

E JSR 00H 1 JSR 06H 4 JSR 09H<br />

F JR 0DH 2 RS 5 RS<br />

μSUB 6 μSUB 9 μSUB C<br />

6 JSR 0CH 9 JSR 0CH C RS<br />

7 JSR 03H A RS<br />

8 RS<br />

Spatiul de adresare in memoria de comanda este urmatorul:<br />

D, E, 0, 1, 6, D, 7, 3, D, 4, 9, A, 5, 8, 2, F, D etc<br />

Microprogramul corespunzator este dat mai jos


Secvente de microinstructiuni pentru controlul operatiilor in Microsecventiatorul AMD2909<br />

Adresa de<br />

memorie, in<br />

memoria de<br />

control<br />

31 30 29 28 27 26 25 24<br />

R3 R2 R1 R0 P3 P2 P1 P0<br />

Adresa de Obtinerea μI<br />

salt urmatoare<br />

0 1 1 0 0 0 1 0 1 JSR 0CH<br />

1 0 1 1 0 0 1 0 1 JSR 06H<br />

2 0 1 1 0 RS<br />

3 1 1 0 0 0 1 0 1 JSR 0CH<br />

4 1 0 0 1 0 1 0 1 JSR 09H<br />

5 0 1 1 0 RS<br />

6 1 1 0 0 0 1 0 1 JSR 0CH<br />

7 0 0 1 1 0 1 0 1 JSR 03H<br />

8 0 1 1 0 RS<br />

9 0 0 1 0 CONT<br />

A 0 1 1 0 RS<br />

C 0 1 1 0 RS<br />

D 0 0 1 0 CONT<br />

E 0 0 0 0 0 1 0 1 JSR 00H<br />

F 1 1 0 1 0 1 0 1 JSR 0DH<br />

Observatii<br />

Descrierea microinstructiunilor<br />

individuale la nivel de mnemonice<br />

Microsubrutine imbricate. Secventierea adreselor de microinstructiuni: D, E, 0, 1, 6, D, 7, 3, D, 4, 9, A, 5, 8, 2, F, D etc


Adr<br />

31302928 27 26 25 24 23 22 2120 19 18 1716 15 1413 12 11 10 9 8 7 65 4 3 2 1 0<br />

Observatii<br />

μI<br />

R3:0 P3:0 M I8:6 M I2:0 Cn I5:3 “A” “B” “D”<br />

1 0<br />

Descrierea microinstructiunilor<br />

0 2 3 3 1 0 0 CONT INC R0<br />

1 15 15 1 JRC 15 NOP<br />

2 0 1 1 JR 0 NOP<br />

15 2 1 CONT NOP<br />

(INCREMENT & TEST)<br />

0 2 3 7 3 0 0 CONT LOAD R0, 0<br />

1 14 1 3 7 3 15 15 JR 14 LOAD R15,15<br />

14 2 3 3 3 0 CONT READ R0<br />

15 14 1 3 3 3 15 JR 14 READ R15<br />

(INCARCARE & CITIRE/AFISARE)


Calculul numarului de unitati continute in cuvintele V0, V1, V2 stocate in trei registre R0, R1, R2, din RAM:<br />

0 LOAD R0, V0<br />

1 LOAD R1, V1<br />

2 LOAD R2, V2<br />

3 LOAD R4, V4 /V4 contine o valoare corespunzatoare numarului de biti explorati la nivel de cuvant<br />

4 CLEAR R3<br />

5 R0 ∩ D; D=0001<br />

6 R0 ← R0/2; JSRNZF 14<br />

7 R1 ∩ D; D=0001<br />

8 R1 ← R1/2; JSRNZF 14<br />

9 R2 ∩ D; D=0001<br />

10 R2 ← R2/2; JSRNZF 14<br />

11 DCR R4<br />

12 JRZF 5<br />

13 NOP; JR 15<br />

14 RS; INC R3<br />

15 READ R3; JR 15


Adr<br />

31302928 27 26 25 24 23 22 2120 19 18 1716 15 1413 12 11 10 9 8 7 65 4 3 2 1 0<br />

Observatii<br />

μI<br />

R3:0 P3:0 M I8:6 M I2:0 Cn I5:3 “A” “B” “D”<br />

1 0<br />

Descrierea microinstructiunilor<br />

0 2 3 7 3 0 V0 CONT LOAD R0, V0<br />

1 2 3 7 3 1 V1 CONT LOAD R1, V1<br />

2 2 3 7 3 2 V2 CONT LOAD R2, V2<br />

3 2 3 7 3 4 4 CONT LOAD R4, 4<br />

4 2 3 3 4 3 CONT LOAD R4, 0<br />

5 2 1 5 4 0 0 1 CONT R0 ∩ MSK (0001)<br />

6 14 4 5 3 3 0 JSNZF 14 R0← R0/2<br />

7 2 1 5 4 1 1 1 CONT R0 ∩ MSK (0001)<br />

8 14 4 5 3 3 1 JSNZF 14 R1← R1/2<br />

9 2 1 5 4 2 2 1 CONT R2 ∩ MSK (0001)<br />

10 14 4 5 3 3 2 JSNZF 14 R2← R2/2<br />

11 2 3 3 0 1 4 CONT DCR R4<br />

12 5 0 1 JRNZF 5 NOP<br />

13 15 1 1 JR 15 NOP<br />

14 6 3 3 1 0 RS INC R3<br />

15 15 1 1 3 3 JR 15 READ R15


Implementarea unui contor pe 16 biti.<br />

Contorul este realizat prin concatenarea registrelor de cate 4 biti: R3, R2, R1, R0. Se presupune ca microprogramul incepe de la<br />

adresa 7:<br />

7 R0← R0 + 1 12 JRNZF 7<br />

8 JRNZF 7 13 R3← R3 + 1<br />

9 R1← R1 + 1 14 JRNZF 7<br />

10 JRNZF 7 15 JR 7<br />

11 R2← R2 + 1<br />

Adr 31302928 27 26 25 24 23 22 2120 19 18 1716 15 1413 12 11 10 9 8 7 65 4 3 2 1 0<br />

Observatii<br />

μI<br />

R3:0 P3:0 M I8:6 M I2:0 Cn I5:3 “A” “B” “D”<br />

1 0<br />

Descrierea microinstructiunilor<br />

7 2 3 3 1 0 CONT R0← R0 + 1<br />

8 7 0 1 JRNZF 7 NOP<br />

9 2 3 3 1 1 CONT R1← R1+ 1<br />

10 7 0 1 JRNZF 7 NOP<br />

11 2 3 3 1 2 CONT R2← R2 + 1<br />

12 7 0 1 JRNZF 7 NOP<br />

13 2 3 3 1 3 CONT R3← R3 + 1<br />

14 7 0 1 JR 7 NOP


Evaluarea perioadei ceasului.<br />

Conditii<br />

6 7<br />

M<br />

U<br />

X<br />

Ceas (CK)<br />

8<br />

μ Secv.<br />

AMD2910<br />

Memorie<br />

de<br />

control<br />

1 2 6, 4<br />

R<br />

μI<br />

MUX<br />

LSB /G, /P<br />

A,B,I,Cn<br />

2901 B<br />

CK Y<br />

3<br />

/G<br />

Cn AMD 2902 Cn+z /P<br />

5<br />

CK Registru dr Date<br />

MUX<br />

MSB<br />

Cn+4<br />

OVR<br />

2901 B F3<br />

Cn YCK F=0<br />

5<br />

R<br />

C<br />

o<br />

n<br />

d<br />

Conditii


Evaluarea intarzierilor in propagarea semnalelor:<br />

Unitatea de executie<br />

1. RμI Cesa → Iesire 15 ns<br />

2. 2901 B A,B → /G0, /P0 50 ns<br />

3. 2902 /G0, /P0 → Cn+z 10 ns<br />

4. 2901 B Cn → Cn+4, OVR,Y 29 ns<br />

5. RCond,MUX Intr→ Ies 21 ns<br />

6. 2901B RAM3 setup 16 ns<br />

Unitatea de Comanda.<br />

Total: 141 ns<br />

1. RμI Cesa → Iesire 15 ns<br />

6. MUX Selectie → Iesire 20 ns<br />

7. 2910 Conditii → Iesire 45 ns<br />

8. PROM Timpul de Acces 55 ns<br />

1. RμI Setup 5 ns<br />

Ceas (CK)<br />

140 ns<br />

Total: 140 ns


Unitati de executie integrate<br />

Unitatile de executie se prezinta sub forma unor circuite integrate pe scara medie/larga. De<br />

regula ele sunt structurate transe de biti astfel incat, prin concatenare si prin utilizarea unor<br />

circuite aditionale, se pot construi sisteme de prelucrare pentru date organizate pe 4, 8, 16, 24,<br />

32, 48 sau 64 de biti.<br />

Din punct de vedere structural unitatile de executie sunt constituite dintr-o unitate aritmetica-<br />

logica, logica de generare a indicatorilor de conditii, un ansamblu de registre generale, unul<br />

sau mai multe circuite de selectie, unn circuit de deplasare si din porturi de acces pentru<br />

intrarea/iesirrea datelor.<br />

Semnalele de comanda se aplica la intrarile special prevazute, fie codificate pe campuri, fie<br />

complet decodificate.<br />

Sistemul functioneaza sincron cu un ceas a carui frecventa de tact este conditionata de<br />

intarzierile semnalelor in unitatea de executie ( propagarea transportului, timpul de basculare a<br />

bistabilelor dintr-o stare in alta etc).<br />

Unitatile de executie integrate s-au comercializat in asociatie cu unitatile de comanda<br />

corespunzatoare si cu o serie de circuite aditionale, formand ceea ce se chiama microprocesoare<br />

pe transe de biti, microprocesoare "bit-slice", microprocesoare "multi-chip" etc.<br />

Printre celemai raspindite familii de microprocesoare"bit-slice"<br />

s-au aflat si cele produse de compania Advanced Micro Devices, sub numele de AMD 2900.<br />

In cele ce urmeaza va fi prezentata unitatea de executie AMD 2901 sub aspect structural-<br />

functional. De asemenea, se vor prezenta modalitatile de realizare a unor unitati de executie<br />

pentru prelucrarea datelor pe 16 biti, unitatile de comanda corespunzatoare, cat si elemente<br />

<strong>privind</strong> microprogramarea acestora.<br />

Unitatea de executie AMD 2901.<br />

Unitatea de executie AMD 2901 este organizata pe transe de 4 biti/circuit si este prevazuta cu<br />

elementele necesare cuplarii in cascada.<br />

Semnalele de comanda se aplica sub forma unor vectori binari la terminalele circuitului, fiind, de<br />

regula, preluate sub controlul unui circuit micro-secventiator integrat ( AMD 2909, 2911 ) de la<br />

o memorie cu continut permanent. Aceasta solutie se foloseste in cazul unitatilor de comanda<br />

microprogramate. Uneori, pentru a mari viteza de operare, in locul unitatii de comanda<br />

microprogramate se utilizeaza automate conventionale cu porti, bistabile si registre.


Unitatea de executie AMD 2901 dispune de urmatoarele resurse:<br />

- un ansamblu de 16 registre generale de cite 4 biti, organizate sub forma unei memorii<br />

(RAM) biport, cu doua intrari de adrese, o intrare de date si doua iesiri de date;<br />

- o unitate aritmetica-logica, cu transport anticipat, capabila sa efectueze 3 operatii aritmetice<br />

binare si 5 operatii logice si sa genereze, atit indicatorii de conditii: depasire, zero, semn,<br />

transport (Cn+4), cat si conditiile de propagare (P) si generare(G) ale transportului, la<br />

nivelul intregului circuit;<br />

- un selector de date (selector surse UAL) pentru cele doua intrari ale unitatii aritmetice-<br />

logice, care pot reprezenta combinatii intre iesirile memoriei biport (A,B), o intrare externa<br />

de date (D), constanta "zero" si iesirea unui registru su plimentar-extensie (Q);<br />

- un selector de iesire din circuit, care furnizeaza prin intermediul unor tampoane TS fie<br />

datele de la iesirea A, a memoriei biport, fie datele de la iesirea UAL;<br />

- un registru auxiliar-extensie (Q), care poate fi incarcat fie cu datele de la iesirea UAL, fie cu<br />

propriul sau continut deplasat stanga/dreapta prin intermediul unei retele logice de<br />

deplasare-multiplexor QSHIFT;<br />

- o retea de deplasare-multiplexor RAMSHIFT, plasata pe intrarea B a memoriei biport<br />

RAM.<br />

Indicatorii de conditii trebuie stocati intr-un registru dupa fiecare operatie efectuata de UAL.<br />

Circuitul afost realizat in diverse variante tehnologice: AMD 2901, 2901A, 2901B, 2901C, cu<br />

sporuri de viteza de 25%, 50% si - respectiv 75%, fata de 2901.<br />

In figura se prezinta schema bloc a circuitului AMD 2901.<br />

Continuturile celor 16 cuvinte din RAM pot fi citite la iesirile A si B, pe baza adreselor A si B,<br />

fiind stocate in doua circuite tampon/latch. Stocarea are loc pe frontul crescator al semnalului de<br />

ceas. Dupa tranzitia negativa a semnalului de ceas, in RAM, in locatia specificata de adresa B, se<br />

poate inscrie o noua valoare.<br />

Astfel, in cadrul unei perioade de ceas se efectueaza o operatie de citire si o operatie de scriere<br />

in RAM. Datele fortate in RAM sunt preluate direct sau deplasate dreapta/stinga, prin<br />

intermediul multiplexorului RAMSHIFT, de la iesirea F a UAL.<br />

Unitatea aritmetica-logica poate efectua, sub controlul semnalelor I3:5, trei operatii aritmetice<br />

binare si cinci operatii logice, asupra operanzilor aplicati la intrarile R si S.


4<br />

RAM0 RAM3 Q0 Q3<br />

0 RAMSHIFT 3<br />

0 QSHIFT 3<br />

Ceas<br />

Adrersa “A”<br />

4 4 CP I6:8<br />

Adresa “B” WE 4<br />

4 4<br />

Data D 4<br />

I0:2<br />

4 4 0<br />

D A B 0 Q<br />

Selector sursa<br />

R S<br />

4 4<br />

Cn G, P<br />

Cn R S<br />

UAL<br />

I3:5 (Cn+4, OVR, F=0, F3)<br />

4 4<br />

OE<br />

I6:8<br />

“B” DATAIN<br />

Citire<br />

RAM 16 × 4<br />

Citire/Scriere<br />

DATA OUT<br />

“A” “B”<br />

A F<br />

Selector Iesire<br />

Y<br />

Intrarile R si S ale UAL sunt preluate de la iesirile unui circuit selector (Selector sursa UAL),<br />

care sub controlul semnalelor I0:2, din intrarile D (Date externe), A, B, 0 si Q, poate furniza<br />

combinatiile AB;AD; AQ; A0; DQ; D0; Q0; BD; BQ; B0. In tabelul de mai jos se prezinta<br />

selectia surselor de operanzi pentru UAL.<br />

F QREG Q


Mnemonica Microcod Codul Sursa<br />

octal<br />

I2 I1 I0 R S<br />

AQ 0 0 0 0 A Q<br />

AB 0 0 1 1 A B<br />

ZQ 0 1 0 2 0 Q<br />

ZB 0 1 1 3 0 B<br />

ZA 1 0 0 4 0 A<br />

DA 1 0 1 5 D A<br />

DQ 1 1 0 6 D Q<br />

DZ 1 1 1 7 D Z<br />

Tab.1.<br />

Intrarea directa D este folosita pentru a introduce date in circuit, in RAM si in registrul Q.<br />

Registrul Q este utilizatin operatiilede inmultire si impartire, ca extensie sau ca<br />

acumulator/registru in unele aplicatii.<br />

Microcodul: I8:0 ( Structura vectorului de comanda ).<br />

9biti<br />

Operatiile efectuate de UAL sint prezentate in tabelul de mai<br />

jos:<br />

I8:6 I5:3 I2:0<br />

Destinatie UAL Functie UAL Sursa UAL<br />

8 7 6 5 4 3 2 1 0


Mnemonica Microcod Cod Functia Simbol<br />

octal UAL<br />

I5 I4 I3<br />

ADD 0 0 0 0 R Plus S R+S<br />

SUBR 0 0 1 1 S Minus R S-R<br />

SUBS 0 1 0 2 R Minus S R-S<br />

OR 0 1 1 3 R OR S R∪S<br />

AND 1 0 0 4 R AND S R∩S<br />

NOTRS 1 0 1 5 R AND S R & S<br />

EXOR 1 1 0 6 R EXOR S R⊕S<br />

EXNOR 1 1 1 7 R EXNOR S R≡S<br />

Tab. 2.<br />

Pe baza informatiilor din tabelele 1 si 2 se pot genera functiile aritmetice si logice realizate de<br />

unitatea de executie AMD 2901:<br />

AMD 2901 Functiile aritmetice. Tab.3.<br />

Microcod octal Cn=0 (Low) Cn=1(High)<br />

I5:3,I2:0 Grup Functie Grup Functie<br />

0 0 ADD A+Q ADD Plus1 A+Q+1<br />

0 1 A+B A+B+1<br />

0 5 D+A D+A+1<br />

0 6 D+Q D+Q+1<br />

0 2 Pass Q Increment Q+1<br />

0 3 B B+1<br />

0 4 A A+1<br />

0 7 D D+1<br />

1 2 Decrement Q-1 Pass Q


1 3 B-1 B<br />

1 4 A-1 A<br />

2 7 D-1 D<br />

2 2 Comple- -Q-1 Comple- -Q<br />

2 3 mentul -B-1 mentul -B<br />

2 4 fata de 1 -A-1 fata de 2 -A<br />

1 7 -D-1 -D<br />

1 0 Scadere Q-A-1 Scadere Q-A<br />

1 1 in com- B-A-1 in com- B-A<br />

1 5 plementul A-D-1 plemnetul A-D<br />

1 6 ata de 1 Q-D-1 fata de 2 Q-D<br />

2 0 A-Q-1 A-Q<br />

2 1 A-B-1 A-B<br />

2 5 D-A-1 D-A<br />

2 6 D-A-1 D-Q<br />

AMD 2901 Functii logice. Tab.4.<br />

Microcod octal Grup Functie<br />

I5:3,I2:0<br />

4 0 AND A ∩ Q<br />

4 1 A ∩ B<br />

4 5 D ∩ A<br />

4 6 D ∩ Q<br />

3 0 OR A ∪ Q<br />

3 1 A ∪ B<br />

3 5 D ∪ A<br />

3 6 D ∪ Q<br />

6 0 EXOR A ⊕ Q


6 1 A ⊕ B<br />

6 5 D ⊕ A<br />

6 6 D ⊕ Q<br />

7 0 EXNOR A ≡ Q<br />

7 1 A ≡ B<br />

7 5 D ≡ A<br />

7 6 D ≡ Q<br />

7 2 INVERT Q<br />

7 3 B<br />

7 4 A<br />

7 7 D<br />

6 2 PASS Q<br />

6 3 B<br />

6 4 A<br />

6 7 D<br />

3 2 PASS Q<br />

3 3 B<br />

3 4 A<br />

3 7 D<br />

4 2 "ZERO" 0<br />

4 3 0<br />

4 4 0<br />

4 7 0<br />

5 0 MASK A ∩ Q<br />

5 1 A ∩ B<br />

5 5 D ∩ A<br />

5 6 D ∩ Q<br />

Campul "Destinatie UAL" (I8:6) din vectorul de comanda I8:0 are o semnificatie complexa prin<br />

faptul ca specifica:


- operarea RAM (deplasare/incarcare/inactiv);<br />

- operarea registrului Q (deplasare/incarcare/inactiv);<br />

- conexiunile la RAMSHIFT (RAM0 si RAM3);<br />

- conexiunile la QSHIFT (Q0 si Q3);<br />

- iesirea Y.<br />

Terminalele RAM0/RAM3 si Q0/Q3, din punct de vedere electric, sunt terminale de<br />

intrare/iesire, controlul lor fiind asigurat de campul I8:6, din microcod.<br />

In tabelul de mai jos se prezinta semnificatiile campului I8:6, in conditiile in care:<br />

- B reprezinta locatia din RAM adresata pe baza adresei B;<br />

- UP inseamna deplasarea catre MSB;<br />

- DOWN specifica deplasarea catre LSB.<br />

Comanda destinatiei UAL Tab.5.<br />

Mnemo- M.cod Cod Functia RAM Functia Q Ies RAMSHIFT QSHIFT<br />

nica oct<br />

I8I7I6 Depl Incarc. Depl Incarc. Y RAM0 RAM3 Q0 Q3<br />

QREG 0 0 0 0 * Nu * Q←F F * * * *<br />

NOP 0 0 1 1 * Nu * Nu F * * * *<br />

RAMA 0 1 0 2 Nu B←F * Nu A * * * *<br />

RAMF 0 1 1 3 Nu B←F * Nu F * * * *<br />

RAMQD 1 0 0 4 DOWN B←F/2 DOWN Q←Q/2 F F0 IN3 Q0 IN3<br />

RAMD 1 0 1 5 DOWN B←F/2 * Nu F F0 IN3 Q0 *<br />

RAMQU 1 1 0 6 UP B←2F UP Q←2Q F IN0 F3 IN0 Q3<br />

RAMU 1 1 1 7 UP B←2F * Nu F IN0 F3 * Q3<br />

*)Din punct de vedere electric terminalul asigura o intrare TTL, conectata intern cu o iesire TS<br />

aflata in starea de mare impedanta.<br />

Intrarea B in RAM este furnizata de un multiplexor RAMSHIFT. Acesta, sub controlul<br />

microcodului I8:6, selecteaza intrarea directa sau deplasata stanga/dreapta, cu insertia unor date


speciice prin terminalele RAM3/RAM0. Dupa cum se va vedea ulterior (Fig. ), datele pentru<br />

terminalele RAM3/RAM0 sunt selectate cu ajutorul altor biti (MUX1, MUX0 ) din microcodul de<br />

comanda si cu un hardware aditional,constituit din doua multiplexoare AMD 25LS-253, cu cate<br />

8 intrari si 2 iesiri.<br />

Multiplexoarele AMD 25LS253, amintite mai sus, solutioneaza si problemele circuitului<br />

QSHIFT, care asigura una din intrarile registrului Q.<br />

Iesirea Y este realizata cu un circuit TS. Sub controlul semnalului OE, iesirea Y se conecteaza<br />

la o magistrala de date.<br />

Intrarea de ceas in circuitul AMD 2901 controleaza resursele RAM, Q si tampoanele-latch A si<br />

B, plasate pe iesirile RAM. Cand semnalul de ceas este pe nivel ridicat tampoanele A si B sunt<br />

activate, preluand datele din locatiile citite din RAM, pentru a le furniza la iesire, ca surse UAL.<br />

Pe durata nivelului coborat al semnalului de ceas tampoanele A si Bstocheaza datele incarcate<br />

anterior. In cazul in care se activeaza semnalul WE, pe nivelul coborat al semnalului de ceas se<br />

poate stoca in RAM noua data plasata la intrarea B, prin intermediul circuitului RAMSHIFT.<br />

I7 I7<br />

MUX0 MUX1 MUX0 MUX1<br />

1G A B 2G LSB MSB 1G A B 2G<br />

1C0<br />

1C0<br />

H 1C1<br />

1C1 H<br />

Q0 Q1<br />

1C2 1Y<br />

1Y 1C2<br />

1C3 25LS-253<br />

2C0<br />

AMD 2901<br />

25LS-253 1C3<br />

2C0<br />

H 2C1 2Y RAM1RAM3 2Y 2C1 H<br />

2C2<br />

2C2<br />

2C3<br />

2C3<br />

MSB-Fn


In continuare se va perzenta schema bloc partiala a unei unitati de executie pe 16 biti, constituita<br />

din patru circuite AMD 2901 si un circuit cu transport anticipat AMD 2902<br />

D0:3 D12:15<br />

Q0I/O Q15I/O<br />

Q0 Q3<br />

Q0 Q3<br />

RAM0I/O RAM15I/O<br />

Cin<br />

Observatie:<br />

F=0(2) F=0(3) 470Ω<br />

Pentru marcarea unor semnale active pe nivel coborat, in cazul de fata, numele semnalului a fost<br />

precedat de simbolul “/”.<br />

Unitatea de executie poate utiliza si multiplexoare 4:1 obisnuite, in locul celor produse de catre<br />

AMD, 25LS-253. In schema de mai jos se arata modul in care sunt interconectate logic cele 4<br />

multiplexoare.<br />

Plecand de la elementele prezentate anterior se poate construi formatul cuvantului de comanda,<br />

al microinstructiunii, pentru controlul unitatii de executie.<br />

In scop didactic se va considera data de prelucrat continuta in microinstructiune, intr-un camp<br />

D. In cazul unei unitati de prelucrare pe 4 biti, campul D va avea, de asemenea, 4 biti. Pe masura<br />

+5V<br />

ce creste lungimea cuvantului prelucrat, va creste si dimensiunea campului D, din<br />

microinstructiune.<br />

RAM0 RAM3<br />

/G<br />

/P<br />

AMD 2901(1)<br />

Cn+4<br />

OVR<br />

F3<br />

Cn F=0<br />

RAM0 RAM3<br />

/G<br />

/P<br />

AMD 2901(4)<br />

Cn+4<br />

OVR<br />

F3<br />

Cn F=0<br />

/P0 /G0 /P1 /G1 /P2 /G2 /P3 /G3<br />

Cn AMD 2902 /G<br />

Cn+x Cn+y Cn+z /P


“0”<br />

MUX1,MUX0<br />

MUX MUX MUX MUX<br />

RAM SHIFT QSHIFT<br />

0 3 0 3 F3<br />

In conditiile plasarii unor multiplexoare pe intrarile de deplasare ale circuitelor RAMSHIFT si<br />

QSHIFT registrele R si Q se pot concatena in vederea efectuarii unor deplasari sau rotiri duble,<br />

conform tabelului de mai jos (originea de indexare este la stanga):<br />

MUX1MUX0 TIP DREAPTA (JOS) STANGA (SUS)<br />

0 0 ZERO RAM3 ← 0; RAM0 ← 0;<br />

Q3 ← 0 Q0 ← 0<br />

0 1 ROTIRE RAM3 ← RAM0 ; RAM0 ← RAM3;<br />

Q3 ← Q0 Q0 ← Q3<br />

1 0 ROTIRE CU RAM3 ← Q0; RAM0 ← Q3;<br />

LUNGIME DUBLA Q3 ← RAM0 Q0 ← RAM3<br />

1 1 DEPLASARE RAM3 ← F3 ; RAM0 ← Q3;<br />

DUBLA Q3 ← RAM0 Q0 ← 0<br />

ARITMETICA


Cuvantul (microinstructiunea) de comanda al unitatii de executie va avea structura urmatoare:<br />

23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0<br />

M I8 I7 I6 M I2 I1 I0 Cn I5 I4 I3 A3 A2 A1 A0 B3 B2 B1 B0 D3 D2 D1 D0<br />

U Selectie U Selectie Operatie Adresa “A” Adresa “B” Data “D”<br />

X destinatie X sursa UAL<br />

1 2<br />

Se poate observa ca, microinstructiunea care controleaza unitatea de executie poseda 24 de biti.<br />

Bitii 0,..,3 au aparut ca urmare a inglobarii datei in microinstructiune (microinstructiune cu<br />

operand imediat). Campul D se va extinde in incrementi de 4 biti odata cu extinderea lungimii<br />

cuvantului prelucrat de catre unitatea de executie. Campul Cn este asociat cu transportul in<br />

rangul cel mai putin semnificativ al unitatii de executie, fiind la latitudinea celui care scrie<br />

microprogramul.


Unitati de comanda integrate. Secventiatorul de microprogram AMD 2909.<br />

Secventiatorul de microprogram AMD 2909 face parte din familia de circuite AMD2900 si<br />

constituie elementul de baza in jurul caruia este organmizata unitatea de comanda<br />

microprogramata.<br />

Dupa cum s-a aratat in paragraful anterior, atat unitatea de executie AMD 2901, cat si circuitele<br />

asociate acesteia sunt controlate cu ajutorul unui vector de comanda constituit din campuri de<br />

biti, cu functii bie precizate. Un asemenea vector controleaza operatii aritmetice elementare,<br />

care se pot efectua pe durata unei perioade de ceas. Vectorul semnalelor de comanda poate fi<br />

generat cu ajutorul unui circuit secvential, in cazul unitatilor de comanda conventionale, sau<br />

extras dintr-o memorie cu continut permanent, in cazul unitatilor de comanda microprogramate.<br />

Operatiile cu caracter complex, printre care se numara si instructiunile calculatoarelor<br />

conventionale, se implementeaza sub forma unor secvente de vectori de comanda. In sistemele<br />

microprogramate aceste secvente sunt stocate intr-o memorie de control sau memorie de<br />

microprograme.<br />

Un cuvant al memoriei de control reprezinta un vector de comanda sau o microinstructiune.<br />

Secventiatorul de microprogram, structurat pe transe de cate 4 biti, este destinat generarii<br />

adreselor de microinstructiuni si asigurarii inlantuirii acestora.<br />

Secventiatorul, prezentat mai jos, are ca resurse hardware:<br />

- Contorul de MicroProgram (CMP);<br />

- Registrul de Ramificare (RR);<br />

- Indicatorul de Stiva (IS);<br />

- STiVa (STV) cu capacitate de 4 cuvinte × 4 biti;<br />

- INCrementatorul (INC);<br />

- MultipleXorul (MUX) 4 × (4 : 1);<br />

- Tampon cu trei Stari (TS) si alte circuite logice combinationale auxiliare.<br />

Schema bloc a unitatii de comanda va contine, pe langa microsecventiator, si elementele<br />

necesare realizarii unei unitati de comanda:<br />

- Memoria de Microprogram (MM);<br />

- Registrul MicroInstrucriunii (RMI);<br />

- un Comutator de Adrese (CA);<br />

- o memorie de tip PROM.


RE<br />

D3:0<br />

S0<br />

S1<br />

ORi<br />

ZERO<br />

OE Y[4]<br />

R[3:0] FE PUP(PUSH/POP)<br />

Cn<br />

Cn+4<br />

Ceas<br />

Prin conectarea in cascada a trei asemenea circuite se asigura o adresa de microinstructiune de<br />

12 biti, ceea ce permite accesul la o memorie de comanda cu capacitatea de 4096 cuvinte.<br />

Secventiatorul furnizeaza o adresa Y[4] de microinstructiune, care reprezinta iesirea X[4] a<br />

multiplexorului prelucrata logic. Multiplexorul are ca intrari selectabile cu ajutorul semnalelor<br />

S1,S0:<br />

- adresa externa D;<br />

- continutul Registrului de Ramificare (RR);<br />

- continutul varfului stivei (STV)<br />

- continutul Contorului de MicroProgram.<br />

Iesirea Y este furnizata prin intermediul unui circuit tampon TS, controlat de semnalul OE.<br />

Din punct de vedere logic, Y[4] se exprima astfel:<br />

Y[4] = ZERO ∩ (Y[4] ∪ OR[4])<br />

RR[4] IS<br />

D RR STV CMP<br />

MUX<br />

X[4]<br />

SAU-NU<br />

SI<br />

TS<br />

STV<br />

4 cuv.× 4 biti<br />

CMP[4]<br />

unde OR[4] este un vector logic aplicat din exterior, adesea avand toti bitii egali cu 1. ZERO<br />

INC


este, de asemena, un vector logic, care paote face ca Y[4]a aibe toate rangurile egale cu 0. In<br />

acest mod se pot forta valori particulare pentru adresa microinstructiunii urmatoare sau se pot<br />

efectua transferuri relative la adresa curenta.<br />

Secventierea microinstructiunilor este realizata prin controlul circuitului 2909 cu ajutorul<br />

semnalelor preluate din campurile de control ale microinstructiunii si de la conditiile externe.<br />

Operarea microsecventiatorului este descrisa cu ajutorul urmatoarelor tabele:<br />

Selectie MUX: Controlul Iesirii:<br />

S1 S0 IESIRE ORi ZERO OE Yi<br />

0 0 CMP * * 1 Z (TS)<br />

0 1 RR * 0 0 0<br />

1 0 STV 1 1 0 1<br />

1 1 D 0 1 0 IES MUX<br />

Operarea Stivei:<br />

FE PUP OPERATIE<br />

1 * inactiva<br />

0 1 IS ← INC(IS); PUSH(CMP)<br />

0 0 POP(STV); DCR(IS)<br />

In functie de semnalele de control si de conditiile externe, microsecventiatorul poate realiza<br />

urmatoarele operatii de control, la nivelul microprogramului:<br />

- transfer neconditionat la adresa X – mnemonica J X;<br />

- chemare de micro subrutina – mnemonica CALL X;<br />

- revenire din microsubrutina – mnemonica RETURN;<br />

- trecerea la microinstructiunea urmatoare din secventa – mnemonica CONTINUE.<br />

Transferul neconditionat la adresa X se realizeaza prin aplicarea vectorului binar X la intrarea D<br />

a multiplexorului si a urmatorului vector binar la intrarile de control ale microsecventiatorului:<br />

S1 S2, FE, PUP, OR[4], ZERO = 1 1, 1, *, 0000, 1<br />

Chemarea unei microsubrutine, de la adresa X, este asigurata prin fortarea adresei X in registrul<br />

RR si prin aplicarea urmatorului vector binar la intrarile de control ale microsecventiatorului:


S1 S2, FE, PUP, OR[4], ZERO = 0 1, 0, 1, 0000, 1<br />

Revenirea dintr-o microsubrutina este implementata folosind un vector de control al<br />

microsecventiatorului cu urmatoarea structura:<br />

S1 S2, FE, PUP, OR[4], ZERO = 1 0, 0, 0, 0000, 1<br />

Trecerea la urmatoarea microinstructiune din secventa impune ca adresa Y sa corespunda<br />

continutului Contorului de Microprogram, ceea ce se realizeaza cu ajytorul urmatorului vector<br />

de comanda:<br />

S1 S2, FE, PUP, OR[4], ZERO = 0 0, 1, *, 0000, 1<br />

Conform celor aratate mai sus, microsecventiatorul efectueaza urmatoarele operatii privitoare la<br />

generarea adresei Y a microinstructiunii urmatoare si la modificarea continuturilor Contorului<br />

de MicroProgram si Stivei:<br />

Y = (((CMP ! RR ! STV ! D) * DCD0:3(S1,S0) ∪ OR0:3) ! 4 0)* (ZERO, ZERO)<br />

CMP ← ((INC(CMP ! RR ! STV ! D) * DCD0:3(S1,S0) ∪ OR0:3) ! 4 0)* (ZERO, ZERO)<br />

STV ← ((STV1:3 ! STV0) ! (CMP ! CMP ! STV0:2) ! STV ! STV) * DCD0:3(FE, PUP)<br />

Conectarea in cascada a circuitelor microsecventiatorului pemite explorarea unui spatiu mai<br />

mare in memoria de microprogram. Mai jos se prezinta interconectarea in cascada a trei<br />

microsecventioatoare AMD 2909.<br />

S0:1<br />

OR0:3<br />

altele<br />

4<br />

R D<br />

S0:1<br />

AMD2909<br />

OR0:3<br />

Cn Cn+4<br />

altele<br />

Y0:3<br />

R D<br />

4 12 12 4<br />

R D<br />

S0:1<br />

AMD2909<br />

OR0:3<br />

Cn Cn+4<br />

altele<br />

Y0:3<br />

Y0:11<br />

4<br />

R D<br />

S0:1<br />

AMD2909<br />

OR0:3<br />

Cn Cn+4<br />

altele<br />

Y0:3


Dupa cum s-a mai aratat, pentru realizarea unei unitati de comanda, microsecventiatorul trebuie<br />

prevazut cu o serie de circuite auxiliare, care sunt prezentate in figura de mai jos:<br />

AMD29751<br />

A4:1<br />

CA<br />

A0<br />

PROM<br />

CS P3:0 AMD2909 Y[4]<br />

RR[4] IS<br />

D RR STV CMP<br />

MUX<br />

X[4]<br />

MM<br />

RMI<br />

AMD2918<br />

STV<br />

4 cuv.× 4 biti<br />

MUX0,MUX1<br />

ADRESA “A”<br />

CMP[4]<br />

INC<br />

ADRESA “B”<br />

DATA “D”<br />

Cn<br />

SELECTIE SURSA (I2:0)<br />

OPERATIE UAL (I5:3)<br />

SELECTIE DESTINATIE (I8:6)<br />

SELECTIE COD CONDITIE (P3:0)<br />

CODUL CONDITIEI SELECTATE<br />

Cn+4


Intre acestea un rol deosebit il joaca memoria PROM 29751, care furnizeaza semnalele de<br />

comanda pentru microsecventiator. Continutul acestei memorii PROM este citit pe baza unei<br />

adrese obtinute dintr-un camp P0:3, al registrului microinstructiunii RMI. Bitii P0:3 ai<br />

microinstructiunii se transforma in bitii de adresa A1:4, ai memoriei PROM, in timp ce bitul A0<br />

este furnizat de iesirea unui multiplexor la intrarile caruia se aplica indicatorii de conditii, cat si<br />

alte semnale. Intrarile de date ale multiplexorului au fost stabilite pe durata executiei<br />

microinstructiunii precedente. Intrarile de selectie ale multiplexorului sunt asigurate tot de bitii<br />

P0:3, furnizati de microinstructiunea curenta. In figura de mai jos se prezinta o schema bloc a<br />

unitatii de comanda, cu indicarea elementelor discutate anterior.<br />

MUX<br />

Magistrala pentru date si instructiuni<br />

Registrul Instructiunii RI<br />

Cod operatie adresa, etc.<br />

PROM mapare adresa<br />

O5<br />

PROM<br />

29751 O4<br />

O3<br />

A0 O2<br />

O1<br />

O0<br />

A4A3A2A1<br />

D[4] R[4]<br />

OR[4]<br />

ZERO<br />

PUP AMD 2909<br />

FE<br />

S1 Cn+4<br />

S0 Cn<br />

Yout<br />

Adresa<br />

Memoria de<br />

4 4 microprogram<br />

R3:0<br />

RMI<br />

Semnale de<br />

P3:0 comanda


Operarea unitatii de comnada microprogramata este stabilita prin continutul memoriei PROM,<br />

care furnizeaza la iesire semnalele O5:0, care reprezinta vectorul de comanda al<br />

microsecventiatorului: OR[4], ZERO, PUP, FE, S1, S0. In locatiile memoriei PROM, adresate cu<br />

ajutorul campului P3:0, sunt stocati vectori de comanda, care impun unitatii de comanda<br />

microprogramate efectuarea operatiilor prezentate in tabelul de mai jos:<br />

P3:0 Operatie Mnemonica<br />

cod hexa<br />

0 Ramificare la adresa R daca F ≠ 0 JRNZF<br />

1 Ramificare neconditionata la adresa R JR<br />

2 CONTINUA CONT<br />

3 Ramificare la adresa D JD<br />

4 Ramificare la subrutina cu adresa R daca F ≠ 0 JSRNZF<br />

5 Ramificare la subrutina cu adresa R JSR<br />

6 Revenire din subrutina RS<br />

7 Ramificare la adresa continuta in varful stivei (fara POP) JSTV<br />

8 Terminare de ciclu si POP daca F = 0 TCPOZF<br />

9 PUSH si CONTINUA PUCONT<br />

A POP si CONTINUA POCONT<br />

B Terminare de ciclu si POP daca Cn+4 = 1 TCPOC<br />

C Ramificare la adresa R daca F = 0 JRZF<br />

D Ramificare la adresa R daca F3 = 1 JRF3<br />

E Ramificare la adresa R daca OVR = 1 JROVR<br />

F Ramificare la adresa R daca Cn+4 = 1 JRC<br />

Se poate observa, in ultima schema bloc, faptul ca intrarea R a microsecventiatorului este<br />

preluata direct de la iesirea memoriei de comanda, fara a mai fi stocat in prealabil in registrul<br />

microinstructiunii RMI. In acest mod adresa de ramificare se incarca direct in registrul R al<br />

microsecventiatorului.<br />

Din cele prezentate rezulta ca operarea microsecventiatorului este controlata de doua campuri<br />

ale microinstructiunii stocate in Memoria de comanda. Este vorba de campul P3:0, care


stabileste operatia, conform tabelului de mai sus, si de campul R3:0, al adresei de ramificare.<br />

Prin concatenarea mai multor microsecventiatoare campul P ramane constant ca lungime, in<br />

timp ce campul R se modifica, in incrementi de cate 4 biti, pentru a furniza spatii de adresare<br />

mai mari in memoria de microprogram.<br />

Structura unui cuvant – microinstructiune, destinat controlului unui microsecventiator AMD<br />

2909, este formata din doua campuri de cate patru biti:<br />

- campul P, care specifica modul de obtinere a microinstructiunii urmatoare, si<br />

- campul R, care defineste adresa de salt, daca este cazul.<br />

31 30 29 28 27 26 25 24<br />

R3 R2 R1 R0 P3 P2 P1 P0<br />

Adresa de Obtinerea μI<br />

salt urmatoare<br />

Microprogramarea unui procesor “bit-slice”, constituit cu ajutorul circuitelor AMD 2901<br />

si AMD 2909, in vederea prelucrarii datelor pe 4 biti.<br />

(Urmeaza mai multe exemple de microprograme)


Sinteza circuitelor combinationale<br />

Minimizarea folosind diagrama Karnaugh. (D-K)<br />

1. Copiaza tabela de adevar in (D-K)<br />

2. Identifica subcuburile: selecteaza la fiecare pas pe cel mai mare subcub, chiar<br />

daca se suprapune cu alte cuburi selectate anterior, pana la acoperirea tuturor<br />

unitatilor (Incearca: 4×4, 2×4 si 4×2, 1×4 si 4×1, 2×1 si 1×2, in final 1×1) .<br />

3. Genereaza realizarea minimala ca Suma de Produse (SP).<br />

Termenii incercuiti poarta numele de implicanti. Un implicant care nu estcontinut<br />

complet intr-un alt implicant poarta numele de implicant prim.<br />

Cazul SP nonminimale


Structuri utile de porti.


Logica pentru Sumatorul Complet (SC)<br />

Ecuatia transportului C0 poate fi simplificata destul de usor:<br />

C0 = BC + AB+ AC<br />

In schimb, suma, S, nu are o realizare simpla de SP, chiar daca ea poate fi<br />

implementata cu doua porti XOR, cu cate doua intrari.<br />

Sinteza logica folosind multiplexoare (MUX-uri)


Implementarea sistematica a logicii combinationale.<br />

Optimizari in cazul logicii cu MUX-uri<br />

Sinteza bazata pe Tabele de Cautare (Lookup Tables)<br />

Teoretic, se poate construi oricare bloc logic combinational, cu o iesire, folosind<br />

multiplexoare. Pentru o functie de N variabile este necesar un multiplexor cu 2 N<br />

intrari.


Structura unui Multiplexor<br />

Multiplexoarele pot fi partitionate in doua sectiuni cu functiile de decodificare si<br />

selectare. Decodificatorul identifica intrarea dorita, iar Selectorul transfera la iesire<br />

acea intrare.<br />

Prin partajarea sectiunii de decodificare, multiplexoarele pot fi utilizate la<br />

implementarea tabelelor de cautare cu un numar oarecare de iesiri.<br />

Decodificatorul<br />

Decodificatorul dispune de k intrari, denumite intrari de selectie si N=2 k iesiri de date.<br />

Se poate construi un tablou bidimensional format din decodificatoare si selectoare,<br />

dupa cum se arata in continuare.<br />

Partajarea logicii de decodificare.<br />

Astfel, se poate realiza un dispozitiv universal de tip tabela de cautare, denumit<br />

Memorie cu Continut Permanent (ROM – Read Only Memory), cu ajutorul careia se<br />

poate implementa oricare tabela de adevar si, astfel, oricare dispozitiv logic<br />

combinational.


ROM - detalii de implementare<br />

Logica SI cablata, logica SAU programabila<br />

Avantaje:<br />

- proiect cu o structura regulata<br />

- proiectarea poate fi complet automatizata<br />

Dezavantaje:<br />

- Tranzistoarele “trage sus” sunt active, ceea ce implica cosum static de putere<br />

- Trasee lungi de metal, cu capacitati mari<br />

- Viteza de lucru relativ mica.<br />

Terminologie:<br />

- Intrarille circuitului ROM: adrese<br />

- Iesirile decodificatorului: linii de cuvint<br />

- Iesirile selectorului: linii de bit<br />

Cresterea vitezei in cazul ROM<br />

Cresterea vitezei in cazul ROM se poate realiza prin reducerea capacitatiilor<br />

traseelor lungi de metal, care strabat structura.


Cea mai buna metoda consta in realizarea unei structuri patrate.<br />

Intrebari:<br />

- De ce sau folosit circuite NOR?<br />

- Nu se puteau elimina unele inversoare in cazul folosirii circuitelor NAND?<br />

Observatii <strong>privind</strong> utilizarea circuitelor ROM<br />

pentru implementarea logicii combinationale<br />

- ROM nu tine seama de structura functiilor combinationale<br />

- Dimensiunea, planul (layout) si proiectul sunt independente de functie<br />

- Oricare tabela de adevar poate fi implementata/”programata” prin reconfigurari<br />

minore:<br />

- stratul de metal (ROM cu masca)<br />

- fuzibile (PROM –Field programmable ROM)<br />

- sarcini pe portile flotante (EPROM – Erasable PROM) etc<br />

Model: valorile functiei in tabela de cautare se iau din tabela de adevar.<br />

Intrari: “ADRESE” corespunzatoare celor N intrari<br />

Dimensiunea ROM ≈ 2 N × Nr.iesiri.<br />

Intrebari:<br />

- De ce dimensiunile ROM cresc cu un factor egal cu 4?<br />

- La iesirea unui circuit ROM se pot observa “glitch-uri”? Explicatie.<br />

Exemplu: Zar cu 7 fatete.<br />

Intrucat mecanic nu se poate realiza un zar cu 7 fatete, se va incerca o implementare<br />

electronica, pornind de la fatetele de zar de mai jos:<br />

Cu ajutorul unui tablou de LED-uri, marcate ca mai jos, se pot afisa fatetele zarului:<br />

Proiectare bazata pe ROM<br />

Proiectul consta in scrierea tabelei de adevar<br />

Optimizari: eliminarea iesirilor redundante si examinarea adresarii.


O implementare ROM simpla<br />

PLA (Programmable Logic Array -Tablou Logic Programabil)<br />

In cazul in care termenii AND ai decodificatorului din ROM ar putea fi<br />

programabili, ca si termenii SAU, s-ar putea folosi o serie de metode de minimizare<br />

in scopul reducerii dimensiunilor tabloului ROM. Se obtine un dispozitiv universal.<br />

Implementarea PLA a Zarului cu 7 fatete<br />

Ca si in cazul ROM, PLA asigura sinteza functiilor logice arbtrare utilizand<br />

implementari bazate pe SP.


Avantaje:<br />

- implementari minimizate si rapide<br />

- structuri regulate:<br />

- generare automata<br />

- proiectare facila<br />

- mai lenta decat implementarea optimala cu porti.<br />

Impachetarea PLA<br />

Adesea aceeasi linie de bit poate fi partajata de doua iesiri. I mod similar, este<br />

posibil, sa se aduca intrarile pe ambele laturi ale tabloului, ceea ce face ca desenul sa<br />

arate ca o pereche de PLAuri in oglinda.<br />

PAL (Programmable Array Logic – Tablouri ProgramabileLogice)<br />

O alta abordare a proiectarii logice structurate o constituie PAL-urile. Aceste<br />

dispozitive au fost in voga in anii 80 intrucat au inlocuit cu succes portile TTL si au<br />

contribuit la lansarea microprocesoarelor. Actualmente sunt depasite..<br />

PAL-urile au un decodificator programabil (planul AND) si o logica de slectie fixa.<br />

Aceste dispozitive au fost utile pentru implementarea expresiilor logice sub forma de<br />

SP, asigurand in acelasi timp, si posibilitati de comanda a sarcinilor mari. Ele se


procurau sub forma neprogramata. Programarea se putea face de catre utilizator cu<br />

echipamente ieftine.<br />

Concluzii:<br />

Multiplexoarele:<br />

- Un multiplexor cu N intrari poate implementa tabele de adevar cu N intrari si o<br />

iesire<br />

ROM-urile<br />

- Logica de decodificare partajata<br />

- Genereaza toate produsele<br />

- Pot implementa tabele de adevar cu un numar oarecare de iesiri<br />

- Usor de specificat<br />

- Plan (layout) regulat<br />

- Utilizare ineficienta a spatiului/timpului<br />

PLA-urile<br />

- Asigura realizari minimizate pentru SP<br />

- Genereaza numai produsele necesare<br />

- Pentru proiecte compacte este necesara minimizarea<br />

- Plan (layout) regulat<br />

PAL-urile<br />

- Usor de prefabricat si de impachetat<br />

Metode moderne: Celule Standard<br />

Se creaza, mai intai, o biblioteca de celule logice: porti, registre, multiplexoare,<br />

sumatoare, ploturi de I/E etc. O foaie de catalog, pentru fiecare celula, descrie functia,<br />

aria ocupata, puterea consumata, timpul de propagare, timpii de crestere si de cadere<br />

ca functii de sarcina etc<br />

Exemplu de celula standard<br />

Ca si in cazul proiectarii plachetelor la nivel de componente, cu doua decade in urma,<br />

uneltele CAD plaseaza si interconecteaza celulele, urmarindu-se:<br />

- minimizarea ariei ocupate<br />

- satisfacerea restrictiilor de timp.


Arii/Tablouri de Porti: <strong>Scurt</strong>area timpului de realizare a proiectului<br />

Tablourile de porti utilizeaza tablouri fixe de tranzistoare, care sunt “personalizate” in<br />

etapa finala de procesare in care se adauga fire/trasee metalice si contacte.<br />

Cea mai populara arhitectura este “Marea de Porti” (Sea of Gates), in care nucleul<br />

circuitului integrat este un tablou continuu de tranzistoare MOS. Trasarea straturilor<br />

de metal se efectueaza peste partea superioara a tranzistoarelor nefolosite.<br />

Avantaje:<br />

- pot fi prefabricate<br />

- sunt personalizate numai ultimele masti.


Tablou de porti: Exemplu.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!