Sunteți pe pagina 1din 265

Digitally signed by Dragos D.

Date: 2003.01.24 14:51:59 +02'00'


Signature Not Verified Location: 3x2cb.ines.ro

1.INTRODUCERE.

1.1. Scurt istoric privind dezvoltarea echipamentelor de prelucrare a datelor.


Un calculator modern reprezinta un sistem complex care inglobeaza in constructia sa
tehnologii diverse: electronice, magnetice, electromecanice, electrono-optice etc. Astfel, in
prezent, pentru realizarea unitatii centrale a unui calculator, care asigura stocarea
programului si a datelor pe termen scurt, secventierea instructiunilor si efectuarea
operatiilor de calcul, se utilizeaza, cu precadere, tehnologii microelectronice. Pentru
stocarea datelor si a programelor pe termen lung se folosesc suporturi magnetice sub forma
de benzi sau discuri, bazate pe diverse tehnologii magnetice/optice. Pentru implementarea
operatiilor de intrare/iesire sunt folosite in principal tehnologiile electronice si
electromecanice.
Evolutia calculatoarelor este strans legata de progresele inregistrate de tehnologiile amintite
mai sus. Cercetarile efectuate pentru realizarea de calculatoare cat mai performante au
impulsionat aprofundarea unor noi aspecte in cadrul acestor tehnologii.
Calculatoarele moderne reprezinta rezultatul unui indelungat proces de cautari ale unor
mijloace tehnice adecvate pentru mecanizarea si automatizarea operatiilor de calcul.
In evolutia mijloacelor de tehnica de calcul se pot evidentia mai multe etape.
1. Etapa instrumentelor de calcul.
• Secolul 12 en., China - abacul.
• Sfarsitul sec. 17 si inceputul sec.18, J. Napier si R. Bissaker -rigla de calcul.
2. Etapa masinilor mecanice de calcul ( bazate pe roti dintate angrenate: roata dintata
joaca rolul elementului cu mai multe stari stabile, fiecare stare codifica o cifra zecimala. )
• 1642. B. Pascal realizeaza o masina de adunat.
• 1694. von Leibniz construieste o masina de adunat si inmultit.
• 1823. Ch.Babbage proiecteaza primul calculator cu executie automata a programului.
Proiectul prevedea principalele elemente ale calculatoarelor moderne (unitatile de:
memorie, calcul, intrare, iesire si comanda ).
• 1872 E. Barbour realizeaza prima masina de calcul cu imprimanta.
• 1892. W. Burroughs construieste o masina de calcul de birou perfectionata.
• 1912. F. Baldwin si J. Monroe incep productia de masa a masinilor mecanice de
calculat, cu patru operatii aritmetice.
3. Masini electromecanice de calculat (bazate pe roti dintate angrenate, actionate
electric ).
• 1930. Productia de masa a masinilor electromecanice de calculat prevazute cu operatiile:
adunare, scadere, inmultire, impartire, radacina patrata, subtotal etc.
• 1937 - 1945. Masini electromecanice de calculat, bazate pe relee electromagnetice
(Mark I ), cu program cablat. Releele electromagnetice si contactele lor joaca rolul
elementelor bistabile. Cu ajutorul lor se pot codifica cifrele sistemului de numeratie binar.
In 1937 Howard Aiken, de la Universitatea Harward, a propus proiectul Calculatorului cu
Secventa Automata de Comanda. Acesta folosea principiile enuntate de Ch. Babbage si
tehnologia de implementare pentru calculatoarele electromecanice produse de IBM.
Constructia calculatorului Mark I a inceput in 1939 si s-a terminat la 7 august 1944, data ce
marcheaza inceputul erei calculatoarelor.
4. Masinile electronice de calcul cu program memorat, bazate la inceput pe tuburi
electronice, apoi pe tranzistori si circuite integrate pe scara simpla (SSI: sub 20 de
tranzistori pe pastila de Si), medie (MSI: 20 - 1000 de tranzistori pe pastila de Si), larga
(LSI: 1000 – 50.000 de tranzistori pe pastila de SI), foarte larga (VLSI: 50.000 – 100.0000
de tranzistori pe pastila de Si) si ultra larga (ULSI: peste 1.000.000 de tranzistori pe pastila
de Si).
Primele calculatoare realizate cu tuburi electronice:
• 1943: la Universitatea din Pennsylvania a inceput constructia primului calculator bazat
pe tuburi electronice ENIAC ( Electronic Numerical Integrator And Computer ), de catre o
echipa avand in frunte pe J.P. Eckert, J.W. Mauchly si J. von Neumann. Cu aceasta ocazie
s-a folosit ideea de a stoca in aceeasi memorie, atat datele, cat si programul, ceea ce a
permis modificarea relativ usoara a programului;
• 1945: a inceput constructia unui alt calculator electronic EDVAC (Electronic Discrete
Variable Automatic Computer) pe baza lucrarii lui J.von Neumann: "Prima schita de Raport
asupra lui EDVAC". Dupa elaborarea structurii logice de baza a calculatorului cu
program memorat, au fost stabilite entitatile functionale care concurau la realizarea acestuia:
- un mediu de intrare care sa permita introducerea unui numar nelimitat de operanzi si
instructiuni;
- o memorie din care se citesc operanzi sau instructiuni si in care se pot introduce, in
ordinea dorita, rezultatele;
- o sectiune de calcul, capabila sa efectueze operatii aritmetice sau logice asupra
operanzilor cititi din memorie;
- un mediu de iesire, care sa permita livrarea unui numar nelimitat de rezultate catre
utilizator;
- o unitate de comanda, capabila sa interpreteze instructiunile citite din memorie si sa
selecteze diverse variante de desfasurare a operatiilor, in functie de rezultatele obtinute
pe parcurs.
Marea majoritate a calculatoarelor construite pana in prezent se bazeaza pe aceste principii,
purtand numele de calculatoare de tip von Neumann.
Pe baza proiectului EDVAC, Eckert si Mauchly au produs, in 1951, in cadrul unei
companii proprii, primul calculator comercial UNIVAC 1.
La Universitatea Princeton, von Neumann a condus realizarea, in 1951, a calculatorului
IAS, care dispunea de posibilitatea de a-si modifica partea de adresa din instructiune.
Aceasta facilitate asigura reducerea spatiului ocupat in memorie de catre program, ceea ce
permite prelucrarea unor seturi mai mari de date.
Avand in vedere tehnologiile utilizate in constructia calculatoarelor, incepand cu anul 1946,
se pot evidentia cinci generatii de calculatoare. Intrucit functia de prelucrare a datelor este
legata si de cea de transmitere a datelor, printre caracteristicile specifice fiecarei generatii de
calculatoare trebuie incluse si elementele reprezentative privind tehnologiile
telecomunicatiilor.
In tabelul de mai jos se prezinta caracteristicile generatiilor de sisteme de calcul si de
telecomunicatii.
Tabelul 1.

Evolutia generatiilor de calculatoare si a telecomunicatiilor.


Generatia I ( 1946-1956 ).
1. Hardware calculatoare: relee, tuburi electronice, tambur mag netic, tub catodic.
2. Software calculatoare: programe cablate, cod masina, autocod.
3. Exemple de calculatoare: ENIAC, EDVAC, UNIVAC 1, IBM 650, CIFA 1-41,
CIFA 101-102, MARICCA, MECIPT-1 .
4. Tehnologia telecomunicatiilor: teletype, telefon.
5. Performantele calculatoarelor: capacitate memorie 2 Koct, viteza de operare 10.000
instr/s.

1
Denumirile calculatoarelor produse in Romania sunt prezentate cu litere cursive
Generatia a II-a ( 1957 - 1963 ).
1. Hardware calculatoare: tranzistoare, memorii cu ferite, cablaj imprimat, discuri
magnetice.
2. Software calculatoare: limbaje de nivel inalt (Algol, FORTRAN).
3. Exemple de calculatoare: NCR 501, IBM 7094, CDC 6600, DACICC-1/2,
CET 500/501, MECIPT-2,DACICC-200.
4. Tehnologia telecomunicatiilor: transmisiuni numerice, modulatie in coduri de impulsuri.
5. Performantele calculatoarelor: capacitatea memoriei 32 Koct,viteza de operare
2.000.000 instr/s.
Generatia a III-a ( 1964 -1981 )
1. Hardware calculatoare: circuite integrate, memorii semiconductoare, cablaj imprimat
multistrat, microprocesoare, discuri magnetice, minicalcula-
toare.
2. Software calculatoare: limbaje de nivel foarte inalt, programare structurata, LISP,
sisteme de operare orientate pe limbaje ( Algol, Pascal ),timp
partajat, grafica pe calculator, baze de date.
3. Exemple de calculatoare: IBM 360-370, PDP11/XX, Spectra 70, Honeywell 200,
Cray-1, Illiac IV, Cyber 205, RIAD 1-2, Felix C-256/512/1024,
Independent 100/102F, Coral 4001/4030.
4. Tehnologia telecomunicatiilor: comunicatii prin satelit, microunde, retele, fibre optice,
comutare de pachete.
5. Performantele calculatoarelor: capacitatea memoriei 2 Moct, viteza de operare 5 mil.op/s.
Generatia a IV-a ( 1982 - 1989 ).
1. Hardware calculatoare: VLSI, sisteme distribuite, discuri optice, microcalculatoare de
16/32 biti,superminicalculatoare, supercalculatoare.
2. Software calculatoare: sisteme de operare evoluate, ADA, pachete de programe de larga
utilizare, sisteme expert, limbaje orientate pe obiecte, baze de
date relationale.
3. Exemple de calculatoare: IBM-43xx, VAX-11/7xx, IBM-308x, RIAD3, Coral 4021,
Independent 106, Felix 5000, Coral 8730.
4. Tehnologia telecomunicatiilor: retele integrate de comunicatii numerice ( digitale ).
5. Performantele calculatoarelor: capacitatea memoriei 8 Moct, viteza de operare 30
mil.instr/s
Generatia a V-a ( 1990 - ).
1.Hardware calculatoare: tehnici evoluate de impachetare si interconectare, ULSI,
proiectare circuite integrate 3D, tehnologii Ga-AS si Josephson,
componente optice, arhitecturi paralele pentru prelucrarea
inferentelor, retele neuronale.
2. Software calculatoare: sisteme de operare cu interfata evoluata cu utilizatorul, limbaje
concurente, programare functionala, prelucrare simbolica
(limbaje naturale, recunoasterea formelor: imagini/voce), Prolog,
baze de cunostinte, sisteme expert evoluate, CAD, CAM, CAE,
multimedia, realitate virtuala, web.
3. Exemple de calculatoare: statii de lucru, super-calculatoare, retele de supercalculatoare,
proiectul japonez si alte proiecte elaborate in unele tari sau
grupuri de tari din Europa.
4. Tehnologia telecomunicatiilor: dezvoltarea extensiva a sistemelor distribuite, retele
locale, retele din fibra optica de mare capacitate retele de
transmisii radio la frecvente de ordinul GHz cu spectru
imprastiat, telefonie digitala mobila, fuzionarea
tehnologiilor comunicatiilor si calculatoarelor, Internet.
5. Performantele calculatoarelor: capacitatea memoriei zeci-sute Moct, viteza de operare
1 Ginstr - 1 Tinstr/s.

In prezent pentru circuitele integrate folosite in calculatoarele electronice se folosesc


numeroase tehnologii care se pot grupa in tehnologii bipolare si tehnologii MOS
Tehnologii bipolare:
• TTL (Transistor Transistor Logic):
- TTL-S (Schottky TTL),
- TTL-LS (Low-Power Schottky TTL),
- TTL-AS (Advanced Schottky TTL),
- TTL-ALS (Advanced Low-power Schottky TTL),
- FAST (Fairchild Advanced Schottky TTL).
• ECL (Emitter Coupled Logic).
• I2L (Integrated Injection Logic).
Tehnologii MOS:
• PMOS (MOS canal P).
• NMOS (MOS canal N):
- HMOS (High performance MOS).
• CMOS (Complementary MOS):
- HCMOS (High density CMOS),
- ACL (Advanced CMOS Logic).
• MNOS (Metal Nitride Oxide Semiconductor):
- FAMOS (Floating gate Avalanche injection MOS),
- FLOTOX (FLOating gate Tunnel Oxid)e.
Circuitele integrate care se folosesc in constructia calculatoreor se plaseaza in categoriile:
standard, specifice aplicatiilor ( ASIC - Application Specific Integrated Circuits ) si
programabile/configurabile.
La rindul lor circuitele ASIC se impart in:
• Circuite personalizate la cerere ( Semi-Custom ):
- Circuite configurabile ( Programmable Logic Devices ),
- Circuite predifuzate ( Gate Arrays ).
• Circuite realizate la comanda ( Custom ):
- Circuite precaracterizate ( Standard Cells ),
- Circuite realizate complet la cerere ( Full Custom ).
Se aminteste ca tranzistorul a fost inventat in anul 1947 si ca primele exemplare ocupau o
suprafata de 3,5 mm2 . La sfirsitul anilor 50 a aparut circuitul integrat care, grupand pe
aceeasi pastila mai multi tranzistori, a avut o evolutie spectaculoasa in sensul dublarii
numarului de componente pe pastila, la fiecare 18 luni. Aceasta s-a datorat in primul rand
numeroaselor perfectionari ale proceselor tehnologice, care permit rezolutii de ordinul a
2,5µm – 0,18 µm.
In continuare se vor da unele date privind tehnologiile circuitelor VLSI, in general, evolutia
memoriilor si a procesoarelor.
Reprezentarea sistemelor de calcul pe niveluri ierarhice.

Nivelul PMS Structuri: retele, sisteme de procesoare multiple,


(Processor, calculatoare.
Memory Componente: procesoare, memorii, comutatoare,
Switches ) traductoare, operatori asupra datelor,
legaturi, controlere.

Nivelul Subnivelul Aplicatii Structuri: pachete statis tice, ecuatii cu derivate


Progra- Limbajelor partiale, simulatoare de sisteme
melor. evoluate. energetice.
Componente: biblioteci matemetice, rutine, rutine de
formatare.

Rutine Structuri: functii matematice, pachete pentru


aplicative aplicatii grafice.
Componente: subrutine, alocatoare de memorie.

Pachete de Structuri: alocatoare de memorie, rutine de I/E,


asistenta in sisteme de fisiere.
in timpul Componente: apeluri ale sistemului de operare.
executiei.

Sisteme Structuri: planificatoare, alocatoare, comunicatii.


Operare Componente: subrutine, corutine, programe.

Subnivelul Structuri: set de instructiuni.


ISP Componente: stare memorie, stare procesor, calcul
(Instruction adresa efectiva, decodificare
Set Processor) instructiuni, executie instructiuni.

Nivelul Subnivelul Unitate Micropro- Structuri: microprogram, microrutina.


proiec- transferu- de co- gramata Componente: microsecventi ator, memorie
tarii rilor intre manda de microinstructiuni.
registre
Conven- Structuri: secventiator.
tionala Componente: masini secventiale.

Unitate de executie Structuri: unitate aritmetica, registre


generale.
Componente: registre, operatori asupra
datelor.

Subnivelul Circuite secventiale Structuri: numaratoare, genratoare


circuitelor functionale, registre.
de comuta- Componente: bistabile, latch-uri,linii de
tie. intarziere
Circuite combina- Structuri: codificatoare, decodificatoare,
tionale. operatori asupra datelor.
Componente: porti logice.

Nivelul circuitelor. Structuri: amplificatoare,elemente de intirziere,


orologiu /ceas, porti.
Componente: tranzistoare, relee, rezistente, capaci-
tati.

Bibliografie:
1. A.Petrescu. Calculatoare numerice. Note de curs.1999- 2000-2001, ( site-ul: www.csit-
sun.pub.ro si pe suport magnetic).
2. A.Petrescu. I. Francisc, Z. Racovita. Initiere in Structura Calculatoarelor Electronice.
Editura Teora. 1996.
3. A.S. Tanenbaum. Organizarea Structurata a Calculatoarelor. Editura AGORA, 1999.
4. L.N. Vintan. Arhitecturi de Procesoare cu Paralelism la Nivelul Instructiunilor. Editura
Academiei Romane. 2000.
5. D. Grigoras. Calcul Paralel. De la sisteme la programarea aplicatiilor. AGORA. 2000.
6. J. Hennessy, D. Paterson. Computer Architecture. A Quantitative Approach. 2nded.
1996. Morgan Kaufmann Publishers, Inc.
7. Z.F. Baruch. Sisteme de intrare/iesire ale calculatoarelor. Editura Albastra. 2000
8. S.G. Shiva. Computer Design and Architecture. 3rd Ed. Marcel Dekker Publishing
House. 2000.
9. J. Hennessy, D. Paterson. Computer Organization and Design. The Hardware/Software
Interface. 2nded.. 1998. Morgan Kaufmann Publishers, Inc.
10. R. Baron, L. Higbie. Computer Architecture. 1992. Addison Wesley Publishing
Company.
11. M. Morris Mano, Ch. R. Kime. Logic and Computer Design Fundamentals 2nd ed.
Prentice Hall International. Inc.
12. David Van den Bout. The Practical XILINX Designer Lab Book.Version 1.5, 1999.
Prentice Hall.
13. V..P. Heuring, H. F. Jordan. Computer Systems Design and Architecture. Addison
Wesley Longman, Inc. 1997.
1.2 Elemente introductive privind informatia.
Memorarea, regasirea si prelucrarea informatiei reprezinta operatii de baza intilnite in
studiul oricarui capitol al stiintei calculatoarelor.
Din punct de vedere lexicografic, informatia reprezinta cunostintele transmise sau
receptionate, care se refera la circumstante sau fapte particulare.
Sub aspect filosofic informatia se afla in urmatoarea relatie, in raport cu entitatile:
data, cunostinta, intelepciune: data < informatie < cunostinta < intelepciune.
Domeniul ingineriei considera ca informatia inlatura/elimina incertitudinea. Astfel,
informatia nu are nimic de-a face cu cunostinta sau semnificatia. Informatia este, in mod
natural, “ceea ce nu se poate prezice”.
In cadrul procesului edificarii domeniului teoriei informatiei s-au dat si precizat o serie
de definitii formale privind continutul informational al unui mesaj ( Hartley - 1928,
Kolmogorov - 1942, Wiener - 1948, Shannon - 1949 ).
Se considera un sistem reprezentand o multime formata din n obiecte, avand proprietatea
ca fiecare obiect poseda o probabilitate independenta pi de aparitie.
Incertitudinea H asociata acestui sistem este definita ca:
n
H = - ∑ pi log2 (pi),
i=1
in timp ce valoarea –H, reprezinta cantitatea de informatie asociata sistemului
Se presupune existenta unei urne cu 8 bile numerotate de la 1 la 8. Probabilitatea de a
extrage o cifra data, in urma unei trageri, este egala cu 1/8. Incertitudinea medie asociata
cu numarul selectat poate fi calculata cu ajutorul formulei de mai sus:

8
H = - ∑ 1/8. log2 (1/8) = - log2 (1/8) = log2 (1/8) = 3 biti.
i=1

Pentru a masura incertitudinea asociata sistemului s-a folosit o unitate de masura numita
bit (binary digit). Un bit este o masura a incertitudinii sau a informatiei asociate unei
conditii cu doua stari: fals/adevarat, inchis/deschis etc. Astfel, atunci cand se afirma ca
rezultatul aruncarii unei monede este “pajura”, s-a comunicat o informatie de: log2(2/1) =
1 bit.
Cantitatea de informatie care se castiga este egala cu cantitatea de incertitudine inlaturata
(in cazul de fata prin aflarea numarului extras din urna).
In situatia numarului selectat din urna s-a calculat ca sunt necesari trei biti de informatie
pentru a afla numarul de pe bila extrasa. Din punctul de vedere al definitiei bitului,
aceasta inseamna ca este permisa punerea a trei intrebari cu raspuns de tipul da - nu,
pentru a cunoaste numarul extras:

n<4?
Da Nu

n<2? n<6?
Da DaNu Nu
. . .
n<2? n<4? n<6? n<8?
Da Nu Da . Nu Da Nu Da . Nu

n=1 n=2 n=3 n=4 n=5 n=6 n=7 n=8

Cei trei biti de informatie, asociati cu aflarea numarului inscris pe bila, pot fi asamblati
in mesaje cu lungimea de trei simboluri 0 sau 1, unde 1 reprezinta simbolul asociat
raspunsului "da", in timp ce 0 este simbolul asociat cu raspunsul "nu". In tabelul de mai
jos se prezinta o schema posibila pentru codificarea evenimentului legat de extragerea
din urna a unei bile date:

Numarul bilei Schema mesajului

1 111
2 110
3 101
4 100
5 011
6 010
7 001
8 000

Se poate face observatia ca, in general, pentru a specifica identitatea unui numar inscris
pe bila extrasa, se pot folosi mai multe scheme de mesaje.
Legatura dintre mesaj si informatie reprezinta o aplicatie c:

c
M Æ I,

care asociaza ( pune in corespondenta ) mesajului M, informatia I. Corespondenta c


poarta numele de schema de codificare (cod, regula, de interpretare, cifru , cheie etc. ).
Adesea se pune problema cantitatii medii de informatie continuta intr-un sir de date,
reprezentand M mesaje. Aceasta poarta numele de entropie si poate fi calculata cu
ajutorul urmatoarei formule:
N
entropia = ∑ (Mi/N).log2(N/Mi),
i=1

unde:
- (Mi/N) reprezinta probabilitatea mesajului i, iar
- log2(N/Mi) constituie informatia din mesajul i.

Codificarea informatiei.
Codificarea informatiei se refera la reprezentarea acesteia. Gasirea unei codificari
corespunzatoare si eficiente constituie o problema extrem de importanta intrucat aceasta
are un impact pe o serie de niveluri.
Astfel, la nivelul echipamentelor de calcul si memorare, are influenta asupra numarului
de componente. In ceea ce priveste nivelul eficientei, influenta se refera la numarul de biti
utilizati. Sunt influentate, de asemenea, nivelul fiabilitatii, sub aspectul zgomotului si
nivelul securitatii, in ceea ce priveste criptarea.

Codificarea cu lungime fixa.


In cazul in care evenimentele au aceeasi probabilitate de aparitie, se pot utiliza codurile
de lungime fixa. Un asemenea cod trebuie sa foloseasca un numar suficient de biti pentru
a putea reprezenta continutul informational. De exemplu, in cazul cifrelor zecimale
{0,1,2,3,4,5,6,7,8,9} se foloseste un cod de 4 biti (binar-zecimal), denumit , in engleza,
BCD (Binary Coded Decimal). Lungimea codului (numarul de biti) rezulta din
urmatoarea expresie:
10
∑ (1/10).log2(10) = 3,322 < 4 biti
i=1

De asemenea, pentru cele 84 de caractere din Engleza: {A-Z (26), a-z (26), 0-9 (10),
punctuatie (9), matematice(9), financiare (4)} se foloseste un cod binar de 7 biti denumit
ASCII (American Standard Code for Information Interchange). Lungimea codului ASCII
rezulta din expresia de mai jos:

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

In continuare se vor prezenta exemple de codificari de lungime fixa.


Codificarea numerelor.
Numerele pozitve se pot codifica direct, sub forma unei secvente de biti, carora li se
asociaza ponderi diferite. De la dreapta la stanga, aceste ponderi reprezinta, in ordine
crescatoare, puteri ale lui 2. Valoarea v a unui numar de n biti, codificat in acest mod,
este data de expresia:

n-1
v = ∑ 2i.bi
i=0

unde bi constituie rangul i (bitul i) al reprezentarii.


Pentru numarul binar:

211 210 29 28 27 26 25 24 23 22 21 20

0 1 1 0 1 0 1 1 1 0 0 1

se va obtine valoarea 1721 in zecimal.


Adesea, reprezentarea numerelor in binar este greoaie, datorita numarului mare de
ranguri. Reprezentari cu lungime mai scurta se obtin in cazul utilizarii unor baze, care
sunt puteri ale lui 2. De exemplu: 8 si 16. In aceste situatii trecerea de la reprezentarea
binara la cea octala/hexazecimala si invers se realizeaza mecanic, impartind numarul
binar, de la dreapta la stanga, in triade/tetrade binare, carora li se pun in corespondenta
cifrele octale/hexazecimale corespunzatoare.

Baza 8 Baza 16

Triada binara Cifra octala Tetrada binara cifra hexa. Tetrada binara cifra hexa.

000 - 0 0000 - 0 1000 - 8


001 - 1 0001 - 1 1001 - 9
010 - 2 0010 - 2 1010 - a
011 - 3 0011 - 3 1011 - b
100 - 4 0100 - 4 1100 - c
101 - 5 0101 - 5 1101 - d
110 - 6 0110 - 6 1110 - e
111 - 7 0111 - 7 1111 - f

Astfel, numarul binar:


011010111001(2) va avea urmatoarele reprezentari:
octala:
3271(8) si
hexazecimala:
6b9(16),
care sunt de trei ori si, respectiv, de patru ori mai scurte.

Numere cu semn, reprezentarea in complementul fata de 2.


Un numar cu semn, in reprezentarea pe n biti, complementara fata de 2, va avea
urmatoarea structura:
n biti

-2n-1 2n-2 …. …. …. 23 22 21 20

bit de semn Gama de reprezentare:[ -2n-1 , 2n-1-1] virgula zecimala


(0 pentru ≥ 0,
1 pentru < 0)
Astfel, numerele zecimale 47(10) si –47(10), vor avea urmatoarele reprezentari binare, pe 8
biti, in complementul fata de 2:
47(10) 00101111(2)
-47(10) 11010001(2)
Reprezentarea numerelor intregi cu semn, in complementul fata de 2, permite utilizarea
aceleiasi proceduri mod 2n, atat pentru adunare, cat si pentru scadere. De asemenea,
procedura se utilizeaza si in cazul numerelor fara semn.
Deplasand virgula zecimala spre stanga, se pot reprezenta si numerele fractionare, ca in
exemplul urmator:
1101,0001 = -23 + 22 + 20 + 2-4 = -8 + 4 + 1 + 0,0625 = -2,9357

Codificarea cu lungime variabila.


In cazul unor evenimente cu probabilitati diferite de aparitie, se vor folosi secvente mai
scurte pentru codificarea evenimentelor cu probabilitati mari de aparitie, in timp ce
pentru codificarea evenimentelor cu probabilitati mici de aparitie se vor folosi secvente
mai lungi.
Exemplul 1.
Se considera 4 evenimente: A, B, C, D, cu probabilitatile de aparitie si cu codurile
asociate, conform tabelei de mai jos:

Eveniment A B C D

Prob. aparitie (pi) 1/2 1/4 1/8 1/8

Codificare 0 11 100 101

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


Transmiterea informatiei privind 1000 de evenimente necesita, in medie, 1750 biti.
O schema de decodificare a unui mesaj ce contine codurile unei secvente de evenimente
A, C, D, A, B, C etc. se conformeaza urmatoarei structuri arborescente:

0 1

A 0 1

0 1 B

C D
Pentru a realiza o codificare mai efeicienta, in mod current, se codifica secvente de
evenimente si nu evenimente individuale. Aceasta abordare este intalnita in algoritmii de
compresie a fisierelor.
Exemplul 2.
In cadrul acestui nou exemplu se considera suma a doua zaruri, in sensul evaluarii
continutului de informatie existent in suma obtinuta la o aruncare. Rezultatele inregistrate
in cadrul mai multor aruncari au probabilitati diferite. Posibilitatile de obtinere a
diferitelor sume sunt prezentate mai jos:

Informatia medie, la o aruncare, furnizata de suma a doua zaruri este urmatoare:

12 12
imed = ∑ (Mj/N).log2(N/Mj) = ∑ (pj).log2(1/pj) = 3,275 biti.
j=2 j=2

In continuare, se pune problema codificarii sumelor obtinute in cadrul aruncarilor a


doua zaruri.
Cel mai mare intreg dupa 3,274 este 4. Astfel, cu 4 biti, se pot codifica cele 11 valori ale
sumelor. Vor mai ramane neutilizate 5 coduri, corespunzatoare lui 0, 1, 13, 14, si 15.
Se pune problema daca exista o solutie de codificare mai buna?
Avand in vedere continuturile informationale diferite, ale diferitelor combinatii obtinute
la aruncarea zarurilor, se poate recurge la coduri de lungime diferita. Astfel, se poate
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
carui probabilitate de aparitie este egala cu suma probabilitatilor celor doi copii. Procesul
se continua pana cand se ajunge la un singur simbol.
Rezultatul acestei proceduri este arborele reprezentat mai jos, in cadrul caruia au fost
atribuite codificari fiecarui smbol prin etichetarea fiecarui copil din extrema dreapta cu
“1” si a fiecarui copil din extrema stanga cu ”0”.

Codificarea pentru fiecare simbol particular se obtine prin parcurgerea arborelui pe o


cale ce porneste de la radacina acestuia pana la simbolul care intereseaza. Aceasta forma
de codificare cu lungime variabila poarta numele de codificare Huffman.
Eficienta codificarii.
Eficienta unei metode de codificare poate fi masurata prin diferenta intre continutul
informational (entropia) al unui sir de simboluri si dimensiunea medie a codului.
Dimensiunea medie a codului stabilit pentru sumele obtinute la aruncarea a doua zaruri
se calculeaza astfel:
dmed = (1/36).5 + (2/36).4 + (3/36).3 + (4/36).3 + (5/36).3 + (6/36).3 +
+ (5/36).3 + (4/36).3 + (3/36).4 + (2/36).4 + (1/36).5 = 3,306
Rezultatul obtinut: dmed = 3,306 se apropie destul de mult de imed = 3,275.
In continuare se pune problema gasirii unor metode si mai eficiente de codificare.
Consideratii privind codificarea.
Schemele de codificare, care isi propun sa corespunda continutului informational al unei
secvente de date, se bazeaza pe reducerea redundantei. Acestea sunt in esenta tehnici de
compresie a datelor.
In multe cazuri insa se urmareste cresterea redundantei in vederea cresterii rezistentei
(coduri detectoare si corectoare de erori)la zgomot a sirului de date sau a simplificarii
manipularii datelor, prin stabilirea unor coduri de lungime fixa.
Detectarea si corectarea erorilor.
Se presupune ca se doreste transmisia sigura a rezultatului aruncarii unei monede, ceea ce
corespunde unei informatii de un bit.. Daca pe parcursul transmisiei a aparut o eroare de
un singur bit, un rezultat “0” va fi receptionat ca “1” si invers. Ambele coduri sunt valide
si nu se poate stabili , la receptie, faptul ca, in timpul transmisiei, a aparut o eroare.
In acest context se pune problema numarului de pozitii binare in cadrul carora bitii
corespunzatori a doua coduri valide, de aceeasi lungime, sunt diferiti. Aceasta mai poarta
numele de distanta Hamming. Astfel, modificarea unui bit, intr-un rang dat al unui cod,
sa nu-l transforme pe acesta intr-un alt cod valid. In exemplul privitor la rezultatul
aruncarii unei monede si al comunicarii acestuia, distanta Hamming intre cele doua
coduri este egala cu unu.
Detectarea erorii.
In mod natural se doreste un sistem de codificare in cadrul careia o eroare de un singur
bit sa nu produca un alt cod valid. Pentru a asigura detectarea unei erori de un singur bit ,
in cadrul unui cod de lungime oarecare, se adauga un bit de paritate. In acest mod
distanta Hamming minima intre doua coduri valide devine egala cu 2. Spre exemplificare
se prezinta mai jos o diagrama de codificare a rezultaului aruncarii unei monede, folosind
un bit suplimentar de paritate para, ceea ce inseamna ca bitul suplimentar va fi astfel ales
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
(D –1) erori la nivel de bit.
Detectarea erorilor.
Marind distanta Hamming intre doua cuvinte-cod valide la 3, se poate garanta ca
perechile de cuvinte-cod, care se obtin in cazul unei erori de un bit, nu se suprapun. In
cazul in care se detecteaza o eroare, aceasta se poate corecta intrucat pozitia bitului eronat
poate fi localizata. Aceasta rezulta din diagrama- hipercub de mai jos.

Daca D este distanta Hamming minima intre doua cuvinte-cod valide, se pot corecta
(D-1)/ biti eronati.
Intrebari:
- se pot detecta in mod sigur doi biti eronati in timp ce se corecteaza o eroare de un
bit?
- intotdeauna este necesara triplarea numarului de biti?
Schema de codificare cu 4 biti.
Prin folosirea a 4 biti se pot genera 8 codificari cu distanta Hamming egala cu 1, ceea ce
permite detectarea unei erori la nivelul unui singur bit. Astfel, se pot codifica 3 biti de
informatie cu 4 biti. Formatele de biti care contin o eroare difera de formatele codurilor
valide prin paritate, adica numarul de unitati este impar. Aceasta rezulta din diagrama de
mai jos, care constituie reprezentarea in plan a hipercubului corespunzator codificarii.

Din pacate schema de codificare cu 4 biti nu este mai buna decat schema de codificare cu
3 biti, din punctual de vedere al numarului de coduri separate la o distanta Hamming
egala cu 3. Se pot gasi insa doua codificari cu distanta Hamming egala cu 4, ceea ce
permite detectarea a doua erori de cate un bit si corectia unei singure erori de un bit.

Dupa cum se vede din diagrama de mai sus exista doar doua coduri care sunt separate
printr-o distanta Hamming egala cu 3.

Schema de codificare cu 5 biti.


Pentru a obtine mai mult de doua coduri separate printr-o distanta Hamming egala cu 3,
trebuie utilizati 5 biti pentru codificare.
Mai jos se prezinta 5 coduri {0000, 01111, 10101, 1010} separate printr-o distanta
Hamming ≤ 3.

In aceste conditii se poate corecta o eroare de 1 bit si se pot detecta unele dintre erorile de
2 biti (dar nu toate).
Aplicatiile teoriei codurilor.
Codificarea permite solutionarea multor probleme:
- detectarea erorilor multi-bit: folosind verificarea redundantei ciclice (CRC);
- corectarea erorilor in rafala: coduri reed-Solomon;
- imbunatatirea raportului S/Z: codificari/decodificari Viterbi, PRML;
In practica se utilizeaza combinatii de coduri diferite. Spre exemplu, in canalul numeric
satelit-receptor (DBS TV):
3. Elemente introductive privind operarea si organizarea unui sistem numeric.

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


de programe de sistem ( software de baza ), care asigura prelucrarea automata a
informatiilor, in conformitate cu algoritmii specificati de catre utilizator, prin programele
de aplicatii ( software de aplicatii - utilizator ).
Conform principiilor stabilite de John von Neumann un calculator trebuie sa posede
urmatoarele elemente:
- un mediu de intrare, pentru instructiuni si date ( operanzi );
- o memorie in care se stocheaza programul, datele initiale, rezultatele partiale si finale;
- un ansamblu de prelucrare, capabil sa efectueze operatii aritmetice si logice, in
conformitate cu un algoritm dat, specificat prin program;
- un mediu de iesire, pentru extragerea rezultatelor si prezentarea acestora intr-o forma
accesibila utilizatorului;
- un element de decizie care, pe baza rezultatelor partiale obtinute pe parcursul
prelucrarii, va selecta una din optiunile posibile de continuare a calculelor.
Programul elaborat, pentru un calculator numeric, reprezinta descrierea algoritmului de
rezolvare a unei probleme ( clase de probleme ) date, cu ajutorul instructiunilor pe care le
poate executa calculatorul respectiv.
Conform propunerii lui von Neumann, datele si programul sunt plasate in aceeasi
memorie, ceea ce a permis, la calculatoarele din generatia I-a, efectuarea unor operatii
aritmetice sau logice asupra unor campuri din instructiune, in vederea reducerii
dimensiunilor programelor.
Functionarea calculatorului are un caracter secvential, constand in citiri si executii
succesive ale instructiunilor programului.
Intr-un calculator pot fi evidentiate, pe parcursul executiei unui program, doua fluxuri de
informatii: fluxul datelor, care se prelucreaza, si fluxul instructiunilor, care controleaza,
comanda procesul de calcul.
Calculatoarele bazate pe principiile amintite mai sus se numesc calculatoare de tip von
Neumann sau conventionale, fiind comandate de fluxul de instructiuni.
In prezent se studiaza si realizeaza sub forma de modele de laborator noi tipuri de
calculatoare, neconventionale, bazate pe fluxul de date si fluxul de cereri.
In primul caz sunt amorsate, la un moment dat, toate operatiile din program pentru care
sunt disponibile datele implicate.
In al doilea caz necesitatea unui rezultat activeaza toate operatiile de calcul asociate.
Intrucat un calculator numeric este folosit, in esenta, pentru implementarea automata a
unui algoritm, se reaminteste ca un algoritm reprezinta un set finit de reguli, care
precizeaza o secventa de operatii, pentru solutionarea unei clase date de probleme.
Un algoritm poseda cinci elemente mai importante:
- caracter finit: trebuie sa se termine dupa un numar finit de pasi;
- caracter determinist: fiecare pas al unui algoritm trebuie definit in mod precis, actiunile
care se executa trebuie sa fie specificate riguros, fara ambiguitati, pentru fiecare caz.
- intrare: un algoritm are una sau mai multe intrari, reprezentind datele initiale;
- iesire: un algoritm are una sau mai multe iesiri, care reprezinta rezultatele, aflate intr-o
anumita relatie cu intrarile;
- eficacitate: un algoritm trebuie sa se execute exact si intr-un interval finit de timp.
Printre altele, analiza algoritmilor are ca scop determinarea performantelor acestora, in
sensul ca, daca pentru o problema exista mai multi algoritmi, trebuie sa se decida care din
ei este mai potrivit, sub aspectul numarului de operatii, al spatiului de memorie necesare
si, uneori, al puterii consumate, pentru implementare.
Teoria algoritmilor trateaza, in principal, problemele existentei sau nonexistentei
algoritmilor eficienti,pentru efectuarea unor calcule particulare.
Inainte de a incerca o descriere formala a unei metode de calcul se vor preciza unele
notiuni:
- variabilele de stare reprezinta marimi primare, care presupun unele valori bine definite
(ele pot reprezenta parametrii unui sistem fizic);
- un ansamblu de variabile de stare, in care fiecare poarta un nume, reprezinta multimea
variabilelor de stare;
- o atribuire data de valori pentru toate variabilele multimii variabilelor de stare poarta
numele de stare a multimii sau o stare presupune o valoare data fiecarei variabile de stare;
- ansamblul tuturor starilor posibile, pentru o multime data de variabile de stare,
formeaza spatiul starilor pentru acea multime;
- un calcul in spatiul starilor reprezinta o secventa de stari in acel spatiu, primul element
al secventei reprezinta starea initiala, iar ultimul constituie starea finala.
Din punct de vedere formal, metoda de calcul reprezinta un cuadruplu:
< Q, I, E, f >,
in care s-au facut urmatoarele notatii:
Q -multimea starilor calculului,
I - multimea intrarilor,
E -multimea iesirilor,
f - multimea functiilor de calcul, definite in Q.
In plus:
I⊂ Q si E⊂ Q,
iar pentru ∀ q, q ⊂ E , f trebuie sa lase nemodificate elementele multimii E, adica:
f(q) = q,
Fiecare intrare x in multimea I defineste o secventa de calcul:
x0, x1, x2,..,xk,...., dupa cum urmeaza:
x0 = x si x(k+1) = f(xk), pentru k > 0.
Se poate spune ca secventa de calcul se termina in k pasi, daca k este cel mai mic intreg
pentru care xk este in E. In acest caz se spune ca intrarea x produce iesirea xk.
Se observa ca daca xk ⊂ E, la fel si x(k+1) ⊂ E, intrucat, conform definitiei date mai sus,
x(k+1) = xk.
Unele secvente de calcul pot avea o lungime infinita.
Un algoritm reprezinta o metoda de calcul care se termina dupa un numar finit (eventual
foarte mare) de pasi, pentru toate intrarile x ⊂ I.

Exemplu: Algoritmul MAX.


Acest algoritm gaseste elementul cu valoarea cea mai mare al multimii { A(i) },
unde 1 ≤ i ≤ n, si o atribuie iesirii MAX.
In cele ce urmeaza operatorul " " specifica atribuirea unei valori variabilei de stare
din membrul stang, obtinuta prin evaluarea functiei din membrul drept al expresiei.
Se vor folosi doua variabile de stare pentru calcul: xc ( x-curent ), xm (x-maxim ).
ALGORITM: MAX.
intrari: { A(i) }, 1 ≤ i ≤ n,
iesiri: MAX,
var.de stare: { xc, xm }.
f: secventa de calcul:
1. if n < 1 go to STOP
2. if n = 1 then MAX A(1) and go to 9 (STOP)
3. xm A(1); xc A(2);
4. if xm < xc then xm xc
5. xc A(i)
6. i i+1
7. if i > n then MAX xm and go to STOP
8. go to 4
9. STOP
Mecanizarea acestui algoritm presupune existenta unui modul, care dispune de
urmatoarele resurse hardware:
- RC: registru in care se aduce valoarea curenta A(i);
- RM: registru in care se plaseaza valoarea curenta maxima A(j);
- N si UNU: registre in care se pastreaza constantele n si 1;
- CNT: contor pentru indexul i;
- RD: registru in care se plaseaza rezultatul scaderii;
- MAX: registru de iesire ( coincide ca nume cu iesirea MAX );
- START: bistabil in care se inregistreaza comanda externa start;
- SUM/DIF: unitate logica combinationala, care efectueaza adunarea/scaderea;
- un automat cu 10 stari distincte.
Se considera ca intrarile A(i) sunt furnizate din exterior in mod curent si ca nu sunt
stocate in modul. Astfel, se pot observa, in continuare, unele diferente nesemnificative
functional in implementarea fizica a algoritmului, in raport cu prezentarea lui teoretica.
Schema care va efectua automat algoritmul va purta numele MODULE: MAX si va
opera cu numere binare intregi si pozitive.
Urmeaza descrierea modulului si a modului sau de operare (nu se specifica lungimea
operanzilor ).
Operatorul " " specifica fortarea valorii numerice, obtinuta ca urmare a evaluarii
termenul din dreapta al expresiei, in registrul din termenul din stanga al expresiei.
MODULE: MAX
INTRARI: A(i); start; RESET; n;
IESIRI: MAX;
MEMORII: RC; RM; N; UNU; CNT; RD; MAX; START /* Registre care corespund
/* variabilelor de stare, atat pentru unitatea de executie, cat si pentru unitatea de comanda
1. if (START = 0) then go to 1 /* cicleaza pentru START
2. RC 0; RD 0; RM 0; N n; UNU 1; CNT 1;
START 0 /* Initializare
3. if N = 0 then go to 1
4. RC A(CNT)
5. RD DIF(RC,RM) /* DIF(RC,RM) = RC - RM
6. if RD > 0 then RM RC
7. CNT SUM(CNT,UNU) /* SUM(CNT,UNU) = CNT + UNU
8. RD DIF(N,CNT) /* DIF(N,CNT) = N - CNT
9. if RD < 0 then MAX RM and go to 1
10. go to 4
ENDSEQ /* Sfarsit secventa
if RESET = 1 then go to 1 /*Operatia RESET indiferent de stadiul executiei in
/*secventa
if start = 1 then START = 1 /* Fortarea in 1 a bistabilului START, la aparitia intrarii
/*start = 1
ENDMODULE /* Sfarsitul descrierii modulului
Implementarea fizica a modulului presupune existenta urmatoarelor elemente:
- un ceas, care asigura sincronizarea sistemului;
- o intrare start, sincrona cu ceasul, care este stocata temporar intr-un bistabil (START);
- o intrare asincrona RESET,care forteaza sistemul instarea 1.
Intrarea RESET este indicata la sfirsitul descrierii secventei de lucru, deoarece se aplica
asincron.
Descrierea secventei se termina cu marcajul ENDSEQ, modulul fiind cuprins intre
numele MODULE si marcajul ENDMODULE.
Stabilirea schemei modulului presupune evidentierea unitatii de executie, in care se
prelucreaza fluxul de date, si a unitatii de comanda, care asigura fluxul de control,
mentionindu-se resursele hardware asociate.
Prima iteratie a procesului de realizarea/”mecanizare” a algoritmului MAX este data mai
jos:

Unitatea de Executie

RC SUM/DIF N
A[i]
MAX

RM RD UNU
n

MAX CNT

RESET Ceas RD … … .. Comenzi

Unitatea de Comanda
start START … …
AUTOMAT
DE
COMANDA
CEAS
RESET
Evolutia automatului din unitatea de comanda poate fi ilustrata cu ajutorul grafului de
mai jos, in care nodurile marcate cu cifre reprezinta starile automatului, iar arcele
orientate marcheaza taranzitiile conditionate/neconditionate.

RESET START=0
1.

start START=1

2.

N=0

3.

N≠ 0
4.

5.

6.

7.
RD < 0

8.

9.

RD ≥ 0

10
Diagrama de stari prezentata mai sus se utilizeaza pentru proiectarea automatului de
comanda, care asigura fluxul de control necesar derularii algoritmului MAX.
Procesul de proiectare a sistemului numeric, corespunzator algoritmului dat, necesita mai
multe etape, care vor fi ilustrate in cadrul cursului Calculatoare Numerice.

Masina Turing. In literatura de specialitate consacrata studierii posibilitatilor de


mecanizare a algoritmilor Masina Turing joaca un rol important.
Masina Turing se caracterizeaza prin doua principii de baza:
- descompunerea in operatii elementare a executiei unui algoritm este dusa la limita,
de exemplu adunare se implementeaza prin incrementari repetate;
- memoria masinii se prezinta sub forma unei benzi nelimitate, formata din
compartimente succesive in care se poate afla un simbol, reprezentind o informatie;
- conceptul de memorie infinita este pur matematic.
Masina opereaza asupra informatiilor reprezentate prin simboluri luate dintr-un alfabet
finit: a0, a1, a2,....,ai, exterior masinii. Printre simboluri se afla un simbol special V, care
indica lipsa unei informatii.
Fiecare compartiment al benzii, la un moment dat, contine un singur simbol.
Functionarea are loc in cicluri succesive, tratandu-se la fiecare pas cate un singur simbol.
Masina poseda un cod de instructiuni, specificat intr-un alfabet intern: F0, F1, F2,....,Fp.
O instructiune defineste in fiecare ciclu starea dispozitivului de prelucrare. Unul din
codurile de instructiuni, notat cu A, specifica oprirea masinii.
In fiecare ciclu un simbol de pe banda este prelucrat pe baza unui operator Fi.
In afara benzii infinite masina Turing mai contine:
- un element de executie si comanda: operatorul Ω ,
- o celula de memorie, M, in care se stocheaza instructiunea ( functia ) urmatoare,
- un dispozitiv, d, de antrenare a benzii in ambele sensuri, prin fata unui cap de
citire/scriere; comanda de antrenare a benzii este codificata dupa cum urmeaza:
"+" deplasare la stanga,
"-" deplasare la dreapta,
"0" fara deplasare.
Schema bloc a masinii Turing este data mai jos:
Informatia de prelucrat Instructiunea curenta
aI ai Fi
Cap citire/
scriere Operatorul Ω M
.
. aj d Fj
. Informatia prelucrata Instructiunea urmatoare
. Banda infinita/Memoria
.
. -
d
0 Comanda deplasarii
+

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


operarea are loc in timp finit, adica se va intalni simbolul A, masina va prelucra
informatia ai. In caz contrar, operarea are loc fara oprire si masina nu poate trata
informatia respectiva.
Operarea masinii Turing este definita prin tabelul de corespondenta intre dubletii de
intrare < ai, Fi > si tripletii de iesire < aj, Fj, d >. In fiecare ciclu de lucru operatorul Ω
efectueaza transformarea:
< ai, Fi > < aj, Fj, d >,
simbolul ai fiind inlocuit cu simbolul aj.
Banda este deplasata conform codului simbolului d, iar Fj este stocat in memoria M, pana
in ciclul urmator.
In vederea executiei, un algoritm trebuie descris sub forma urmatorului tablou:
Fi

ai aj Fj d

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


poate fi amorsata cunoscand continutul celulei de pe banda, plasata in fata capului de
citire/scriere, si instructiunea initiala.
Pentru exemplificare, se va considera cazul unui numar zecimal n care va fi incrementat.
Se presupune ca pe banda se afla, in celule succesive, cifrele unui numar zecimal,
incadrate la stanga si la dreapta de simbolul V.Algoritmul consta in examinarea cifrelor
incepand de la dreapta.
Se incrementeaza prima cifra la dreapta si procesul se opreste daca rezultatul este diferit
de zero. In cazul in care rezultatul este zero ( depaseste 9 ) se mai efectueaza o deplasare
a benzii spre dreapta, incrementandu-se noua cifra.
Alfabetul extern al masinii consta in 10 cifre zecimale si din simbolul vid V.
Alfabetul instructiunilor Fi contine functia F, care asigura incrementarea si functia A
care comanda oprirea.
Tabelul de functionare este urmatorul

Informatia ai Instructiunea Fi

0 1A0
1 2A0
2 3A0
3 4A0
4 5A0
5 6A0
6 7A0
7 8A0
8 9A0
9 0F -
V 1A0
In cazul cifrelor 0 – 8, are loc incremntarea si oprirea masinii, iar in cazul cifrei 9
procesul continua prin incrementarea simbolului si propagarea transportului, cu
deplasarea benzii spre dreapta si incrementarea urmatorului simbol. Daca urmatorul
simbol este din gama 0 - 9 situatia este aceeasi. Daca simbolul este V, are loc inlocuirea
lui cu 1 si masina se opreste.
Concluzii. Masina Turing reprezinta cea mai simpla entitate care se poate imagina in
vederea prelucrarii automate a informatiei.
In masina Turing se pot regasi o serie de elemente comune cu calculatoarele numerice:
- codificarea informatiei; exista doua limbaje/coduri independente: limbajul extern,
pentru codificarea informatiilor manipulate de catre masina, si limbajul propriu al
instructiunilor/functiilor masinii;
- functionarea automata a masinii se bazeaza pe un set limitat de instructiuni/functii;
- operarea masinii are un caracter secvential, executia instructiunii curente este insotita
de pregatirea executiei operatiei urmatoare;
- executia unui algoritm de catre masina se traduce prin examinarea unui tablou care
contine toate situatiile posibile, ceea ce corespunde unui program cablat, reprezentand un
algoritm independent de informatia care se trateaza;
- unele informatii de baza pot avea un caracter conditional, evenimentul urmator va
depinde de rezultatul operatiei curente;
- memoria M este ireductibila si aminteste contorul programului/registrul instructiunii
din calculatoarele conventionale;
- masina Turing are un program fix; pentru a-l modifica trebuie reconstruita masina.
Masina Turing nu are un caracter universal. Pentru a deveni universala trebuie sa
indeplineasca urmatoarele conditii:
- sa accepte toate alfabetele, conditie usor de realizat daca alfabetele se codifica binar, iar
masina va trata toate codurile binare;
- sa aibe posibilitatea de a i se introduce din exterior un tabel de functionare, pentru a
executa un algoritm dat, adica un program,ceea ce caracterizeaza masina von Neumann.
4. Modalitati de reprezentare a calculatoarelor.

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


Din punct de vedere functional, sub forma cea mai generala, un calculator se poate reprezenta
prin tripletul:
< I, E, C >,
unde:
- I constituie multimea intrarilor,
- E corespunde multimii iesirilor,
- C ⊂ I x E reprezinta o submultime a produselor carteziene intre elementele multimii I si
elementele multimii E. C realizeaza aplicatii din multimea intrarilor I, in multimea iesirilor E.
Pentru a facilita studiul unui calculator sub aspect functional, adesea se recurge la reprezentarea
lui sub forma unei ierarhii de niveluri imbricate.
Un nivel este constituit din multimea aplicatiilor asupra elementelor multimii de intrare pentru
nivelul dat, cat si asupra elementelor multimilor de intrare si iesire de la nivelul inferior,
imbricat. Aplicatiile de la un nivel dat pot constitui aplicatii si pentru nivelul superior urmator.
O posibilitate de reprezentare este data mai jos unde se pot distinge trei niveluri imbricate:
- aplicatiile/functiile primitive ale masinii de baza implementate in hardware, capabila sa execute
operatii elementare,
- functiile standard/predefinite reprezentate prin nivelul instruciunilor masinii conventionale,
- functiile construite de utilizator, pe baza instructiunilor masinii conventionale, pentru diverse
tipuri de aplicatii concrete.

Nivelul aplicatiilor/functiilor primitive


masina de baza ( realizata in hardware )
capabila sa execute operatii elementare.

Nivelul functiilor standard/predefinite; nivelul


instructiunilor masinii conventionale.

Nivelul functiilor construite de utilizator pe baza functiilor de


la nivelul inferior. Acesta este nivelul aplicativ al calculatorului.
La nivelul masinii conventionale se defineste notiunea de arhitectura a unui calculator numeric
prin cuadruplul:
A = < PI,PE,RG,I >
unde:
PI = { PI0,....,PIi } este multimea porturilor de intrare,
PE = { PE0,....,PEj } este multime porturilor de iesire,
RG = { RG0,....,RGk } este ansamblul registrelor generale din unitatea de executie,
I = { I0,......,Il } este setul instructiunilor calculatorului.
Porturile de intrare si iesire sunt utilizate pentru schimbul de informatii cu mediul inconjurator,
prin intermediul echipamentelorperiferice, in timp ce registrele generale sunt folosite pentru
stocarea diferitelor variabile de stare.
Sub forma unui prim exemplu se prezinta mai jos arhitectura microprocesorului Intel 8080.

7 0 7 0

PI0 F
…….. A 7 0

PI255 B C
D E
PE0 H L
……. SP
PE255 PC
15 0
Atat porturile de intrare PI0,.....,PI255, cat si porturile de iesire PE0,....,PE255 au cate 8 biti.
In cadrul registrelor generale se intalnesc si o serie de registre cu caracter specializat in ceea ce
priveste utilizarea:
- A este registrul acumulator principal, folosit in cele mai multe operatii aritmetice si logice;
- B, C, D, E, H, L sint registre de uz general, desi unele au si utilizari speciale ( H si L sunt
folosite adesea pentru formarea unor adrese de operanzi pe 16 biti );
- F este registrul indicatorilor de conditii, furnizati de unitatea de executie dupa fiecare operatie
( CY - transport in afara rangului de semn, AC - transportauxiliar intretetradele octetului
rezultat, S - semnul rezultatului, Z - indicator de rezultat zero, P - indicator privind
paritatea numarului de unitati din rezultat ). Pozitiile ocupate de acesti indicatori de conditii in
registrul F sunt date mai jos:

7 6 5 4 3 2 1 0

S7 Z6 *5 4
AC *3 P2 *1 0
CY

- SP este indicatorul de stiva, care asigura accesul la o structura de tip stiva organizata in
memorie;
- PC contor program, pentru adresarea instructiunilor din memorie.
Lista de instructiuni a microprocesorului 8080 contine 78 de instructiuni.
Un alt exemplu il constituie arhitectura microprocesorului 8086:

15 8 7 0
AX: AH AL Acumulator
BX: BH BL Registru - baza
CX: CH CL Registru - contor
DX: DH DL Registru - date

SP Indicator - stiva
BP Indicator - baza
SI Indicator - sursa
DI Indicator - destinatie

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

* * O D I T S Z * A * P * C
Semnificatiile indicatorilor de conditii sint urmatoarele: O - depasira aritmatica, D - directia la
explorarea sirurilor, I - activare/dezactivare intreruperi, T - capcana pentru lucrul pas cu pas, S -
semn, Z - zero, A - transport auxiliar, P - paritate, C - transport in afara rangului de semn.

15 0

CS Registrul segmentului de cod


SS
Registrul segmentului de date
DS Registrul segmentului stivei
ES
Registrul segmentului suplimentar

15 0
Indicator de instructiune
IP
(Contorul Programului)
Microprocesorul 8086 mai poseda cate doua tablouri de porturi de intrare/iesire, a cate 65536
octeti fiecare:

PI0, ……………,.PI65536 65536 Porturi de Intrare organizate pe octe

PE0, ……………,.PE65536 65536 Porturi de Iesire organizate pe octeti

Nota: Porturile de I/E pot fi organizate si pe cuvinte de 16 biti, la dimensiunea de 32768 cuvinte
fiecare tablou de porturi.
Tinand seama de toate modurile de adresare, microprocesorul 8086 dispune peste 300 de
instructiuni diferite.
Ultimul exemplu se refera la unitate centrala a calculatorului FELIX 5000, care este vazuta de
catre programator sub formaa 16 registre generale RG0,...,RG15, de cate 32 de biti, si a unui
cuvant dublu de stare program ( PSW Program Status Word ), care stocheaza contorul
program si o serie de indicatori de conditii:
0 31

RG0 Registrele Generale

…………………………………………………..
RG15

Cuvantul de stare program ( PSW ):


0 ……………………………….8 9 ……………………………………………….31

PC

32 33 34 35 36 37 38 39 40 41

DI DS DD DB Z S D C IS IE

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

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

Campurile PSW au urmatoarele semnificatii:


PC - contor program;
Masti de depasire:
DI,DS - depasire inferioara/superioara in virgula mobila:
- 64 < E < 64 , ( E = exponent );
DD- depasire zecimala;
DB - depasire binara: -1 < n < 1, ( n = mantisa ).
Daca masca este unu atunci derutarea este interzsisa.
Indicatorii de conditii ai rezultatului:
Z = 1 - rezultat nul;
S = 1 - rezultat < 0;
D = 1 - depasire;
C = 1 - transport.
Masti de intrerupere:
IS - masca intreruperi de I/E;
IE - masca intreruperi externe;
CE - masca intreruperi contor nul.
Daca masca este unu, intreruperea este inhibata si ramane in asteptare.
Nivelul programului:
NP = 0 - unitatea centrala opereaza in modul privilegiat ( poate executa toate instructiunile );
NP = 1 - unitate centrala opereaza in modul normal ( incercarea de a executa instructiunile de
sistem genereaza o derutare ).
Cheia de acces:
CA = cheia de acces la paginile de memorie, de cite 2Ko, protejate prin chei de protectie.
Masca de rotunjire:
MR = 0 - se rotunjeste rezultatul operatiei in virgula mobila;
MR = 1 - rezultatul nu se rotunjeste.
Paritate memorie:
PM = 0 - eroarea de paritate la memorie este tratata prin deru tare;
PM = 1 - eroarea se trateaza prin intrerupere.
Nivelul de intrerupere asociat programului:
NIT- defineste nivelul de prioritate al programului in curs de executie ( pot exista cel mult 128
niveluri de prioritate ).
Calculatorul FELIX 5000 are implementate 102 instructiuni, din 128 instructiuni posibile.
Cunoscand arhitectura unui calculator ( porturile de I/E, setul registrelor generale, indicatorii de
conditii, lista de instruc-tiuni - inclusuiv modurile de calcul pentru adresa efectiva- ) se pot scrie
programe la nivelul masinii conventionale ( in limbaj de asamblare ).
Reprezentarea structurala a unui calculator pleaca de la ideea ca acesta reprezinta un
agregat/sistem, care consta din componente primitive ( primitive functionale ) interconectate
intr-o maniera data, pentru a putea executa operatii specifice, de prelucrare a informatiei.
Componentele se caracterizeaza printr-o serie de atribute, iar atributele - prin valori. Informatia
poate fi masurata in biti, ranguri zecimale, caractere alfanumerice etc. Pe linga functiile
specifice de prelucrare a informatiei, componentele primitive se mai caracterizeaza prin
debit de transfer si capacitate de stocare ale informatiilor.
Aceste caracteristici prezintaimportantapentru studiul sistemelor de calcul cu ajutorul metodelor
cercetarii operationale, in numeroase aplicatii ( multiprogramare, multiprelucrare, timp di-
vizat, retele de calculatoare etc. ), in care intervin congestii, cozi de asteptare, zone tampon
( buffer ), debite de transfer al datelor etc.
Din punct de vedere structural sistemul de calcul poate fi descompus in:
- unitatea de intrare ( UI ),
- unitatea centrala ( UCe ),
- unitatea de iesire ( UE ).

I E
UI UCe UE

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


( traductoarele/ elementele de executie ) care preiau informatia din mediul extern si o furni-
zeaza in sistem sau care executa diferite actiuni asupra mediului extern, ca urmare a interpretarii
informatiei prelucrate de calculator.
Unitatea centrala asigura stocarea programului, a datelor si realizeaza prelucrarea automata a
acestora pe baza interpretariiprogramului dat.
Pentru a putea intelege organizarea si operarea unor sisteme complexe cum sunt calculatoarele
se impune descompunerea lor in unitati functionale mai simple, cu precizarea semnalelor
manipulate si al modului lor de dialog.
Astfel, rafinarea structurii sistemului de calcul evidentiaza in zonele UI si UE:
- subsistemul de intrare ( SI ),
- subsistemul de iesire ( SE ),
- echipamentele periferice de intrare ( EPI ) si echipamentele periferice de iesire ( EPE ).
EPI au rolul de a prelua datele de la diverse traductoare, evenual stocata pe diversi purtatori
fizici, si a le aduce la o forma compatibila cu intrarile SI ( ca naturafizica,format de reprezen-
tare etc ).
EPE au functia de a prelua datele prelucrate, furnizate prin SE, si de a le aduce la o forma
corespunzatoare destinatiei: semnale specifice diferitelor elemente de executie ( in cazul
conducerii proceselor tehnologice ) sau de a le plasa pe un anumit suport fizic etc.
Subsistemele de I/E asigura transferul, autonom sau sub controlul UCe, al informatiilor intre
UCe si EP prin realizarea unei adaptari de debite de transfer ( vitezele de operare ale acestora
difera cu mai multe ordine de marime ). Uneori sint implementate si alte operatii: modificarea
formatului de reprezentare a datelor, validari, verificari etc.
La nivelul UCe se pot distinge urmatoarele unitati functionale:
- unitatea de memorie ( UM ),
- unitatea de executie ( UE ),
- unitatea de comanda ( UC ).

UCe
Date/
EPI SI UM SE EPE
Instr. Instr. Date
Date Rez. Comenzi
Cond Cond
UE UC

Com
Comenzi
Conditii

Comenzi

date /adrese
instructiuni
comenzi,
conditii/indicatori de stare/stari.
Unitatea de memorie are functia de stocare a datelor initiale, a programului, a rezultatelor
intermediare si finale. In sistemele moderne ea poate opera autonom, atat cu SI/SE, cat si cu
procesorul ( ansamblul unitate de comanda - unitate de executie ). Unitatea de memorie are o
organizare liniara, constand in celule de stocare a informatiei, al caror continut poate fi
manipulat prin specificarea adresei celulei date.
Memoria
(n-1) 0

Celula 0

Celula 1

(m-1) 0

Adresa i Celula i
m
Registrul de adrese
Celula 2(m -1)

(m-1)
Adresa ia valori cuprinse intre 0 si 2 unde m este numarul de ranguri binare ale registrului
de adrese.
Unitatea de executie asigura, sub controlul unitatii de comanda, o succesiune de operatii
aritmetice si logice asupra datelor preluate din unitatea de memorie sau din memoria locala-
proprie (implementata sub forma unor registre generale -RG-), rezultatele fiind returnate in
unitatea de memorie sau in registrele generale.
Dupa fiecare operatie UE actualizeaza starea unor indicatori de conditii, care reflecta
caracteristicile rezultatului curent ( < 0, > 0, = 0, paritate, transport, depasire etc. ).
Unitatea de comanda prelucreaza fluxul de instructiuni, care constituie programul. Ea furnizeaza
semnale de comanda pentru celelalte unitati, coordonind functionarea lor in conformitate cu
cerintele programului. UC poate examina, in cadrul executiei unei instructiuni date, informatia
de stare asociata fiecarei unitati, luand in continuare deciziile corespunzatoare pentru executia
corecta a programului.
Unitatea de comanda se poate implementa sub forma conventionala ( ca automat secvential cu
stari codificate sau cu stari complet decodificate ) sau sub forma microprogramata ( cu stocarea
semnalelor de comanda, in maniera statica, intr-o memorie rapida ).
Inunele cazuri UC este denumita si unitate deprelucrare a instructiunilor - unitatea I, iar unitatile
de executie si de memorie sunt notate cu E si respectiv cu M.
Astfel, un calculator C ( unitatea centrala ) poate fi reprezentat prin expresia:
C = I [ E - M ].
In cadrul notatiei structurale PMS ( in care sunt folosite drept componente primitive: P -
procesorul, M - memoria, S - comutatorul, D - operatorul asupra datelor, K - operatorul de
comanda, L - legatura, T - terminalul/traductorul ) un calculator C se descrie prin formula:

C=M-P-T
Prima notatie este utila in cazul sistemelor constituite din mai multe unitati de executie si
memorii asociate, controlate de o singura unitate de comanda( Sisteme cu un singur Flux de
Instructiuni si mai Multe Fluxuri de Date - SIMD - Single Instruction Stream Multiple Data
Stream ).
Sistemele obisnuite au un singur flux de instructiuni si un singur flux de date SISD - Single
Instruction Stream Single Data Stream ).
In rezumat se poate observa ca:
- ansamblul: UE + UC = P ( Procesor sau Unitate Centrala de Prelucrare - UCP sau CPU ),
- ansamblul: P + M = UC ( Unitate Centrala ),
- ansamblul: UC + SI + SE + Software = Sistem de calcul.
In continuare se vor prezenta cateva exemple de sisteme de calcul, folosind notatia PMS:
- sistem de calcul in care terminalele ( echipamentele de I/E ) transfera datele cu memoria prin
intermediul p[rocesorului:

M P S K1 T1

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

M S1 P S2 K2 T2

K3 T3

K1 T1

Instructiunile calculatorului reprezinta o colectie de informatii privind operatiile operatiile care


se pot efectua intr-un calculator dat.
Sub forma cea mai generala instructiunile se impart in doua categorii:
- instructiuni operationale si de transfer al informatiilor, inclusiv instructiunile de I/E;
- instructiuni cu caracter de decizie, care modifica secventa de executie a programului in mod
conditionat de o serie de indicatori sau in mod neconditionat.
Instructiunile sunt formate din mai multe cimpuri, dintre care se mentioneaza urmatoarele:
- codul de operatie/functia, care specifica operatia/actiunea elementara evocata de instructiune:
aritmetica, logica, transfer de date, transfer al comenzii etc.;
- adresa operandului/instructiunii, care specifica locatia de memorie cu care se face transferul
de date sau de la care se citeste o instructiune.
In cazul instructiunilor cu caracter operational, structura instructiunii poate contine, pe linga
campul codului de operatie, unul sau mai multe campuri pentru adrese.
Instructiunea cu o adresa:

COP ADRESA
Instructiunea cu doua adrese:

COP ADRESA1 ADRESA2

Instructiunea cu trei adrese:

COP ADRESA1 ADRESA2 ADRESA3

In primul caz instructiunea specifica adresa unui singur operand, cel de-al doilea operand (in
cazul operatiilor ce implica doi opeanzi) fiind deja adus in UE. De regula, rezultatul ramane in
UE.
In cazul al doilea sunt prezente adresele celor doi operanzi (adresa operandului destinatie si
adresa operandului sursa - rezultatul operatiei se stocheazalaadresaoperandului destinatie).
Campul ADRESA3, in cel de-al treilea caz, poate specifica adresa la care se trimite rezultatul.
Instructiunile cu trei adrese sunt extrem de rar intilnite.
Campul de adresa din instructiune poate avea mai multe semnificatii:
- contine chiar operandul, in cazul operandului imediat;
- reprezinta adresa unui operand din memorie, in situatia adresarii directe;
- reprezinta adresa unei celule de memorie in care se afla adresa unui operand, in cazul adresarii
indirecte.
In unele situatii, la continutul cimpului de adresa din instructiune se aduna continuturile unor
registre speciale:
- registrele baza, la adresarea bazata;
- registrele index, la adresarea indexata.
Cu ajutorulacestor facilitati se pot adresa diverse date stocate in memorie, care sunt structurate
sub forma de masive, multidimensionale, in cazuri particulare: matrici si vectori.
Registrul baza contine adresa de start ( baza ) a structurii, adresa din instructiune reprezinta o
deplasare in structura data, iar registrul index asigura adunarea unei cantitati variabile
( incrementabile/decrementabile - eventual automat ).
Adresa obtinuta in urma unor asemenea operatii, adesea combinate, poarta numele de adresa
efectiva.
In consecinta, instructiunea va contine campuri aditionale, care vor specifica adresarea bazata,
indirecta, indexata etc, deci modul de calcul al adresei efective.
Aceste artificii sunt impuse de faptul ca, in calculatoarele conventionale, memoria este
organizata liniar, in cadrul ei informatia fiind stocata sub forma unor structuri date. Diversele
moduri de adresare faciliteaza accesul la componentele acestor structuri.
Trebuie mentionat faptul ca listele de instructiuni pentru cele mai multe calculatoare contin si
instructiuni fara adresa. Acestea se bazeaza pe facilitatile implementate in hardware care permit
adresarea si manipularea datelor plasate intr-o structura speciala numita stiva ( stack - LIFO -
Last In Last Out ), organizata in memorie sau ( mai rar ) in asamblaje de registre aflate in
unitatea de executie ( microprocesorul Intel 8008 ). Accesul la informatia plasata in stiva se
realizeaza numai prin intermediul varfului stivei, folosind doua operatii de baza: plasarea unui
nou cuvant in stiva ( PUSH ) si extragerea cuvintului din varful stivei ( POP ). Adresa celulei
ocupate din varful stivei este stocata intr-un registru indicator de stiva ( Stack Pointer - SP ) al
carui continut este automat incrementat dupa o operatie POP si respectiv - decrementat, dupa o
operatie PUSH.
Instructiunile, care afecteaza executia programului, trebuie sa specifice in campul codului de
operatie conditiile testate, iar in campul de adresa deplasarea necesara calculului adresei efec-
tive. Si in acest caz adresa efectiva se poate obtine direct, indirect, bazat, idexat sau ca urmare a
unor operatii combinate.
Formatul instructiunii calculatorului FELIX 5000, contine in cadrul a 32 de biti mai multe
campuri:
0 1 3 4 7 8 9 15 16 31

I B Q X F D

unde:
- 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
unul din registrele generale RG9 - RG15, iar pentru 0 adresarea nebazata;
- Q poate specifica, printre altele, ( registrul general, care contine unul din operanzi, o
constanta sau un vector logic sau adresa de origine si lungimea unui operand, in cazul
manipularii sirurilor ) si registrul general RG0 - RG15 folosit la indexare;
- X ia valoarea 0, in cazul adresarii neindexate si valorea 1, in cazul adresarii indexate;
- D specifica deplasarea, folosita pentru calculul adresei efective, prin adunarea cu registrul
baza. Daca registrul baza nu este specificat, D asigura adresarea pe o zona de 64 Ko. Pentru
explorarea intregului spatiu de memorie se aduna in mod curent continutul lui D cu continutul
registrului baza.
Modurile de adresare intilnite la FELIX 5000:
- Adresare directa: I = 0; X = 0; B <> 0.
Aef = ( B + 8 ) + D; unde ( B + 8 ) specifica registrul general utilizat ca baza.
- Adresarea indirecta: I = 1; X = 0; B <> 0.
Prima adresa efectiva, Aef, calculata va reprezenta adresa unui cuvant din memorie in care se
gaseste o informatie care este tratata, din punctul de vedere al calculului unei noi adrese efective,
ca o instructiune. Astfel, la adresa efectiva:
Aef1 =( B + 8 ) + D se va gasi un cuvant care va avea campurile: I1, B1, Q1, X1, F1, D1.
Daca I1 = 1, atunci se va calcula noua adresa efectiva:
Aef2 = ( B1 + 8 ) + D1, de la care se va citi un nou cuvant, procesul putand continua pe
maximum 5 niveluri de adresare indirecta, pana cand Ii = 0.
Adresarea indexata directa: I = 0; X = 1.
Aef = ( Q ) + ( B + 8 ) + D, unde ( Q ) specifica RG folosit ca registru index.
Adresarea indexata indirecta: I = 1; X = 1.
Aef1 = ( B + 8 ) + D,
Aef(k+1) = ( Bk + 8 ) + Dk
Aef = ( Q ) + Aef(k+1) = ( Q ) + ( Bk + 8 ) + Dk.
5. Conventii de proiectare.

Dupa cum s-a aratat intr-un capitol anterior, un sistem numeric poate fi partitionat in:
- sectiunea de date ( unitatea de executie ),
- sectiunea de comanda ( unitatea de comanda ).

Intrare: Date Registre si Logica aferenta Iesire: Date/Rezultate


(Sectiunea /Unitatea de Date/Executie)

Semnale de Conditii
comanda

Intrare: Conditii Circuit secvential de comanda Iesire: Comenzi


(Sectiunea/Unitatea de Comanda)

Unitatea de executie asigura prelucrarea datelor, reprezentate sub forma unor vectori binari,
prin transferul acestora intre registrele sursa si registrele destinatie.Transferul se efectueaza prin
intermediul unor retele/circuite logice combinationale.
Transferurile intre registre.
Intrucat prelucrarea datelor are la baza transferul intre registre, proiectarea unui sistem
numeric, in vederea executiei unui algoritm, consta intr-o planificare, ce va defini fiecare
transfer, prin specificarea ordinii/temporizarii ( timing ) in care aceste transferuri vor avea loc.
In continuare se prezinta mecanismele hardware de implementare a transferurilor intre registre
si notatiile corespunzatoare folosite. Registrele sunt notate cu majuscule avand, de regula, o
semnificatie mnemotehnica. Pe scurt, se vor folosi "mnemonice".
Transferul continutului unui registru sursa intr-un registru destinatie, fara a afecta continutul
sursei, se noteaza astfel:
AC RD

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

AC 1,1,1,1

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


si cu intrari de tip PRESET/CLR.
Transferurile sincrone au loc sub controlul semnalului de ceas pe fronturile anterior, pentru
bistabilele de tip D, sau pe frontul posterior, pentru bistabilele master-slave, de tip JK.
Transferurile implementate prin semnale de comanda aplicate pe intrarile PRESET/CLR au, in
general, caracter asincron. Mai jos se vor prezenta, pentru cazul unui bistabil D controlat pe
frontul anterior al semnalului de ceas, reprezentarea simbolica si diagrama temporala de operare.
Se observa ca datele la intrarea D sunt stabile inaintea aparitiei frontului crescator al semnalului
de ceas, cand are loc fortarea datei in bistabil. Iesirea va lua valoarea corespunzatoare intrarii cu
o anumita intarziere in raport cu frontul crescator al semnalului de ceas.
4

Ceas (CLK)
PRE

Data 2 5 Iesire
D Q
Ceas 3 6 Data (D)
CLR

CLK Q

7474 Iesire (Q)

In cazul bistabilelor de tip master-slave fortarea datelor are loc pe frontul anterior al semnalului
de ceas, iar aparitia lor la iesire se constata pe frontul posterior al ceasului. Mai jos se prezinta
simbolul si diagrama temporala pentru operarea bistabilului JK.
2

Ceas (CLK)
PRE

Data 4 15 Iesire
J Q
Ceas 1 Data (J/K)
CLK
Data 16 14
CLR

K Q Iesire (Q)

7476

In continuare se vor considera elemente bistabile de tip master-slave, atat pentru sectiunea de
date, cat si pentru sectiunea de comanda.
Un circuit secvential de comanda furnizeaza, pentru sectiunea de date, diverse semnale de
comanda, sincrone cu ceasul sistemului, cu perioade egale cu durata unei perioade de ceas sau
cu multipli ai acesteia. Acestea sunt semnalele de comanda de tip nivel.
Semnalele de Comanda de tip Nivel (SCN) vor avea un sufix numeric i ce va specifica numarul
iesirii de comanda a automatului (SCNi). Semnalele SCNi pot fi strobate/esantionate cu
semnalul curent de ceas, pentru a forma Semnale de Comanda de tip Impuls(SCIi), cu durata
activa corespunzatoare semnalului curent de ceas.

Conditii

Circuit Secvential (Unitate e Comanda)


Ceas

SCN(i-1) SCNi 1
3 SCIi
2

Ceas 7408

Ceas

SCN(i-1)

SCI(i-1)

SCNi

SCIi

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


transferul continutului registrului de doi biti RA[2], numerotati de la 0 la 1 ( RA0:1 ),in registrul
destinatie RB[2] ( RB0:1 ):
i. RB0:1 RA0:1
Considerand, in continuare, ca se vor folosi numai bistabile master-slave JK sau D (se face
presupunerea ca si bistabilele de tip D opereaza in maniera master-slave ), schemele hardware
pentru implementarea acestui transfer vor fi urmatoarele:
RA0 RB0

2
PRE

PRE
4 15 4 15
J Q J Q
1 1
CLK CLK
16 14 16 14

CLR

CLR
K Q K Q

7476 7476
3

3
2

2
PRE

PRE
4 15 4 15
J Q
RA1 J Q
RB1
1 1
CLK CLK
16 14 16 14
CLR

CLR
K Q K Q

7476 7476
3

SCN1 3
1
3
2
Ceas
7408

RA0 RB0
4

4
PRE

PRE

2 5 2 5
D Q D Q
3 6 3 6
CLR

CLR

CLK Q CLK Q

7474 7474
1

RA1 RB1
4

4
PRE

PRE

2 5 2 5
D Q D Q
3 6 3 6
CLR

CLR

CLK Q CLK Q

7474 7474
1

SCN1 1
3
Ceas 2

7408

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

Ceas

SCNi

SCIi

Vechea Valoare din RB \\

Noua Valoare din RB


Adesea, intr-un registru trebuie sa se transfere, in momente diferite, vectori diferiti, de la diverse
surse.
Fie registrele sursa: RA, RB si registrul destinatie RC. Se cere implementarea, la momentele
1, 2 a urmatoarelor transferuri:
1. RC RA
2. RC RB
sub controlul semnalelor SCN1, SCN2.
4

RA0
PRE

2 5 1
D Q 3
3 6 2
CLR

CLK Q
7408 U9A
7474 1
3
41

4
RA1 2
PRE

PRE
2 5 1 7432 2 5
D Q 3 D Q
3 6 2 3 6
CLR

CLR
CLK Q CLK Q
7408
7474 7474
1

SCN1 1
4

RB0
PRE

PRE

2 5 1 2 5
D Q 3 D Q
3 6 2 3 6
CLR

CLR

CLK Q CLK Q
7408 U10A
7474 1 7474
3
41

RB1 2
PRE

2 5 1 7432
D Q 3
3 6 2
CLR

CLK Q
7408
7474 1
3 1
1

SCN2 SCN1
2 3
SCN2 2
7432
7408

CLK

Se cere implementarea hardware a transferurilor:


1. RA 1,1
2. RA 0,0
3. RA RB
Pentru a stabili expresia functiei logice combinationale, care reprezinta intrarea Di a bistabilului
destinatie RAi, se utilizeaza diagrama Karnaugh, cu variabila RBi introdusa in diagrama:
SCN1, SCN2
00 01 11 10
SCN3 Functia de excitatie Di este data de expresia:
* * * 1
0 Di = SCN1 ∪ RBi .SCN3
RBi * * *
1
Aceasta va duce la urmatoarea implementare:

4
RB0 1 RA0
3 1

PRE
2 3 2 5
2 D Q
7408 3 6

CLR
7432 CLK Q

7474

1
4
RB1 1 RA1
3 1

PRE
2 3 2 5
2 D Q
7408 3 6
7432 CLR
CLK Q

SCN1 SCN3 7474


U7A
1

CLK 1
1 3
SCN3 2 9 2
SCN2 8
SCN1 7408

In cazul in care se urmareste implementarea operatiei elementare:


j. RAi RBi.RCi
se poate folosi schema de mai jos:

RBi 1
3
RCi 2
4

RAi
7408
PRE

2 5
D Q
3 6
CLR

CLK Q
U41A
SCNj 1 7474
3
1

Ceas 2
SCIj
7408
Reprezentarea componentelor constructive logice combinationale si secventiale (SSI/MSI).
In realizarea practica a unui sistem numeric de complexitate mica/medie (in afara cazurilor cand
se folosesc circuite programabile FPGA/FPLD) sunt utilizate atat componente logice
combinationale, cat si secventiale standard, integrate pe scara simpla si medie. Pentru o tratare
unitara a celor doua tipuri de componente, mai jos, se prezinta o modalitate de tratare unitara a
acestora.
Componentele combinationale.
Sub forma cea mai generala o componenta combinationala (Circuit Logic Combinational – CLC)
se poate reprezenta sub forma unei “cutii negre” avand m intrari de date X[m], p intrari de
comanda C[p] si n iesiri Z[n]. Intrarile si iesirile se pot reprezenta sub forma unor vectori binari
X[m], C[p], Z[n], iar operarea componentei/circuitului poate fi descrisa cu ajutorul unei tabele.

m X[m] Operatia Descrierea Comanda


p CLC Functia C(p-1) ………C0
C[p] F0 Z = F0(X) 0 …………0 0
n Z[n] F1 Z = F1(X) 0 …………0 1
….. ………… ………………
F(2^p-1) Z = F(2^p-1)(X) 0 …………0 0

Se poate observa ca iesirea Z este prezenta atata timp cat este sunt prezente intrarile X si C, fapt
mentionat prin utilizarea semnului “=” intre termenii din dreapta si stanga, in coloana
“Descriere”. Iesirea Z este definita, ca functie de intrarea X, pentru cele 2p valori pe care le
poate lua vectorul de comanda C. In continuare sevor prezenta cateva cazuri particulare.

Circuitul AND (7408).


Modelul Componenta din Tabelul de descriere
biblioteca
A[4] B[4] Operatia Descrierea Comanda
4 4 AND Z=A∩ B ------
1
7408 3
2

7408

4 Z[4] ¼ din pastila 7408


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

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


4 A[4] 4 A[1]
7408 ZERO Z = 0000 0
TRUE Z= B 1
4 Z[4]
Circuitul sumator 7483.
Modelul Componenta din Tabelul de descriere
biblioteca
A[4] B[4] C0[1] Operatia Descrierea Comanda
4 4 1 1
3 A4 C4
14 ADD C4,S = ADD(A,B,C0) -----
A3
7483 8
10 A2
SUM4
15

16 A1 2
4 B4
SUM3
7 B3 6
11 B2
SUM2
13 B1 9
C4[1] 1 4 S[4] C0
SUM1
7483A

Circuitul XOR (7486).


Modelul Componenta din Tabelul de descriere
biblioteca
A[4] B[4] Operatia Descrierea Comanda
4 4 1
XOR Z=A⊕ B ------
3
7486 2

7486

4 Z[4] ¼ din pastila 7486

Ca si in cazul circuitului AND (7408), pentru circuitul XOR (7486) intrarile A[4] pot fi
controlate de catre acelasi semnal de comanda, ceea ce va permite implementarea pe 4 biti a
functiilor TRUE si NEG, conform tabelului de mai jos.
A[1] 1 B[4] Operatia Descrierea Comanda
4 A[4] 4 A[1]
7486 TRUE Z= B 0
NEG Z= B 1
4 Z[4]

Multiplexorul 74157

Modelul Componenta din Tabelul de descriere


biblioteca
A[4] B[4] 2
Operatia Descrierea Comanda
3 1A 4
1B 1Y
S=A/B 4 4 5
2A G S=A/B
6 7
2B 2Y
74157 11
3A
SELA Z=A 0 0
10 9
14 3B 3Y
G 13 4A
4B 4Y
12 SELB Z=B 0 1
15
4 Z[4] 1 STROBEG STROB Z = 0000 1 *
SELECTAB
74157

Intrarile active pe nivel coborat sunt marcate cu un cerc


Circuite secventiale.
In cazul circuitelor secventiale intervine si semnalul de ceas, pe langa semnalul de comanda.
Pentru a marca faptul ca iesirea circuitului isi pastreaza valoarea si dupa disparitia datelor de la
intrare, atribuirea valorii expresiei logice din termenul din dreapta variablei din termenul din
stanga se specifica prin “ “. Intrarile de ceas sunt marcate printr-un varf de sageata.

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


p CLS Functia C(p-1) ………C0
CLK F0 Q F0(X) 0 ………..0 0
n Q[n] F1 Q F1(X) 0 ………..0 1
….. ………… ………………
F(2^p-1) Q F(2^p-1)(X) 0 ………..0 0
Circuit bistabil JK (7473).

Modelul Componenta din Tabelul de descriere


biblioteca
Operatia Descrierea Comanda
J 14
J Q
12 J K
K Bistab.JK 1
CLK
NOP Q Q 0 0
3 CLR 13
CLK K Q CLEAR Q 0 0 1
7473
4 Q[4] PRESET Q 1 1 0
COMPL Q Q 1 1

Contor binar 74163

Modelul Componenta din Tabelul de descriere


biblioteca
ENT A[4] Operatia Descrierea Comanda
CLR 3
4 A QA
14
13
CLR LOAD ENP
B QB
ENP 5
C QC
12 NOP Q Q 1 1 0
74163 6
D QD
11
15
LOAD 2 RCO
CLK
INC Q ADD(Q,T) 1 1 1
10
7 ENT
CLK 9 ENP LOAD Q A 1 0 *
CLR

LOAD

RC0 Q[4] 74163 CLEAR Q 0 0 * *

Registru de deplasare 74178

SER A[4] Operatia Descrierea Comanda


SH 1 4 SH LOAD
LOAD 74178 NOP Q Q 0 0
CLK LOAD Q A 0 1
4 Q[4] SHIFT Q Q2:0, SER 1 *
In cazul in care intrarea SEReste folosita drept intrare de comanda se realizeaza functiile din
tabelul de mai jos:

Modelul Componenta din Tabelul de descriere


biblioteca
A[4] Operatia Descrierea Comanda
3
SERIAL
SER 9
QA
LOAD
4 SER SH LOAD
11
SHIFT
SH QB
6 NOP Q Q * 0 0
2
A
74178 1 8
LOAD 13 B QC
C
LOAD Q A * 0 1
12 10
D QD
CLK 5 SHIFT0 Q Q2:0, 0 0 1 0
CLK
74178
Q[4] SHIFT1 Q Q2:0, 1 1 1 0

Registru cu doua intrari multiplexate 74298

Modelul Componenta din Tabelul de descriere


biblioteca

A[4] B[4] 10
Operatia Descrierea Comanda
WS
WS 4 4 3
A1 QA
15 WS
2
A2
CKL 74298 4
1 B1 QB
14
LOADA Q A 0
9 B2 13
5 C1 QC
7 C2
D1 QD
12 LOADB Q B 1
6
11 D2
4 Q[4] CLK
74298
Scheme combinate.
Schema unui sumator/scazator
Schema se bazeaza pe utilizarea a doua circuite: XOR (7486) si ADD (7483)

A[4] B[4]
D

1 Operatia Descrierea Comanda


4 4

D
7486

ADD Z = C4,ADD(A,B) 0
4 4 SUB Z = C4,SUB(A,B) 1

7483
C4 1 C0 1

4 Z[4]

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


Schema se poate extinde usor pentru operatiile pe 8 biti. In acest mod se pot realiza structuri
complexe, noi blocuri constructive, a caror operare poate fi descrisa concis cu ajutorul tabelelor.

Conexiuni prin magistrale.


In numeroase cazuri implementarea in hardware a unui algoritm de prelucrare a datelor impune,
la diverse etape ale executiei sale, conectarea unor registre-sursa la anumite registre-destinatie.
Conexiunile directe ofera posibilitatea unui inalt grad de paralelism al transferurilor de date. In
schimb sunt neeconomice sub aspectul consumului de circuite logice.
Pentru exemplificare se vor considera, pe de-o parte, doua registre-sursa: RA si RB, iar pe de
alta parte doua registre-destinatie: RC si RD, intre care se realizeaza urmatoarele transferuri:
1. RC RA
2. RD RB
3. RC RB
4. RD RA
5. RC RA; RD RB
6. RC RD; RC RA
Aceste transferuri se vor realiza sub controlul semnalelor de comanda de tip nivel: SCN1,
SCN2, SCN3, SCN4, SCN5, SCN6 si al semnalelor de comanda de tip impuls: SCI1, SCI2,
SCI3, SCI4, SCI5, SCI6.
O ilustrare a implementarii transferurilor de mai sus este prezentata in continuare, considerand,
pentru simplificare, registre de cate un bit.
SCN2
1
3
2
SCN5
7432
4

4
RB 1 RD
3 1
PRE

PRE
2 5 2 3 2 5
D Q 2 D Q
3 6 7408 3 6
CLR

CLR
CLK Q 7432 CLK Q

7474 7474
1
1

1
CLK
SCN3 1 3
1 3 2
3 2
2 7408
SCN6 7408
7432
SCN6 SCN6 2
1 3
3 1 SCN5 1
2 3 SCN4 4
SCN5 2 5
7432 SCN2
7408
4

RA
1
PRE

2 5 1 3 RC
D Q 3 2
PRE

3 6 2 2 5
CLR

CLK Q 7432 D Q
7408 3 6
CLR

7474 CLK Q
1
1

CLK
SCN4 3 7474
1 2
1

3
2 7408
SCN1
7432
SCN6 2
3
SCN5 1
SCN3 4
5
SCN1

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


stabili o functie de cost, pe baza numarului de porti SI, SAU si a numarului de biti al fiecarui
registru. Astfel,
- numarul de porti SI = s.d.n,
- numarul de porti SAU = d.n
Rezulta o functie de cost ≈n.d.(s + 1)
Pentru a reduce costul conexiunilor intre surse si destinatii se utilizeaza magistralele. Acestea
reprezinta, de regula, trasee metalice/fire pe circuite imprimate sau la nivelul structurilor
integrate pe siliciu. Modelul conexiunilor, prin intermediul magistralei, este ilustrat mai jos.

+5V

R
RD

RB D

Q 1
3
2 CLK
OC

CLK
1
3
RAMAG/BUS = RB 2

Q 1
3
2 RD <- MAG/BUS RC
OC
D

MAG/BUS
CLK

MAG/BUS = RA

CLK
1
3
2

RC <- MAG/BUS

Se poate observa ca portile SI, care conecteaza iesirile registrelor RA si RB, la magistrala sunt
de tipul “colector deschis” OC. Conexiunile Registrelor RA si RB, la magistrala MAG/BUS se
realizeaza sub controlul unor semnale de comanda de tip nivel, specificate in desen prin
expresiile: MAG/BUS = RA si MAG/BUS = RB. Fortarea continutului magistralei MAG/BUS
in registrele RC si RD are loc sub controlul semnalelor de comanda de tip impuls, specificate in
desen prin expresiile: RC MAG/BUS si RD MAG/BUS.
Magistrala joaca rolul unui circuit SAU, conform figurii de mai jos.
Transferurile nu se mai pot efectua in paralel, de la surse la destinatii. Ele vor avea un caracter
secvential. Astfel, transferul:
1. RC RA, se va efectua prin operatiile:
1. MAG/BUS = RA; RC MAG/BUS,
unde simbolul “=” reprezinta o conexiune, pe durata unui semnal de comanda de tip nivel.
4

4
PRE

PRE
2 5 1 2 5
D Q 3 D Q
3 6 2 3 6
CLR

CLR
CLK Q CLK Q

7474 7474
1
1

1
3 CLK 1
MAG/BUS = RB 2 3

4
RA 2
4

7432

PRE
Q 2 5
PRE

2 5 1 RD <- MAG/BUS D Q
D Q 3 3 6

CLR
3 6 2 CLK Q
CLR

CLK Q
7474
7474

1
MAG/BUS CLK 1
1

3
MAG/BUS = RA 2

RC <- MAG/BUS

Functia de cost va fi data de numarul portilor SI, al portilor SAU, cat si de numarul de biti ai
vectorilor transferati:
- numarul de porti SI = s.n,
- numarul de porti SAU = n
Rezulta o functie de cost ≈n.(s + 1)
De cele mai multe ori conexiunile registrelor-sursa la magistrala se realizeaza prin circuite “Tri-
state”, care inlocuiesc circuitele de tip “OC”.
6. INTRODUCERE IN LIMBAJUL DE PROGRAMARE HARDWARE AHPL.
( AHPL - A Hardware Programming Language ).
In functie de scopul urmarit, un calculator numeric poate fi descris folosind diverse mijloace.
Astfel, la nivelul etapei de proiectare, se folosesc adesea diagrame bloc, organigrame, limbaje
specializate, tabele de cablaj etc.
In cadrul acestei lucrari calculatorul numeric este descris in termenii unor secvente de
transferuri ale datelor intre diferitele primitive functionale ale calculatorului, in vederea imple-
mentarii unui algoritm dat. Se considera ca, dupa terminarea acestei etape de proiectare,
elaborarea schemelor logice si a schemelor de cablaj reprezinta operatii mecanice, de rutina, care
se pot automatiza cu usurinta.
Sistemele numerice de calcul prelucreaza in principal date structurate sub forma de vectori
binari, stocati in registre sau memorii organizate sub forma de matrici, cu acces la linii.
In acest context apare evidenta utilitatea unui limbaj prevazut cu facilitati pentru manipularea
vectorilor si matricilor.
Un asemenea limbaj a fost propus de K.E. Iverson in anul 1960 sub numele APL
(A Programming Language ). Limbajul APL cunoaste o larga raspindire, ca limbaj
conversational in sistemele cu multiacces IBM 360/370 si chiar in cadrul calculatoarelor
personale IBM-PC compatibile. Trebuie mentionata, de asemenea, si implementarea realizata in
tara noastra pe sistemele FELIX C-266/512.
APL este un limbaj foarte puternic. El permite descrierea concisa a algoritmilor si verificarea lor
prin executie, pe calculator. Pentru scopurile urmarite de proiectare, limbajul APL trebuie
completat cu instructiuni si alte constructii, care permit o implementare directa in hardware.
Un asemenea limbaj AHPL ( A Hardware Programming Language ) a fost propus de catre
F. Hill si G. Peterson in 1974, fiind apoi perfectionat pe parcurs ( 1978, 1983 ). AHPL, ca limbaj
de descriere a transferurilor intre registre, asigura o corespondenta directa intre notatia folosita
si implementarea ei in hardware.
AHPL foloseste, pe linga constructiile proprii, si un subset de constructii din APL, care isi
gasesc un corespondent in hardware. Frecvent, in scopul facilitarii comunicarii si documenarii, in
programele AHPL se mai utilizeaza unele notatii APL, care descriu algoritmul de operare al unui
calculator numeric.
In momentul traducerii in hardware a descrierii AHPL a modulului numeric dat, aceste notatii
nu sunt luate in consideratie.
Autorii limbajului AHPL au elaborat si un compliator pentru hardware, care are ca intrare
descrierea AHPL a sistemului numeric, iar ca iesire - schema sistemului, la nivel de diagrame.
Indiferent de implementarea unui algoritm, este o buna practica aceea de a descrie mai intai
algoritmul in APL si de a-l executa pe un calculator, prevazut cu un compliator de APL.
In continuare algoritmul descris in APL poate fi implementat in hardware, firmware
(microprogram) sau poate fi executat direct, fiind implementat in software.

Conventii privind operanzii folositi in AHPL.


Operanzii manipulati in limbajul AHPL reprezinta marimi constante sau variabile.
Constantele sunt date numerice sau alfanumerice. Ele se reprezinta prin numere standard,
respectiv - prin litere standard sau numere cuprinse intre semnele apostrof.
Variabilele pot fi scalari, vectori, matrici.
Este important de facut distinctie intre variabile si valori.In limbajele conventionale de
programare o variabila reprezinta un nume prin care se face o referire la un operand; o valoare
reprezinta marimea pe care o ia efectiv operandul. In AHPL, prin variabila se intelege numele
unui registru al carui continut este manipulat printr-o instructiune a programului, iar prin valoare
- data care se plaseaza in registru.
Tipurile de operanzi in AHPL se vor deosebi prin conventii tipografice: litere mici pentru
scalari, majuscule pentru vectori si majuscule ingrosate pentru matrici.
Transferul unei constante ( binare - in cazul de fata ) intr-un registru AC se noteaza astfel:
AC 0,1,1,1,1,0,1,0
Transferul continutului unui registru RD, intr-un registru AC, fara a se modifica continutul lui
RD se reprezinta prin instructiunea:
AC ← RD
Un vector constituie o colectie de operanzi avand o structura unidimensionala. Numarul
componentelor vectorului reprezinta dimensiunea vectorului. Pentru a specifica dimensiunea
unui vector oarecare (AC) se va folosi notatia ρAC, unde ρ reprezinta operatorul “dimensiune”.
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,
plasata in extrema stanga: AC0 ,AC1 ,......,ACρAC-1
Trebuie observat ca aceasta notatie este destul de greoaie in textele dactilografiate, ceea ce
face ca, in multe cazuri, indicii sa fie plasati pe aceeasi linie cu numele registrului, de exemplu:
ACi - bitul de rang i din registrul AC. Pentru a specifica un grup de biti adiacenti, dintr-un
registru se foloseste notatia: A i:j sau A(i:j), unde sunt inclusi si bitii i si j.
Operanzii de tip matricial se reprezinta sub forma unui tablou bidimensional, constituit din
elemente cu indici inferiori si superiori. Indicii inferiori specifica coloanele, iar cei superiori
liniile. Se considera matricea M avind ρ1M coloane si ρ2M linii, unde ρ1 si ρ2 reprezinta
notatiile pentru operatorii care aplicati lui M furnizeaza numarul de coloane si numarul de linii
ale tabloului M.

M00 M01 …….....….......M0ρ1M-1


...................……..…..……....
.......….……. Mij.......……….
Mρ2M-10 Mρ2M-11........……. Mρ2M-1ρ1M-1

Linia i a matricii M se specifica prin notatia Mi sau M<i>, iar coloana j - prin notatia Mj sau
M[j]. Liniile succesive i...k, ale matricii M se noteaza prin Mi:k sau M<i:k>, iar coloanele
succesive j...l - prin Mj:l sau M[j:l].

Conventii privind operatorii APL si AHPL.


Operatorii folositi sunt operatorii primitivi si operatorii de tip mixt.
Operatorii primitivi manipuleaza, de regula, operanzi de tip scalar, desi ei pot fi extinsi atat la
vectori, cat si matrici. Acesti opeatori se pot referi la o singura variabila (operatori unari) sau la
doua variabile (operatori binari). In cele ce urmeaza se prezinta operatorii primitivi aritmetici,
logici si relationali. In scopul facilitarii comunicarii, in textele ce reprezinta programe AHPL pot
fi intalniti toti acesti operatori. Implementari directe in hardware au insa numai operatorii logici.
Operatorii aritmetici si relationali sunt specifici limbajului APL.
Operatorii aritmetici manipuleaza numere reale:
x + y adunare; suma algebrica, ( APL ),
x - y scadere; diferenta algebrica, ( APL ),
x ∗ y inmultire; inmultire algebrica, ( APL ),
x % y impartire algebrica; ( APL ).
|x valoare absoluta; ( APL ).
Operatorii logici manipuleaza numere binare ( vectori binari ):
x NU (APL si AHPL),
x ∩ y SI (APL si AHPL),
x ∪ y SAU (APL si AHPL),
x ⊕ y SAU-Exclusiv (APL si AHPL).
Operatorii relationali sunt de forma:
( x ℜ y ) unde ℜ ∈ { <, ≤, =, ≥, > } ( APL ).
In versiunile existente de APL, incercarea de a folosi alte tipuri de variabile, cu exceptia celor
logice, conduce la eroare de domeniu.
In raport cu operatorii aritmetici si relationali nu exista limitari privind folosirea variabilelor.
In exemplele urmatoare se considera:
x = 1, y = -3, W = ( 4,-5,0,2 ) si U = ( 1,2,1,-1 ).
Instructiune: Rezultat:
z ← x+y z = -2
z ← x z=0
Z←W + U Z = ( 5,-3, 1,1 )
Z←W * U Z = ( 4,-10,0,-2 )
Z← W%U Z = ( 4,-2.5,0,-2 )
z← (x<y) z=0
z← (x>y) z=1
Operatorii de tip mixt sunt extrem de puternici, deoarece permit manipularea unor combinatii
de scalari, vectori si matrici. In cele ce urmeaza se vor prezenta operatorii de tip mixt, cu
specificarea limbajelor in care se utilizeaza.
Notatie Denumire Semnificatie Observatii

X,Y Inlantuire/ X0 ,...,XρX-1 ,Y0 ,....,YρY-1 APL si AHPL


Concatenare
M!N Inlantuire O matrice cu ρ2M+ρ2N linii AHPL
linii. cu liniile lui M peste liniile lui N.

k↑X Extragere Se extrag primele k elemente APL


din vextorul X.

k↓X Eliminare Se elimina primele k elemente APL


din vectorul X.
⊥X Decodificare Echivalentul zecimal al vectorului APL
binar X
nΤp Codificare Un vector cu n elemente binare, APL si AHPL
binara. obtinut prin repre zentarea
numarului zecimal p in baza doi.

@/X Reducere X0 @X1 @X2 @............@XρX-1 APL si AHPL

X ← @/M Reducere X i ← @/Mi AHPL si APL


linie

X ← @//M Reducere Xj ← @/Mj AHPL si APL


coloana

X ← U/Y Comprimare Vectorul X este obtinut APL si AHPL


din vectorul Y prin su- in descrierea
primarea rangurilor Xi unitatilor logice
pentu care Ui =0 combinationale
U este vector binar.

A ← U/M Comprimare Ai ← U/Mi Idem linii.

A ← U//M Comprimare Aj← U/Mj Idem coloane


coloane
Nota1: @ este un operator logic sau aritmetic.
Nota2: A si M sunt matrici, iar U este un vector binar.
In exemplele care urmeaza se ilustreaza utilizarea operatorilor de tip mixt.
Inlantuirea.
Fie: X = ( 1,2,3,4 ) si Y = ( 5,6,7 ),
daca Z ← X,Y atunci, rezulta: Z = ( 1,2,3,4,5,6,7 )
Inlantuirea permite descrierea operatiilor de deplasare si rotire ale vectorilor si matricilor.
In cele ce urmeaza se vor prezenta notatiile AHPL pentru deplasari si rotiri de vectori.
Fie vectorul A = ( A0 ,A1 ,A2 ,......,AρA-1)
Deplasare logica - dreapta (cu inserta unui zero in bitul 0).
A ← 0, A0 ,A1 ,A2 ,......,AρA-2
Deplasare logica - stanga (cu insertia unui zero in bitul de rang ρA-1).
A ← A1 ,A2 ,......,AρA-1,0
Deplasare aritmetica dreapta (cu extinderea bitului de rang 0 in bitul de rang 1).
A ← A0, A0 ,A1 ,A2 ,......,AρA-2
Deplasarea aritmetica stanga este identica cu deplasarea logica stanga.
Rotire -dreapta.
A ← AρA-1, A0 ,A1 ,A2 ,......,AρA-2
Rotire - stanga.
A ← A1 ,A2 ,......,AρA-1, A0
In operatiile de deplasare si rotire, inaintea bitului de rang 0 si dupa bitul de rang ρA-1, se pot
plasa biti individuali reprezentand indicatori de conditii ( de exemplu, din unitatea de executie,
bitul de transport). Cele mai multe microprocesoare dispun de instructiuni care implementeaza
asemenea operatii de deplasare. Ele sunt folosite pentru instructiunile de transfer conditionat al
comenzii.
In continuare sint ilustrate operatiile de rotire/deplasare circulara a liniilor unei matrici.
Fie: 100
M= 110
011
Deplasare circulara in sus.
110
Daca N ← M 1:2 0
! M , atunci rezulta: N= 011
100
Deplasre circulara in jos.
011
Daca N ← M ! M 2 0:1
, atunci rezulta: N= 100
110
Extragerea.
Fie: X = (1,2,3,4,5,6)
daca Y ← 4↑X, atunci rezulta: Y = ( 1,2,3,4 ) in APL
Eliminarea.
daca, Y ← 4↓X atunci rezulta: Y = ( 4,5,6 ) in APL.
In AHPL notatiile echivalente vor fi urmatoarele:
Y ← X0:3 ( extragere ) si respectiv Y← X4:6 ( eliminare )
Decodificare binara.
Fie: X = ( 1,1,0,1 ) si Y = ( 1,0,0,0,1 )
daca: x ← ⊥ X si y ← ⊥ Y, atunci: x = 13 si y = 17
Codificarea binara.
Fie: x = 13 si y = 17
daca: X ← 4 Τ x si Y ← 5 Τ y, atunci: X = ( 1,1,0,1 ) si Y = ( 1,0,0,0,1 ).
Reducere.
Fie @ un operator binar care se aplica unui vector binar X,rezultatul operatiei va fi de forma:
x ← ( ....(( X0@X1 )@X2 )@.....XρX-1 )
Expresia:
x ← +/X este echivalenta cu :
ρX-1

x ← Σ Xi
i=0

Daca X este un vector logic ( cu componente binare ), atunci urmatoarele operatii vor furniza
informatii privind:
x ← +/X, numarul de unitati din vectorul X;
x ← ∪ /X, prezenta a cel putin unei unitati diferita de zero, daca x <> 0;
x ← ∩ X, prezenta tuturor componentelor egale cu unu, daca x = 1.
Fie matricea M:

1001
M← 0 1 0 0 , atunci: +/M = ( 2,1,3 ); +//M = ( 2,1,1,2,) si +/(+//(M)) = 6.
1011
Comprimare.
Fie U = ( 1,0,0,1 ) si A = ( 1,2,3,4 ), atunci: X ← U/A, conduce la rezultatul: X = ( 1,4 )
Considerind matricea M si vectorul U de mai sus, comprimarea pe linii N ← U/M va furniza
matricea N, de forma:
11
N ← 00
11

Comprimarea coloanelor va fi exemplificata cu un vector logic V, de forma: V = ( 1,1,0 ).


N <-- V//M va avea aspectul urmator:

1001
N←
0100

Ca un ultim exemplu, penru a ilustra forta limbajului AHPL se va scrie un program pentru
cautarea intr-o lista de cuvinte plasate intr-o memorie, in vederea extragerii acelor cuvinte
pentru care primii 4 biti sunt egali cu 1.
Se considera ca lista de cuvinte binare, de cite 16 biti, se afla intr-o memorie M, cu un numar de
ρ2M cuvinte. Se va forma un vector U cu ρ2ΤM componente, care vor fi 0 pentru acele cuvinte,
care nu indeplinesc conditia impusa si 1, in caz contrar. In final se va genera o matrice N
obtinuta prin comprimarea coloanelor lui M dupa vectorul U.
1. U ← ρ2MΤ0 /* se genereaza valoarea initiala a vectorului U
2. i ← 0 /* se initializeaza contorul i
3. → ( Mi0^ Mi1 ^ Mi2 ^ Mi3 ) = 0 )/(5) /* se testeaza conditia
4. Ui ← 1 /* se atribuie valoarea 1 componentei care nu indepplineste conditia impus
5. i ← i + 1 /* se incrementeaza contorul i
6. → ( i < ρ2M )/(3) /* transfer conditionat al comenzii
7. N ← U//M
Se poate observa ca vectorul U se pute genera simplu prin opeatia:
U ← (M0 ∩ M1 ∩ M2 ∩ M3)
Deci, tot programul secvential de mai sus se poate inlocui cuexpresia:
N ← (M0 ∩ M1 ∩ M2 ∩ M3) // M

Conventii AHPL pentru descrierea logicii combinationale.


S-a aratat ca procesul de prelucrare a datelor consta in trans-ferul acestora intre registrele sursa
si registrele destinatie prin intermediul unor retele logice combinationale. Acestea din urma
reprezinta resurse hardware, care pot fi folosite in mod repetat, cu diverse argumente, in puncte
diferite ale secventei AHPL, care descrie algoritmul.
Se considera o retea logica combinationala, care realizeaza operatia NAND ( SI-NU ) asupra
rangurilor a doi vectori de 4 biti.
C ← ( A0 ∩ B0 , A1 ∩ B1 ,A2 ∩ B2 , A3 ∩ B3)
Daca expresia de mai sus apare in mod repetat in secventa AHPL, se poate folosi o notatie
prescurtata:
C ← NAND(A;B), care este asemanatoare unei notatii de subrutina intr-un limbaj de
programare. In contextul de fata NAND(A;B) va fi mentionata ca o functie sau o unitate logica
combinationala.
Intr-un program AHPL, ea va fi descrisa o singura data, dupa care poate fi apelata in mod
repetat, cu diferite argumente.
Sub forma generala descriera unei asemenea functii fi delimitata de titlu si de sfirsit ( END ).
UNIT: NAND(A;B)
conexiuni
.........
conexiuni
END
Dupa titlu pot urma declaratii privind vectorii manipulati, lungimea lor etc. Conexiunile sunt
instructiuni care se traduc direct in hardware sub forma unor legaturi intre intrarile si iesirile
unor circuite logice combinationale.
Intr-un alt paragraf se vor da mai multe exemple privind descrierea unor unitati logice
combinationale: BUSFN, DCD, ADD etc.
7. Descrierea sistemelor numerice la nivelul transferurilor
intre registre folosind limbajul AHPL.
Sistemele numerice de calcul au un caracter complex ceea ce conduce la o serie de dificultati,
atat in privinta descrierii lor functionale, cat si a proiectarii lor.
Plecand de la modul lor de functionare, ele pot fi partajate in subsisteme sau module mai
simple, cu specificatii bine precizate in legatura cu semnalele de intrare si iesire, care vor
reprezenta date, comenzi, stari, sincronizari etc, pe de-o parte, cat si in legatura cu algoritmul de
operare.
Sub aspect functional, un sistem numeric poate fi descris prin proceduri si functii, plecind de la
algoritmul pe care trebuie sa-l execute. Astfel, intr-o prima etapa, descriera sistemului numeric
va fi asemanatoare cu cea a unui program de mare complexitate.
Procedurile vor avea ca implementari fizice modulele, in timp ce functiile vor fi realizate prin
unitati logice combinationale.
In cadrul modulelor pot fi evidentiate unitatile de executie si de comanda. In descrierea
modulelor se intilnesc in mod frecvent functii a caror implementare conduce la scheme logice
combinationale. Pentru prezentarea modalitatilor de descriere ale modulelor si functiilor se va
folosi forma BNF ( Backus-Naur Form ).
Structura unei proceduri ( modul ) este urmatoarea:
MODULE: < nume modul >
< lista de declaratii >
< lista de pasi AHPL >
ENDSEQ
< lista de instructiuni individuale nesincronizate si instructiuni >
END
< lista de declaratii >:= < MEMORY ( memorii ) >
< INPUTS ( intrari ) >
< OUTPUTS ( iesiri ) >
< BUSES ( magistrale ) >
< LABELS ( etichete ) >
< ONE-SHOTS ( monostabile ) >
< COMBUSES ( magistrale decomunicatii)>
< MEMORY >: < lista de bistabile >;< lista de registre >;<lista de memorii >
< lista de bistabile >:= < nume bistabil >;...;< nume bistabil >
< lista de registre>:= < nume registru[i]>;...;<nume registru[j] >
< i, j >:= dimensiunile registrelor
< i, j >:= 1|2|.......|n
< lista de memorii >:= < nume memorie[m;n] >;...;< nume memorie[r;q]
< m,r >:= numar de cuvinte in memorii
< n,q >:= numar de biti in cuvintele de memorie
< m, n, q, r >:= 1|2|......|n
< INPUTS >: < lista de vectori >;< lista de semnale individuale>
< lista de vectori >:= < nume vector[i] >;...;< nume vector[j] >
< lista de semnale individuale >:= < nume semnal >;...;< nume semnal >
<OUTPUTS >: < lista de vectori >;...;< lista de semnale individuale >
< BUSES >: < lista de magistrale >
< lista de magistrale >:= < nume magistrala[i] >;...;< nume magistrala[j] >
< i,j >:= dimensiunile magistralelor
< LABELS >: < lista de etichete >
< lista de etichete >:= < nume eticheta >;...; < nume eticheta >
( etichetele sunt folosite pentru a referi campuri din anumite registre - subregistre etc )
< ONE-SHOTS >: < lista de monostabili >
< lista de monostabili >:= < numemonostabil[i] >;...;< nume monostabil[j] >
< i,j >:= duratele semnalelor la iesirile monostabilelor, date in multipli ai perioadei de tact
< COMBUSES >: < lista de magistrale de comunicatii >
< lista de magistrale de comunicatii >:= < nume magistrala[i] >;< nume magistrala[j]
( magistrala de comunicatii trebuie sa fie conectata la un set de linii de intrare/iesire in/din
modul >
Exemplu de declaratii: Se considera un modul FILTRU DE CUVINTE plasat intre doua
sisteme numerice A ( emitator ) si B ( receptor ), care permite trecerea unor vectori binari ce
indeplinesc anumite conditii. Modulul poseda registrele de intrare si iesire
REGIN[16] si REGIES[16], registrul intern A[4] si bistabilul a,
intrarea X[16] si iesirile Z[16], gatain, gataies.
Descrierea modulului va incepe astfel:
MODULE: FILTRU DE CUVINTE
MEMORY: REGIN[16]; REGIES[16]; A[4], a
INPUTS: X[16]
OUTPUTS: Z[16]; gatain; gataies
In continuare se va prezenta secventa de pasi AHPL. Un pas AHPL contine toate operatiile
elementare, sincrone cu o perioada a ceasului, care au loc la nivelurile resurselor unitatilor de
executie si comanda. Fiecare pas de comanda va consta din instructiuni AHPL de atribuire
(actiune si o instructiune AHPL de ramificare/control ).
< secventa de pasi AHPL >:= < pas AHPL>
< pas AHPL >
............
< pas AHPL >
< pas AHPL >:= < lista de instructiuni de atribuire >;< instructiune de ramificatie >
< instructiune de atribuire >:= < nul >|< transfer sincron >|< conexiune >|< transfer sicron;
conexiune >
< instructiune de ramificare >:= < nul >|< → (F)/(Sj) >|< → (Sj) >|< DEAD END-fara
continuare >
< nul >:= < absenta instructiunii de atribuire >|< instructiune implicita de ramificare la pasul
urmator >
< transfer sincron >:= < VD <- VLCS >|< VD ← MLCS*F >|< MD*F ← VLCS >
VD - vector destinatie. El reprezinta fie un registru simplu, fie un vector format din unul sau
mai multe elemente de memorie asamblate pe baza unor operatori de selectie. Indicii superiori si
inferiori, care afecteaza operanzii, sunt in mod obligatoriu constante.
Se folosesc urmatorii operatori de selectie:
Aj - elementul j din vectorul
A m:n - elementele m, pina la n, din vectorul A
, - inlantuire ( concatenare )
A ! B - inlantuire pe linii
Mj - linia j din matricea M
Mm:n - liniile m, pina la n, din matricea M.
VLCS reprezinta un vector logic combinational sursa, constituit din expresii logice
combinationale evaluate, ale caror argumente (operanzi) pot fi: elemente de memorie, intrari,
functii logice, magistrale, constante binare.
Operatorii din expresii sint de tip logic: ∩ (SI), ∪ (SAU), (NU), ∩ / ( SI aplicat
elementelor vectorului ), ∪ / (SAU aplicat elementelor vectorului), ⊕ / (SAU-Exclusiv),
SYN (sincronizare).
In absenta parantezelor, in expresiile din VLCS, operatorii logici si de selectie vor avea
urmatoarele prioritati:
1. Negatia si Sincronizarea,
2. Toti operatorii de selectie, cu exceptia inlantuirii,
3. ∩
4. ∪ sau ⊕ ,
5. Inlantuirea.
MD - matrice de memorie sau asamblaj de registre de memorare.
MLCS - matrice logica combinationala sursa, constituita din asamblaje de vectori logici
combinationali.
F - vector de selectie, ale carui componente sint expresii logice combinationale evaluate, care se
exclud mutual:
F = ( f1 ( x1 ,...,xn ),.....,fm (x1 ,...,xn),
unde: ( fi ∩ f j =0 ) si ( ∪ /F ) = 1; i,j = 1,...,n; i = j; xI ∈ { 0,1 }.
Expresiile: MLCS*F si MD*F sint echivalente cu expresiile:
F/MLCS si F/MD ( selectie pe linii ).
< conexiune > := < BUS = VLCS >|< BUS = MLCS*F >|< Z = VLCS >|< Z = MLCS*F >
Exemple:
D ← Am:n , Bp:q
D ← A + B,C
Fie matricea logica combinationala sursa: ( A ! B ! C ), unde A, B, C sunt vectori logici
combinationali, si vectorul logic:
F = ( d, e, f ).
In aceste conditii se pot scrie urmatoarele instructiuni de atribuire:
1. D ← ( A ! B ! C ) * ( d, e, f )
echivalenta cu:
D←d∩ A U e∩B U f∩ C
2. ( A ! B ! C ) * ( d, e, f ) ← D
echivalenta cu:
d ∩ A ∪e ∩ B ∪f∩ C ←D
3. BUS = ( A ! B ! C ) * ( d, e, f )
reprezenand o conexiune conditionala la magistrala BUS a unuia dintre vectorii A, B, sau C.
In instructiunea de tip ramificatie, F are semnificatia prezentata mai sus, iar E constituie un
vector ale carui componente (Ei) sunt numere/etichete de pasi AHPL, din secventa data, la care
poate avea loc ramificarea ( transferul comenzii ).
De exemplu, ramificarea:
→ ( x, x )/( Ei, Ej)
asigura transferul comenzii la linia Ei , daca x = 1 sau la linia Ej , daca x = 0.
DEAD END marcheaza sfirsitul comenzii, terminarea operarii in sensul ca instructiunea de
comanda nu mai genereaza trecerea la pasul urmator din secventa, acesta lipsind.
Dupa END SEQ ( sfirsitul secventei de pasi AHPL ), in descrierea modulului sint plasate
instructiunile individuale de atribuire nesincronizate, conexiunile permanente, operatiile de
comanda asincrone, cum ar fi operatia RESET(1), care forteaza reluarea secventei numerotate
de pasi AHPL de la linia 1.
Descrierea AHPL a unei functii.
UNIT: < nume de functie >( <parametri> )
< declaratii >
< secventa de instructiuni de conexiune, contorizare,
transfer al comenzii >
END
< parametri > := < lista de intrari >
< lista de intrari >:= < VLC >|< MLC >
< declaratii >: < INPUTS >
< OUTPUTS >
< INPUTS >: < lista de intrari separate prin ; >
< OUTPUTS >:< vector logic combinational >
< secventa de instructiuni > := < conexiune >| < atribuire de valoare unui indice >|< transfer
conditionat al comenzii >
< atribuire de valoare unui indice > := < nume indice ⇐ valoare binara | zecimala >
< transfer conditionat al comenzii >:= < ⇒ (F)/(S) >
Efectul executiei unui program AHPL, ce descrie o unitate, reprezinta compilarea - generarea
schemei hardware pentru acea unitate combinationala. Numai instructiunile de conexiune
genereaza efectiv hardware. Instructiunile care manipuleaza indici si cele de transfer asigura
efectuarea unor operatii de ciclare pentru generarea unor copii multiple ale aceleiasi scheme.
Folosirea functiilor, in cadrul unor module, presupune descrierea lor ca unitati, o singura data,
in vederea compilarii/generarii schemei logice combinationale specifice. Unitatea poate fi apelata
ca functie, in cadrul instructiunilor de atribuire ( transfer | conexiune ), din secventa de pasi
AHPL, a unui modul.

In rezumat structura bloc a unui sistem numeric consta din module si functii:

Modul
Nume modul
Declaratii Pas secv.
Procedura Modul Secventa de comanda Pas secv.
Sfarsit secventa Pas secv.
Transferuri si conexiuni
Modul Sfarsit

Sistem Numeric

Unitate
Nume unitate
Declaratii Pas secv.* )
Functie Unitate Secventa de conexiuni Pas secv.
Sfarsit Pas secv

Unitate
*)
Specifica o conexiune
Sintaxa unui pas de comanda din secventa:

NUL
Instructiune de conectare
Actiune Transfer sincron
Transferuri si conexiuni
Pas din secventa
de comanda → (F)/(E)
→ (Ej)
Ramificatie NUL
Fara continuare (DEAD END)

Transferul sincron poate avea unul din urmataoarele formate:

VD ← VLCS
Transfer sincron VD ← MLCS * F
MD * F ← VLCS

Instructiunea de conectare poate avea unul din urmatoarele formate:

BUS = VLCS
Instructiune de conectare BUS = MLCS*F
z = VLCS
z = MLCS * F

Exemple de descrieri AHPL ale unor UNITATI (Circuite Logice Combinationale) si ale
unor module.

1. Sumatorul Complet (FULLADD).


Sumatorul Complet reprezinta un circuit logic combinational cu trei intrari: x, y, cin si doua
iesiri: sum, cout. Intrarile x si y sunt intrari de date de cate un bit (corespunzatoare unui rang
oarecare i, in cazul adunarii a doi vectori binari X si Y), iar cin este intrarea de transport (din
rangul inferior). Iesire sum corespunde sumei, pentru rangul curent, iar cout constituie
transportul in rangul urmator. x y
cout cin
FULLADD

sum
Ecuatiile logice pentru sum si cout sunt urmatoarele:
sum = ( x ∩ y ∩ cin ) ∪ ( x ∩ y ∩ cin ) ∪ ( x ∩ y ∩ cin ) ∪ ( x ∩ y ∩ cin )
cout = ( x ∩ y ) ∪ ( x ∩ cin ) ∪ ( y ∩ cin )
Aceste ecuatii se pot implementa cu ajutorul portilor SI, SAU, NU.
Folosind si porti SAU-EXCLUSIV, expresiile de mai sus devin mai simple:
sum = x ⊕ y ⊕ cin
cout = ((x ⊕ y) ∩ cin ) ∪ ( x ∩ y )
Cu ajutorul ecuatiilor de mai sus se poate prezenta o secventa AHPL, de descriere a Sumatorului
Complet, sub forma unei Unitati:
UNIT: FULLADD(x ; y ; cin)
INPUTS: x ; y ; cin
OUTPUTS: FULLADD[2]
1. a = x ⊕ y
2. b = x ∩ y
3. sum = a ⊕ cin
4. c = a ∩ cin
5. cout = b ∪ c
6. FULLADD0 = cout
7. FULLADD1 = sum
END
Primele cinci instructiuni reprezinta pasi de conectare, iar ultimele doua instructiuni constituie
iesirile.
Se poate observa ca secventa care descrie un Sumator Complet are un caracter “spatial”, in
sensul ca pasii reprezentati corespund iesirilor/intrarilor portilor logice, care intra in componenta
unei retele spatiale. Pasii 1-7 nu sunt legati de vreun mecanism de temporizare. Elementul timp
intervine, in acest context, numai in legatura cu intarzierea in propagarea semnalelor prin porti..
Intrarile x, y si cin trebuie sa fie stabile pana la obtinerea rezultatelor sum si cout.
Pe baza Unitatii FULLADD se poate genera un sumator cu transport succesiv pentru numere
binare de cate 16 biti.
Sumator, ADD, cu transport succesiv, pentru numere binare de cate 16 biti.
Pentru realizarea unui asemenea sumator, se vor utiliza, in caltate de blocuri constructive,
componentele Sumatorului Complet: FULLADD0 si FULLADD1. Acestea vor fi chemate
succesiv, in cadrul unor cicluri, pentru fiecare bit al sumatorului ADD. In cadrul programului
AHPL, pentru controlul ciclurilor se va introduce un indice i, care va fi initializat, decrementat si
testat. Operatiile corespunzatoare manipularii indicelui i vor fi marcate cu sageti cu corp dublu,
care vor fi tratate intr-o maniera specifica de catre compilatorul, care va genera schema lui ADD.
UNIT: ADD( X; Y )
INPUTS X[16]; Y[16]
OUTPUTS: ADD[17]
1. C16 = 0
2. i ⇐ 15
3. Ci = FULLADD0 ( Xi; Yi; Ci+1)
4. Si = FULLADD1 ( Xi; Yi; Ci+1)
5. i ⇐ i–1
6. ⇒ ( i ≥ 0)/(3)
7. ADD = C0, S0:17
END
Compilarea manuala a acestui program AHPL, va genera elementele schemei sumatorului ADD,
in maniera prezentata mai jos la nivelul primelor doua si al ultimei parcurgeri a programului.
X15 Y15
1. C15 C16
FADD

S15
2. X14 Y14 X15 Y15
C14 C15 C16
FADD FADD

S14 S15
3. X0 Y0 X14 Y14 X15 Y15
C0 C14 C15 C16
FADD FADD FADD

C0 S0 S14 S15
ADD0 ADD1 ADD14 ADD15

2. Decodificatorul DCD.
Decodificatorul DCD(A), unde A este un vector binar de n biti, este un circuit combinational cu
n intrari si 2n iesiri. Pentru oricare vector binar, aplicat la intrare, numai o singura iesirea
decodificatorului va fi activa.
A0 DCD0
A1 DCD1
DCD

An DCD2n -1

Descrierea DCD(A) in AHPL este urmatoarea:


UNIT: DCD(A)
INPUTS: A[n]
OUTPUTS: DCD( 2n )
1. i ⇐ 0
2. DCDi = ∩ /(( n Τ i ) / A), ( n Τ i ) / A)
3. i ⇐ i + 1
4. i ⇒ ( i < 2n )/(2)
END
Primul pas initializeaza indexul i, pentru a stabili iesirea decodificatorului, care urmeaza sa fie
evaluata. Operatiile inceteaza dupa evaluarea tuturor iesirilor decodificatorului DCD.
Pentru a intelege cum se evalueaza iesirile decodificatorului, sa considera cazul particular n = 4
si i = 5.
DCD5 = ∩ /(( 4 Τ 5 ) / A), ( 4 Τ 5 ) / A )
= ∩ /((0,1,0,1) / A), (0,1,0,1) / A)
= ∩ /(( A1, A3 ), (A0, A2)) = A0 ,A1, A2, A3
In cazul in care A = A0 ,A1, A2, A3 = (0, 1, 0, 1) se obtine DCD5 =1. Celelalte iesiri DCDj, pentru
care j ∈ {0, 1, 2,….., 2 n-1} ∩ j ≠ 5, vor lua valoarea 0.
3. Circuitul, BUSFN, de citire a unui cuvant dintr-o memorie M.
Se considera o memorie M, alcatuita din mai multe registre M0, M1, ……, M2↑m –1. Memoria
primeste informatiile de adresa de la un registru RA si efectueaza operatiile de citire/scriere prin
intermediul unui registru RD.
Scrie Citeste

Comnada M0
Adresa ( DCD),
R M1
(BUSFN)
A …..
M2↑↑m -1

RD
Data

Memoria M dispune de o unitate de comanda, care asigura controlul operatiilor de scriere si


citire, pe baza semnalelor primite din exterior.
Operatiile de citire si scriere se pot descrie, la nivelul transferurilor intre registre, dupa cum
urmeaza:
• Citire
i. RA ← Adresa
(i +1). RD ← BUSFN( M; DCD(RA)); Citeste = 1
• Scriere
j. RA ← Adresa; RD ← Data
(j +1). M* DCD(RA) ← RD; Scrie = 1
BUSFN(M; DCD(RA)) reprezinta o functie logica combinationala, care are ca argumente o
matrice M, cu ρ2M linii si ρ1M coloane, pe de-o parte si un vector DCD(RA), cu 2m
componente, pe de alta parte, unde ρ2M = 2m.
Daca in locul vectorului DCD(RA) se utilizeaza un vector R[r], iar ρ1M este egal cu p, se poate
obtine urmatoarea descriere AHPL:
UNIT: BUSFN( M ; R )
INPUTS: M[ r : p ]
OUTPUTS: BUSFN[ p ]
1. N0 = M0 ∩ R0
2. i ⇐ 1
3. Ni = ( Mi ∩ Ri ) ∪ Ni-1
4. i ⇐ i + 1
5. i ⇒ ( i < r )/(3)
6. BUSFN = Nr-1
END
O schita a implementarii unitatii BUSFN, in contextul operatiei de citirere, este data mai jos.

M0 M1 Mp2M-1

SCNi

DCD0 DCD1 DCDp2M-1


BUSFN(M;DCD(RA))

citeste

0 1
N N

MAG/BUS
4. Implementarea secventei start/reset (PRESET).
Implementarea primilor pasi dintr-o secventa AHPL, din cadrul descrierii unui modul a carui
operare este lansata de semnalul start, este prezentata mai jos. Primul bistabil (1), cat si celelalte
bistabile (2), (3), (4) ale schemei de comanda au fost fortate, printr-un semnal reset/PRE/CLR
asincron, in starile Q1 = 1 si, respectiv, Q2 =0, Q3 =0, Q4 =0. Comanda reset, in cazul de fata
PRESET, are un caracter asincron si apare, in secventa AHPL, intre specificatiileENDSEQ si
END, sub forma: PRESET(1), unde (1) constituie linia AHPL, la care se efectueaza saltul (un
GO TO 1 asincron).

SCN2 SCN3 SCN4

D PRE Q D Q D Q D Q
1 2 3 4
C C CLR C CLR C CLR

SYN(start)

Ceas

PRESET

Ceas

start

SYN(start)

SCN1

SCN2

SCN3
In continuare, operarea automatului cu stari complet decodificate, la nivelul primului bistabil,
este prezentata sub forma diagramei de tranzitii:

SYN(start) PRESET(1)
1

SYN(start)

Dupa cum se constata, automatul va parasi starea (1) numai in conditiile in care semnalul
SYN(start) va trece pe nivel ridicat. In caz contrar, starea (1) se va extinde pe un numar indefinit
de perioade de ceas.
5. Sincronizarea semnalului start.
In cele prezentate mai sus, s-a vazut necesitatea existentei unui semnal de start, pentru activarea
automatului de comanda al unui modul. De cele mai multe ori semnalul start este dat manual,
ceea ce face ca el sa fie asincron cu ceasul sistemului si sa aibe o durata relativ mare.
Sincronizarea semnalului start, specificata prin operatorul SYN(start), se poate realiza cu
ajutorul diferitelor scheme. Mai jos se prezinta una dintre acestea, impreuna cu diagramele de
semnale.

SYN(start) SNP(SYN(start))

start
D PRE Q D PRE Q

C C
SYNI(start)
ceas

ceas

start

SYN(start)

SYNI(start)

SNP(SYN(start))
Se poate usor observa ca, cel de-al doilea bistabilul reproduce sub forma negata, la iesirea Q,
semnalul SYN(start), intarziat cu o perioada de ceas. Prin efectuarea produsului logic intre
SYN(start) si semnalul SYNI(start) se obtine un semnal de start sincronizat, de tip nivel, cu
durata unei perioade de ceas: SNP(SYN(start)).

6. Comanda citirii instructiunii dintr-o memorie principala asincrona.


Memoriile principale ale calculatoarelor numerice reprezinta module, care opereaza asincron, de
cele mai multe ori.
Secventa AHPL, pentru citirea unei instructiuni dintr-o memorie M, prevazuta cu registrele de
adresa RA si registrul de date RD, in registrul de instructiuni RI, are urmatorul aspect:
2. RA ← CP /* CP este contorul programului
3. RD ← BUSFN(M;DCD(RA))
4. RI ← RD
In cazul unei memorii asincrone, al carei model logic este dat mai jos, adresele si datele
presupun, pe de-o parte, folosirea unor magistrale: ADR, DATIN, DATIES, iar comanda, pe de
alta parte, utilizarea unor semnale de control citeste, scrie si de stare ocupat.

DATIN
ADR R M R
A D
DATIES MAG

citeste
Comanda
scrie ocupat

Modelul logic al modulului memoriei principale.


In aceste conditii secventa AHPL, de citire a unei instructiuni, din memorie, capata urmatorul
aspect:
2. ADR ← CP; citeste = 1
→ SYN(ocupat)/(2)
3. nul
→ SYN(ocupat)/(3)
4. FARA INTARZIERE
MAG = DATIES; RI ← MAG

MAG = DATEIES
citeste ADR <- CP SYN(ocupat) RI <- MAG

(1)
D Q D Q
2 3
C CLR C CLR

ceas

ceas

SCN2
citeste

ocupat

SYN(ocupat)

SCN3

SCN4

Se poate constata faptul ca, pasul (4), FARA INTARZIERE, este amorsat in ultima parte a
pasului anterior (3), ceea ce conduce la castigarea unei perioade de tact.
7. Exemple de module descrise in AHPL.
Umatoarele doua exemple de module sunt preluate din lucrarea Calculatoare numerice.
Hardware-structura si proiectare, autori F.J. Hill si G.R.Peterson, Editura Tehnica 1981.
7.1.Unitate de comanda pentru o masina unealta.
Se cere proiectarea unei unitati de comanda, pentru o masina unealta, care foloseste o memorie
ROM[1024:18] pentru a stoca patru secvente, de cate 256 cuvinte x 18 biti, structurati sub
forma a trei campuri, pentru a specifica pozitia uneltei in trei dimensiuni. Pozitia curenta a
uneltei este memorata intr-un registru PR[18], care furnizeaza, conform structurarii sale pe cele
trei campuri, vectori binari, de cate sase biti, pentru trei convertoare numeric/analogice CN/,
care comanda echipamentul de actionare al masinii unelte. Comunicarea cu operatorul se
realizeaza cu ajutorul unui bistabil start/stop ss (controlat din exterior de catre semnalele de
comanda start si stop) si al unui registru RSECV[2] (comandat di exterior prin semnalul
SECV[2], in care se memoreaza numarul secventei, care se executa: 00, 01, 10, 11.
Prin fortarea in unu a bistabilului ss, se va lansa in executie secventa al carei numar este stocat in
RSECV.
Daca, pe parcursul functionarii sistemului, operatorul forteaza in unu intrarea stop, bistabilul ss
va lua valoarea zero, secventa curenta se va termina si in registrul RP se va stoca un vector binar
cu 18 componente egale cu zero, iar unitatea de comanda va trece in starea initiala (1).
In cazul terminarii normale a secventei curente vor avea loc operatiile:
ss ← 0 ; PR ← 18 Τ 0 ; → (1)
Modificarile continuturilor lui ss si RSECV vor fi sincronizate cu ceasul.
Solutie: Pentru implementare, pe langa resursele mentionate mai sus, se va mai introduce un
registru de adrese RA[10] de 10 biti. Cele patru secvente sunt notate cu A, B, C, D si vor avea,
in zecimal, urmatoarele adrese de start: 0, 256, 512, 768. Frecventa ceasului este compatibila cu
rata impusa de citirile efectuate de masina unealta. Un cuvant se citeste din memeorie intr-o
singura perioada de tact.

SECV RSECV

start R ROM R IESRP


A P
ss
stop
MODULE: Unitate_de _comanda_pentru_o_masina_unealta
MEMORY: ROM[1024:18]; RP[18]; RA[10]; RSECV[2]; ss
INPUTS: SECV[2]; start; stop
OUTPUTS: IESRP[18]
1. RSECV ← SECV
→ (ss, ss)/(1,2)
2. RA ← RSECV0, RSECV1, 8 Τ 0
3. RP ← BUSFN(ROM; DCD(AR))
4. RA ← INC(RA)
→ (( ∩ /RA 2:9 ∩ ss ), ss, ( ∩ /RA 2:9 ∩ ss ))/(5, 6 ,3)
5. ss ← 0
6. RP ← 18 Τ 0
→ (1)
ENDSECV
ss ← (1 ! 0) * (start, stop)
IESRP = RP
END
Plecand de la descrierea AHPL, de mai sus, sa se detalieze sectiunea de executie si sectiunea de
comanda la nivelul schemelor cu porti, bistabile, registre, inclusiv semnalele de comanda.

71. Verificator de caractere duble.


Sa se proiecteze un modul numeric destinat verificarii caracterelor duble, prezente intr-un sir de
caractere de cate 8 biti. Modulul poseda o linie de intrare, data, care va fi activata, pe nivel
ridicat, de catre sursa de caractere, atunci cand un nou caracter este disponibil pe cele 8 linii de
intrare CAR. Tranzitiile pe intrarile data si CAR[8] sunt sincronizate cu ceasul verificatorului de
caractere. O linie de iesire, accept, va furniza un semnal de tip nivel, cu durata unei perioade de
tact, dupa acceptarea caracterului de la intrarea CAR. O linie de iesire, y, conectata la un
vistabil, Y, va fi activa pe nivel ridicat, in cazul in care cel mai recent caracter receptionat
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.
Intervalul intre spsirile a doua caractere succesive este suficient de mare pentru a permite
verificarea seriala a existentei vreunei dubluri.
Sa se prezinte descrierea in AHPL a verificatorului de caractere duble.

CAR[8] RIN[8]
data y
MRD[16:8] Y[1]
accept
CNT[4]

Solutie: Verificatorul de caractere duble va contine un tablou de 8 registre de deplasare, a cate


16 biti fiecare. Acest tablou de registre va fi vazut ca o memorie MRD de 16 cuvinte a cate 8
biti: MRD[16:8]. In schema trebuie prevazute un registru de intrare RIN[8] si un contor
CNT[4], de caractere. Caracterul curent, receptionat in RIN, este comparat cu fiecare caracter,
stocat in MRD, in procesul rotirii caracterelor catre linia superioara. CNT va contoriza
verificarea celor 16 caractere din MRD. Dupa terminarea verificarii ultimului caracter din MRD,
caracterul curent, din RIN, este fortat in MRD15, in timp ce cuvantul, inregistrat de cel mai mult
timp, care se afla in MRD0, este pierdut. La detectarea unui caracter dublu semnalul y este fortat
in 1.
Descrierea AHPL a modulului.
MODULE: Verificator_de_caractere_duble
MEMORY: MRD[16:8]; RIN[8]; CNT[4]; Y[1]
INPUTS: CAR[8]; data
OUTPUTS: accept; y
1. → (data, data)/(1, 2)
2. accept = 1; y ← 0
RIN ← CAR; CNT ← 4Τ 0
3. Y * ∪ /(RIN ⊕ MRD0) ← 1
CNT ← INC(CNT)
MRD ← (MRD1:15 ! MRD0)
→ ( ∩ /CNT, ∩ /CNT )/(4,3)
4. MRD ← (MRD1:15 ! RIN)
→ (1)
ENDSEQUENCE
y =Y
END
module calculator;
// declaratii registre, memorie etc

reg [7:0] ac, ri, rd;


reg [3:0] ra, cp;
reg z,s,c,reset;
reg [7:0] m[0:15];

//incarcarea programului

initial begin: incarca_prog


//incarcarea programului
$readmemb("prog2.v",m);
//afisarea rezultatelor simularii sub forma tabelara
$display(" timp cp ra rd ri ac z s reset");
$monitor("%d %d %h %h %h %h %h %h %h",
$time, cp,ra,rd,ri,ac,z,s,reset);
//afisarea formelor de unda
$vw_dumpvars();
$vw_group("all",$time,cp,ra,rd,ri,ac,z,s,reset);
//aplicarea semnalului reset (vezi task-ul apply_reset)
apply_reset;
end

//oprire simulare
initial begin: stop_at
#300; $stop;
end

//bucla principala

always begin:bucla_principala
if (!reset)
begin
#10; fetch;
#10; execute;
end
else
#10;
end

// mijloace de depanare

task apply_reset;
begin
reset = 1;
#10;
reset = 0;
cp = 0;
ac = 0;
end
endtask

// Task-urile principale: fetch, execute

task fetch;
begin
rd = m[cp];
cp = cp + 1;
end
endtask

task execute;
begin
ri = rd;
case(ri[7:4])

4'b0000:begin // LAC
ra = ri[3:0];
rd = m[ra];
ac = rd;
end
4'b0001:begin // SAC
ra = ri[3:0];
rd = ac;
m[ra] = rd;
end
4'b0010:begin // ADN
ra = ri[3:0];
rd = m[ra];
ac = ac+rd;
s = ~ac[7];
z = ~(|ac);
end
4'b0011:begin //SCD
ra = ri[3:0];
rd = m[ra];
ac = ac-rd;
s = ~ac[7];
z = ~(|ac);
end
4'b0100: begin//AND
ra = ri[3:0];
rd = m[ra];
ac = ac & rd;
end
4'b0101:begin // OR
ra = ri[3:0];
rd = m[ra];
ac = ac | rd;
end
4'b0110:begin // XOR
ra = ri[3:0];
rd = m[ra];
ac = ac ^ rd;
end
4'b0111:begin // NAC
ac = ~ac;
end
4'b1000:begin // JMP
cp = ri[3:0];
end
4'b1001:begin // JPZ
if(z)begin
cp = ri[3:0];
end
else
cp = cp;
end
4'b1010:begin // JN
if(~z) begin
cp = ri[3:0];
end
else
cp = cp;
end
4'b1100:// HLT
begin
$display("halt");
$stop;
end
default: $display("cod de operatie inexistent");
endcase
end
endtask
endmodule
//prog2.v
00001100
01001101
00001100
01011101
00001100
01101110
11000000
00000000
00000000
00000000
00000000
00000000
10100101
01011010
10101010
00000000

Veriwell -k C:\Program Files\VeriWell\exe\VeriWell.key -l C:\Program


Files\VeriWell\exe\VeriWell.log calculator2.V
VeriWell for Win32 HDL <Version 2.1.1> Tue Nov 21 08:19:37 2000

This is a free version of the VeriWell for Win32 Simulator


Distribute this freely; call 1-800-VERIWELL for ordering information
See the file "!readme.1st" for more information

Copyright (c) 1993-96 Wellspring Solutions, Inc.


All rights reserved

Memory Available: 0
Entering Phase I...
Compiling source file : calculator2.V
The size of this model is [7%, 7%] of the capacity of the free version

Entering Phase II...


Entering Phase III...
No errors in compilation
Top-level modules:
calculator

timp cp ra rd ri ac z s reset
0 x x xx xx xx x x 1
10 0 x xx xx 00 x x 0
20 1 x 0c xx 00 x x 0
30 1 c a5 0c a5 x x 0
40 2 c 4d 0c a5 x x 0
50 2 d 5a 4d 00 x x 0
60 3 d 0c 4d 00 x x 0
70 3 c a5 0c a5 x x 0
80 4 c 5d 0c a5 x x 0
90 4 d 5a 5d ff x x 0
100 5 d 0c 5d ff x x 0
110 5 c a5 0c a5 x x 0
120 6 c 6e 0c a5 x x 0
130 6 e aa 6e 0f x x 0
140 7 e c0 6e 0f x x 0
halt
Stop at simulation time 150
C1>
CSCI 320 Computer Architecture
Handbook on Verilog HDL
By
Dr. Daniel C. Hyde
Computer Science Department
Bucknell University
Lewisburg, PA 17837
Copyright 1995
By Daniel C. Hyde
August 25, 1995
Updated August 23, 1997
1. Tabla de materii
1. Introducere …….............................................................…………….................
1.1 Ce este Verilog?...................................................................…..……….....
1.2 Ce este VeriWell?...............................................................…........………
1.3 De ce se utilizeaza Verilog HDL? ....................................…..........……...
2. Limbajul Verilog…….. ……...........................................................……………
2.1 Primul Program Verilog....................................................…..........………
2.2 Conventii Lexicale.....................................................…....…..........………
2.3 Structura unui Program .....................................................…..........………
2.4 Tipuri de Date……...............................................................….......……….
2.4.1 Tipuri de Date Fizice.........................................................….…......
2.4.2 Tipuri de Date Abstracte................................................….……......
2.5 Operatori…................................................................................…..………..
2.5.1 Operatori Arithmetici. Binari...................................................……..
2.5.2 Operatori Arithmetici. Unari......................................................……
2.5.3 Operatori Relationali.....................................................................….
2.5.4 Operatori Logici ...............................................................................
2.5.5 Operatori la Nivel de Bit...................................................................
2.5.6 Operatori Unari de Reducere............................................................
2.5.7 Alti Operatori....................................................................................
2.5.8 Operator de Precedenta.....................................................................
2.6 Constructii de Control................................................................………........
2.6.1 Selectia: Instructiunile - if si case.......................…...........................
2.6.2 Repetarea: Instructiunile - for, while si repeat...................................
2.7 Alte Instructiuni......................................................................……………...
2.7.1 Instructiunea - parameter .................................................................
2.7.2 Atribuirea Continua .........................................................................
2.7.3 Atribuiri Procedurale Blocante si Non – blocante............................
2.8 Task-uri si Functii ...........................................................….....……….......
2.9 Controlul Sincronizarii (Timing)................................................………......
2.9.1 Controlul Intarzierii (#) ...................................................................
2.9.2 Evenimente........................................................................................
2.9.3 Instructiunea wait....................................................................…......
2.9.4 Instructiunile fork and join...............................................................
2.10 Examplu: Semafor de Trafic......................................................……........
3.Utilizarea simulatorului Veriwell.....................................…………….………....
3.1Crearea Fisierului Model ...........................................................………......
3.2 Pornirea simulatorului..........................................................……..……......
3.3 Cum se iese din Simulator? . ........................................................………...
3.4 Optiunile Simulatorului..................................................................……......
3.5 Depanarea ...............................................................................…………....
4. Functiile si Task-urile de Sistem........................................……………………..
4.1 $cleartrace................................................................…………….................
4.2 $display ..............................................................................……………......
4.3 $finish........................................................................……………...............
4.4 $monitor .......................................................................……………............
4.5 $scope ..............................................................................……………........
4.6 $settrace........................................................................……………............
4.7 $showscopes.............................................................................…………....
4.8 $showvars................................................................................………….....
4.9 $stop......................................................................................……………....
4.10 $time ....................................................................................……………..
Bibliografie..............................................................................………………….…

1. Introducere
Verilog reprezinta un Limbaj de Descriere a Hardware-lui (Hardware Description
Language -HDL).
Un asemenea limbaj este utilizat pentru descrierea sistemelor numerice, de exemplu, un
calculator sau o componenta a acestuia. Un sistem numeric poate fi descris, la niveluri diferite,
in functie de aspectele care intereseaza. Astfel, un HDL poate descrie amplasarea traseelor de
legatura (firele), a rezistoarelor si tranzistoarelor pe un circuit integrat, adica la nivel de
comutator. Limbajul HD poate descrie sistemul numeric avand in vedere portile logice si
bistabilele componente, adica la nivel de poarta. La un nivel mai ridicat sistemul numeric poate
fi descris in termenii transferurilor vectorilor de informatie intre registre. Acesta reprezinta
Nivelul Transferurilor intre Registre (Register Transfer Level - RTL). Limbajul Verilog
suporta toate aceste niveluri. In cele ce urmeaza se va pune accent pe aspectele limbajului
Verilog, care se refera nivelul RTL.
1.1. Ce este Verilog?
Verilog reprezinta unul dintre cele doua limbaje importante HDL, folosite de catre proiectantii
din industrie si din mediile academice. VHDL reprezinta cel de-al doile limbaj. In ceea ce
priveste industria parerile sunt impartite. Unii cred ca Verilog este mai usor de invatat si de
utilizat decat VHDL. Standardul IEEE, pentru VHDL, a aparut in 1987, in timp ce standardul
IEEE, pentru Verilog, a fost elaborat in 1995. Verilog este asemanator limbajului C, care este
foarte raspandit in randurile inginerilor electronisti si de calculatoare. VHDL este asemanator cu
limbajul Ada, mai putin cunoscut de catre inginerii amintiti mai sus.
Verilog a fost lansat, in 1985, de catre Gateway System Corporation, care a fost preluata de
catre Cadence Design Systems, Inc.’s Systems Division. Pana in 1990, cand a luat fiinta Open
Verilog International (OVI), HDL Verilog a fost proprietatea companiei Cadence. Ulterior,
Cadence a plasat Verilog in Domeniul Public, cu speranta deschiderii unei piete de produse
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
sa se bazeze pe pe acest limbaj, in vederea elaborarii de unelte de dezvoltare.
Verilog HDL permite proiectantului de hardware sa descrie proiectele, atat la un inalt nivel de
abstractizare, cum ar fi cel al arhitecturii sau comportamental, cat si la niveluri mai joase de
implementare ( nivelurile portii si comutatorului), conducand la mastile/sabloanele pentru
Circuitele Integrate pe Scara Foarte Larga (Very Large Scale Integration –VLSI-Integrated
Circuits –IC- ) si la fabricarea circuitului.
O prima utilizare a HDL-eurilor este acea legata de simularea proiectelor inainte de a fi
introduse in fabricatie. Textul de fata nu acopera toate aspectele ce privesc Verilog HDL, ci
numai acelea ce privesc nivelurile arhitectural si comportamental. Textul se axeaza pe
proiectarea la nivel RTL.
1.2. Ce este VeriWell?
VeriWell reprezinta o implementare cuprinzatoare a lui Verilog HDL, dezvoltata initial de catre
Wellspring Solutions, Inc. VeriWell suporta limbajul Verilog, conform specificatiilor
Manualului de Referinta a limbajului, eleborat de catre OVI. VeriWell a fost lansat in decembrie
1992 si a fost elaborat pentru a fi compatibil, atat cu standardul OVI, cat si cu Verilog-XL, al
companiei Cadence. VeriWell este distribuit si vandut de catre SynaptiCAD Inc.
Pentru platformele Windows 95/NT, Windows 3.1,Macintosh, SunOS si Linux, SynaptiCAD
Inc.ofera versiuni “free” ale produsului, care sunt identice cu cele ale produsului comercial, cu
exceptia limitarii la 1000 de linii de cod HDL
1.3. De ce se utilizeaza Verilog HDL?
Sistemele numerice sunt extrem de complexe. La nivelul celor mai mici detalii, ele constau in
sute de miloane de elemente de tipul tranzistoarelor sau al portilor. De aceea, pentru sistemele
numerice mari, proiectarea la nivelul portilor este practic imposibila. Pe durata mai multor
decade, schemele logice au servit ca lingua franca pentru proiectarea logica, ceea ce nu mai este
cazul, in conditiile de astazi. In prezent, complexitatea hardware-lui a devenit atat de mare incat
o schema la nivelul portilor logice este aproape inutila. Schema devine un paienjenis de
conexiuni, care nu mai arata functionalitatea proiectului.
Incepand cu 1970, inginerii de calculatoare si inginerii electronisti au apelat la limbajele de
descriere a hardware-lui (HDL). Cele mai raspandite HDL-euri in industrie sunt Verilog si
VHDL. In urma cu 5 ani Verilog se afla pe primul loc cu peste 10.000 de utilizatori/proiectanti
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
largi game de niveluri de abstractizare si, in acelasi timp, ii asigura accesul la uneltele de
proiectare asistata de calculator, la nivelurile avute in vedere.
Verilog permite proiectantilor de hardware sa descrie proiectele cu ajutorul constructiilor
comportamentale, amanand detaliile de implementare pentru stadiile ulterioare ale procesului de
proiectare. O reprezentarea abstracta ajuta proiectantul in explorarea alternativelor arhitecturale
prin simulari, pentru a detecta congestiile proiectului inaintea inceperii proiectarii detaliate.
Desi nivelul comportamental Verilog reprezinta un nivel inalt de descriere a unui sistem
numeric, el reprezinta o notatie precisa. Exista unelete de proiectarea asistata, materializate prin
programe, care vor “compila” programele elaborate in Verilog pana la nivelul circuitelor
constand in porti si bistabile.
Astfel, se poate merge in laborator pentru a se conecta circuitele logice prin cablaje in vederea
obtinerii unui sistem functional. Alte unelte de proiectare pot “compila” programele descrise in
Verilog intr-o descriere a mastilor de circuite integrate , pentru Integrarea pe Scara Larga
(VLSI). De aceea, cu ajutorul unor unelte automatizate corespunzatoare se poate crea o
descriere a proiectului VLSI in Verilog, in vederea transmiterii ei prin posta electronica, catre o
“topitorie de siliciu”, pentru a primi ulterior, in cateva saptamani, circuitul integrat.
Verilog permite, de asemenea, proiectantului sa specifice proiectele la nivelul portii logice,
folosind constructiile porti si la nivelul tranzistorului, utilizand constructiile comutator.
Scopul urmarit, in materialul de fata, nu este acela de a crea circuite VLSI, ci de a folosi
limbajul Verilog pentru a descrie precis functionalitatea oricarui sistem numeric, de exemplu,
un calculator.
In orice caz, un circuit VLSI, proiectat pe baza constructiilor comportamentale din Verilog, va fi
destul de lent si va ocupa o arie importanta pe pastila de siliciu. Nivelurile mai coborate ale
limbajului Verilog permit inginerilor sa optimizeze circuitele logice si mastile/sabloanele VLSI
pentru a maximiza viteza si a minimiza aria circuitului VLSI
2. Limbajul Verilog.
Aceste note de curs nu isi propun o descriere completa a limbajului Verilog. Vor fi descrise
numai acele elemente ale linbajului, care vor permite studentului sa exploreze aspectele
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
standardul IEEE.
Studiul limbajului Verilog va fi inceput prin parcurgerea unui exemplu, constand intr-un
program simplu Verilog
Examinarea instructiunilor de atribuire permite observarea similitudinii limbajului Verilog cu
limbajul C. Comentariile sunt asemanatoare cu cele din C++, adica “//”, la inceputul liniei.
Limbajul Verilog descrie un sistem numeric sub forma unui set de module, dar, in cele ce
urmeaza va fi prezent un singur modul numit “simple”
2.1 Primul program Verilog.
//Dan Hyde; August 9, 1995
// Un prim model numeric in Verilog
module simple;
// Exemplu simplu la nivel RTL, pentru a demonstra Verilog.
// Registrul A este incrementat cu unu. Apoi primii patru biti ai registrului B sunt incarcati cu
// valorile negate ale ultimilor patru biti din A. C reprezinta o reducere “and” a ultimilor doi biti
// din A.
//declare registers and flip-flops
reg [0:7] A, B;
reg C;
// Cele doua constructii “initial” si always” opereaza concurent
initial begin: stop_at
// Va opri executia dupa 20 unitati de simulare.
#20; $stop;
end
// Aceste instructiuni sunt executate la timpul simulat 0 ( nu exista #k).
initial begin: Init
// Initializeaza registrul A. Celelalte registre au valori “x”.
A = 0;
// Antetul de afisare.
$display("Time A B C");
// Afisaza valorile A, B, C in cazurile in care acestea se modifica.
$monitor(" %0d %b %b %b", $time, A, B, C);
end
//main_process va cicla pana la terminarea simularii.
always begin: main_process
// #1 insemna executia dupa o unitate de timp de simulare.
#1 A = A + 1;
#1 B[0:3] = ~A[4:7]; // ~ este operatorul "not" la nivel de bit
#1 C = &A[6:7]; // reducerea "and" a ultimilor doi biti ai registrului
end
endmodule
In module simple au fost declarate doua registrea A si B de cate 8 biti si un registru C, de un bit
sau bistabil. In interiorul modulului, o constructie “always” si doua constructii “initial” descriu
firele de control, care se executa in acelasi timp sau concurent. In constructia initial
instructiunile sunt executate secvential ca in C sau in alte limbaje imperative traditionale.
Constructia always este asemanatoare cu constructia initial cu exceptia ca aceasta cicleaza
continuu, cat timp opereaza simulatorul.
Notatia #1 semnifica faptul ca instructiunea care urmeaza se va executa cu o intarziere de o
unitate de timp simulat. De aceea, firul de control, provocat de catre prima constructie initial,
va intarzia, cu 20 unitati de timp simulat, chemarea task-ului de sistem $stop si va opri
simularea.
Task-ul de sistem $display permite proiectantului sa tipareasca mesajele in maniera in care
printf o face in limbajul C. La fiecare unitate de timp simulat, cand una dintre variabilele listate
isi modifica valoarea, task- ul de sistem $monitor tipareste un mesaj. Functia de sistem $time
intoarce valoarea curenta a timpului simulat.
Mai jos se prezinta iesirea Simulatorului VeriWell: ( A se vedea Sectiunea 3, referitoare la
utilizarea Simulatorului VeriWell).
Time A B C
0 00000000 xxxxxxxx x
1 00000001 xxxxxxxx x
2 00000001 1110xxxx x
3 00000001 1110xxxx 0
4 00000010 1110xxxx 0
5 00000010 1101xxxx 0
7 00000011 1101xxxx 0
8 00000011 1100xxxx 0
9 00000011 1100xxxx 1
10 00000100 1100xxxx 1
11 00000100 1011xxxx 1
12 00000100 1011xxxx 0
13 00000101 1011xxxx 0
14 00000101 1010xxxx 0
16 00000110 1010xxxx 0
17 00000110 1001xxxx 0
19 00000111 1001xxxx 0
Stop at simulation time 20
Acest program, cat si rezultatele simularii trebuie studiate cu atentie. Structura programului este
tipica pentru programele Verilog, care vor fi scrise in acest curs: o constructie initial, pentru a
specifica durata simularii, o alta constructie initial, pentru initializarea registrelor si pentru a
specifica registrele care se monitorizeaza si o constructie always, pentru sistemul numeric
modelat. De observat ca toate instructiunile din cea de-a doua constructie initial sunt efectuate la
timpul time = 0, deoarece nu sunt prevazute instructiuni de intarziere: #<integer>.
2.2 Conventii Lexicale.
Conventiile lexicale sunt asemanatoare cu cele din limbajul C++. Comentariile sunt specificate
prin // la inceputul liniei, fiind valabile pentru acea linie. Comentariile pe mai multe linii incep
cu /* si se termina cu */. Cuvintele cheie, de exemplu, module, sunt rezervate si utilizeaza
literele mici ale alfabetului. Limbajul este sensibil la literele mici si la majuscule. Spatiile sunt
importante prin aceea ca delimiteaza obiectele in limbaj.
Numerele sunt specificate sub forma traditionala ca o serie de cifre cu sau fara semn, in maniera
urmatoare:
<dimensiune>< format baza><numar>
unde <dimensiune> contine cifre zecimale care specifica dimensiunea constantei ca numar de
biti.
Campul <dimensiune> este optional. Campul <format baza> are un singur caracter ’ urmat
de unul dintre urmatoarele caractere b, d, o si h, care specifica baza de numeratie: binara,
zecimala, octala si hexazecimala. Campul <numar> contine cifre care corespund lui < format
baza>.
Exemple:
549 // numar zecimal
'h 8FF // numar hexzecimal
'o765 // numar octal
4'b11 // numarul binar cu patru biti 0011
3'b10x // numar binar cu 3 biti, avand ultimul bit necunoscut
5'd3 // numar zecimal cu 5 ranguri
-4'b11 // complementul fata de 2, pe patru ranguri al numarului 0011 sau 1101
Campul <numar> poate sa nu aibe semn. Oricare semn trebuie sa fie plasat la inceput.
Un sir reprezinta o secventa de caractere plasate intre ghilimele: “acesta este un sir”.
Operatorii pot fi exprimati prin unul, doua sau trei caractere (sectiunea 2.5).
Un identificator este specificat printr-o litera sau “underscore” urmat de zero sau mai multe
litere, cifre, semne dolar sau “underscores”. Identificatorii pot avea pana la 1024 caractere.
2.3 Structura unui Program.
Limbajul Verilog descrie un sistem numeric ca un set de module. Fiecare dintre aceste module
are o interfata cu alte module, pentru a specifica modul in care sunt interconectate. De regula se
plaseaza un modul intr-un fisier, fara ca aceasta sa fie o cerinta obligatorie. Modulele opereaza
concurent. In general, exista un modul pe nivelul cel mai inalt, care specifica un sistem inchis ce
contine, atat datele de test, cat si modelele hardware. Modulul de pe nivelul cel mai inalt invoca
aparitii ale celorlalte module.
Modulele reprezinta parti hardware, care pot fi de la simple porti pana la sisteme complete ex.,
un microprocesor. Modulele pot fi specificate, fie comportamental, fie structural (sau o
combinatie a celor doua). O specificare comportamentala defineste comportarea unui sistem
numeric (modul) folosind constructiile limbajelor de programare traditionale, de exemplu: if,
instructiuni de atribuire. O specificare structurala exprima comportarea unui sistem numeric
(modul) ca o conectare ierarhica de submodule. La baza ierarhiei componentele trebuie sa fie
primitive sau sa fie specificate comportamental.
Primitivele Verilog includ atat porti, cat si tranzistoare de trecere (comutatoare).
Structura unui modul este urmatoarea:
module <nume_modul> (<lista de porturi>);
<declaratii>
<obiecte ale modulului>
endmodule

Mai sus <nume_modul> reprezinta un identificator care, in mod unic, denumeste modulul. De
asemenea, <lista de porturi> constituie o lista de porturi de intrare (input), iesire (output) sau
intrare/iesire (inout), care sunt folosite pentru conectarea cu alte module. Sectiunea
<declaratii> specifica obiectele de tip date ca registre (reg), memorii si fire (wire), cat si
constructiile procedurale ca function-s si task-s
Sectiunea <obiecte ale modulului> poate contine: constructii initial, constructii always,
atribuiri continue sau aparitii/instante ale modulelor.
Semantica constructiei unui module in Verilog este diferita de cea a subrutinelor, procedurilor
si a functiilor din alte limbaje. Un modul nu este chemat niciodata. Un modul are o instanta la
inceputul unui program si este prezent pe intreaga durata a programului. O instanta a unui modul
Verilog este utilizata ca model al unui circuit hardware la care se presupune ca nu se efectueaza
modificari de cablaj. La fiecare instanta a modulului, acesteia i se da un nume.
De exemplu NAND1 si NAND2 sunt nume de instante ale porti NAND, in exemplul de mai jos.
In acest exemplu este data o specificare comportamentala a unui modul NAND.
Iesirea out este negatia produsului and al intrarilor in1 si in2.
// Modelul Comportamenta al portii Nand.
// Dan Hyde, August 9, 1995
module NAND(in1, in2, out);
input in1, in2;
output out;
// instructiune de atribuire continua. o
assign out = ~(in1 & in2);
endmodule
Porturile in1, in2 si out sunt etichete pe fire. Atribuirea continua assign urmareste in
permanenta eventualele modificari ale variabilelor din membrul drept, pentru reevaluarea
expresiei si pentru propagarea rezultatului in membrul stang (out).
Instructiunea de atribuire continua este utilizata pentru a modela circuitele combinationale la
care iesirile se modifica ca urmare a modificarilor intrarilor.
Specificarea structurala a unui modul AND, obtinuta ca urmare a conectarii iesirii unui NAND
la cele doua intrari ale altui NAND.
module AND(in1, in2, out);
// Modelul structural al unei porti AND formata din doua porti NAND.
input in1, in2;
output out;
wire w1;
// doua instante ale modulului NAND
NAND NAND1(in1, in2, w1);
NAND NAND2(w1, w1, out);
endmodule
Acest modul are doua instante ale lui NAND, numite NAND1 si NAND2, conectate printr-un fir
intern w1
Forma generala pentru invocarea unei instante este urmatoarea:
<nume_modul > <lista de parametri > <numele instantei> (<lista de porturi>);
unde <lista de parametri> are valorile parametrilor, care sunt transferate catre instanta. Un
exemplu de parametru transferat ar fi intarzierea pe o poarta.
Urmatorul modul reprezinta un modul de nivel inalt, care stabileste anumite seturi de date si
care asigura monitorizarea variabilelor.
module test_AND;
// Modul de nivel inalt pentru testarea altor doua module.
reg a, b;
wire out1, out2;
initial begin // Datele de test
a = 0; b = 0;
#1 a = 1;
#1 b = 1;
#1 a = 0;
end
initial begin // Activarea monitorizarii
$monitor("Time=%0d a=%b b=%b out1=%b out2=%b",
$time, a, b, out1, out2);
end
// Instantele modulelor AND si NAND
AND gate1(a, b, out2);
NAND gate2(a, b, out1);
Endmodule
De notat ca valorile a si b trebuie mentinute pe toata durata operarii. De aceea este necesara
utilizarea unor registre de cate un bit. Variabilele de tip reg stocheaza ultima valoare care le-a
fost atribuita procedural. Firul, wire, nu are capacitatea de memorare. El poate fi comandat in
mod continuu, de exemplu, prin instructiunea de atribuire continua sau prin iesirea unui modul
Daca firele de intrare nu sunt conectate, ele vor lua valoarea x – necunoscuta.
Atribuirile continue folosesc cuvantul cheie assign in timp ce atribuirile procedurale au forma
<variabila reg > = <expresie> unde <variabila reg> trebuie sa fie un registru sau o memorie
Atribuirile procedurale pot aparea numai in constructiile initial si always
Instructiunile din blocul primei constructii initial vor fi executate secvential, dintre care unele
vor fi intarziate de #1 cu o unitate de timp simulat. Constructia always se comporta in acelasi
mod ca si constructia initial cu exceptia ca ea cicleaza la infinit (pana la terminarea simularii).
Constructiile initial si always sunt utilizate pentru modelarea logicii secventiale (automate cu
stari finite)
Verilog face o importanta distinctie intre atribuirile procedurale si atribuirea continua assign.
Atribuirile procedurale modifica starea unui registru, adica a logicii secventiale, in timp ce
atribuirea continua este utilizata pentru a modela logica combinationala. Atribuirile continue
comanda variabile de tip wire si sunt evaluate si actualizate atunci cand un operand de intrare
isi modifica valoarea. Este important de inteles si de memorat aceste diferente.
Toate cele trei module vor fi plasate intr-un fisier, care va fi executat de catre simulator pentru a
produce urmatoarea iesire:
Time=0 a=0 b=0 out1=1 out2=0
Time=1 a=1 b=0 out1=1 out2=0
Time=2 a=1 b=1 out1=0 out2=1
Time=3 a=0 b=1 out1=1 out2=0
Intrucat simulatorul iese din cadrul evenimentelor, nu a mai fost necesara oprirea explicita a
simularii.
2.4 Tipuri de Date
2.4.1 Tipuri de Date Fizice.
Intrucat scopul limbajului Verilog este acela de a modela hardware-ul numeric, tipurile primare
de date vor fi destinate modelarii registrelor (reg) si firelor (wire). Variabilele reg stocheaza
ultima valoare, care le-a fost atribuita procedural, in timp ce variabilele wire reprezinta
conexiuni fizice intre entitati structurale cum ar fi portile. Un fir (wire) nu stocheaza o valoare.
O variabila wire reprezinta numai o eticheta pe un fir. Trebuie remarcat faptul ca tipul de date
wire reprezinta unul dintre tipurile de date net prezente in Verilog in care mai sunt incluse:
“and cablat (wand)”, “or cablat (wor)” si “magistrala cu trei stari (tri)”. Aceste note se
limiteaza numai la tipul de date wire.
Obiectele reg si wire , care reprezinta date, pot lua urmatoarele valori:
0 valoarea logica zero sau fals
1 unu logic sau adevarat
x valoare logica necunoscuta
z impedanta ridicata a unei porti “tristate”.
La inceputul simularii variabilele reg sunt initializate la valoarea x. Oricare variabila wire
neconectata la ceva are valoarea x.
In declaratii se poate specifica dimensiunea unui registru sau a unui fir. De exemplu,
declaratiile:
reg [0:7] A, B;
wire [0:3] Dataout;
reg [7:0] C;
specifica registrele A si B ca avand 8 biti, cu cel mai semnificativ bit avand indicele zero, in
timp ce registrul C, de opt biti, are indicele sapte, pentru cel mai semnificativ bit. specify
Firul Dataout are 4 biti.
Bitii unui registru sunt specificati prin notatia:[<start-bit>:<end-bit>].
De exemplu, in cea de-a doua atribuire procedurala, din secventa:
initial begin: int1
A = 8'b01011010;
B = {A[0:3] | A[4:7], 4'b0000};
end
B este fortat la o valoare egala cu suma logica a primilor patru biti din A si a ultimilor patru
biti din A, concatenata cu 0000. B are acum valoarea 11110000. Parantezele {} specifica faptul
ca bitii a doua sau ai mai multor argumente, separati prin virgule sunt concatenati impreuna.
Un argument poate fi replicat prin specificarea numarului de repetitii sub forma:
{numar_repetitii{exp1, exp2, ... , expn}}
Iata cateva exemple:
C = {2{4’b1011}}; //lui C I se asigneaza vectorul de biti: 8’b10111011
C = {{4{A[4]}}, AA[4:7]}; // primii 4 biti reprezinta extensia semnului.
Intr-o expresie gama de referire trebuie sa aibe, pentru indici, expresii constante. Un singur bit
poate fi referit ca o variabila. De exemplu:
reg [0:7] A, B;
B = 3;
A[0: B] = 3'b111; // ILEGAL – indicii trebuie sa fie constanti!!
A[B] = 1'b1; // Referirea la un singur bit este LEGALA.
Aceasta cerinta stricta privind valorile constante pentru indici, la referirea unui registru, este
impusa de faptul ca se doreste ca expresia sa fie realizabila fizic, in hardware.
Memoriile sunt specificate ca vectori de registre. De exemplu Mem are 1K cuvinte de cate 32
de biti.
reg [31:0] Mem [0:1023];
Notatia Mem[0] asigura referirea la cuvantul cua adresa zero din memorie. Tabloul de indici
pentru o memorie (vector de registre) poate fi un registru. De remarcat faptul ca o memorie nu
poate fi accesata la nivel de bit, in Verilog. Pentru a realiza aceasta operatie, cuvantul din
memorie trebuie transferat mai intai intr-un registru temporar.

2.4.2 Tipuri de Date Abstracte.


Intr-un model de hardware, pe landga variabilele, care modeleaza hardware-ul, se gasesc si alte
tipuri de variabile. De exemplu, proiectantul doreste sa foloseasca o variabila integer, pentru a
contoriza numarul de aparitii ale unui eveniment. Pentru comoditatea proiectantului, Verilog
HDL poseda mai multe tipuri de date carora nu le corespund realizari hardware. Aceste tipuri de
date include integer, real si time. Tipurile de date integer si real se comporta ca si in alte
limbaje, de exemplu C.
Trebuie subliniata faptul ca variabila reg este fara semn, in timp ce variabial integer reprezinta
un intreg de 32 de biti cu semn. Acest fapt are o mare importanta la scadere.
Variabila time specifica cantitati, pe 64 de biti, si sunt folosite in conjunctie cu functia de
sistem $time. Sunt acceptate tablouri de variabile integer si time , dar nu de reali. In Verilog
nu sunt permise tablouri multidimensionale Iata cateva exemple:
integer Count; // intreg simplu, cu semn, pe 32 de biti.
integer K[1:64]; // un tablou de 64 intregi.
time Start, Stop; // doua variabile timp de 64 de biti.
2.5 Operatori
2.5.1 Operatori Aritmetici binari.
Operatorii aritmetici binari opereaza cu doi operanzi. Operanzii de tip reg si net sunt tratati ca
fara semn. Operanziide tip real si integer pot avea semn. Daca un bit oarecare, al unui operand,
este necunoscut (‘x’), atunci rezultatul este necunoscut.
Operator Nume Comentarii
+ Adunare
- Scadere
* Inmultire
/ Impartire Impartirea cu zero furnizeaza un x, necunoscut
% Modul
2.5.2 Operatori Aritmetici Unari.
Operator Nume Comentarii
- Minus Unar Modifica semnul operandului sau
2.5.3 Operatori Relationali.
Operatorii relationali compara doi operanzi si intorc o valoare logica, adica TRUE(1) sau
FALSE(0). Daca un bit oarecare este necunoscut, relatia este ambigua si rezultatul este
necunoscut.
Operator Nume Comentarii
> Mai mare decat
>= Mai mare decat sau egal
< Mai mic decat
<= Mai mic decat sau egal
== Egalitate logica
!= Inegalitae logica
2.5.4 Operatori Logici
Operatorii logici opereaza cu operanzi logici si intorc o valoare logica, adica TRUE(1) sau
FALSE(0). Sunt utilizati in instructiunile if si while. A nu se confunda cu operatorii logici
Booleeni la nivel de bit. De exemplu, ! este un NOT logic iar ~ este NOT la nivel de bit. Primul
neaga, ex., !(5 == 6) este TRUE. Al doile complementeaza bitii, de exemplu: ~{1,0,1,1} este
0100.
Operator Nume Comentarii
! Negatia logica
&& AND logic
|| OR logic
2.5.5 Operatori la nivel de bit.
Opeartorii la nivel de bit opereaza pe bitii operandului sau operanzilor. De exemplu, rezultatul
lui A& B este AND pentru bitii corespunzatori din A si B. Operand pe un bit necunoscut, se
obtine un bit necunoscut (x) in valoarea rezultatului. De exemplu, AND-ul unui x cu un FALSE
este un x. OR-rul unui x cu un TRUE este un TRUE.
Operator Nume Comentarii
~ Negatia la nivel de bit
& AND la nivel de bit
| OR la nivel de bit.
^ XOR la nivel de bit
~& NAND la nivel de bit
~| NOR la nivel de bit
~^ sau ^~ Echivalenta la nivel de bit NOT XOR
2.5.6 Operatori unari de reducere.
Operatorii unari de reducere furnizeaza un rezultat de un singur bit prin aplicarea operatorului
la toti bitii operandului. de exemplu, &A va efectua AND pe toti bitii lui A.
Operator Nume Comentarii
& reducere AND
| reducere OR
^ reducere XOR
~& reducere NAND
~| reducere NOR
~^ reducere XNOR
2.5.7 Alti Operatori.
Operatorul conditional se comporta ca si in limbajul C.
Operator Nume Comentarii
=== Egalitatea Case. Comparatia la nivel de bit include compararea
valorilor x si z. Toti bitii trebuie sa se potriveasca,
pentru egalitate. Intoarce TRUE sau FALSE.
!== Inegalitatea Case Comparatia la nivel de bit include compararea
valorilor x si z. Oricare diferenta intre bitii
comparati produce o inegalitate. Intoarce TRUE sau
FALSE.
{,} Concatenarea Reuneste bitii separati, furnizati de doua sau mai
multe expresii separate prin virgule, de exemplu:
{A[0], B[1:7]} concateneraza bitul zero din A cu
bitii 1pana la 7 din B.
<< Deplasare la stanga. Pozitiile din dreapta eliberate se incarca cu zero, de
exemplu: A = A << 2; //deplaseaza A cu doi biti la
stanga si forteaza zero in bitii eliberati.
>> Deplasare la dreapta Pozitiile din stanga eliberate se incarca cu zero
?: Conditional Atribuie una dintre cele doua valori, in functie de
Conditional, de exemplu: A = C>D ? B+3 : B-2
semnifica faptul ca daca C > D, atunci valoarea lui
A este B+3 altfel B-2.
2.5.8 Precedenta operatorilor.
Precedenta operatorilor este prezentata mai jos: Varful tabelei corespunde celei mai ridicate
precedente, in timp ce baza corespunde celei mai coborate precedente.Operatorii de pe aceeasi
linie au aceeasi precedenta si asociaza termenul stang celui drept intr-o expresie. Parantezele
sunt utilizate pentru a modifica precedenta sau pentru a clarifica situatia. Pentru a usura
intelegerea, se recomanda utilizarea parantezelor.
operatori unari: ! & ~& | ~| ^ ~^ + - (cea mai ridicata precedenta)
* / %
+ -
<< >>
< <= > >=
== != === ~==
& ~& ^ ~^
| ~|
&&
||
?:

2.6 Constructiile de Control.


Verilog poseda o bogata colectie de instructiuni de control, care pot fi utilizate in sectiunile
procedurale de cod, adica in cadrul blocurilor initial si always. Cele mai multe sunt familiare
programatorului, care cunoaste limbajele traditionale de programare, cum ar fi limbajul C.
Principala diferenta consta in aceea ca in locul parantezelor { }, din limbajul C, Verilog
utilizeaza begin si end. In Verilog, parantezele { } sunt utilizate pentru concatenarea sirurilor de
biti. Deoarece cei mai multi utilizatori sunt familiarizati cu limbajul C, urmatoarele subsectiuni
vor contine numai cate un exemplu din fiecare constructie.
2.6.1 Selectia – Instructiunile if si case.
Instructiunea if este usor de utilizat:
if (A == 4)
begin
B = 2;
end
else
begin
B = 4;
end
Spre deosebire de instructiunea case din C, prima <value> care se potriveste cu valoarea lui
<expression> este selectata si instructiunea asociata este executata, apoi controlul este transferat
dupa endcase, adica nu sunt necesare instructiuni break ca in C.
case (<expression>)
<value1>: <instructiune>
<value2>: <instructiune>
default: <instructiune>
endcase
In urmatorul exemplu se verifica valoarea semnalului de 1 bit .
case (sig)
1'bz: $display("Semnal flotant");
1'bx: $display("Semnal necunoscut");
default: $display("Semnalul este %b", sig);
endcase
2.6.2 Repetitia – Instructiunile for, while si repeat.
Instructiunea for este foarte apropiata de instructiunea for din C, cu exceptia ca operatorii ++ si
– nu sunt prezenti in Verilog. De aceea se va folosi i = i + 1.
for(i = 0; i < 10; i = i + 1)
begin
$display("i= %0d", i);
end
Instructiunea while opereaza in forma normala:
i = 0;
while(i < 10)
begin
$display("i= %0d", i);
i = i + 1;
end
Instructiunea repeat repeta urmatorul bloc de un numar fixat de ori, in exemplul urmator de 5
ori:
repeat (5)
begin
$display("i= %0d", i);
i = i + 1;
end
2.7 Alte Instructiuni.
2.7.1 Instructiunea parameter.
Instructiunea parametru permite programatorului sa dea unei constante un nume. In mod tipic se
utilizeaza pentru a specifica numarul de biti ai unui registru sau intarzierile. De exemplu, se pot
parametriza declaratiile unui model:
parameter byte_size = 8;
reg [byte_size - 1:0] A, B;
2.7.2 Atribuirea Continua.
Atribuirea continua comanda variabile de tip wire, fiind evaluate si actualizate ori de cate ori o
intrare operand isi modifica valoarea. In cele ce urmeaza valorile de pe firele in1 si in2 sunt
inmultite pentru a comanda iesirea out. Cuvantul cheie assign este utilizat pentru a face
distinctia intre atribuirea continua si atribuirea procedurala. Instructiunea urmatoare efecteaza
produsul semnalelor de pe firele in1 si in2, neaga rezultatul si comanda continuu firul out.
assign out = ~(in1 & in2);
2.7.3 Atribuiri Procedurale Blocante si Nonblocante.
Limbajul Verilog are doua forme pentru instructiunea de atribuire procedurala: blocanta si
nonblocanta. Cele doua forme se deosebesc prin operatorii de atribuire = si <=. Instructiunea de
atribuire blocanta (operatorul =) actioneaza ca si in limbajele traditionale de programare.
Intreaga instructiune este efectuata inainte de a trece controlul la urmatoarea instructiune.
Instructiunea nonblocanta (operator <=) evalueaza termenul din dreapta, pentru unitatea curenta
de timp, si atribuie valoarea obtinuta termenului din stanga, la sfarsitul unitatii de timp. De
exemplu, urmatorul program Verilog testeaza atribuirile blocante si non blocante:
// testarea atribuirii blocante si nonblocante
module blocant;
reg [0:7] A, B;
initial begin: init1
A = 3;
#1 A = A + 1; // atribuire procedurala blocanta
B = A + 1;
$display("Blocanta: A= %b B= %b", A, B );
A = 3;
#1 A <= A + 1; // atribuire procedurala non blocanta
B <= A + 1;
#1 $display("Nonblocanta: A= %b B= %b", A, B );
end
endmodule
si produce urmatoarele iesiri:
Blocanta: A= 00000100 B= 00000101
Nonblocanta: A= 00000100 B= 00000100
Efectul este acela ca, pentru toate atribuirile nonblocante se folosesc vechile valori ale
variabilelor, de la inceputul unitatii curente de timp, pentru a asigna registrelor noile valor, la
sfarsitul unitatii curentre de timp. Aceasta reprezinta o reflectarea a modului in care apar unele
transferuri intre registre, in unele sisteme hardware.
2.8 Task-uri si Functii.
Task-urile sunt asemanatoare procedurilor din alte limbaje de programare, de exemplu, task-
urile pot avea zero sau mai multe argumente si nu intorc o valoare. Functiile se comporta ca
subrutinele din alte limbaje de programare.
Exceptii:
1. O functie Verilog trebuie sa se execute intr-o unitate de timp simulat. Nu vor exista
instructiuni de control al timpului: comanda intarzierii (#), comanda de eveniment (@) sau
instructiunea wait. Un task poate contine instructiuni controlate de timp..
2. O functie Verilog nu poate invoca (call, enable) un task; in timp ce un task poate chema alte
task-uri si functii.
Definitia unui task este urmatoarea:
task <nume_task >; //De observat ca nu exista o lista de parametri sau ().
<porturi argumente>
<declaratii>
<instructiuni>
endtask
O invocare a unui task este de forma urmatoare:
<nume_task > (<lista de porturi>);
unde <lista de porturi> este o lista de expresii, care corespund prin pozitie lui <porturi
argumente> din definitie. Porturi argumente, in definitie pot fi: input, inout sau output.
Deoarece <porturi argumente> din definitia task-ului arata ca si alte declaratii, programatorul
trebuie sa fie atent, in ceea ce priveste adaugarea declaratiilor la inceputul task-ului.
// Testarea task-urilor si a functiilor
// Dan Hyde, Aug 28, 1995
module tasks;
task add; // definitia task-ului
input a, b; // doua porturi de intrare argumente
output c; // un port de iesire argument
reg R; // declaratie de registru
begin
R = 1;
if (a == b)
c = 1 & R;
else
c = 0;
end
endtask
initial begin: init1
reg p;
add(1, 0, p); // invocarea task-ului cu 3 argumente
$display("p= %b", p);
end
endmodule
Parametri input si inout sunt transferati prin valoare catre task, iar parametrii output si inout
sunt transferati inapoi prin valoare, catre constructia care a invocat task-ul. Chemarea prin
referire nu este disponibila. Alocarea tuturor variabilelor este statica. Astfel, un task se poate
autoinvoca, dar la fiecare invocare se va folosi aceeasi memorie, ceea ce inseamna ca variabilele
locale nu sunt fortate in stiva. Deoarece firele concurente pot invoca acelasi task, programatorul
trebuie sa fie atent la natura statica a alocarii spatiului de memorie, pentru a evita suprascrierea
spatiului partajat de memorie.
Scopul unei functii este acela de a returna o valoare care urmeaza sa fie folosita intr-o expresie.
Definitia unei functii trebuie sa contina cel putin un argument de intrare, input. Transferul
argumentelor in functii este asemanator ca si la task-uri.
Definitia unei functii este urmatoarea:
function <gama sau tipul> <nume_functie>; //Nota: nu exista lista de parametri sau ().
< porturi argumente>
<declaratii>
<instructiuni>
endfunction
unde <gama/range sa tipul/type> este tipul rezultatelor returnate expresiei, care a chemat
functia. In interiorul functiei, trebuie sa se asigneze o valoare numelui functiei. Mai jos este
prezentata o functie, care este similara task-ului de mai sus.
// Testarea functiilor
// Dan Hyde, Aug 28, 1995
module functions;
function [1:1] add2; // definitia functiei
input a, b; // doua porturi argumente de intrare
reg R; // declararea registrului
begin
R = 1;
if (a == b)
add2 = 1 & R;
else
add2 = 0;
end
endfunction
initial begin: init1
reg p;
p = add2(1, 0); // invocarea unei functii cu doua argumente
$display("p= %b", p);
end
endmodule
2.9 Control Sincronizarii/Timing-ului.
Limbajul Verilog ofera doua tipuri explicite de control al sincronizarii, atunci cand urmeaza sa
apara instructiuni procedurale.
Primul tip il reprezinta comanda intarzierii in care o expresie specifica durata de timp intre
prima aparitie a instructiunii si momentul in care ea se executa.
Al doilea tip de comanda a intarzierii il reprezinta expresia eveniment, care permite executia
instructiunii.
A treia sectiune descrie instructiunea wait, care asteapta modificarea unei variabile specifice..
Verilog constituie un simulator bazat pe evenimente in timp discret, adica evenimentele sunt
planificate la momente discrete de timp si plasate intr-o coada de asteptare, ordonata in timp.
Cel mai timpuriu eveniment se afla in fruntea cozii de asteptare iar evenimentele ulterioare sunt
dupa el. Simulatorul inlatura toate evenimentele pentru timpul curent de simulare si le
prelucreaza. In timpul prelucrarii, pot fi create mai multe evenimente si plasate in locul
corespunzator, in coada pentru prelucrarea ulterioara. Cand toate evenimentele pentru timpul
curent au fost procesate, simulatorul trece la urmatorul pas in timp si prelucreaza urmatoarele
evenimente din fruntea cozii. Daca nu exista controlul sincronizarii, timpul de simulare nu
evolueaza. Timpul de simulare poate progresa numai in una din urmatoarele situatii:
1. specificarea intarzierii pe poarta sau fir;
2. un control al intarzierii, introdus prin simbolul #;
3. un eveniment de control, introdus prin simbolul @;
4. instructiunea wait.
Ordinea executiei evenimentelor in acelasi interval de timp/ceas este impredictibila.
2.9.1 Controlul Intarzierii (#)
O expresie de control al intarzierii specifica durata de timp intre prima aparitie a instructiunii
si momentul executiei acesteia. De exemplu:
#10 A = A + 1;
specifica o intarziere de 10 unitati de timp inainte de a executa instructiunea de asignare
procedurala. Simbolul # poate fi urmat de o expresie cu variabile.

2.9.2 Evenimente.
Executia unei instructiuni procedurale poate fi amorsat de o schimbare de valoare pe un fir sau
intr-un registru sau de aparitia unui eveniment cu nume.:
@r begin // controlat printr-o modificare a valorii in registrul r
A = B&C;
end
@(posedge clock2) A = B&C; // controlat de frontul pozitiva al lui clock2
@(negedge clock3) A = B&C; // controlat de frontul negativ al lui clock3
forever @(negedge clock) // controlat de frontul negativ
begin
A = B&C;
end
In formele care folosesc posedge si negedge, trebuie sa fie urmate de o expresie de un bit, de
regula un semnal de ceas. La o tranzitie de la 1 la 0 ( sau necunoscut), se detecteaza un negedge
Un posedge este detectat la o tranzitie de la 0 la 1 (sau necunoscut). Verilog furnizeaza, de
asemenea, facilitati pentru a denumi un eveniment si apoi sa amorseze aparitia acelui eveniment.
Mai intai trebuie sa se declare acel eveniment:
event event6;
Pentru a amorsa un eveniment se va folosi simbolul → :
→ event6;
Pentru a controla un bloc de cod, se va folosi simbolul @, dupa cum se arata mai jos:
@(event6) begin
<cod procedural oarecare >
end
Se va presupune ca evenimentul apare intr-un fir de control, adica concurent, iar codul de
control se afla in alt fir. Mai multe evenimente pot fi sumate logic in interiorul parantezelor.
2.9.3 Instructiunea wait.
Instructiunea wait permite intarzierea unei instructiuni procedurale sau a unui bloc, pana ce
conditia specificata devine adevarata:
wait (A == 3)
begin
A = B&C;
end
Diferenta intre comportamentul unei instructiuni wait si un eveniment este aceea ca
instructiunea wait este sesizeaza nivelul, in timp ce un @(posedge clock); este amorsat de catre
o tranzitie a semnalului sau sesizeaza frontul.
2.9.4 Instructiunile fork si join.
Folosind constructiile fork si join, Verilog permite existenta mai multor fire de control in cadrul
constructiilor initial si always. De exemplu, pentru a avea trei fire de control, se ramifica (fork)
controlul in trei si apoi fuzioneaza (join), dupa cum se va vedea mai jos:
fork: trei // desface firul in trei; cate unul pentru fiecare begin-end
begin
// codul pentru firul1
end
begin
// codul pentru firul2
end
begin
// codul pentru firul3
end
join // fuziunea firelor intr-un singur fir.
Fiecare instructiune intre fork si join, in acest caz cele trei blocuri begin-end, este executata
concurent. Dupa terminarea celor trei fire, este executata urmatoarea instructiune dupa join.
Trebuie sa existe certitudinea ca intre cele trei fire diferite nu exista interferente. De exemplu,
nu se poate modifica continutul unui registru, in aceeasi perioada de ceas, in doua fire diferite.
2.10 Exemplu: Comanda semaforului de trafic.
Pentru a demonstra task-urile si evenimentele, se va prezenta un model de controlor de semafor
de trafic.
// Model numeric pentru un controlul unui semafor de trafic.
// By Dan Hyde August 10, 1995
module traffic;
parameter on = 1, off = 0, red_tics = 35,
amber_tics = 3, green_tics = 20;
reg clock, red, amber, green;
// va opri simularea dupa 1000 unitati de timp
initial begin: stop_at
#1000; $stop;
end
// initializeaza luminile si seteaza monitorizarea registrelor.
initial begin: Init
red = off; amber = off; green = off;
$display(" Timpul green amber red");
$monitor("%3d %b %b %b", $time, green, amber, red);
end
// task de asteptare pentru aparitiile fronturilor pozitive ale ceasului
// inainte de a stinge (off) luminile
task light;
output color;
input [31:0] tics;
begin
repeat(tics) // asteapta detectarea fronturilor pozitive ale ceasului
@(posedge clock);
color = off;
end
endtask
// forma de unda pentru o un ceas cu o perioada de doua unitati de timp
always begin: clock_wave
#1 clock = 0;
#1 clock = 1;
end
always begin: main_process
red = on;
light(red, red_tics); // cheama task-ul de asteptare
green = on;
light(green, green_tics);
amber = on;
light(amber, amber_tics);
end
endmodule
Iesirea simulatorului de semafor de trafic este urmatoarea:
Time green amber red
0 0 0 1
70 1 0 0
110 0 1 0
116 0 0 1
186 1 0 0
226 0 1 0
232 0 0 1
302 1 0 0
342 0 1 0
348 0 0 1
418 1 0 0
458 0 1 0
464 0 0 1
534 1 0 0
574 0 1 0
580 0 0 1
650 1 0 0
690 0 1 0
696 0 0 1
766 1 0 0
806 0 1 0
812 0 0 1
882 1 0 0
922 0 1 0
928 0 0 1
998 1 0 0
Stop at simulation time 1000

3. Utilizarea Simulatorului.
3.1 Crearea Fisierului Model
Se introduce codul Cerilog, generat cu ajutorul unui editor oarecar, de exemplu Edit. Ca
extensie pentru fisierul sursa se va folosi “.v”.
3.2 Pornirea Simulatorului.

VeriWell este executat din fereastra UNIX shell. Se tasteaza"veriwell" urmat de numele
fisierelor care contin modelele si optiunile. Optiunile pot aparea intr-o ordine oarecare, oriunde
in linia de comanda. De exemplu:
host-name% veriwell cpu.v bus.v top.v -s
Aceasta va incarca fiecare fisier in memorie, le va compila si va intra in modul interactiv. Prin
inlaturarea optiunii "-s" , simularea va incepe imediat. Optiunile sunt prelucrate in ordinea in
care apar in linia de comanda.Fisierele sunt prelucrate in ordinea in care ele apar dupa
prelucrarea optiunilor.
3.3 Iesirea din Simulator.
Pentru a iesi din simulator se tasteaza $finish; sau Control-d.
Pentru a stopa simularea se tasteaza Control-c. Executia unui task de sistem $stop; in cadrul
codului Verilog va stopa simularea.
3.4Optiunile Simulatorului.
Optiunile utilizate in mod curent, in linia de comanda, sunt prezentate mai jos. Pentru alte
optiuni se recomanda consultarea lucrarii: VeriWell User’s Guide.
-i <inputfilename>
Specifica un fisier care contine comenzi interactive, care urmeaza sa fie executate imediat ce se
intra in modul interactiv. Aceasta optiune trebuie sa fie utilizata cu optiunea "-s". Aceasta poate
fi utilizata pentru a initializa variablele si pentru a stabili limitele timpului de simulare.
-s
Asigura intrarea in modul interactiv inaintea inceperii simularii.
-t
Realizeaza trasarea/urmarirea tuturor instructiunilor. Acest mod poate fi dezactivat prin task-ul
de sistem $cleartrace.
3.5 Depanarea in Modul Interactiv VeriWell.
VeriWell este interactiv. Dupa lansare, simularea poate fi controlata prin comenzi simple. De
asemenea, VeriWell accepta oricare instructiune Verilog statement (dar nu pot fi adaugate noi
module sau declaratii).
Modul interactiv poate fi introdus pe trei cai:
1). La folosirea optiunii "-s" in linia de comanda sau in fisierul de comanda, se lanseaza modul
interactiv, inaintea inceperii simularii.
2). Cand simularea intalneste task-ul de sistem $stop.
3). Atunci cand utilizatorul tasteaza Control-c, in timpul simularii (nu in timpul compilarii).
Comenzi Interactive.
Continua ('.') [period]
Relanseaza executia de la locatia curenta.
Pas singular cu urmarire (',') [comma]
Executa o singura instructiune si afisaza rezultatul trasarii.
Pas singular fara trasare (';') [semicolon]
Executa o singura instructiune fara urmarire.
Locatia curenta (':') [colon]
Afisaza locatia curenta.
Control-d sau $finish;
Iesirea din simulatorul VeriWell.
In mod tipic, instructiunile Verilog executate interactiv sunt utilizate pentru depanare si
colectare de informatii. $display si $showvars pot fi tastate, in modul interactiv, pentru a arata
valorile variabilelor. De remarcat faptul ca trebuie tastate task-ul de sistem, parametrii si (‘;’).
$scope(<name>); si $showscopes; pot fi tastate pentru a traversa ierarhia modelului. $settrace;
si $cleartrace; vor activa/dezactiva modul de urmarire. Tastarea "#100; $stop;" va opri
executia dupa 100 unitati de timp simulat.
4. Task-urile de Sistem si Functiile.
Task-urile de sistem nu sunt parti ale limbajului Verilog. Ele reprezinta task-uri construite si
pastrate in biblioteca. Cateva dintre cele mai des utilizate task-uri de sistem sunt prezentate mai
jos.
4.1 $cleartrace
Task-ul de sistem $cleartracedezactiveaza urmarirea.. A se vedea task-ul de sistem $settrace
pentru activarea trasarii.
$cleartrace;
4.2 $display
Afisaza text pre ecran ca si printf pentru limbajul C. Forma generala este:
$display(<parametru>, <parametru>, ... <parametru>);
unde <parametru> poate fi un sir intre ghilimele, o expresie care intoarce o valoare sau un
parametru nul. De exemplu, afisarea unui antet:
$display("Registre: A B C");
Caracterul special % indica faptul ca urmatorul caracter reprezinta o specificatie de format.
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
si hexazecimal:
$display("A=%b binar %o octal %d zecimal %h hex",A,A,A,A);
generandu-se urmatoarea iesire:
A=00001111 binar 017 octal 15 zecimal 0f hex
Specificatorii uzuali de format sunt:
%b afisaza in format binar
%c afisaza in format ASCII
%d afisaza in format zecimal
%h afisaza in format hexazecimal
%o afisaza in format octal
%s afisaza in format sir
Un 0 intre % si specificatorul de format aloca numarul exact de caractere cerut pentru afisarea
rezultatului evaluarii expresiei, in locul numarului necesar pentru valoarea cea mai mare pe care
ar lua-o expresia. De exemplu, aceasta este utila la afisarea timpului, dupa cum se va observa
din exemplele de mai jos, care contin doua instructiuni $display.
$display("Timp = %d", $time);
$display("Timp = %0d", $time);
si care genereaza uramatoarele iesiri:
Timp = 1
Timp = 1
Intr-un sir pot fi introduse secvente “Escape”. Secventele “Escape” mai frecvent folosite sunt
urmatoarele:
\n caractelul linie noua
\t caracterul tab
\\ caracterul \
\ caracterul " the "
%% semnul procent
Parametrul nul genereaza un spatiu de un caracter, la afisare. Un parametru nul este caracterizat
prin doua virgule adiacente in lista de parametri. $display adauga autoamat un caracter linie-
noua, la sfarsitul iesirii. A se vedea $write, in “Verilog Language Reference Manual” , daca nu
se doreste o linie noua.
4.3 $finish
Task-ul de sistem $finish asigura iesirea din simulator catre sistemul de operare gazda. A nu se
uita tastarea (‘;’), in modul interactiv.
$finish;
4.4 $monitor
Task-ul de sistem $monitor permite monitorizarea si afisarea valorilor oricarei variabile sau
expresii specificate ca parametru al task-ului. Parametrii sunt specificati ca si in cazul task-ului
de sistem $display. Cand se invoca task-ul $monitor simulatorul stabileste un macanism prin
care, de fiecare data cand o variabila sau o expresie, din lista de parametri, isi modifica valoarea,
cu exceptia lui $time, intreaga lista a parametrilor este afisata la sfarsitul pasului de timp, ca si
cand ar fi fost raportata de catre task-ul $display. Daca doi sau mai multi parametri isi schimba
valoarile in acelasi timp se va realiza o singura afisare. De exemplu, instructiunea urmatoare va
afisa o linie ori de cate ori se modifica unul dintre registrele A, B sau C.
$monitor(" %0d %b %b "%b, $time, A, B, C);
La un moment dat numai o instructiune $monitor trebuie sa fie activa. Monitorizarea poate fi
activata/dezactivata prin urmatoarele instructiuni:
$monitoroff;
<linii de cod>
$monitoron;
4.5 $scope
Task-ul de sistem $scope ofera utilizatorului posibilitatea de a atribui, ca domeniu interactiv, un
nivel particular al ierarhiei, pentru identificarea obiectelor. $scope este util in timpul depanarii
intrucat utilizatorul poate modifica domeniul, pentru a inspecta valorile diverselor variabile, din
diferite module, task-uri si functii.
$scope(<nume>);
Parametrul <nume> trebuie sa fie numele complet ierarhic al unui modul, task, functii sau bloc
cu nume. A se vedea task-ul de sistem $showscopes, pentru afisarea numelor.
4.6 $settrace
Task-ul de sistem $settrace activeaza urmarirea activitatii de simulare. Urmarirea consta in
obtinerea diferitelor informatii, inclusiv a timpului curent de simulare, a numarului liniei, a
numelui fisierului, a modulului si a oricarui rezultat al instructiunii care se executa.
$settrace;
urmarirea se poate dezactiva prin task-ul de sistem $cleartrace .
4.7 $showscopes
Task-ul de sistem $showscopes afisaza o lista completa a tuturor modulelor, task-urilor,
functiilor si a modulelor cu nume din domeniul curent.
$showscopes;
4.8 $showvars
Task-ul de sistem $showvars furnizeaza informatia de stare pentru variabilele registre si fire,
atat scalari, cat si vectori. Invocat fara parametri, $showvars afisaza starile tuturor variabilelor
din domeniul curent. Invocat cu o lista de variabile, el arata numai stareaacelora specificate.
$showvars;
$showvars(<lista de variabile>);
4.9 $stop
Task-ul de sistem $stop opreste simulatorul, trece la modul interactiv si transfera comanda catre
utilizator.
$stop;
4.10 $time
Functia de sistem $time system intoarce timpul curent de simulare sub foma unui intreg de 64
de biti. $time trebuie utilizat intr-o expresie.

Bibliografie
1. Cadence Design Systems, Inc., Verilog-XL Reference Manual.
2. Open Verilog International (OVI), Verilog HDL Language Reference Manual (LRM), 15466
Los Gatos Boulevard, Suite 109-071, Los Gatos, CA 95032; Tel: (408)353-8899, Fax: (408)
353-8869, Email: OVI@netcom.com, $100.
3. Sternheim, E. , R. Singh, Y. Trivedi, R. Madhaven and W. Stapleton, Digital Design and
Synthesis with Verilog HDL, published by Automata Publishing Co., Cupertino, CA, 1993,
ISBN 0-9627488-2-X, $65.
4. Thomas, Donald E., and Philip R. Moorby, The Verilog Hardware Description Language,
second edition, published by Kluwer Academic Publishers, Norwell MA, 1994, ISBN 0-7923-
9523-9, $98, includes DOS version of VeriWell simulator and programs on diskette.
5. Bhasker, J., A Verilog HDL Primer, Star Galaxy Press, 1058 Treeline Drive, Allentown, PA
18103, 1997, ISBN 0-9656277-4-8, $60.
6. Wellspring Solutions, Inc., VeriWell User’s Guide 1.2, August, 1994, part of free distribution
of VeriWell, available online.
7. World Wide Web Pages:
FAQ for comp.lang.verilog - http://www.comit.com/~rajesh/verilog/faq/alt_FAQ.html
comp.lang.verilog archives - http://www.siliconlogic.com/Verilog/
Cadence Design Systems, Inc. - http://www.cadence.com/
Wellspring Solutions - ftp://iii.net/pub/pub-site/wellspring
Verilog research at Cambridge, England - http://www.cl.cam.uk/users/mjcg/Verilog/
9. Bazele Aritmetice ale Calculatoarelor Numerice.
9.1. Introducere.
Intrucat elementele de memorare sunt constituite din dispozitive cu doua stari stabile, iar iar
elementele de prelucrare a informatiei sunt bazate pe circuite logice, care opereaza pe baza
logicii bivalente, intr-un calculator numeric datele sunt reprezentate in binar, sub forma unor
succesiuni de unitati si zerouri. Exista numeroase posibilitati pentru reprezentarea datelor, care
se deosebesc intre ele prin expresibilitate, cost de implementare, usurinta conversiilor de la un
format la altul, cat si prin alte considerente.
Astfel, in cadrul unui calculator numeric, la nivel hardware, se folosesc mai multe tipuri de date:
- Bit: 0,1
- Sir de biti: secvente de biti de lungimi date:
- tetrada: 4 biti,
- octet/byte: 8 biti,
- semicuvant: 16 biti,
- cuvant: 32 de biti,
- cuvant dublu: 64 de biti
- Caracter:
- ASCII: cod de 7 biti
- Zecimal:
- cifrele zecimale 0-9 codificate binar 00002 -10012 (doua cifre zecimale pot fi
impachetate pe un octet sau intr-un octet se poate plasa o singura cifra zecimala);
- Intreg (Virgula fixa):
- fara semn,
- cu semn, reprezentare in:
- semn si modul (cod direct),
- complementul fata de 1 (cod invers),
- complementul fata de 2 (cod complementar).
- Real (Virgula mobila):
- precizie simpla,
- precizie dubla,
- precizie extinsa.
Calculatoarele poseda elemente de stocare a datelor, de tipul registrelor sau al celulelor de
memorie, care dispun de un numar finit de elemente/ranguri, ceea ce afecteaza precizia
calculului. Astfel, la programarea unor aplicatii numerice, trebuie avute in vedere aspectele
legate de precizia limitata a reprezentarii informatiei.

9.2. Sisteme de numeratie.


9.2.1. Reprezentarea numerelor.
Un sistem de numeratie consta in totalitatea regulilor si simbolurilor/cifrelor folosite pentru
reprezentarea numerelor. Sistemele de numeratie pot fi de doua tipuri: pozitionale si
nepozitionale. Intr-un sistem pozitional valoarea/ponderea unui simbol depinde de pozitia pe
care o ocupa in reprezentarea unui numar dat, in timp ce intr-un sistem nepozitional acest lucru
nu are loc. Ca exemplu de sistem nepozitional se poate da sistemul de numeratie roman.
Sistemele de numeratie pozitionale mai poarta numele si de sisteme de numeratie ponderate,
intrucat valoarea unei cifre depinde de pozitia ei in reprezentarea numarului dat.
Un numar intreg N este reprezentat, intr-un sistem de numeratie pozitional, in baza b, sub
forma unui n-tuplu de simboluri xi,

Nb = xn-1 xn-2 xn-3 … xi… x1 x0

unde xi reprezinta o cifra a sistemului de numeratie.


O cifra xi poate lua valori intregi cuprinse intre 0 si b-1, baza b reprezentand numarul valorilor
posibile pe care le poate lua o cifra oarecare xi.
In general, un numar, constituit dintr-o parte intreaga si o parte subunitara are umatoarea
reprezentare in baza b:

Nb = xn-1 xn-2 xn-3 … xi… x1 x0 , x-1 x-2 x-3 … x-i… x-m , (o ≤xi ≤b-1).

Valoarea N a numarului Nb se calculaeza cu ajutorul urmatoarei expresii:

n-1
N = Σ xi. bi
i=-m

Fie numarul (435,25)10, in baza 10 (n=3, m=2 si b=10).

4 x 102 + 3 x 101 + 5 x 100 + 2 x 10-1 + 5 x 10-2 =

(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:

1 x 23 + 0 x 22 + 1 x 21 + 1 x 20 + 0 x 2-1 + 1 x 2-2 =

(8)10 + (0)10 + (2)10 + (1)10 + (0/2)10 + (1/4)10 = (11,25)10

In ultimul exemplu se prezinta metoda polinomiala de conversie a numerelor, reprezentate in


baza 2, in numere reprezentate in baza 10.

9.2.2. Conversia numerelor dintr-o baza in alta.

Intr-un sistem de calcul datele sunt reprezentate in mai multe sisteme de numeratie. Astfel,
datele de la intrare si cele de la iesire sunt, in general, reprezentate in baza 10. In memoria
calculatorului si in unitatea de prelucrare datele sunt reprezentate in baza 2. Sunt situatii in care
datele, care se prelucreaza, sunt reprezentate in baza 10, cifrele zecimale fiind codificate prin
tetrade binare. Pentru a usura operatiile de programare, uneori, numerele binare sunt convertite
in numere reprezentate in baza 8 sau baza 16.
Plecand de la reprezentarea numerelor sub forma coeficientilor dezvoltarii polinomiale, in
raport cu baza, conversia se poate efectua prin operatii repetate de impartire/inmultire in
conditiile numerelor intregi/subunitare.
Se presupune un numar N constituit dintr-o parte intreaga Ni si o parte subunitara Nf :
N = Ni + Nf
Astfel:
Ni = xn-1 xn-2 xn-3 … xi… x1 x0 si
Nb = 0, x-1 x-2 x-3 … x-i… x-m
Conversia numerelor intregi din baza b in baza q presupune impartirea repetata a catului de la
impartirea precedenta la noua baza si retinerea restului, mai mic decat noua baza, pana cand
catul curent devine mai mic decat noua baza. Ca prim cat se ia numarul Ni , care urmeaza sa fie
convertit. Resturile obtinute formeaza cifrele noului numar, incepand cu cea mai putin
semnificativa. Toate operatiile se efectueaza in baza de plecare b.
Din punctul de vedere al valorii exprimate:
(Ni)b = (Ni)q
(Ni)q se poate scrie ca un p-tuplu astfel:
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
operatii:
(Ni)b : q = (Ni)b1 + y0 /q , cifra curenta a noului numar este y0
(Ni)b1: q = (Ni)b2 + y1 /q , cifra curenta a noului numar este y1
………………………………………………………………..
(Ni)bp-2: q = (Ni)bp-1 + yp-2 /q , cifra curenta a noului numar este yp-2
unde 0 ≤ (Ni)bp-1 ≤ q reprezinta cifra cea mai semnificativa a noii reprezentari
Exemplu:
(17)10 = ( ? )2
17 : 2 = 8 +1/2 , y0 = 1;
8 : 2 = 4 +0/2 , y1 = 0;
4 : 2 = 2 +0/2 , y2 = 0;
2 : 2 = 1 + 0/2 , y3 = 0;
y4 = 1

( 17 )10 = 100012

Conversia numerelor subunitare din baza b in baza q presupune inmultirea repetata a partii
subunitare, care rezulta de la inmultirea precedenta, cu noua baza si retinerea partii intregi, pana
cand partea subunitara curenta devine 0 sau pana cand se epuizeaza rangurile de reprezentare in
noua baza. Ca prima parte subunitara se ia numarul Nf , care urmeaza sa fie convertit. Intregii
obtinuti formeaza cifrele noului numar, incepand cu cea mai semnificativa. Toate operatiile se
efectueaza in baza de plecare b.
Din punctul de vedere al valorii exprimate:

(Nf)b = (Nf)q
(Nf)q se poate scrie ca un m-tuplu astfel:
Nf = y-1 y-2 y-3 … y-i… y-m
Pentru a obtine coeficientii y-i ai dezvoltarii in baza q se va recurge la urmatoarea secventa de
operatii:
(Nf)b × q = (Nf)b-1 + y0-1 , cifra curenta a noului numar este y-1
(Nf)b-2 × q = (Nf)b-2 + y-2 , cifra curenta a noului numar este y-2
………………………………………………………………..
(Nf)b-m+1× q = 0 + y-m , cifra curenta a noului numar este y-m
In cazul in care (Nf)b-i = 0, procesul se opreste. Se poate constata faptul ca procesul de
conversie a numerelor subunitare poate fi insotit de erori, in cazul unui numar limitat de ranguri
pentru reprezentarea in noua baza sau in cazul aparitiei unor secvente repetate de unitati si
zerouri.
Exemplu:
(0,125)10 = (0,001)2

Se considera urmatorul exemplu:

(0,1)10 = ( ? )2

0,1 × 2 = 0 + 0,2 ; y-1 = 0;


0,2 × 2 = 0 + 0,4 ; y-2 = 0;
0,4 × 2 = 0 + 0,8 ; y-3 = 0;
0,8 × 2 = 1 + 0,6 ; y-4= 1;
0,6 × 2 = 1 + 0,2 ; y-5 = 1;
0,2 × 2 = 0 + 0,4 ; y-6 = 0;
0,4 × 2 = 0 + 0,8 ; y-7 = 0;
0,8 × 2 = 1 + 0,6 ; y-8 = 1;
0,6 × 2 = 1 + 0,2 ; y-9 = 1;
0,2 × 2 = 0 + 0,4 ; y-6 = 0;
………………………………
(0,1)10 = ( 0,00011000110.... )2

Se poate observa ca, in acest ultim caz, conversia nu se efectueaza exact.


Conversiile intre baze, care reprezinta puteri ale lui 2, constituie cazuri particulare, si se
efectueaza mecanic. Astfel, in cazul numerelor reprezentate in octal/hexazecimal, cifrele
octale/hexazecimale se inlocuiesc cu triadele/tetradele binare corespunzatoare si invers.
Numerele octale/hexazecimale se exploreaza, pentru conversia in binar, de la dreapta la stanga.
Mai jos se prezinta un tabel de corespondenta intre cifrele octale, zecimale si hexazecimale, pe
de-o parte si echivalentele lor binare, pe de alta parte.
binar octal zecimal hexazecimal

Exemple:
(011101)2 = (011)2(101)2 = (3)8 (5)8 = (35)8
(011101)2 = (0001)2(1101)2 = (1)16 (D)16 = (1D)16
9.2.3. Reprezentarea informatiei numerice in calculatoare.
Calculatoarele moderne opereaza atat cu numere intregi (cu semn si fara semn), cat si cu
numere reale.
In cazurile numerelor intregi cu semn si al mantisei numerelor reale semnul este codificat prin
bitul plasat in extrema stanga. Semnul “-“ este codificat prin “1”, iar semnul “+” prin “0”.
Pentru numerele intregi cu semn:
Ni = xn-1 xn-2 xn-3 … xi… x1 x0
semnul este codificat prin bitul xn-1.
Un numar real Nr se reprezinta prin doua campuri: mantisa/fractia f, cu semn, si exponent e:
Nr = s e f
unde:
- s reprezinta semnul mantisei, codificat printr-un bit, conform conventiei mentionate mai
sus,
- f constituie mantisa sub forma unui numar subunitar normalizat ( |m | ≤1/2 ),
- e specifica exponentul, de regula, deplasat cu o anumita cantitate pentru a-l face ≥ 0 .
O discutie mai amanuntita, privind reprezentarea numerelor reale se va face intr-un paragraf
ulterior.
9.3. Coduri de reprezentare a numerelor intregi, cu semn, in calculatoare.
Numerele intregi, cu semn, se pot reprezenta in calculatoare in trei moduri diferite, numite
uneori si coduri de reprezentare:
- semn si modul (cod direct),
- complementul fata de 1 (cod invers),
- complementul fata de 2 (cod complementar).
Codul direct (semn si modul).
[x]d = semn |x|
[x]d = 0 xn-2 xn-3 … xi… x1 x0 , pentru x > 0;
[x]d = 1 xn-2 xn-3 … xi… x1 x0 , pentru x < 0
Se poate observa ca, in acest cod, 0 are doua reprezentari, daca este afectat de semn:
[+0]d = 0 0000..000 si
[-0]d = 11111..111
Astfel, un numar x in cod direct, reprezentat pe n ranguri, poate lua valori in gama:
-2n-1 + 1 ≤ x ≤2n-1 - 1,
ceea ce face ca pentru:
- n = 8 valorile minime/maxime sa fie –127 / +127, iar
- n = 16 valorile minime/maxime sa fie –32767 / +32767.
Reprezentarea in modul si semn este utila pentru implementarea operatiei de inmultire, dar
prezinta unele dificultati la adunare si scadere.
Codul invers (complementul fata de unu).
Denumirea de complementul fata de unu provine de la faptul ca, reprezentarea in virgula fixa
s-a realizat in calculatoare, mai intai, pentru numere subunitare, numerele negative fiind stocate
sub forma complementului fata de 2, diminuat cu 1, prin scaderea lui |x| din 1. In cazul
numerelor binare negative intregi, reprezentate pe n ranguri, codurile inverse se obtin prin
scaderea modulelor acestora din 2n – 1.
[x]i = 0 xn-2 xn-3 … xi… x0 , pentru x > 0;

[x]i = 1 xn-2 xn-3 … xi… x0 , pentru x < 0

unde: xi reprezinta inversul lui xi


Se poate observa ca, in acest cod, 0 are doua reprezentari, daca este afectat de semn:
[+0]i = 0 0000..000 si
[-0]i = 11111..111
Astfel, un numar x in cod invers, reprezentat pe n ranguri, poate lua valori in gama:
-2n-1 + 1 ≤ x ≤2n-1 - 1,
ceea ce face ca pentru:
- n = 8 valorile minime/maxime sa fie –127 / +127, iar
- n =16 valorile minime/maxime sa fie –32767 / +32767.
Reprezentarea in codul invers este identica cu reprezentarea in cod direct, in cazul numerelor
pozitive. Pentru a obtine codul invers al unui numar se inverseaza valorile binare ale tuturor
rangurilor, operatie extrem de usor de realizat in hardware.
Codul complementar (complementul fata de doi).
Denumirea de complementul fata de doi provine de la faptul ca reprezentarea in virgula fixa
s-a realizat in calculatoare mai intai pentru numere subunitare, iar numerele negative se stocau
sub forma complementului fata de 2, prin scaderea lui |x| din 2. In cazul numerelor binare,
intregi negative, reprezentate pe n ranguri, codurile inverse se obtin prin scaderea modulelor
acestora din 2n.
[x]c = 0 xn-2 xn-3 … xi… x0 , pentru x ≥ 0;
~ ~ ~ ~
[x]c = 1 xn-2 xn-3 … xi… x0 , pentru x < 0
unde: ~ ~ ~ ~
1 xn-2 xn-3 … xi… x0 se obtine ca urmare a operatiei: 2n - |x|

Se poate observa ca, in acest cod, 0 are o singura reprezentare:


[0]c = 0 0000..000
Astfel, un numar x in cod complementar , reprezentat pe n ranguri, poate lua valori in gama:
-2n-1 ≤ x ≤2n-1 - 1,
ceea ce face ca pentru:
- n = 8 valorile minime/maxime sa fie –128 / +127, iar
- n = 16 valorile minime/maxime sa fie –32768 / +32767.
Pentru: x > 0 [x]d = [x]i = [x]c
Pentru: x < 0 [x]c = [x]i + 1 = 2n - |x| .
Se poate observa usor ca, prin mijloace hardware, codul complementar al unui numar negativ se
poate obtine adunand, la inversul numarului (obtinut prin negarea logica a tuturor rangurilor), o
unitate in cel mai putin semnificativ rang.
Reprezentarea in cod complementar faciliteaza realizarea hardware-lui necesar operatiilor de
adunare si scadere in calculatoare.
Reprezentarea in exces.
Reprezentarea in exces este cunoscuta si sub numele de reprezentare deplasata. Ideea de baza
consta in aceea de a atribui celui mai mic numar (numar negativ) valoarea cea mai mica intreaga
ce se poate reprezenta in calculator, manipuland in acest mod numere fara semn. In cazul
reprezentarii numerelor (14)10 si (-14)10 sub forma unor numere pe binare pe 8 biti, folosind
forma excess 128 va trebui sa se obtina corespondentele binare ale numerelor (128 + 14 = 142)10
si (128 + - 14 = 114)10. Astfel, codul binar in exces 128 pentru (-14)10 este (01110010)2.
Nu exista o semnificatie numerica a valorii in excess, ea are ca efect deplasarea reprezentarii in
complementul fata de doi. Pentru cazul studiat valoarea exces a fost astfel aleasa incat sa aibe
acelas sablon de biti ca si cel mai mare numar negativ, ceea ce face ca numerele sa apara ca si
cand ar fi sortate ca numere binare fara semn. Celui mai mic numar negativ (-128)10 ii va
corespunde (00000000)2, in timp ce celui mai mare numar pozitiv (127)10 ii va corespunde
(11111111)2. Aceasta reprezentare simplifica efectuarea operatiei de comparare a numerelor,
ceea ce este esential pentru realizarea hardware-lui necesar operarii asupra exponentilor, la
reprezentarea in virgula mobila.
9.4. Codul binar-zecimal.
Numerele pot fi reprezentate in sistemul de numeratie cu baza 10, in conditiile in care rangurile
zecimale sunt codificate prin tetrade binare. Acesta este codul binar-zecimal sau BCD (Binary
Coded Decimal). Posibilitatile de codificare oferite de catre o tetrada binara nu sunt epuizate in
cazul BCD, deoarece raman neutilizate 6 tetrade dintr-un total de 16.
In cazurile in care se doreste o codificare BCD cu semn, tetradele binare: (1100) si (1101) se
folosesc pentru codificarea semnelor “+” si “-“, in timp ce tetradele binare (0000),….., (1001)
se utilizeaza pentru codificarea cifrelor zecimale.
Pe un octet/byte, in bitii cei mai putin semnificativi, poate fi plasata o singura tetrada: BCD
“neimpachetat”. In cazul plasarii a doua tetrade BCD pe un singur octet, se spune ca BCD este
“impachetat” .
Codurile BCD se utilizeaza in calculatoarele destinate calculelor comerciale, financiare,
inlaturand necesitatea conversiilor zecimal-binar si binar-zecimal.
Un numar negativ in baza 10, cu mai multe ranguri, se poate reprezenta in BCD in
complementul fata de 9 sau fata de 10.
In cazul numerelor (+402)10 si (-402)10 se pot da reprezentarile lor in complementul fata de 9
si fata de 10:
0000 0100 0000 0010 (+402)10
a) (0)10 (4)10 (0)10 (2)10

1001 0101 1001 0111 (-402)10 complementul fata de 9


b) (9)10 (5)10 (9)10 (7)10

1001 0101 1001 1000 (-402)10 complementul fata de 10


c) (9)10 (5)10 (9)10 (8)10

In ultimul exemplu numerele pozitive vor fi reprezentate in gama 0 – 4999, iar numerele
negative in gama 5000 – 9999.
9.5. Reprezentarea in virgula mobila.
Reprezentarea numerelor in virgula fixa precizeaza un numar de ranguri la stanga virgulei,
pentru partea intreaga, si un alt numar de ranguri la dreapta virgulei, pentru partea subunitara.
In vederea asigurarii unei game largi de reprezentare, cat si a unei precizii convenabile, in cazul
virgulei fixe trebuie sa se aloce un numar mare de ranguri. Astfel, in cazul in care se doreste
manipularea numerelor cu valori pana la 1 trilion (1012) sunt necesare 40 de ranguri binare ,
intrucat 1012 ≈240. Acelasi numar de 40 ranguri binare este necesar in cazul asigurarii unei
precizii de o trilionime. Numerele ar fi astfel reprezentate pe 80 de biti. In practica solicitarile
privind gama si precizia pot fi si mai mari.
Virgula mobila ofera posibilitatea reprezentarii cu un numar mic de ranguri binare a unei game
largi de numere exprimabile, prin efectuarea unui compromis intre numarul de rangur, care
asigura precizia, si numarul de ranguri, care asigura gama.
In numarul, reprezentat in virgula mobila, de mai jos:
0,36542 × 104
gama este stabilita de catre numarul de ranguri ale exponentului si de catre baza, care, in cazul
de fata, este 10. Precizia este asociata cu numarul de ranguri ale partii subunitare, 5 in exemplul
de mai sus. Precizia si gama impun un numar de 6 ranguri zecimale, la care se mai adauga unul
pentru codificarea semnului partii subunitare/mantisei:
+ 4. 36542
semnul mantisei virgula
exponent mantisa
In afara compromisului intre precizie si gama, bazat pe modificarea numarului de biti din
reprezentarile exponentului si mantisei, pentru marirea gamei de reprezentare, se mai poate
actiona, si asupra bazei, in sensul cresterii acesteia. Prin aceasta creste precizia pentru numerele
mici, iar pentru numerele mari scade.
Reprezentarea normalizata. Un numar poate fi reprezentat, in virgula mobila, in mai multe
moduri:
3654,2 × 100 = 36,542 × 102 = 0,36542 × 104
Pentru a evita reprezentarile multiple ale aceluiasi numar se introduce forma normalizata.
Aceasta se obtine prin deplasarea spre stanga a mantisei, astfel incat, imediat la dreapta virgulei
sa se afle o cifra diferita de 0. Pe masura deplasarii mantisei la stanga se incrementeaza si
exponentul. Operatia nu are sens atunci cand mantisa are toate rangurile egale cu 0.
Un exponent este, de regula, rezervat pentru reprezentarea lui zero si a altor cazuri speciale,
cum ar fi ∞ . Cu exceptia cazului cand este egala cu zero, mantisa poseda in bitul cel mai
semnificativ o unitate, pentru o baza egala cu 2. Acest bit, egal cu 1, este prezent in mod
implicit, ceea ce permite deplasarea mantisei spre stanga cu un bit, in scopul maririi preciziei.
Bitul in cauza poarta numele de “bit ascuns".
Terminologia folosita in legatura cu erorile de calcul.
In analiza erorilor posibile privind prelucrarea datelor se folosesc o serie de termeni si concepte
specifice.
Precizia. Constituie un termen asociat cu lungimea cuvantului, numarul de biti disponibili intr-
un cuvant pentru reprezentarea unui numar dat. In cazul unui registru de 8 biti, considerand ca
se reprezinta numai numere naturale, precizia de reprezentare va fi de 1/256. Precizia nu trebuie
confundata cu acuratetea.
Acurateta. Aceasta reprezinta o masura a apropierii unei aproximatii fata de valoarea exacta.
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
ia numarul binar fractionar 0,10101010101,care trebuie reprezentat pe 8 biti se va obtine:
0,1010101. Ultima forma constituie o reprezentare cu eroare a numarului initial. Astfel, in al
doile caz reprezentarea, care contine o eroare, este mai precisa (8 biti in loc de 4), dar are o
acurateta mai mica .
Gama. Gama reprezinta multimea numerelor reprezentabile intr-un sistem dat. Astfel, in
reprezentarea numerelor intregi in complementul fata de doi, pe patru biti, gama de reprezentare
va fi de la -8 la + 7, adica (+7) - (-8) = 15.
Rezolutia. Aceasta constituie marimea diferentei/distantei intre doua numere sau cifre adiacente.
Pentru reprezentarea cu patru cifre zecimale, gama fiind intre 0000 si 9999, rezolutia este
constanta si egala cu 1.
In cazul reprezentarii in virgula mobila rezolutia nu mai este constanta in cadrul gamei. Ea este
dependenta de valoarea exponentului utilizat.
Trunchierea. Cunoscuta si sub denumirea de rotunjire prin lipsa, aceasta tehnica este utilizata in
cazurile in care precizia nu este suficienta pentru reprezentarea corecta a numarului stocat.
Considerand stocarea valorii lui pi = 3,141592654 intr-un dispozitiv capabil sa memoreze numai
6 cfre zecimale, numarul pi = 3,14159 se va reprezenta cu o eroare de trunchiere egala cu
0,000002654.
Rotunjirea. Metoda prin care se cauta sa se selecteze valoarea cea mai apropiata de valoarea
initiala a numarului poarta numele de rotunjire. In zecimal, daca cifra aflata la dreapta
ultimei cifre, care intra in reprezentare, este mai mare sau egala cu 5 atunci ultima cifra se
incrementeaza cu 1, in caz contrar se lasa neschimbata. In binar, daca cifra aflata la dreapta ulti-
mei cifre, care intra in reprezentare, este 1 atunci la ultima cifra se adauga o unitate, in caz
contrar cifra nu se modifica.
Depasirea. Situatia de depasire apare cind rezultatul unui calcul este prea mare pentru a putea fi
reprezentat in sistem. Spre exemplu, daca se lucreaza in binar cu numere intregi reprezentate in
complementul fata de doi, pe 4 biti, gama de reprezentare fiind -8 la +7, orice rezultat care
depaseste gama va conduce la depasire.
Depasirea superioara si depasirea inferioara. Aceste situatii apar la reprezentarea numerelor in
virgula mobila, atunci cand rezultatul este mai mare sau mai mic decat cel mai mare sau cel mai
mic numar care poate sa fie reprezentat in sistem. Pentru a preveni obtinerea unor rezultate
false/eronate/pseudorezultate se elaboreaza tehnici prin care se semnalizeaza aparitia unor
asemenea situatii.
Erori introduse la conversia numerelor din baza zece in baza doi. Aceste erori apar datorita
faptului ca cele mai multe numere nu reprezinta multipli ai unor fractii binare. Situatia se intal-
neste in mod frecvent la introducerea datelor in calculator. De regula, numarul rangurilor binare
este destul de mare pentru a se putea reprezenta numarul necesar de cifre zecimale.

Reprezentarea numerelor reale.


Calculatoarele destinate calculelor stiintifice si ingineresti opereaza in principal cu numere
reale. Se cunoaste ca multimea numerelor reale este convexa, adica in oricare interval, indife-
rent de marimea sa, exista un numar infinit de valori reale. Intr-un calculator pot fi reprezentate
precis valori discrete, dintr-o multime finita, deoarece fiecare informatie/data poate fi
reprezentata numai printr-un numar fix de biti. Astfel, oricare reprezentare a unor numere reale,
intr-un calculator, constituie o aproximare a valorilor exacte.
Un aspect important se refera la faptul ca datele reale presupun in acelasi timp atat o gama mare
de valori, cat si o anumita precizie.
In principiu numerele reale se pot reprezenta in doua moduri: in virgula fixa si in virgula
mobila.
Reprezentarea in virgula fixa presupune un numar dat de ranguri pentru partea intreaga si pentru
partea subunitara:
X = xn-1 xn-2 … xi… x1 x0 , x-1 x-2 … x-i… x-m
Desi prin aceasta reprezentare se poate asigura o precizie satisfacatoare, in multe cazuri
(in functie de numarul de ranguri n + m ) apar dificultati importante in privinta gamei de
reprezentare a datelor de intrare, a rezultatelor partiale si finale in cadrul unui program executat
pe un calculator. Aceasta implica introducerea unor factori de scara, care sa asigure limitarea
valorilor maxime la posibilitatile reale de reprezentare, in calculatorul dat.
Reprezentarea in virgula mobila sau notatia stiintifica foloseste in principal doua campuri:unul
pentru exponent (e) si altul pentru mantisa/parte subunitara/fractie (f). Astfel, numarul real X se
poate scrie:
X = f.r e
unde r este baza, f - mantisa, iar e - exponentul.
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
nu pierde din precizie); numarul de biti din mantisa asigura precizia de reprezentare.
Exponentul stabileste gama de reprezentare; pentru simplificarea algoritmilor de efectuare a
operatiilor aritmetice, in virgula mobila, se utilizeaza numai exponenti pozitivi (deplasati), prin
adunarea unei cantitati date, astfel incat, cel mai mic exponent sa nu ia o valoare negativa (sa fie
zero).
Daca exponentul are k biti si mantisa m biti (exclusiv semnul s), numarul X se va putea
reprezenta astfel:
X = s ek-1ek-2 ….e0 f-1 f-2 …..e-m
Semnul s, al mantisei, va fi plasat in rangul cel mai semnificativ al reprezentarii binare.
Stabilirea formatului de reprezentare a numerelor reale, in virgula mobila, a constituit obiectul a
numeroase studii, care s-au concretizat prin elaborarea unui standard (IEEE 754). Astfel, au
fost alese doua formate standard:
- formatul scurt sau de baza, pe un cuvant de 32 de biti, care asigura o viteza mai mare de
operare;
- formatul lung sau dublu de baza, pe un cuvant de 64 de biti, care asigura o precizie mai mare
de lucru.
In alegerea bazei s-a plecat de la observatia ca aceasta trebuie sa permita cea mai buna precizie
posibila si pentru formatul scurt. S-a demonstrat ca o baza egala cu 2 asigura o precizie mai
buna in cazul rotunjirii mantisei rezultatului unei operatii aritmetice, decat alte baze (4, 8, 16),
cel putin cu un rang in raport cu baza 16.
In privinta reprezentarii se considera ca folosirea codului direct ( semn si modul ) este
superioara codului complementar.
Daca lungimea cuvintului este fixata gama si precizia se influenteaza reciproc.
O gama de 10+/-75 este insuficienta, in timp ce o gama de 10+/-300 corespunde cerintelor
celor mai multe aplicatii. De aceea in cazul formatului scurt a fost sacrificata gama, intr-o
oarecare masura, pentru a asigura o buna precizie.
Daca se foloseste aceeasi unitate aritmetica, atat pentru operatiile in formatul scurt, cat si pentru
operatiile in formatul lung, in primul caz nu se vor inregistra depasiri de tip superior sau
inferior. De asemenea, se poate observa ca numarul de biti (52) din mantisa in formatul lung
este mai mare decat dublul numarului de biti (2 × 24) ai mantisei in formatul scurt. Aceasta
face ca la inmultirea in formatul scurt adunarea produselor partiale sa nu fie afectata de erori.
Formatul scurt ( simplu - de baza ).

s e f
0 1 89 31

- bitul 0: s = semnul mantisei ( s = 1 - mantisa negativa );


- bitii 1-8: e = exponentul deplasat ( deplasarea este 27 - 1 );
- bitii 9-31: f = mantisa/fractia ( cand e ≠ 0, se presupune un
bit egal cu 1, la stanga lui f; virgula se plaseaza intre acest bit si primul bit explicit al mantisei;
valoare: numarul reprezentat intr-un format scurt este:
( -1 )s 2 e-(2↑7- 1).( 1 + f ), cu conditia e ≠0.
Valoarea/marimea numerelor reprezentate este in gama: -2-126 .(1,0) pana la 2127 .( 2 – 2-23 ),
ceea ce reprezinta aproximativ –1,8 × 10-38 pana la 3,40 × 1038
Formatul lung ( dublu - de baza ).

s e f
0 1 1112 63

- bitul 0: s = semnul mantisei ( s = 1 - mantisa negativa );


- bitii 1-11: e = exponentul deplasat ( deplasarea este 210 - 1 );
- bitii 12-63: f = mantisa/fractia ( cand e ≠ 0, se presupune un
bit egal cu 1, la stanga lui f; virgula se plaseaza intre acest bit si primul bit explicit al mantisei;
valoare: numarul reprezentat intr-un format lung este:
( -1 )s 2 e-(2↑10 - 1).( 1 + f ), cu conditia e ≠0.
Observatii privind formatele.
1. Baza a fost aleasa din considerente de echilibrare a gamei, cu restrictia ca toate
numerele mici sa aibe valori reciproce reprezentabile. Contrar altor practici, gama
obtinuta este deplasata pentru a putea asigura depasirea inferioara (underflow),
deoarece aceasta situatie se poate rezolva mai usor, prin hardware, decat depasirea
superioara (overflow)
2. S-a constatat ca prezenta unui prim bit implicit, inaintea bitilor mantisei, asigura
depasirea inferioara gradata. Mai jos se va arata cum au fost rezolvate aspectele
mentionate la punctele 1 si 2.
3. Cazuri speciale.
3.1 In conditiile unui exponent egal cu zero s-a rezervat un camp pentru:
- zero: toti bitii sunt zero;
- date initializate: bitul de semn este unu, iar ceilalti biti sunt zero;
- numere denormalizate: toate formatele de biti cu exponent zero si mantisa diferita
de zero se interpreteaza ca numere denormalizate; in efectuarea operatiilor
aritmetice bitul cel mai semnificativ este fortat la zero iar bitul implicit unu este
adunat la exponent, ceea ce va permite implementarea gradata a depasirii
inferioare.
Valoarea denormalizata va fi: ( -1 )s 21-(2↑7- 1).( 0 + f )
3.2 In conditiile unui exponent cu toti bitii egali cu unu s-a rezervat un camp pentru:
- +∞ : semnul este zero, iar celalti biti sunt unu;
- -∞ : toti bitii sunt unu:
- nedefinit: semnul si mantisa sunt zero, iar exponentul este format din unitati;
- alte situatii: celelalte combinatii sunt rezervate pentru utilizari inca nedefinite.
Standardul IEEE 754 pentru reprezentarea numerelor in virgula mobila.
Acest standard a fost acceptat de numerosi producatori de microprocesoare si de unitati centrale
pentru minicalculatoare si calculatoare de capacitate medie-mare.
In aceste conditii se vor putea transporta, fara dificultati majore, pachetele de programe
stiintifice intre diferite tipuri de echipamente de calcul.
A. Formate.
Formatele prezentate mai sus fac parte din standardul IEEE 754. In plus standardul mai contine
formatul extins cu formele scurta (simpla) si lunga (dubla), in care mantisa este prevazuta cu
un bit j, pentru specificarea explicita a partii intregi, care in formatul de baza discutat a fost
presupus implicit. In acest format se dau alte valori minime si maxime pentru exponenti si
mantise, in raport cu formatul de baza.
In cele ce urmeaza se prezinta in rezumat caracteristicele tuturor formatelor.
Formatul simplu - de baza.
Acest format este organizat pe 32 de biti: 1 bit pentru semnul mantisei, 8 biti pentru exponent si
32 de biti pentru mantisa.
Valoarea V a numarului se calculeaza astfel:
- daca e = 255 si f ≠ 0, atunci V = NaN ( nu este un numar -Not a Number - simbol
codificat in format );
- daca e = 255 si f = 0, atunci V = (-1)s.∞
- daca 0 < e < 255, atunci V = (-1)s.2e-127.(1,f);
- daca e = 0 si f ≠0, atunci V = (-1)s.2-126.(0,f);
- daca e = 0 si f = 0, atunci V = (-1)s.0 (zero).
Formatul dublu - de baza.
Acest format este organizat pe 64 de biti: 1 bit pentru semnul mantisei, 11 biti pentru exponent
si 52 de biti pentru mantisa.
Valoarea V a numarului se determina dupa cum urmeaza:
- daca e = 2047 si f ≠ 0, atunci V = NaN ( nu este un numar -Not a Number - simbol
codificat in format );
- daca e = 2047 si f = 0, atunci V = (-1)s.∞
- daca 0 < e < 2047 atunci V = (-1)s.2e-1023.(1,f);
- daca e = 0 si f ≠0, atunci V = (-1)s.2-1022.(0,f);
- daca e = 0 si f = 0, atunci V = (-1)s.0 (zero).
Formatul simplu - extins.
Acest format este structurat astfel: 1 bit de semn, 1 bit pentru partea intreaga (j) a mantisei, cel
putin 31 de biti pentru partea fractionara a mantisei (f) si un exponent ce poate lua
valori cuprinse intre minimum m = -1022 si maximum M = 1023.
Valoarea V a numarului se determina dupa cum urmeaza:
- daca e = M si f ≠0, atunci V = NaN;
- daca e = M si f = 0, atunci V = (-1)s .∞ ;
- daca m < e < M, atunci V = (-1)s.2e.(j,f);
- daca e = m si j = f = 0, atunci V = (-1)s. 0 (zero);
- daca e = m si j ≠ 0 sau f ≠ 0, atunci V = (-1)s.2e*.(j,f);
unde e* este egal cu m sau m + 1, selectat la implementare.
Formatul dublu extins.
Acest format are caracteristici identice cu formatul simplu extins, cu exceptia ca exponentul ia
valori intre m = -16382 si M =16383, avand cel putin 63 de biti pentru partea fractionara (f).

B.Rotunjirea.
Operatia de rotunjire trateaza numarul ca avand o precizie infinita si il modifica pentru a
corespunde formatului destinatie.
Schema hardware va emite un semnal pentru a arata daca rezultatul este corect sau incorect.
Standardul IEEE 754 include atat un mecanism standard-implicit de rotunjire, cat si alte trei
metode ce pot fi selectate de utilizator.
Mecanismul standard rotunjeste numarul la cea mai apropiata valoare reprezentabila. Daca sunt
posibile doua valori, formatul este rotunjit la valoarea para, care face ca eroarea de rotunjire
sa fie egala cu jumatate din valoarea celui mai putin semnificativ bit.
Celelalte trei mecanisme de rotunjire selectabile sunt urmatoarele:
- rotunjirea catre +∞ asigura cea mai apropiata valoare dar nu mai mica decat a
numarului dat;
- rotunjirea catre -∞ furnizeaza cea mai apropiata valoare, dar nu mai mare decat
numarul dat;
- rotunjirea catre 0 ( trunchiere ) asigura valoarea cea mai apropiata, dar nu mai mare
decat numarul dat in modul.
Operatia de rotunjire se aplica formatului destinatie. In formatul dublu sau formatul extins
standardul permite utilizatorului sa specifice daca rotunjirea trebuie sa se efectueze in formatul
simplu - de baza. Aceasta permite ca pe o masina, care are numai formatul dublu de baza sau
formatul extins, sa se emuleze si formatul simplu de baza.
C. Valori speciale.
Standardul de reprezentare in virgula mobila suporta aritmetica cu numere infinite folosind
modalitatile afina si proiectiva, selectabile de utilizator.
Modalitatea infinit-afina este definita prin relatia:
-∞ < ( oricare numar finit ) < +∞
Modalitatea infinit-proiectiva compara intotdeauna numerele egale, indiferent de semn.
Standardul defineste un set de operatii astfel incat folosirea unui operand infinit nu va conduce
la un rezultat eronat; pentru detectarea unor asemenea cazuri nu sunt prevazute capcane. In
calculele cu valori infinite toate exceptiile care se vor discuta in continuare raman valabile.
NaN constituie o valoare speciala, introdusa pentru a semnaliza operatii invalide sau operatii
care produc rezultate invalide cu o valoare speciala. Standardul defineste posibilitatile de utili-
zare si neutilizare ale capcanelor pentru NaN. Folosirea capcanei asigura activarea unei exceptii,
la efectuarea unei operatii cu un operand NaN. Neutilizarea capcanei conduce numai la
pozitionarea indicatorilor corespunzatori de eroare (conditii).
D. Operatii.
In standard sunt definite operatiile aritmetice de baza: adunarea, scaderaea, inmultirea si
impartirea; radacina patrata si gasirea restului la impartire; conversia formatului in: virgula mo-
bila, numere intregi si numere zecimale codificate binar BCD ( cu exceptia numerelor BCD
extinse EBCD ); compararea numerelor in virgula mobila.
Operatia de comparare conduce la unele situatii particulare, cand se folosesc operanzi NaN sau
cu valori infinite. Relatiile permise sunt: "mai mic decat", "egal cu", "mai mare decat" si
"neordonat". Ultimul caz apare cand cel putin un operand este NaN si cand un numar infinit este
comparat in modalitatea proiectiva cu un numar finit. Relatia "neordonat" afirma predicatele
"neordonat" si "< >", negand insa pe toate celelalte. Atunci cand se testeaza daca un numar are
valoarea NaN, nu va fi posibila verificarea intre o constanta NaN si un numar, deoarece relatia
este intotdeauna "neordonat".
E. Exceptii si capcane.
Standardul IEEE754 defineste atat exceptiile, care trebuie detectate, cat si informatiile necesare
elementului, care manipuleza capcana, pentru gasirea exceptiilor. Implementarea va asigura
cate un indicator pentru fiecare tip de exceptie. Raspunsul standard la exceptie consta in
continuarea operatiei, fara activarea capcanei.
Operatie invalida. Acest tip de exceptie se incadreaza in doua clase: exceptii de operand
invalid si rezultat invalid. In ambele cazuri, daca nu este activata o capcana, rezultatul va fi
NaN.
Exceptiile de operand sunt provocate de urmatoarele evenimente:
- un operand este NaN, fara a se genera un semnal pentru capcana si fara a se activa
capcana;
- se executa una din urmatoarele operatii:
- (∞ ) + (∞ ) - ( modalitatea proiectiva ),
- (∞ ) + (-∞ ) - ( modalitatea afina ),
- (∞ )/(∞ ), 0/0 si 0 × ∞ ;
- in operatia xREMy, de aflare a restului la impartire, fie x este infinit, fie y este zero;
- cand se incearca extragerea radacinii patrate dintr-un numar negativ;
- la conversia de la formatul in virgula mobila la intreg sau BCD, cand conversia corecta
conduce la o depasire, la o valoare infinita sau NaN;
- la comparatiile ce folosesc predicatele <, > sau negatiile lor, cand relatia este de
"neordonare" si cand nici un operand nu este"neordonat".
Exceptiile de rezultat invalid apar cand rezultatul unei operatii nu este corect in raport cu
formatul destinatie.
Alte exceptii. Exceptiile standard sunt urmatoarele:
- impartire cu zero;
- depasire superioara;
- depasire inferioara;
- rezultat inexact, atunci cand nu se genereaza alte exceptii si cand valoarea rotunjita
pentru rezultat conduce la depasire superioara, fara a activa capcana.
Parametrii pentru capcana. Capcanele, care corespund fiecarei exceptii pot fi
activate/dezactivate de utilizator. Cand este activata, exceptia transfera controlul la o rutina
pentru manipularea capcanei (furnizata de utilizator sau de catre sistem).
O asemenea rutina trebuie sa primeasca urmatoarele informatii:
- tipul exceptiei, care a aparut,
- tipul operatiei, care s-a executat,
- formatul destinatiei,
- rezultatul corect rotunjit ( in cazul depasirii superioare/inferioare, rezultatului
inexact/invalid), pe langa alte informatii referitoare la faptul ca rezultatul nu
corespunde formatului destinatie,
- valorile operandului, in cazurile impartirii cu zero si exceptiilor de operand invalid.
Standardul aritmetic.
Scopul urmarit prin aritmetica in virgula mobila este acela de a pune la dispozitia utilizatorului
un sistem convenabil de reprezentare a numerelor prin care se obtin rezultate precise ca urmare
a efectuarii operatiilor aritmetice. D. Knuth a sugerat un model de aritmetica in virgula mobila,
care permite obtinerea unor rezultate in virgula mobila foarte apropiate de rezultatul corect.
Algoritmii propusi de Knuth conduc la implementari extrem de costisitoare si nu ofera solutii
pentru cazul rezultatelor aflate exact intre doua numere in virgula mobila.
In continuare se prezinta atat un set de reguli, care specifica toate cazurile, cat si algoritmii de
implementare ai acestui set de reguli.
Reguli.
1. Multimea numerelor in virgula mobila trebuie sa contina 0 si 1 (identitati aditive si
multiplicative), iar daca x apartine multimii atunci si -x va apartine multimii.
2. Daca rezultatul corect al unei operatii in virgula mobila esteun numar in virgula mobila,
atunci acel numar trebuie sa fie generat de operatia respectiva, in caz contrar rezultatul va fi
rotunjit conform regulei 3.
3. Daca rezultatul corect se afla exact la mijlocul intervalului dintre doua numere in virgula
mobila, atunci aritmetica respectiva trebuie sa genereze numarul cu mantisa para.
Regulile de mai sus ( regula de rotunjire poarta numele de "rotunjire la par" ) asigura maximum
de precizie.
In continuare vor fi ilustrate metodele de implementare ale operatiilor aritmetice in virgula
mobila (adunare, scadere, inmultire si impartire), care utilizeaza "rotunjirea la par", in ve-
derea obtinerii rezultatului final.
Pentru exemplificare se va considera un acumulator cu urmatoarea structura, pentru efectuarea
operatiilor aritmetice cu numere avand mantisa de patru biti:

D F1 F2 F3 F4 G R ST

cu urmatoarele notatii:
- D: bitul de depasire,
- F1 - F4: cei 4 biti ai mantisei,
- G: Bitul de garda,
- R: bitul de rotunjire,
- ST: bitul de legatura/lipitura, "stiky".
Bitul ST este pozitionat in unu, daca in procesul de denormalizare are loc transferul unei unitati
din bitul R spre dreapta. Daca ST este pozitionat in unu el va ramane in aceasta stare pe toata
durata operatiilor. Toate deplasarile in acumulator implica bitii D, G, R si ST. Bitul ST nu este
modificat de deplasarea la stinga. Deplasarea la dreapta introduce zero in bitul D.
In algoritmii de mai jos se considera ca acumulatorul este initializat la zero si ca operanzii au
fost verificati daca sunt invalizi sau egali cu zero. Astfel, se considera numai operanzii valizi,
normalizati, diferiti de zero. De asemenea, se considera ca operatiile aritmetice, privind
exponentii pentru inmultire, imparire si ajustare prin deplasare, sunt evidente, fara a necesita
detalieri, si ca semnul rezultatului este stabilit in mod corespunzator.
Adunarea si scaderea in virgula mobila vor fi tratate impreuna, evidentiind doua cazuri:
- adunarea modulelor, atunci cand se aduna numere cu acelasi semn sau cand se scad
numere cu semne diferite;
- scaderea modulelor, atunci cand se scad numere cu acelasi semn sau se aduna numere
cu semne diferite.
1.Adunarea modulelor.
1.1.Denormalizarea: numarul cu exponent mai mic se incarca in acumulator si se deplaseaza
cu un numar de pozitii spre dreapta, egal cu diferenta exponentilor. Daca exponentii sunt egali
oricare dintre numere/operanzi poate fi incarcat in acumulator, fara a se efectua vreo deplasare.
1.2.Adunarea: cel de-al doilea operand este adunat la acumulator.
1.3.Normalizarea: daca s-a pozitionat in unu bitul D atunci se deplaseaza continutul
acumulatorului cu un bit spre dreapta.
1.4.Rotunjirea: se aduna 1 la pozitia G, dupa care, daca G = R = ST = 0, se forteaza F4 ← 0.
1.5.Renormalizarea: daca D este pozitionat in unu se face deplasarea continutului
acumulatorului spre dreapta.
1.6.Depasirea: se verifica daca a avut loc o depasire a exponenului.
2.Scadera modulelor.
2.1.Denormalizarea: se incarca numarul cu modulul cel mai mic in acumulator si se deplaseaza
la dreapta, daca este necesar. Rezultatul va fi zero daca si numai daca operanzii sunt egali, aban-
donadu-se operatiile urmatoare.
2.2.Scadearea: se scade continutul acumulatorului din celalalt operand, pastrand rezultatul in
acumulator ( daca ST = 1 se va genera un imprumut );
2.3.Normalizarea: se deplaseaza acumulatorul la stanga pana cand F1 devine egal cu 1;
2.4.Rotunjirea: se aduna 1 la bitul G si apoi, daca G = R = 0 si ST = 0, se forteaza F4 ← 0; nu
este necesara rotunjirea daca pentru normalizare au fost necesare mai multe deplasari la stanga;
2.5.Renormalizarea: in cazul in care rotunjirea a condus la depasire, se efectueaza o
deplasare spre dreapta.
Inmultirea.
In algoritmul pentru inmultirea in virgula mobila se considera prezente resursele hardware
necesare pentru a forma produsul la doua numere in lungime dubla. In caz contrar se poate
folosi algoritmul "aduna si deplaseaza la dreapta" in acumulator, pentru a forma produsul,
incepand cu rangul inferior. In continuare partea mai putin semnificativa este pierduta pe masura
ce este deplasata in afara bitului ST.
1.Inmultirea: se formeaza produsul in lungime dubla;
2.Normalizarea: pentru o eventuala normalizare a produsului se face o deplasare cu un bit;
3.Pozitionarea bitilor G, R, ST: fie produsul normalizat in lungime dubla:
F1 F2 F3 F4 F5 F6 F7 F8
atunci G = F5, R = F6, ST = F7 ∪ F8.
4.Rotunjirea: se realizeaza dupa cum s-a aratat mai sus;
5.Renormalizarea: se realizeaza dupa cum s-a aratat mai sus;
6.Erori: se verifica depasirea superioara/inferioara a expnentului.
Impartirea.
Se considera ca, in procesul efectuarii impartirii, restul este disponibil in orice moment.
1.Impartirea: se formeaza primii sase biti ai catului normalizat:
F1 F2 F3 F4 F5 F6
2.Pozitionarea bitilor G, R, ST: se forteaza:
G = F5, R = F6 si ST = rest;
3.Rotunjirea: se efectueaza dupa regulile mentionate mai sus;
4.Renormalizarea: se efectueaza dupa regulile mentionate mai sus.
Prezenta bitului ST permite implementarea rotunjirii directionate, adica la dreapta sau la stanga
pe un numar standard de biti.
In algoritmii de mai sus s-a cautat obtinerea unei precizii maxime cu pretul reducerii vitezei,
intr-o oarecare masura.
Erori in reprezentarea numerelor in virgula mobila.
Precizia finita introduce erori, care pot sau nu pot sa fie acceptabile pentru aplicatia data. Spre
exemplu, se considera reprezentarea unui milion, in virgula mobila, dupa care se scade 1, din
aceasta. In cazul in care eroarea este mai mare decat 1, restul va fi tot de 1 milion.
Pentru a caracteriza eroarea, gama si precizia, se vor face urmatoarele notatii:
b – baza;
f - numarul rangurilor semnificative ale mantisei/fractiei, in baza data;
E - cel mai mare exponent;
e - cel mai mic exponent.
Numarul rangurilor semnificative din fractie este diferit de numarul de biti in cazul in care baza
este diferita de 2. De exemplu, o baza egala cu 16 foloseste 4 biti pentru fiecare rang. Daca baza
este de forma 2k (o putere a lui 2), atunci sunt necesari k biti pentru fiecare rang exprimat in
baza data. Utilizarea lui 1 ascuns mareste f cu 1 bit, chiar daca nu conduce la cresterea
numarului de numere reprezentabile.
In cadrul analizei reprezentarii in virgula mobila intereseaza urmatoarele aspecte:
- numarul numerelor reprezentabile;
- numarul care are valoarea/marimea cea mai mare;
- numarul diferit de zero, care are valoare/marimea cea mai mica;
- dimensiunea celei mai mari distante intre doua numere succesive;
- dimensiunea celei mai mici distante intre doua numere succesive.
Numarul numerelor reprezentabile se poate calcula luand in considerare numarul de valori pe
care le pot lua campurile distincte ale reprezentarii in virgula mobila:
- semnul poate lua doua valori;
- numarul de exponenti este dat de expresia: ((M – m) + 1);
- primul rang al fractiei: b-1;
- celelalte ranguri ale fractiei: bf-1;
- zero.
Astfel, se obtine urmatoarea expresie:
2 × ((M – m) + 1) × (b-1) × bf-1 + 1
Trebuie aratat ca, in cazul exponentului, nu toate combinatiile de biti sunt valide. Spre exemplu,
in standardul IEEE 754, desi sunt rezervati 8 biti pentru exponent, cel mai mic exponent este
-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
diferit de zero, care are valoare/marimea cea mai mica;
Numarul cu marimea cea mai mica are, de asemenea, cel mai mic exponent bm si cea mai mica
fractie normalizata (diferita de zero), care va fi egala cu b-1. Astfel, numarul cel mai mic va fi:
bm-1. In mod similar numarul cel mai mare va avea cel mai mare exponent bMsi cea mai mare
fractie (1 - b-f), ceea ce conduce la valoarea bM . (1 - b-f).
Cea mai mica distanta si cea mai mare distanta intre doua numere consecutive sunt calculate
intr-o maniera similara. Cea mai mica distanta apare atunci cand exponentul are cea mai mica
valoare bm si cand se modifica cel mai putin bit semnificativ al fractiei, b-f. Aceasta conduce la o
valoare minima a distantei egala cu bm-f. Cea mai mare distanta apare atunci cand exponentul are
cea mai mare valoare bM si cand se modifica cel mai putin bit semnificativ al fractiei,b- f.
Aceasta conduce la o valoare minima a distantei egala cu bM-f.
Se va considera un exemplu, de reprezentare in virgula mobila, in care exista un bit de semn, un
exponent pe 2 biti in exces 2, o fractie pe 3 biti normalizat, fara 1 ascuns. Reprezentarea lui zero
este 000000. In figura de mai jos este data reprezentarea in acest format:

Observatii:
- au aparut distante mari intre zero si primele numere reprezentabile, deoarece
reprezentarea normalizata nu permite structuri de biti in mantisa, care sa corespunda
acestor distante;
- cel mai mic exponent este –2 si cea mai mica fractie normalizata este (0,100)2, ceea ce
face ca modulul celui mai mic numar reprezentabil, diferit de zero, sa fie 1/8.
- cel mai mare exponent este 21, iar cea mai mare fractie este (1 – 2-3), ceea ce conduce
la o valoare de 7/4 pentru cel mai mare numar reprezentabil;
- cel mai mic exponent este –2, iar valoarea celui mai putin semnificativ bit al fractiei
este 2-3, conducand la o valoare minima a distantei intre doua numere consecutive
egala cu 2-5, adica 1/32;
- cel mai mare exponent este 1, iar valoarea celui mai putin semnificativ bit al fractiei
este 2-3, conducand la o valoare maxima a distantei intre doua numere consecutive
egala cu 2-2, adica 1/4;
- datorita normalizarii numarul reprezentarilor valide este mai mic decat numarul
reprezentarilor posibile;
- numarul reprezentabile este dat de expresia:
2 × ((M – m) + 1) × (b-1) × bf-1 + 1 = 2 × ((1 – (- 2) + 1) × (2-1) × 23-1 + 1= 33.
- erorile relative sunt aproximativ aceleasi, comparand rapoartele intre distantele
minime/maxime, intre doua numere consecutive, si valorile maxime ale celor mai
mici/mari numere reprezentabile:
( bm-f) / (b × (1 - b-f))= 1/( bf-1), pentru numerele mici
distanta valoarea maxima pentru numarul cu exponent minim

( bM-f) / (bM × (1 - b-f))= 1/( bf-1), pentru numerele mari


distanta cel mai mare numar

Observatie: Standardul IEEE 754 utilizeaza numere denormalizate pentru a umple distanta intre
numerele plasate in apropierea zeroului.
Exemplu. Sa se reprezinte in virgula fixa numarul (0,9375)10. Convertit in binar, in virgula fixa,
acest numar va avea urmatoarea forma: (0,0011)2. Valoarea sa exprimata in virgula mobila va fi:
1,1 × 2-4 .
Studiu de caz privind pierderea de precizie la conversia de la intregi la virgula mobila.
In timpul razboiului din Golf, 1991-1992, s-au utilizat baterii de rachete Patriot, pentru
urmarirea si distrugerea rachetelor irakiene Scud. Bateriile, prevazute cu radare si tehnica de
calcul operau numai cateva ore, pentru a se evita detectarea lor. In 5 februarie, 1991, baracile
armatei SUA, de la Dhahran au fost atacate cu rachete, inregistrandu-se 28 de morti, datorita
unor erori in partea de prelucrare a datelor de la sistemele radar.
Tintele sunt urmarite de radar, stabilindu-se, pe baza parametrilor calculati, pozitia viitoare a
acesteia. Astfel, se genereaza o “poarta” in care se considera a fi plasata tinta, ceea ce va permite
eliminarea altor zgomote, din afara “portii”.
Predictia urmatoarei pozitii a rachetei Scud se calcula pe baza vitezei acesteia. Viteza este
determinata prin modificarea pozitiei in raport cu timpul. Timpul in sistemul Patriot este
actualizat de catre ceasul intern la intervale de 100 ms. Viteza este reprezentata in virgula
mobila pe 24 de biti, iar timpul ca un intreg pe 24 de biti. Pentru a calcula noua pozitie, timpul si
viteza trebuie sa fie reprezentate in virgula mobila, pe 24 de biti. Conversia de la intreg la
virgula mobila, pentru timp, s-a facut cu erori, care cresc proportional cu timpul de operare al
sistemului. Astfel, poarta pentru noua pozitie a fost calculata eronat, eroarea depinzand de viteza
rachetei si de durata de timp de cand sistemul era operational. In acea zi Patriot opera de peste
100 de ore, eroarea stabilirii portii fiind de 687 metri, ceea ce a condus la pierderea tintei.
Situatia fusese semnalata cu doua saptamani anterior de catre israelieni. Software-ul a fost
modificat, a fost transmis pe campul de lupta, dar nu fusese instalat. O solutie simpla, pe
moment, ar fi constat in “reboot-area” a sistemului, la intervale de cateva ore, pentru
eliminarea erorilor acumulate la conversia timpului.
Coduri alfanumerice
Spre deosebire de numerele reale, care au o gama infinita, numarul caracterelor alfanumerice
este limitat, ceea ce permite ca un intreg set de caractere sa fie codificat cu un numar redus de
biti pe caracter. In practica se utilizeaza doua sisteme de codificarea a caracterelor alfa
numerice: ASCII ( American Standard Code for Information Interchange) si EBCDIC
(Extended Binary Coded Decimal Interchange Code)
Codul ASCII.
Acest cod, utilizat pentru reprezentarea carcterelor alfanumerice, utilizeaza 7 biti pe caracter.
Toate cele 27 coduri posibile reprezentand caractere valide. In tabela de mai jos se prezinta in
hexazecimal codurile ASCII alfanumerice.

Caracterele din pozitiile 00 – 1F si 7F, sunt caractere de control utilizate pentru transmisie,
controlul afisaii/tiparirii, cat si pentru alte scopuri. Toate celelalte caractere sunt afisabile si
incluzand: literele, cifrele, semnele de punctuatie si spatiul. Cifrele 0 – 9 apar in secventa ca si
literele mici si mari, ceea ce simplifica manipularea caracterelor. Pentru a transforma
reprezentarea alfanumerica a unei cifre zecimale in valoarea sa numerica este suficient sa se
scada (30)16 din ea. Pentru a transforma codul unei majuscule in codul corespunzator al literei
mici se va aduna la primul (20)16.
Codul EBCDIC.
Codul ASCII permite reprezentarea a 128 de caractere, ceea ce reprezinta o limitare pentru cele
mai multe tastaturi moderne. Aceste tastaturi contin, pe langa tastele alfanumerice si taste
dedicate unor caractere speciale. Codul EBCDIC este un cod pe 8 biti utilizat de catre IBM. In
tabelul de mai jos se prezinta, in codificare hexazecimala codurile EBCDIC.

Adesea codul ASCII, pe 7 biti, este reprezentat pe un octet, avand 0 sau 1 in bitul cel mai
semnificativ, care este folosit drept bit de paritate. Aceasta nu este de natura sa favorizeze codul
ASCII in raport cu codul EBCDIC. In schimb, la transmisia seriala a datelor codurile pe 8 biti
necesita mai mult timp, decat cele pe 7 biti.
Coduri detectoare de erori.
Datele stocate, transmise si prelucrate in cadrul sistemelor numerice sunt reprezentate sub forma
unor succesiuni de unitati si zerouri. Reprezentarea lor fizica se realizeaza prin niveluri ale unor
tensiuni electrice, care pot fi afectate de diverse zgomote, avand cauze diferite. Zgomotele pot
modifica unii biti din 0 in 1 si invers, ceea ce conduce la distorsionarea informatiei, la erori. Pe
baza unui model statistic al erorilor este posibila crearea unei astfel de reprezentari a datelor
incat sa fie posibile, atat detectarea, cat si corectarea erorilor.
Daca se considera codul ASCII, in care sunt utilizate toate posibilitatile de codificare ale
caracterelor, oricare modificare a unui bit intr-un cod al unui caracter dat va conduce la codul
valid al altui caracter. Aceasta observatie sta la baza introducerii redundantei, sub forma unor
biti suplimentari, ceea ce va permite detectarea si corectarea erorilor.
Detectarea si corectarea erorilor.
Distanta Hamming defineste distanta logica intre doua coduri de caractere valide si este
masurata prin numarul de biti prin care difera acestea. Pentru codul ASCII aceasta distanta este
egala cu 1. Adugand un singur bit redundant, la codul ASCII al fiecarui caracter alfanumeric, se
poate detecta o singura eroare, intrucat codul eronat se va plasa intre doua coduri valide ASCII.
O metoda de recodificare a codului ASCII, pentru a obtine o distanta Hamming egala cu 2,
consta in introducerea unui bit de paritate, plasat la stanga codului normal ASCII. Acest bit va fi
calculat pe baza sumei modulo 2 a bitilor egali cu 1 din codul ASCII. In cazul conventiei de
paritate para, bitul de paritate va fi egal cu rezultatul sumei modulo 2, amintita mai sus, iar in
cazul paritatii impare acesta va fi egal cu valoarea negata a acesteia.

P 26 25 24 23 22 21 20 Caracterul
1 1 1 0 0 1 0 0 d
0 1 1 0 0 1 0 1 e
0 1 1 0 0 1 1 0 f
1 1 1 0 0 1 1 1 g
0 1 0 0 0 1 0 0 D

Bit de paritate Codul ASCII


In aceste conditii tabela codurilor ASCII, cu bit de paritate, va avea 256 de intrari/coduri, dintre
care jumatate vor fi invalide. In cazul receptionarii unui caracter invalid se poate cere
retransmisia, ceea ce in multe situatii nu este convenabil. O solutie ar fi aceea prin care se poate
detecta si corecta aparitia unei reori. In acest scop trebuie sa se mareasca numarul bitilor
redundanti din codul ASCII.
Pentru detectarea si corectarea unei erori in cadrul fiecarei pozitii a unui cod ASCII, fiecarui
cod valid ASCII trebuie sa i se asocieze alte 7 coduri invalide, in care se va modifica exact un
singur bit. Acest lucru trebuie sa se intample cu fiecare cod valid ASCII, iar codurile invalide
asociate fiecarui cod valid trebuie sa fie diferite. Spre exemplu codului ASCII valid pentru
caracterul d i se vor asocia codurile invalide de mai jos:
11001100 cod valid pentru d
01001100
10001100
11101100
11011100 coduri invalide pentru d
11000100
11001010
11001101
Problema se pune in legatura cu numarul necesar al bitilor redundanti. Pentru un cod de k biti,
se considera ca numarul bitilor redundanti egal cu r. Pentru fiecare cele 2k cuvinte initiale exista
caractere de k biti, in care cate un bit este modificat, la care se adauga caracterele de r biti, cu
cate un bit modificat plus caracterul nemodificat. Astfel, vor exista 2k x (k + r + 1) coduri in
total. Pentru a suporta toate aceste coduri trebuie sa fie suficiente combunatii de k + r biti.
Relatia care trebuie indeplinita este data mai jos:
2k × (k + r + 1) ≤ 2k+ r sau
(k + r + 1) ≤ 2r
In cazul k = 7, daca se cauta intregul r care satisface relatia de mai sus, rezulta r = 4, ceea ce
conduce la un cod ASCII, prevazut cu caractere redundante, de 7 + 4 = 11 biti.
Asignarea celor 4 biti redundanti la cuvintele originale se va face astfel incat sa poata fi
identificata o eroare la un singur bit. Fiecarui bit din cuvantul codificat, incluzand bitii de
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
sunt verificati, incepand cu pozitia 1. C1 este in pozitia de bit1, C2 in pozitia de bit 2, C4 in
pozitia 4 samd. Plasarea lor in pozitii corespunzatoare puterilor lui 2 faciliteaza procesul de
localizare a erorii. Acest mod particular de amplasare poarta numele de Cod de Corectare a unei
Erori Singulare (CCES) sau SEC (Single Error Correcting)

C8 C4 C2 C1 Bit verificat
0 0 0 0 1
0 0 0 1 2
0 0 1 0 3
0 0 1 1 4
0 1 0 0 5
0 1 0 1 6
0 1 1 0 7
0 1 1 1 8
1 0 0 0 9
1 0 0 1 10
1 0 1 0 11

Intrucat pozitiile unitatilor sunt unice in fiecare combinatie a bitilor de verificare, o eroare se
poate localiza prin observarea bitilor redundanti eronati. Pentru exemplificare se considera codul
ASCII al caracterului ‘a’

Pozitia bitilor Bitii de verificare

Valorile bitilor de verificare se stabilesc conform tabelului de mai sus. Bitul de verificare C1= 0
realizeaza paritatea para pentru grupul de biti {1, 3, 5, 7, 9, 11}. Membrii acestui grup sunt luati
din pozitiile, care au 1 in coloana lui C1, din tabela de mai sus. Bitul de verificare C2 = 0
furnizeaza paritatea para pentru grupul de biti {2, 3, 6, 7, 10, 11}. In mod similar bitul de
verificare C4 = 0 asigura paritatea para pentru grupul de biti {4, 5, 6, 7}. In final C8 = 0 stabileste
paritatea para pentru grupul de biti {8, 9, 10, 11}. O posibilitate de cautare in tabela membrilor
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
pozitiile 1, 2, 4, deoarece 1+ 2 + 4 = 7.
Se considera ca receptorul primeste sirul de biti 10010111001, in conditiile CCES pentru
ASCII. Ce caracter a fost transmis?
Se vor calcula paritatile pentru fiecare din bitii de verificare
Bit eronat

Paritate
C1 verifica biti bitii{1, 3, 5, 7, 9, 11} para
C2 verifica biti bitii{2, 3, 6, 7, 10, 11} impara
C4 verifica biti bitii{4, 5, 6, 7} para
C8 verifica biti bitii{8, 9, 10, 11} impara
Pentru a localiza eroarea, se vor aduna pozitiile bitilor de verificare cu paritate impara:
1 + 4 = 5. Astfel cuvantul care a fost transmis este: 10010101001. Daca se inlatura bitii de
verificare, se va obtine codul ASCII al caracterului’D’.
Schema de detectare si corectare a unei erori poate fi vizualizata pe un hipercub, in varfurile
caruia sunt plasate codurile valide si invalide. Distanta Hamming separa codurile valide, in timp
ce un cod invalid esteplasat la o distanta mai mica de un cod valid, ceea ce faciliteaza detectarea
si corectarea erorii.
In cazul aparitiei a doua erori, schema de mai sus permite detectarea lor, fara a oferi
posibilitatea de a le corecta. In cazul a doua erori, care ar putea fi corectate, distanta minima
Hamming trebuie sa fie egala cu 5.
In general, pentru a detecta p erori distanta Hamming minima trebuie sa fie p + 1, iar o distanta
Hamming de 2p + 1 permite corectarea a p erori
Verificare prin redundanta verticala.
Schema prezentata mai sus s-a referit la detectarea si corectarea unei erori singulare intr-un
caracter individual. Aceasta mai poarta numele de verificarea redundanta
orizontala/longitudinala (VRO).
O alternativa o reprezinta verificarea redundanta verticala/longitudinala (VRV) in cadrul
careia, la sfarsitul unui grup de cuvinte transmise, se adauga o suma de control. In acest caz,
paritatea este calculata pe coloane, suma de control fiind atasata, in final, la mesaj. La receptie,
se calculaeaza din nou suma de contro, care se compara cu cea receptionata. Daca apare o eroare
se solicita retransmiterea mesajului intrucat nu exista suficienta redundanta pentru identificarea
pozitiei unei erori. Tehnicile VRO si VRV se pot utiliza pentru a imbunatati verificarea aparitiei
unor erori.
In unele cazuri erorile apar in rafala, modificand mai multi biti consecutivi, atat pe linii, cat si
pe coloane, in cadrul unui mesaj. Pentu asemenea situatii se recomanda o schema mai puternica
de verificare denumita Verificare Redundanta Ciclica (VRC sau CRC - Cyclic Redundancy
Checking). VRC reprezinta o varianta a VRV.
Problema. Sa se calculeze numarul necesar de biti de verificare pentru corectarea unei erori
duble in codul ASCII.
Solutie. In codul ASCII sunt folositi, pentru fiecare caracter, k = 7 biti, la care se vor mai
adauga r biti redundanti de verificare. Pentru fiecare dintre cele 2k caractere ASCII vor exista
(k+ r) caractere eronate la nivelul unui bit si [(k+ r)( k+ r-1)]/2 caractere eronate la nivelul a doi
biti, la care se mai adauga caracterul corect. Numarul caracterelor codificate cu (k+ r) biti este
egal cu 2(k+ r). In aceste conditii trebuie sa se indeplineasca conditia de mai jos:
2k x { (k+ r) + [(k+ r)( k+ r-1)]/2 +1 }≤2(k+ r)
Inlocuind k cu valoarea sa 7, rezulta ca valoarea cea mai mica pentru r, care satisface relatia de
mai sus este r = 7.
Intrucat, pentru corectarea a p erori trebuie pastrata o distanta Hamming egala cu 2p + 1, rezulta
ca in acest caz, unde p = 2, distanta va fi egala cu 5. In cazul in care se mentine aceeasi distanta
si pentru detectarea a erorilor, cunoscand ca distanta Hamming este egala cu numarul erorilor
detectate p + 1, rezulta ca numarul erorilor detectate este egal cu 4.
Probleme.

x
x
x) SEC inseamna Single Error Correcting
2.2.Inmultirea.
Inmultirea numerelor consta in generarea si adunarea produselor partiale obtinute prin
inmultirea rangului curent al inmultitorului cu deinmultitul. In cazul numerelor binare, produsul
partial curent este egal cu deinmultitul, deplasat spre stanga conform pozitiei rangului
inmultitorului, daca bitul curent al inmultitorului este unu, sau egal cu zero, daca bitul curent al
inmultitorului este zero. Daca produsul partial curent este diferit de zero, el se aduna la suma
produselor partiale anterioare.
Exista si posibilitatea ca, dupa fiecare adunare, suma produselor partiale sa fie deplasata spre
dreapta cu un rang.
1.2.1 Inmultirea in cod direct.
Inmultirea in cod direct/semn si modul presupune tratarea separata a semnelor si inmultirea
modulelor.
Fie numerele X si Y,
X ≡ xn-1 xn-2… … … … … … … . x1 x0,
Y ≡ yn-1 yn-2… … … … … … … . y1 y0,
care urmeaza sa fie inmultite, pentru a furniza produsul Z:
Z ≡ z2n-2 z2n-3… … … … … … z1 z0.
Semnul produsului z2n-1 va fi obtinut astfel:
z2n-2 = xn-1 ⊕ yn-1.
Produsele partiale: P0,… … .,Pn-3, Pn-2 se obtin dupa cum urmeaza:
P0 = |x| . y0. 20
P1 = |x| . y1. 21
… … … … … … … .
Pn-2 = |x| . yn-2. 2n-2
iar suma lor va conduce la produsul modulelor:
z2n-3… … … … … … z1 z0
Fie cazul a doua numere reprezentate in cod direct pe 5 biti:
- deinmultitul x = 11000 si
- inmultitorul y = 01000
Pentru semn rezulta: z8 = 1 ⊕ 0 = 1,
in timp ce modulul produsului se va obtine dupa cum se arata mai jos:
1000
× 1001
1000
0000
0000
1000
01001000
z7… … … z1 z0 = 01001000.
Astfel, produsul celor doua numere va avea 9 biti:
z8 z7… … … z1 z0 = 101001000.
In exemplul de mai sus produsele partiale s-au obtinut prin deplasarea spre stanga a
deinmultitului, inmultit cu rangul corespunzator al inmultitorului.
Solutie paralela.
O implementare combinationala presupune utilizarea sumatoarelor complete si a unor porti
AND. Astfel, se obtine un sumator modificat, pentru un rang, conform schemei de mai jos:

Cj Cj

1 SPi,j-1
CI
SPi,j-1 2 4 SPi,j Sumator SPi,j
A0 Z0 Yj modificat
3 5
B0 CO Xi
Yj 1
3
Xi 2

Ci+1 Ci+1

a) Sumator modificat b) Schema bloc a sumatorului modificat


x3 0 x2 0 x1 0 x0 0 y0

sumator sumator sumator sumator


modificat modificat modificat modificat 0
x3 x2 SP0,3 x1 SP0,2 x0 SP0,1 SP0,0 y1

sumator sumator sumator sumator


modificat modificat modificat modificat
0
SP1,4 SP1,3 SP1,2 SP1,1 SP1,0

z4 z3 z2 z1 z0
S-a notat cu SPi,j bitul i al sumei produselor partiale j. Schema prezinta numai primele doua
etaje ale dispozitivului paralel de inmultire.
Sumatorul modificat poate fi utilizat in cadrul unei structuri de inmultire paralela, ca in figura de
mai sus. Din punctul de vedere al implementarii algoritmului, se poate afirma ca, in acest caz,
este vorba de o “programare spatiala”, care conduce la viteza ridicata de operare. Solutia
necesita, pentru implementare, (n-1)2 sumatoare modificate. In cel mai defavorabil caz,
rezultatul inmultirii se obtine dupa propagarea semnalelor prin 4.(n – 1) porti.
Se lasa pe seama cititorului elaborarea unei solutii bazate pe “sumatoare cu salvare a
transportului” si sumatoare cu transport anticipat.
Solutie seria l- paralela.
In scopul reducerii cantitatii de hardware, dispozitivele de inmultire se realizeaza sub forma
unei structuri paralele hardware, pentru un pas de inmultire, cu operare secventiala.
Daca se noteaza produsul partial j cu ppj, atunci un pas de inmultire va avea urmatoarea forma:
ppj = ppj-1 + x . yj. 2j
O schema bloc, pentru solutia mentionata mai sus, este prezentata in continuare:
x3 x2 x1 x0

Generator de produse partiale yj


… … … …

Sumator pe n biti
… … … …
0
… … … . … … … … … …

registru de deplasare dreapta cu 2.(n-1) ranguri


in care se acumuleaza sumele produselor partiale.

Operarea se efectueaza conform urmatoarei secvente:


1. anuleaza continutul registrului in care se acumuleaza sumele produselor partiale;
2. initializeaza numarul rangului bitului inmultitorului j = 0;
3. formeaza produsul partial x . yj.
4. aduna produsul partial la jumatatea superioara a registrului sumei produselor partiale;
5. efectueaza j = j + 1 si daca j = n treci la 8.
6. deplaseaza la dreapta cu un rang continutul registrului sumei produselor partiale;
7. treci la pasul 3;
8. produsul cu 2.(n –1) ranguri s-a obtinut in registrul de deplasare.
Rezultatul se poate stoca fie sub forma unui singur cuvant, pastrand jumatatea superioara, fie
sub forma unui cuvant dublu. In primul caz va fi afectata precizia.
Inmultirea numerelor in cod complementar.
Intrucat, in marea majoritate a cazurilor, numerele negative se reprezinta in calculatoare in codul
complementar, in continuare, vor fi examinate cateva metode de inmultire in acest cod.
Mai intai se vor examina deplasarile aritmetice la stanga si la dreapta in cod complementar.
Se considera urmatoarele cazuri:
1. x > 0.
[x]c = 0 xn-2… … … … … … … . x1 x0,
Deplasarea la stanga:
[2.x]c = xn-2… … … … … … … . x1 x00,
Deplasarea la dreapta:
[2-1.x]c = 00xn-2… … … … … … … . x1,
2. x < 0.
~ ~ ~
[x]c = 1xn-2… … … … … … … . x1 x0,

Deplasarea la stanga:
~ ~
[2.x]c = xn-2… … … … … … … . x1 0,

Deplasarea la dreapta:
~ ~
[2-1.x]c = 11xn-2… … … … … … … . x1.

Cateva metode pentru inmultirea numerelor reprezentate in cod complementar.


Metoda 1.
- Se modifica , daca este cazul, inmultitorul si deinmultitul astfel incat inmultitorul sa fie
pozitiv.
- Produsele partiale se calculeaza in mod obisnuit.
- Deplasarea spre stanga/ dreapta a deinmultitului/sumei produselor partiale se realizeaza
conform regulilor de deplasare in cod complementar.
Metoda 2.
Aceasta metoda presupune inmultirea numerelor cu semn in maniera obisnuita, ca si cand ar fi
vorba de numere intregi fara semn. Rezultatul va fi corect numai in cazul in care cei doi
operanzi sunt pozitivi. In caz contrar sunt necesare corectii, care se incadreaza in trei cazuri.
1. x > 0, y > 0.
[x]c . [y]c = |x| . |y| = [x . y]c
2. x < 0, y > 0; [x]c = 2n - |x|; [y]c = |y|;
[x]c . [y]c = 2n.|y| - |x| . |y|; rezultat incorect
[x]c . [y]c = 22n - |x| . |y|; rezultat corect
Rezulta necesitatea unei corectii egala cu: 22n - 2n.|y|, care se va aduna la rezultatul incorect.
3. x > 0, y < 0; [x]c = |x|; [y]c = 2n - |y|;
[x]c . [y]c = 2n.|x| - |x| . |y|; rezultat incorect
[x]c . [y]c = 22n - |x| . |y|; rezultat corect
Rezulta necesitatea unei corectii egala cu: 22n - 2n.|x|, care se va aduna la rezultatul incorect.
4. x < 0, y < 0; [x]c = 2n - |x|; [y]c = 2n - |y|;
[x]c . [y]c = 22n - 2n.|y| - 2n.|x| + |x| . |y|; rezultat incorect
[x]c . [y]c = |x| . |y|; rezultat corect
Rezulta necesitatea unei corectii egala cu: -22n + 2n.|y| + 2n.|x|, care se va aduna la rezultatul
incorect.
Metoda este greoaie si are un caracter pur teoretic.
Metoda 3. Algoritmul lui Booth.
In acest caz se pleaca de la observatia ca, valoarea unui numar Y, reprezentat in cod
complementar, se poate calcula astfel:
Y = - yn-1 . 2n-1 + yn-2 . 2n-2 + yn-3 . 2n-3 +… … … + y1 . 21 + y0. 20 =
n-1
= Σ (yi-1 - yi) .2i
i=0
unde:
- yn-1 reprezinta rangul de semn, codificat cu 0/1 in cazul numerelor pozitive/negative;
- y-1 constituie rangul aflat la dreapta rangului 0, avand initial valoarea 0.
In aceste conditii valoarea produsului X.Y se va exprima dupa cum urmeaza:
n-1
X.Y = Σ x. (yi-1 - yi) .2i
i=0

Pe baza formulei de mai sus se poate calcula produsul partial de rang i :

yi-1 yi produsul partial.


0 0 0
0 1 - x .2i
1 0 x .2i
1 1 0

Pentru implementarea hardware se considera resursele corespunzatoare unei structuri orientate


pe un singur acumulator:

Deinmultit (X) Inmultitor (Y)

n-1 .. RD.. 0 n-1 .. AC.. 0 n-1 .. MQ.. 0 MQq

RD RD SL

activare
0 1 0/1
MUX 0/1 selectare

Sumator 0/1 CNT

Resursele hardware:
- AC – registrul acumulator;
- RD – registrul de date al memoriei;
- MQ – registru de extensie al acumulatorului;
- MQq – registru de un bit, extensia lui MQ;
- CNT – contor de cicluri ( ρCNT = log2n );
- SL – structura logica pentru activarea si selectarea intrarilor multiplexorului, cat si pentru
controlul transportului la sumator;
- Sumator- sumator combinational cu n ranguri binare.
Descrierea operarii dispozitivului se poate face cu ajutorul urmatoarei organigrame:

Start

RD ← Deinmultit
AC ← Inmultitor
CNT ← log2n T n
MQ ← n T 0
MQq ← 0

MQ ← AC; AC ← n T 0

0,1 MQ0,MQq 0,0; 1,1

AC← ADD(AC,RD)

AC← SUB(AC,RD)

CNT← DEC(CNT)

CNT = 0 ? DA Z = AC,MQ(n-1:1)

NU

AC,MQ,MQq← AC0, AC,MQ Stop


Programul AHPL:
MODULE: Dispozitiv_de_inmultire
MEMORY: RD[n]; AC[n]; MQ[n]; MQq; CNT[log2n]
INPUTS: X[n]; Y[n]
OUTPUTS: Z[2n-1]
// se considera operanzii X si Y adusi in RD si AC
1. MQ ← AC; MQq ← 0; CNT ← log2n T n
2. AC ← n T 0
3. → (MQ0 MQq , MQ0 MQq , MQ0 MQq , MQ0 MQq)/(6, 4, 5, 6)
4. AC← ADD(AC,RD)
→ (6)
5 AC← SUB(AC,RD)
6 CNT← DEC(CNT)
7 → ( ∪ /CNT, ∪ /CNT )/(9,8)
8 AC,MQ,MQq← AC0, AC,MQ
→ (3)
9 ENDSEQ
Z = AC,MQ(n-1:1)
END
In continuare se va prezenta un program Verilog pentru simularea unui dispozitiv de inmultire.
//Simularea unui dispozitiv de inmultire a numerelor reprezentate in complementul fata de doi,
//folosind Algoritmul lui Booth
module inmultitorb;
parameter n=8;
reg [n-1:0] RD,AC,MQ;
reg [2*n-1:0] Z;
reg [2:0] CNT;
reg MQq;
initial begin: init
AC=-7;RD=-5;MQ=0;MQq=0;CNT=n-1;
$display("timp RD AC MQ MQq CNT");
$monitor("%0d %b %b %b %b %b",$time,RD,AC,MQ,MQq,CNT);
wait (CNT==0)
begin
$monitor("Produs= %b",{AC[n-1],AC,MQ[n-1:1]});
#1 $stop;
end
end
always
begin
#1; MQ=AC;
#1; AC=0;
while(CNT>0)
begin
case({MQ[0],MQq})
2'b00:begin
#1;{AC,MQ,MQq}={AC[n-1],AC,MQ};
end
2'b01:
begin
#1;AC=AC+RD;
#1;{AC,MQ,MQq}={AC[n-1],AC,MQ};
end
2'b10:
begin
#1;AC=AC-RD;
#1;{AC,MQ,MQq}={AC[n-1],AC,MQ};
end
2'b11:
begin
#1;{AC,MQ,MQq}={AC[n-1],AC,MQ};
end
endcase
#1;CNT=CNT-1;
end
end
endmodule
Veriwell -k C:\Program Files\VeriWell\exe\VeriWell.key -l C:\Program
Files\VeriWell\exe\VeriWell.log inmultitorb.V
VeriWell for Win32 HDL <Version 2.1.1> Tue Dec 19 16:26:21 2000

This is a free version of the VeriWell for Win32 Simulator


Distribute this freely; call 1-800-VERIWELL for ordering information
See the file "!readme.1st" for more information.

Copyright (c) 1993-96 Wellspring Solutions, Inc.


All rights reserved

Memory Available: 0
Entering Phase I...
Compiling source file : inmultitorb.V
The size of this model is [3%, 2%] of the capacity of the free version

Entering Phase II...


Entering Phase III...
No errors in compilation
Top-level modules:
inmultitorb

//Cazul: RD = 5; AC = 7;

timp RD AC MQ MQq CNT


0 000101 00000111 00000000 0 111
1 00000101 00000111 00000111 0 111
2 00000101 00000000 00000111 0 111
3 00000101 11111011 00000111 0 111
4 00000101 11111101 10000011 1 111
5 00000101 11111101 10000011 1 110
6 00000101 11111110 11000001 1 110
7 00000101 11111110 11000001 1 101
8 00000101 11111111 01100000 1 101
9 00000101 11111111 01100000 1 100
10 00000101 00000100 01100000 1 100
11 00000101 00000010 00110000 0 100
12 00000101 00000010 00110000 0 011
13 00000101 00000001 00011000 0 011
14 00000101 00000001 00011000 0 010
15 00000101 00000000 10001100 0 010
16 00000101 00000000 10001100 0 001
17 00000101 00000000 01000110 0 001
Produs= 0000000000100011
Stop at simulation time 19
C1> $finish;

Top-level modules:
inmultitorb
// Cazul: RD = 5; AC = -7;

timp RD AC MQ MQq CNT


0 00000101 11111001 00000000 0 111
1 00000101 11111001 11111001 0 111
2 00000101 00000000 11111001 0 111
3 00000101 11111011 11111001 0 111
4 00000101 11111101 11111100 1 111
5 00000101 11111101 11111100 1 110
6 00000101 00000010 11111100 1 110
7 00000101 00000001 01111110 0 110
8 00000101 00000001 01111110 0 101
9 00000101 00000000 10111111 0 101
10 00000101 00000000 10111111 0 100
11 00000101 11111011 10111111 0 100
12 00000101 11111101 11011111 1 100
13 00000101 11111101 11011111 1 011
14 00000101 11111110 11101111 1 011
15 00000101 11111110 11101111 1 010
16 00000101 11111111 01110111 1 010
17 00000101 11111111 01110111 1 001
18 00000101 11111111 10111011 1 001
Produs= 1111111111011101
Stop at simulation time 20
C1> $finish;

// Cazul: RD = -5; AC = -7;

timp RD AC MQ MQq CNT


0 11111011 11111001 00000000 0 111
1 11111011 11111001 11111001 0 111
2 11111011 00000000 11111001 0 111
3 11111011 00000101 11111001 0 111
4 11111011 00000010 11111100 1 111
5 11111011 00000010 11111100 1 110
6 11111011 11111101 11111100 1 110
7 11111011 11111110 11111110 0 110
8 11111011 11111110 11111110 0 101
9 11111011 11111111 01111111 0 101
10 11111011 11111111 01111111 0 100
11 11111011 00000100 01111111 0 100
12 11111011 00000010 00111111 1 100
13 11111011 00000010 00111111 1 011
14 11111011 00000001 00011111 1 011
15 11111011 00000001 00011111 1 010
16 11111011 00000000 10001111 1 010
17 11111011 00000000 10001111 1 001
18 11111011 00000000 01000111 1 001
Produs= 0000000000100011
Stop at simulation time 20
C1>

2.3.Impartirea.
Ca regula generala, impartirea numerelor se realizeaza prin scaderea repetata a impartitorului,
deplasat spre dreapta cu un rang, din restul de la scaderea precedenta, pana la obtinerea unui rest
egal cu zero sau mai mic decat impartitorul; ca prim rest se considera deimpartitul.
In general se practica doua metode:
- metoda bazata pe refacerea ultimului rest pozitiv (metoda cu restaurare) si
- metoda in care nu se reface ultimul rest pozitiv (metoda fara restaurare).
Pentru prima metoda se prezinta exemplul urmator, in care deimpartitul este 22, iar impartitorul
este 9:
22 : 9 = q0, q-1q-2
22 40 40
- 9 - 9 - 9
13 31 31
- 9 - 9 - 9
4 22 22
- 9 - 9 - 9
- 5 13 13
q0 = 2 - 9 - 9
4 4
- 9 - 9
- 5 - 5
q-1 = 4 q-2 = 4
22 : 9 = 2,44…
Cea de-a doua metoda pleaca de la ideea ca, in loc de a scadea impartitorul deplasat la dreapta
cu un rang, din ultimul rest pozitiv, se va aduna impartitorul deplasat la dreapt, la la ultimul rest
negativ. Metoda se va ilustra prin exemplul de mai jos:

22 : 9 = q0, q-1q-2
22 -50 40
- 9 +9 - 9
13 - 41 31
- 9 +9 - 9
4 - 32 22
- 9 + 9 - 9
- 5 - 23 13
q0 = 3 + 9 - 9
- 14 4
+ 9 - 9
- 5 - 5
+ 9
4
q-1 = 6 q-2 =

Catul va avea forma: 3, 6 5 6 5 6… … , in care termenii cu bara sunt negativi [3, (-6)5(-6)5(-6)],
ceea ce va impune efectuarea unei corectii care va aduce rezultatul la forma:
22 : 9 = 2,44444…
Multima metoda necesita un numar mai mare de pasi, astfel incat, in continuare se va examina
implementarea metodei bazata pe restaurarea ultimului rest pozitiv.
Algoritmul impartirii numerelor reprezentate in complementul fata de doi, cu restaurarea
ultimului rest pozitiv.
Pentru ilustrarea algoritmului se vor considera urmatoarele resurse hardware:
- AC – acumulator;
- RD – registrul de date al memoriei;
- MQ – registrul de extensie a acumulatorului;
- CNT – registru incrementator, contor de cicluri.
Impartitorul Y va fi incarcat in RD, iar deimpartitul X in AC. In MQ se va acumula catul.

n-1| RD |0 n-1| AC |0 n-1| MQ |0 CNT

Descrierea algoritmului:
1. Se deplaseaza continutul lui RD cu p ranguri spre stanga, in conditiile in care 2p este prima
incercare de multiplu binar al impartitorului.
Se verifica daca RD = 0, in caz afirmativ operatia se termina cu semnalizarea unei erori.
Daca RD ≠ 0, se incarca CNT cu vectorul binar avand valoarea p .
2. Daca deimpartitul si impartitorul au semne identice/diferite se scade/se aduna impartitorul
din/la deimpartit, pentru a obtine restul.
3. a) Daca restul si deimpartitul au semne identice sau restul este egal cu zero, se introduce o
unitate in bitul cel mai putin semnificativ a lui MQ, iar restul va lua locul deimpartitului.
b) Daca restul si deimpartitul au semne diferite si restul curent nu este zero, se introduce un
zero in bitul cel mai putin semnificativ al lui MQ, fara a mai modifica deimpartitul.
4. Se deplaseaza continutul registrului imparitorului cu un rang spre dreapta, extinzand rangul
de semn.
Se decrementeaza CNT.
Se deplaseaza MQ spre stanga cu un bit.
5. Se repeta pasii 2- 4 pana cand continutul lui CNT devine egal cu zero.
6. Daca deimpartitul si impartitorul au avut semne identice rezultatul se afal in registrul MQ. In
cazul in care semnele celor doi operanzi au fost diferite, rezultatul se obtine prin
complementarea continutului registrului MQ.
Realizarea practica a algoritmului impune introducerea unor resurse hardware suplimentare,
fata de AC, RD, MQ, CNT si anume:
- R[n] – registrul in care se obtine restul curent;
- z[1] – bistabil in care se stocheaza informatia (1/0) referitoare la semnele identice/diferite
ale celor doi operanzi;
- e[1] – bistabil care semnalizeaza conditia de eroare/non-eroare (1/0);
- S – unitate logica combinationala, care genereaza semnalul de sfarsit al operatiilor de
deplasare spre stanga in registrul RD;
S = RDn-1 .RDn-2 . RDn-3 ∪ RDn-1 .RDn-2
- F- unitate logica combinationala, care calculeaza identitatea/neidentitatea semnelor
operanzilor;
F = ACn-1 ⊕ RDn-1
- V – unitate logica combinationala, care verifica semnele operanzilor din acumulator
(deimpartit) si din registrul restului curent R;

V = ACn-1 ⊕ Rn-1

- U – unitate logica combinationala, care verifica existenta unui rest curent egal cu zero;
U = ∪ ⁄R.
Structura generala, la nivel de schema bloc, a dispozitivului de impartire:

S S

n-1| AC |0 n-1| n-2| n-3| RD |0

RD RD
F
MUX
z

n-1| ADD |0

n-1| R |0 CNT

V U e

n-1| MQ |0 Deplasare stanga


Programul AHPL pentru dispozitivul de impartire.
MODULE: Dispozitiv_de_impartire
MEMORY: RD[n]; AC[n]; MQ[n]; R[n]; CNT[ log2n ]; z[1]; e[1]
INPUTS: X[n]; Y[n]
OUTPUTS: Z[n]
// se considera operanzii X si Y adusi in AC si RD.
1. MQ ← n T 0; CNT ← log2n T 0; Z ← 0; e ← 0
→ ( ∪ /RD)/(12) // eroare
2. → (S)/(4)
3. RD ← RDn-2:0, 0; CNT← INC(CNT)
→ (2)
4. z ← F
5. R ← (ADD(AC,RD) ! SUB(AC,RD)) * ( F, F )
6. → ( V ∪ U )/(8)
7. MQ ← MQn-2:0, 0
→ (9)
8. MQ ← MQn-2:0, 1
9. → ( ∪ /CNT)/(11)
10. RD ← RDn-1,RDn-1:1 ; CNT← DCR(CNT)
→ (5)
11. MQ← (MQ ! ADD(MQ,1)) * ( z, z )
12. e ← ( 0 ! 1) * (∪ /RD, ∪ /RD)
ENDSEQ
Z = MQ
END
3. Operatii aritmetice in virgula mobila.
Operatiile aritmetice in virgula mobila vor fi examinate la nivelurile schemei bloc, pentru
unitatea aritmetica, si organigramelor pentru adunare/scadere si inmultire. In analiza care
urmeaza se considera operanzii de intrare X ,Y si rezultatul Z, care vor avea urmatoarele
formate:
X ← xs, XE, XF ; Y ← ys, YE, YF; Z ← zs, ZE, ZF

3.1. Schema bloc a unitatii aritmetice in virgula mobila.


Schema bloc a unitatii aritmetice in virgula mobila, in cazul de fata, se bazeaza pe structura
schemei unitatii aritmetice in virgula fixa, la care s-au mai adaugat o serie de resurse, pentru
manipularea exponentilor (registre si unitate aritmetica).

RE2 RE1
ees Prelucrare
exponenti
UALE


Conditii

RD AC MQ
es

DEP. LOGICA DEP. LOGICA

UAL
… ..

Conditii

Prelucrari mantise/fractii
Partea care prelucreaza exponentii contine urmatoarele resurse:
- E1 si RE2 - registre pentru exponenti;
- ees- bistabil de extensie a registrului exponentului la stanga;
- UALE- Unitate Aritmetica Logica pentru Exponenti.
In partea care prelucreaza mantisele/fractiile, fata de resursele hardware pentru prelucrarea in
virgula fixa au mai aparut doua circuite de deplasare logica si un bistabil de extensie a
acumulatorului la stanga es.
Cele doua unitati aritmetice logice sunt prevazute cu circuite logice pentru generarea
indicatorilor de conditii si de eroare.
Operanzii de prelucrat se afla initial in registrele AC si RD. Din acestea se extrag exponentii
(operatia de despachetare), care sunt incarcati in RE1 si RE2. Fractiile sunt deplasate spre stanga
in AC si RD, pentru a beneficia de o precizie maxima.
Dupa terminarea operatiilor asupra exponentilor si fractiilor, are loc o insertie (operatia de
impachetare) a exponentului rezultatului in registrul AC, prin deplasarea fractiei din AC spre
dreapta.
3.2 Organigrama adunarii/scaderii in virgula mobila.
⊥ ZE← ⊥ XE-⊥ YE

> <
⊥ ZE: 0 ZE← ⊥ XE-⊥ YE

=
Da Dif exp> dim F Dif exp> dim F
Da

Nu Nu
Z← X Z← Y

Deplaseaza YE Deplaseaza XE

Iesire Iesire

ZE← XE ZE← YE

Aduna
fractiile

Da Da
Exponent Depasire
maxim? superioara?

Nu

Pozitioneaza Suma zero?


eof Da
Iesire
Pozitioneaza semn, deplaseaza
fractia, incrementeaza Nu
exponent
Da Normalizat?

Pozitioneaza Deplaseaza fractia,


zero curat decrementeaza exponent
Nu
Exponent
minim? Nu
Da Pozitioneaza
euf
Iesire Iesire
3.3. Organigrama inmultirii in virgula mobila.

Da
Operand
zero?
Pozitioneaza
zero curat

Aduna exponentii

Exp eof? Da Pozitioneaza eof

Nu iesire cu
Da eroare
Exp euf? Pozitioneaza euf

Da

Restaureaza expo-
nentul deplasat

Valoarea absoluta
a fractieilor

Inmulteste fractiile

Pozitioneaza
semnul produsului

Da
Prod <0? Complementeaza
produs
Nu
Nu Da
Normali- Exp euf?
zat?

Nu

Decrementeaza Deplaseaza fractie


exponent.

Iesire
Intarzierile in circuitele numerice.

• Tehnologia CMOS - tehnologia de baza.

• CMOS: Semiconductor Metal Oxid Complementar.


- Tranzistor NMOS (Semiconductor Metal Oxid de tip N)
- Tranzistor PMOS (Semiconductor Metal Oxid de tip P)

• Tranzistorul NMOS
- Tranzistorul conduce daca la poarta lui se aplica
un potential electric ridicat (Vdd)

- Tranzistorul este blocat daca la poarta lui se aplica


un potential electric coborat (GND)

• Tranzistorul PMOS
- Tranzistorul este blocat daca la poarta lui se aplica
un potential electric ridicat (Vdd)

- Tranzistorul conduce daca la poarta lui se aplica


un potential electric coborat (GND)

• Componentele de baza: Inversorul CMOS


• Componentele de baza: Portile logice

• Porti logice: comparatie.

a) Daca tranzistoarele PMOS sunt rapide:


- Se recomanda conectarea lor in serie
- Se prefera poarta NOR
- Se prefera, de asemenea, NOR daca tranzitia H→L este mai critica
decat tranzitia L→H.

b) Daca tranzistoarele NMOS sunt rapide:


- Se recomanda conectarea lor in serie
- Se prefera poarta NAND
- Se prefera, de asemenea, NAND daca tranzitia L→H este mai critica
decat tranzitia H→L.
• Comportarile ideala si reala.

a) Cand intrarea 0 → 1, iesirea 1 → 0, dar NU instantaneu.


- Iesirea efectueaza tranzitia 1 → 0 : tensiunea de iesire tranziteaza de
la Vdd (5V) la 0V.
b) Cand intrarea 1 → 0, iesirea 0 → 1 dar NU instantaneu.
- Iesirea efectueaza tranzitia 0 → 1 : tensiunea de iesire tranziteaza de
la 0V la Vdd (5V).
c) Tensiunea nu se modifica instantaneu.
• Analogia temporala cu fluidul.

- Apa ↔ Sarcina Electrica; Capacitatea Rezervorului ↔ Capacitatea (C).


- Nivelul Apei ↔Tensiunea; Debitul Apei ↔ Curentul (Sarcina/Timp).
- Dimensiunea Conductelor; Conductanta Tranzistoarelor (G).
- Timpul de umplere a rezervorului este proportional cu C/G.

• Conectarea in serie a portilor.

- Intarzierea Totala de propagare =


Suma Intarzierilor Individuale = d1 + d2
- Capacitatea C1 are doua componente:
Capacitatea firelor care leaga cele doua porti
Capacitatea de intrare a celui de-al doilea inversor.
• Calculul intarzierilor.

- Suma intarzierior pe caile seriale


- Intarzierea (Vin → V2) ≠ Intarzierea (Vin → V3)
Intarzierea (Vin → V2) = Intarzierea (Vin → V1) + Intarzierea (V1 → V2)
Intarzierea (Vin → V3) = Intarzierea (Vin → V1) + Intarzierea (V1 → V3)
- Drumul Critic = Calea cea mai lunga dintre cele N cai paralele
- C1 = Capacitatea C a firelor + Cin a portii G2 + Cin a portii G3

• Modelul general al intarzierii in circuitele combinationale.

- O Celula Logica Combinationala (simbol) este complet specificata prin:


Comportarea functionala (intrare →iesire):
Tabele de adevar, ecuatii logice, VHDL, Verilog etc.
Factorul de incarcare pentru fiecare intrare.
Intarziere critica in propagarea de la fiecare intrare la fiecare iesire, pentru
fiecare tranzitie:
THL (A,O) = Intarzierea interna fixa + Intarzierea dependenta de sarcina × sarcina
- Modelul liniar
• Caracterizarea unei porti.

- Capacitatea de intrare pentru fiecare intrare.


- Pentru fiecare cale intrare-iesire se considera,
pentru fiecare tip de tranzitie: H → L, L → H, H → Z, L → Z …etc:
o Intarzierea interna (ns)
o Intarzierea dependenta de sarcina (ns/fF)
- Exemplu: Poarta NAND cu 2 Intrari

• Exemplu: Multiplexor 2:1.

- Sarcina capacitiva de Intrare (1 S.I.):


A,B: S.I. (NAND) = 61 fF
S: S.I. (INV) + S.I. (NAND) = 50 fF + 61 fF = 111 fF

- Intarzierea Dependenta de Sarcina (I.D.S.): identica cu cea a portii G3:


TAYlhf = 0,0021 ns/fF TAYhlf = 0,0020 ns/fF
TBYlhf = 0,0021 ns/fF TBYhlf = 0,0020 ns/fF
TSYlhf = 0,0021 ns/fF TSYhlf = 0,0020 ns/fF

- Intarzierea Interna (I.I.):


A la Y: I.I.G1 + (C.Fir1 + S.I.G3)*I.D.S.G1 + I.I.G3
B la Y: I.I.G2 + (C.Fir2 + S.I.G3)*I.D.S.G2 + I.I.G3
S la Y (cazul cel mai defavorabil): I.I.Inv + (C.Fir0 +
S.I.G1)*I.D.S.Inv + I.I.A la Y

- Efectul “C.Fir1” se poate aproxima prin:


presupunerea ca Fir1 are o capacitate egala cu capacitatile C ale
portilor conectate la el

- Exemplu de calcul al I.I.:


TAYlh = TPhl G1 +(2.0*61 fF) * TPhlf G1 + TPlh G3
= 0.1ns + 122 fF*0,0020 ns/fF + 0,5 ns = 0,844 ns
• Abstractie: Multiplexor 2:1.

- Sarcina de Intrare: A = 61 fF, B = 61 fF, S = 111 fF

- Intarzierea dependenta de sarcina:


TAYlhf = 0,0021 ns/fF TAYhlf = 0,0020 ns/fF
TBYlhf = 0,0021 ns/fF TBYhlf = 0,0020 ns/fF
TSYlhf = 0,0021 ns/fF TSYhlf = 0,0020 ns/fF

- Intarzierea Interna:
TAYlh = TPhl G1 +(2.0*61 fF) * TPhlf G1 + TPlh G3
= 0.1ns + 122 fF*0,0020 ns/fF + 0,5 ns = 0,844 ns

- Exercitii: Sa se calculeze: TAYhl, TBYlh, TSYlh, TAYhl.

• Elemente logice utilizate in cadrul cursului.

- NAND2, NAND3, NAND4


- NOR2, NOR3, NOR4
- INV1 (inversor normal)
- INV4 (inversor cu capacitate mare de comanda)
- XOR2
- XNOR2
- MUX (Multiplexoare rapide)
- Sursa de alimentare (Sursa pentru unitati)
- GND (Sursa de zerouri)

- Bistabile de tip D comandate pe front negativ de ceas

• Modelul de Sincronizare (Timing) pentru elementele cu memorie.

- Setup Time (Timp de Stabilire): Intrarea trebuie sa fie stabila inaintea


frontului negativ al semnalului de ceas ceas.
- Hold Time (Timp de Mentinere): Intrarea trebuie sa ramana stabila dupa
frontul negativ al semnalului de ceas.
- Clock-to-Q Time (Timpul Ceas-la-Q):
Iesirea nu se poate modifica instantaneu la frontul semnalului de ceas
Ca si la portile logice exista doua componente ale intarzierii:
o Intarzierea Interna Clk-to-Q
o Intarzierea dependenta de sarcina Clk-to-Q.
Pentru exemplificare se considera Setup = 1ns, Hold = 0,5ns.

• Metodologia de Sincronizare (Clocking).

- Toate elementele de memorare sunt sincronizate cu acelasi semnal de ceas.


- In ceea ce priveste blocurile logice combinationale:
Toate intrarile sunt actualizate la fiecare semnal de ceas
Toate iesirile trebuie sa fie stabile inaintea sosirii urmatorului semnal
de ceas.
• Drumul Critic si Perioada/Ciclul Ceasului.

- Drumul Critic: Calea cea mai lenta intre doua elemente de memorare.
- Perioada/Ciclul Ceasului este o functie de drumul critic si trebuie sa fie
mai mare decat:

Clk-to-Q + Intarzierea corespunzatoare Drumului Critic prin


Circuitul Combinational + Setup
• Efectul Alunecarii (Skew) Ceasului asupra Ciclului.

- Scenariul cel mai defavorabil pentru Ciclu:


Registrul de intrare foloseste CLK1
Registrul de iesire foloseste CLK2
- Ciclul – Alunecarea Ceasului ≥ Clk-to-Q + Intarzierea cea mai mare +
+ Setup
⇒ Ciclul ≥ Clk-to-Q + Intarzierea cea mai mare + Setup +
+ Alunecarea Ceasului

• Metode pentru reducerea Ciclului.

- Reducerea numarului de niveluri logice:

- Folosirea metodelor dinamice de sincronizare.


- Examinarea Incarcarii:
O poarta nu trebuie sa comande mai multe porti.
Trebuie evitata comanda unui fir lung de catre o poarta de mici
dimensiuni
- Folosirea mai multor etaje pentru comanda sarcinilor capacitive mari.
• Evitarea violarii timpului Hold.

- Cerinta pentru Timpul Hold:

Intrarea registrului nu trebuie sa se schimbeimediat dupa modificarea


ceasului.
- Aceasta se poate realiza usor in schemele de sincronizare pe fronturi de
ceas.
- Timpul Hold, pentru cele mai multe bistabile, este ≤ 0 ns.
- CLK-to-Q + Intarzierea pe Calea cea mai scurta > Timpul Hold.

• Efectul Alunecarii Ceasului asupra Timpului Hold.

- Scenariul cel mai defavorabil pentru Timpul Hold:


Registrul de Intrare (FF1) este sincronizat cu CLK2
Registrul de Iesire(FF2) este sincronizat cu CLK1
Iesirea lui FF2 rapid nu trebuie sa modifice intrarea lui FF1, pe
aceeasi tranzitie a ceasului.
- (CLK-to-Q + Intarzierea pe calea cea mai scurta – Alunecarea
Ceasului) > Timpul Hold
OPERATIILE ARITMETICE

1. Procesorul Aritmetic.
Un procesor aritmetic reprezinta un dispozitiv capabil sa efectueze operatii simple sau complexe
asupra unor operanzi furnizati in formate corespunzatoare. Ca exemple se pot da:
- Unitatea Aritmetica simpla;
- Incrementatorul;
- Dispozitivul pentru Transformata Fourier Rapida etc.
Procesorul Aritmetic poate fi examinat atat din punctul de vedere al utilizatorului, cat si al
proiectantului.
1. Din punctul de vedere al utilizatorului, procesorul aritmetic reprezinta o cutie neagra, cu un
numar de intrari si iesiri, capabila sa efectueze o serie de operatii asupra unor operanzi cu
formate specificate. Rezultatele se obtin intr-un timp care depinde de tipul operatiei si de
formatul operanzilor si sunt insotite de indicatorii de conditii.

Operanzi: X, Y Rezultat: Z
Operatia: * Procesor Aritmetic Conditii: Ci
Formate: φ Timp: T(*,φ) Singularitai: Si

Intrari:
- una sau mai multe marimi numerice: X, Y;
- un simbol al operatiei, operatorul: *;
- un simbol de format: φ.
Operanzii de la intrare sunt caracterizati prin trei proprieteti:
- apartin unei multimi finite M de marimi numerice, caracterizate printr-o gama:
Xmin ≤ X ≤ Xmax
- sunt cunoscute cu o precizie data:
X - ∆ Xl ≤ X ≤X + ∆ Xh
- sunt reprezentate cu ajutorul unor simboluri/cifre, in cadrul unui sistem de numeratie, sub
forma unor n-tupluri:
xn-1 xn-2…………………. x1 x0,
care sunt interpretate ca marimi/valori numerice, pe baza unor reguli date.
Operatorii sunt codificati cu ajutorul unor simboluri *, care corespund unui set redus sau extins
de operatii aritmetice:
∗ ∈ {+, -, ×, : }
Formatul. Atunci cand sunt posibile mai multe formate, pentru reprezentarea operanzilor, acest
lucru poate fi specificat la intrarea format, printr-un simbol dat φ.
Iesiri:
- una sau mai multe marimi numerice Z, care reprezinta rezultatul;
- unul sau mai multe simboluri Ci, reprezentand conditiile in care apare rezultatul;
- unul sau mai multe simboluri Si, reprezentand singularitati.
Iesirile numerice poseda aceleasi proprietati ca si operanzii de la intrare: gama, precizie si
reprezentare.
Conditiile specifica caracteristici ale rezultatului: < 0, = 0, > 0 etc.
Singularitatile sunt asociate cu situatiile in care rezultatul obtinut este invalid:
- depasire: rezultatul depaseste posibilitatile hardware de reprezentare a numerelor, in
sistemul numeric dat;
- pierderea excesiva de precizie, la operatiile in virgula mobila;
- erori datorate hardware-lui.
In aceste situatii apare un pseudo-rezultat Z(Si), impreuna cu singularitatea Si, care sunt tratate
atat prin hardware, cat si cu ajutorul unor rutine specifice ale sistemului de operare.
Timpul de operare T(*) este dat pentru fiecare operatie (*), efectuata de catre procesor. Timpul
de operare, in unele cazuri, poate fi variabil:
T(*)min ≤ T(*) ≤ T(*)max
Observatii:
- definitia data procesorului aritmetic cuprinde un spectru larg de “cutii negre”, de la un
contor simplu (ADD-ONE), pana la un generator de functii trigonometrice sau un procesor
FFT.
- structura interna este specificata in termenii timpului asociat cu executia diferitelor operatii,
cat si cu formatul de reprezentare a datelor.
2. Din punctul de vedere al proiectantului intereseaza specificarea detaliata a structurii interne.
Aceasta specificare trebuie sa considere:
- algoritmii aritmetici (proiectarea aritmetica),
- structura logica a procesorului (proiectarea logica).
Proiectarea aritmetica pleaca de la specificatiile date de catre utilizator si le transforma in
specificatii de operatii aritmetice detaliate la nivel de ranguri individuale/bit, in cadrul
reprezentarii concrete a datelor. Aceste specificatii, la nivel de rang individual, reprezinta, in
continuare, datele initiale (tabele de adevar, diagrame etc) pentru proiectarea logica.
Proiectarea logica pleaca de la specificatiile furnizate de catre proiectarea aritmetica si, in
cadrul unei tehnologii date, selecteaza tipurile de circuite logice, pe care le interconecteaza, in
mod corespunzator, in vederea implementarii operatiilor aritmetice impuse de catre algoritmii
aritmetici. In cazul in care algoritmii aritmetici nu se pot executa intr-un singur pas, se
proiecteaza secvente, constand in pasi aritmetici elementari, efectuati sub controlul unor
semnale de comanda. Astfel, proiectantul logic trebuie sa elaboreze atat proiectul unitatii de
executie, cat si proiectul unitatii de comanda.
Specificatiile de tip “black box”, pentru proiectarea unui procesor aritmetic, se obtin prin
transformarea specificatiilor date de catre utilizator, astfel incat, ele sa corespunda posibilitatilor
de implementare. In acest context trebuie sa se aibe in vedere ca:
- datele se reprezinta sub forma unor vectori binari;
- la baza circuitelor, care efectueaza operatiile aritmetice, se afla circuite logice, ce opereaza
cu semnale binare.
Avand in vedere cele de mai sus:
- intrarile X si Y vor deveni:
X ≡ xn-1 xn-2…………………. x1 x0,
Y ≡ yn-1 yn-2…………………. y1 y0,
- operatorul (*) va fi codificat printr-un cod de operatie:
Ω ≡ ωn-1 ωn-2………………..ω1 ω0,
care va indica atat operatia, cat si formatul.
- iesirile reprezinta vectori numerici:
Z ≡ zn-1 zn-2…………………. z1 z0, rezultatul;
C ≡ cp-1 cp-2…………………. c1 c0, indicatorii de conditii
S ≡ sq-1 sq-2…………………. s1 s0, indicatorii de pseudorezultat.
In continuare se vor examina operatiile aritmetice in virgula fixa si in virgula mobila.
2. Operatiile aritmetice in virgula fixa.
2.1. Adunarea si scaderea.
Operatiile de adunare si scadere ale numerelor in virgula fixa se implementeaza, in majoritatea
covarsitoare a cazurilor, cu numere reprezentate in complementul fata de doi. Astfel, operatiile
de adunare si scadere se reduc la operatia de adunare a codurilor complementare ale celor doi
operanzi. Adunarea se efectueaza rang cu rang, incepand cu rangurile mai putin semnificative,
inclusiv rangurile de semn. Transportul, care apare la stanga rangului de semn, se neglijeaza.
Fie operanzii:
x = +/- xn-2…………………. x1 x0,
y = +/- yn-1 yn-2…………… y1 y0,
in conditiile :
-2n-1 ≤x ≤ 2n-1 -1
-2n-1 ≤y ≤ 2n-1 -1
La adunarea/scaderea celor doi operanzi, de mai sus, apar urmatoarele situatii:
a) x > 0, y > 0, dar x + y ≤ 2n-1 –1
[x]c + [y]c = |x| + |y| = [x + y]c
Exemplu:
[+3]c + [+2]c = |0011| + |0010| = |0101| = [0101]c
b) x <0, y > 0, dar 0 < x + y ≤ 2n-1 –1
[x]c + [y]c = 2n - |x| + |y| = [x + y]c
transport,
se neglijeaza >0
Exemplu:
[-6]c + [+7]c = 24 - |0110| + |0111| =
10000 - |0110| + |0111| =
1010 + 0111 = 1 0001 = 0001
transport, se neglijeaza
c) x <0, y > 0, dar x + y < 0
[x]c + [y]c = 2n - |x| + |y| = [x + y]c

<0
Exemplu:
[-7]c + [+6]c = 24 - |0111| + |0110| =
10000 - |0111| + |0110| =
1001+ 0110 = [1111]c
d) x <0, y < 0, dar |x| +| y| ≤ 2n-1 –1
[x]c + [y]c = 2n - |x| + 2n - |y| = [x + y]c
transport,
se neglijeaza < 0

Exemplu:
[-3]c + [- 2]c = 24 - |0011| + 24 - |0010| =
10000 - |0011| + 10000 - |0010| =
1101+ 1110 = 1 1011 = [1011]c
transport, se neglijeaza

Schema unui sumator/scazator


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

A[4] B[4]
D

1 Operatia Descrierea Comanda


4 4

D≡Ω
7486
ADD Z = C4,ADD(A,B) 0

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

7483
C4 1 C0 1 Codul de operatie specifica operatorul: D ≡ Ω

4 Z[4] care ia valorile “0” pentru “+” si “1” pentru ”-“


Pozitionarea indicatorilor de conditii.
Indicatorii de conditii specifica o serie de proprietati ale rezultatului, care apare in registrul
acumulator al rezultatului AC. De regula, ei sunt stocati in bistabile notate cu mnemonice, care
formeaza un registru, incorporat in cuvantul de stare al programului/procesului. Indicatorii de
conditii specifica diverse situatii:
- rezultat = 0 - mnemonica Z, ( Z ← ∪ / AC );
- semnul rezultatului > 0 sau < 0 - mnemonica S, ( S ← ACn-1);
- aparitia transportului, la stanga rangului de semn, mnemonica C, (Cn ← 1);
- rezultatul verificarii paritatii - mnemonica P, ( P ← ⊕ / AC ).
Pozitionarea indicatorilor de pseudo-rezultat.
Printre situatiile care conduc la un pseudo-rezultat, in cazul operarii in virgula fixa, este si aceea
cand apare o depasire. Depasirea se manifesta in conditiile in care cei doi operanzi care se aduna
au acelasi semn. Daca rezultatul obtinut are un semn diferit de semnul comun, al celor doi
operanzi, s-a inregistrat o depasire. Depasirea poate constitui o cauza de intrerupere/suspendare
a programului in cadrul careia a aprut. Aceasta situatie este semnalizata sistemului de operare, in
vederea luarii unei decizii corespunzatoare.
Situatia de depasire se semnaleaza prin generarea unui semnal D egal cu suma modulo doi intre
transportul in rangul de semn si transportul in afara rangului de semn, in cadrul registrului
acumulator, al rezultataului:
D ← Cn ⊕ Cn-1
Implementari.
Operatia de adunare pe un singur rang se realizeaza prin generarea sumei si a transportului,
folosind circuitele logice necesare realizarii fizice a expresiilor logice de mai jos:
Couti = (xi . Cini) ∪ (yi . Cini) ∪ (xi . yi)

Sumi = (xi . yi . Cini) ∪ (xi . yi . Cini) ∪ (xi . yi . Cini) ∪ (xi . yi . Cini),


se concretizeaza intr-un circuit de tip “schema bloc”, denumit SUM, prezentat in continuare:
Ciin 1
CI
Xi 2 4 Rezi
A0 SUM Z0
Yi 3 5
B0 CO Ciout

Cu ajutorul sumatorului la nivel de bit se poate realiza un sumator pe n biti:

Cin 1
CI
X0 2 4 Rez0
A0 Z0
Y0 3 5
B0 CO

1
CI
X1 2 4 Rez1
A0 Z0
Y1 3 5
B0 CO

1
CI
Xn-1 2 4 Rez(n-1)
A0 Z0
Yn-1 3 5 Cout
B0 CO

Sumatorul la nivel de bit poate fi extins si cu operatiile logice SI/AND, SAU/OR, ca in figura de
mai jos, in cadrul careia iesiriele sumatorului, circuitului AND si circuitului OR sunt aplicate la
intrarile unui multiplexor MUX. Codul de operatie, pentru selectarea operatorului, se forteaza la
intrarea Sel, a multiplexorului.
Ciin Sel

Xi

Rez

Yi MUX

1
CI
2 SUM 4
A0 Z0
3 5
B0 CO

Ciout

In conditiile in care se doreste si implementarea operatiei de scadere, este necesar sa se creeze


posibilitatea inversarii intrarii yi, dupa cum se prezinta in continuare:
InvY Ciin Sel

Xi
1

2
Yi

Rez

MUX1
1
CI
MUX2 2 SUM 4 3
A0 Z0
3 5
1 2 B0 CO

Less 4

Ciout

Inversarea lui y se realizeaza sub controlul semnalului de selectie InvY, aplicat la intrarea de
selectie a celui de-al doilea multiplexor
Operatiile ADD, SUB, AND si OR se regasesc in Unitatile Aritmetice Logice ale oricarui
procesor. Exista unele procesoare care au implementata instructiunea “set-on-less-than”,
ce se traduce prin “forteaza in (1), bitul cel mai putin semnificativ al rezultatului, daca
operandul x este mai mic decat operandul y”, in conditiile in care toti ceilalti biti ai rezultatului
vor fi 0. Astfel, in figura de mai sus a aparut o noua intrare la multiplexor “less”.
Structura poate fi completata cu detalierea schemei UAL, pentru bitul cel mai semnificativ, in
care se pune in evidenta depasirea aritmetica.

InvY Ciin Sel

Xi
1

2
Yi

Rez

MUX1
1
CI
MUX2 2 SUM 4 3
A0 Z0
3 5
1 2 B0 CO

Less 4

Set

InvY
Detectie Depasire Depasire

Ciout

Implementarea operatiei “set-on-less-than” presupune efectuarea scaderii lui y din x.


Daca x < y, se va pozitiona in unu semnul rezultatului, la iesirea sumatorului, adica Sum(n-1) .
Acest lucru trebuie sa se reflecte insa in fortarea in unu a bitului cel mai semnificativ al
rezultatului Rez0 si in zero a bitilor Rez(n-1)….. Rez1. Aceasta solutie este ilustrata in urmatoarea
schema bloc.
InvY Cin0 Operatia

X0
Rez0
Y0

LESS
Cout0

1
X1
Rez1 2
Y1 5
3
0 LESS Zero
Cout1 4

X(n-1) Rez(n-1)

Y(n-1)
Depasire
0 LESS
Cout(n-1) Set

In figura de mai sus a fost implementa si pozitionarea in “1” , an indicatorului de conditii, care
specifica aparitia unui rezultat egal cu “0”, la iesirea unitatii arimetice logice. Bistabilul Z se
pozitioneaza in “1”.
Sumatoare performante.
Sumatorul cu transport succesiv.
Tipul cel mai simplu de sumator paralel este sumatorul cu transport succesiv, obtinut prin
interconectarea unor sumatoare complete. Ecuatiile pentru transport si suma, la nivelul unui
etaj, sunt date mai jos:
Couti = (xi . Cini) ∪ (yi . Cini) ∪ (xi . yi)

Sumi = (xi . yi . Cini) ∪ (xi . yi . Cini) ∪ (xi . yi . Cini) ∪ (xi . yi . Cini),

Se poate observa ca cele doua functii combinationale se implementeaza pe doua niveluri logice.
In conditiile in care intarzierea pe un nivel logic este ∆t, rezulta ca intarzierea minima pe rang va
fi 2.∆t. Intrucat, in cazul cel mai defavorabil, transportul se propaga de la rangul cel mai putin
semnificativ pana la iesirea celui mai semnificativ rang, rezulta o intarziere egala cu 2.n.∆t, unde
n este numarul de ranguri. Este evident ca o asemenea solutie nu este acceptabila.
Sumatorul cu intarziere minima.
Considerand ecuatia sumei , Sum0 , de la iesirea celui mai putin semnificativ rang, se incearca
stabilirea unei expresii a acesteia ca functie de intrarile pentru rangul curent (n-1), cat si de
intrarile pentru rangurile mai putin semnificative (n-2),…,1,0. In acest mod se va obtine o
expresie logica implementabila in doua trepte.

Sum0 = [x0. y0 . Cin0] ∪ [x0 . y0 . Cin0] ∪


[x0 . y0 . Cin0] ∪ [x0 . y0 . Cin0]
Pentru iesirea, care reprezinta transportul, din rangul 0 s-a inlocuit Cout0 cu Cin1, pentru a
simplifica relatiile, care urmeaza a se obtine.
Cin1= [x0 . Cin0] ∪ [y0 . Cin0] ∪ [x0 . y0]
Pentru rangul urmator 1, se obtine urmatoarea expresie a sumei:
Sum1 = [x1. y1 . Cin1] ∪ [x1 . y1 . Cin1] ∪
[x1 . y1 . Cin1] ∪ [x1 . y1 . Cin1]
In expresia lui Sum1 se va inlocui Cin1 cu componentele care-l alcatuiesc, conform formulei
precedente. Calculul lui Cin1 conduce la urmatoarea expresie:
Cin1= [x0 . Cin0] ∪ [y0 . Cin0] ∪ [x0 . y0],
Astfel, pentru Sum1 se va obtine o expresie formata prin adunarea logica a 12 produse logice de
cate 4 variabile fiecare.Aceasta presupune utilizarea unei porti OR cu 12 intrari si a 12 porti
AND, cu cate 4 intrari. Extinzand procedeul la urmatoarele ranguri se vor obtine expresii cu
numerosi termeni de tip produs, care, la randul lor, vor avea multe componente. Un calcul
simplu arata ca, in cazul unui sumator pe 64 de biti, vor fi necesare circa 1012 porti, practic de
nerealizat in prezent.
Principiul anticiparii transportului.
Intrucat sumatorul cu transport succesiv este lent, iar sumatorul cu intarziere minima este
imposibil de realizat, se cauta o solutie intermediara. Aceasta grupeaza relatiile obtinute la
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
vedere al generarii/propagarii unui transport. Astfel, rangul j al unui sumator genereaza, Gj ,
transport daca are loc relatia:
Gj = xj . yj
De asemenea, rangul j al unui sumator propaga, Pj , transport in situatia de mai jos:
Pj = xj ⊕ yj = (xj . yj) ∪ (xj . yj).
In aceste conditii se pot elabora noi expresii pentru transportul C(j+1) si pentru suma Sumj , la
nivelul fiecarui rang al sumatorului:.
C(j+1) = Gj ∪ (Pj . Cj)
Sumj = (Pj . Cj) ∪ (Pj . Cj)
Astfel, un sumator complet va consta in doua parti: partea P/G si partea Sum

Partea P/G Partea Sum

/Xj

/Yj

Sumj

Xj 1 2

Yj

1 2

Gj Pj Cj

Relatiile de mai sus se pot structura la nivelul a 4 sectiuni ale unui sumator, bazat pe ideea
mentionata anterior. Incepand cu rangul cel mai putin semnificativ se obtin:
- pentru sume:
Sum0 = (P0 . C0) ∪ (P0 . C0)
Sum1 = (P1 . C1) ∪ (P1 . C1)
Sum2 = (P2 . C2) ∪ (P2 . C2)
Sum3 = (P3 . C3) ∪ (P3 . C3),
si:
- pentru transporturi:
C1 = G0 ∪ (P0 . C0)
C2 = G1 ∪ (P1 . C1) = G1 ∪ (P1 . G0 ) ∪ (P1 . P0 . C0)
C3 = G2 ∪ (P2 . C2) = G2 ∪ (P2 . G1) ∪ (P2 . P1 . G0 ) ∪ (P2 . P1 . P0 . C0)
C4 = G3 ∪ (P3 . C3) = G3 ∪ (P3 . G2) ∪ (P3 . P2 . G1) ∪
∪ (P3 . P2 . P1 . G0 ) ∪ (P3 . P2 . P1 . P0 . C0)

Aceste relatii sunt implementate in unitatea de anticipare a transportului UAT.


Pentru o sectiune de 4 biti, sumatorul cu transport anticipat arata astfel:

Sum3 x3 y3 Sum2 x2 y2 Sum1 x1 y1 Sum0 x0 y0

Sum3 P/G 3 Sum2 P/G 2 Sum1 P/G 1 Sum0 P/G 0

GP C3 P3 G3 C2 P2 G2 C1 P1 G1 C0 P0 G0

Logica de Anticipare a Transportului C0


GG
Efectuand un calcul al intarzierii, se obtine, pe 4 biti de sumator, o intarziere de 6.∆t, in
comparatie cu intarzierea de 8.∆t, pentru sumatorul cu transport succesiv. Din schema bloc, de
mai sus, rezulta ca Logica de Anticipare a Transportului mai genereaza doua semnale la nivel
de grup. Grupul consta intr-un ansamblu de patru ranguri de sumator. Astfel, grupul poate
genera transport (GG =1) sau poate propaga transport (GP = 1).
Ideea anticiparii transportului se poate fi extinsa atat la nivel de grup, cat si la nivel de sectiune
(ansamblu de patru grupuri), realizand o structura piramidala de UAT-uri.
Unitatile de anticipare la nivel de grup si la nivel de sectiune sunt identice cu logica de
anticipare a transportului la nivelul sumatorului cu patru biti.
Analiza performantelor arata ca in cazul unui sumator pe 16 biti, cu transport de grup, se
inregistreaza o intarziere de 8.∆t, fata de intarzierea de 32.∆t, pentru sumatorul cu transport
succesiv. In cazul unui sumator pe 64 de biti, in situatia anticiparii transportului pe sectiuni, se
obtine o intarziere maxima de 14.∆t, comparativ cu intarzierea de 128.∆t, pentru sumatorul cu
transport succesiv.
Se poate aprecia ca numarul de terminale de intrare si iesire ale portilor poate reprezenta un
criteriu de cost, intr-o implementare data. Comparatia cost/performanta pentru cele doua
implementari, de mai sus, arata ca in cazul unui sumator pe 64 de biti, la o crestere a numarului
de terminale cu 50%, pentru solutia cu transport anticipat, se obtine o viteza de 9 ori mai mare,
decat in cazul transportului succesiv.
Sumatorul cu salvare a transportului.
In cazul adunarii mai multor vectori binari simultan se poate recurge la o schema mai rapida,
constand in utilizarea mai multor sumatoare in cascada.
Fie cazul adunarii a patru numere de cate 4 biti, notate cu a, b, e, f. Rangurile numerelor b, e, f
se vor aduna intr-un sumator cu salvare a transportului, care va avea iesiri pentru suma si
transport. Acestea, la randul lor, se vor aduna cu rangurile numarului a, intr-un alt sumator cu
salvare a transportului. Iesirile reprezentand rangurile sumei si rangurile transportului se vor
aduna intr-un sumator obisnuit.

a b e f

Sumator cu salvare a
transportului

Sumator cu salvare a
transportului

C’ S’

Sumator obisnuit

Sum
Detaliile de implementare sunt lasate pe seama cititorului.
Comparatie intre cateva tipuri de sumatoare, pe n biti, in privinta intarzierii si a ariei ocupate:
Tip sumator Intarziere Aria ocupata
Transport succesiv 2.n.∆t 9.n
Intarziere minima 2.∆t 2 (2n+1) /(2n+1)
Transport anticipat 2.(log2n + 1).∆t 7.n + 22.log2n
Secvente de microinstructiuni pentru controlul operatiilor in Unitatea de Executie AMD2901
23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Observatii

M I8 I7 I6 M I2 I1 I0 Cn I5 I4 I3 A3 A2 A1 A0 B3 B2 B1 B0 D3 D2 D1 D0 Descrierea microinstructiunilor
individuale la nivel de mnemonice
U Selectie U Selectie Operatie Adresa “A” Adresa “B” Data “D”
X destinatie X sursa UAL
1 2

0 1 1 1 1 1 0 1 1 0 0 0 0 0 0 1 0 LOAD R0, 02H


0 0 1 0 1 1 0 1 1 0 0 0 0 READ R0
0 1 1 1 1 1 0 1 1 0 0 0 1 0 1 0 0 LOAD R1, 04H
0 1 1 1 1 0 1 1 0 1 1 0 0 0 1 ROTUP R1
0 1 0 1 1 0 1 1 0 1 1 0 0 0 1 ROTDWN R1
0 0 0 0 1 0 1 0 0 CLR Q
1 1 1 0 0 0 1 1 0 1 1 0 0 0 1 DBLROTUP R1,Q
1 1 0 0 0 0 1 1 0 1 1 0 0 0 1 DBLROTDWN R1,Q
0 0 1 0 1 1 0 1 1 NOP
0 1 1 0 1 1 1 0 0 0 0 0 1 CLR R1
0 1 1 0 1 1 1 0 0 0 0 0 0 1 INCR R1
0 1 1 0 1 1 0 0 0 1 0 0 0 1 DCR R1
0 1 1 1 1 1 0 1 1 0 0 1 1 0 1 0 1 LOAD R3, 05H
0 1 1 0 0 1 0 0 0 0 0 0 1 1 0 0 0 1 ADD R1, R3
Secvente de microinstructiuni pentru controlul operatiilor in Microsecventiatorul AMD2909

31 30 29 28 27 26 25 24 Observatii
Adresa de
memorie, in R3 R2 R1 R0 P3 P2 P1 P0
memoria de Descrierea microinstructiunilor
control Adresa de Obtinerea µI individuale la nivel de mnemonice
salt urmatoare

0 1 0 0 1 0 0 0 1 JR 09H
. . . . . . . . . ……….
3 0 0 0 0 0 0 0 1 JR 00H
. . . . . . . . . ……….
6 1 0 1 0 0 0 0 1 JR 0AH
. . . . . . . . . ……….
9 0 1 1 0 0 0 0 1 JR 06H
A 0 0 1 0 CONT
B 0 0 1 0 CONT
C 0 0 1 0 CONT
D 0 0 1 0 CONT
E 0 0 1 0 CONT
F 0 0 1 1 0 0 0 1 JR 03H
Secventa: 0, 9, 6, A, B, C, D, E, F, 3, 0, 9, 6,….etc.
Secvente de microinstructiuni pentru controlul operatiilor in Microsecventiatorul AMD2909

31 30 29 28 27 26 25 24 Observatii
Adresa de
memorie, in R3 R2 R1 R0 P3 P2 P1 P0
memoria de Descrierea microinstructiunilor
control Adresa de Obtinerea µI individuale la nivel de mnemonice
salt urmatoare

0 0 0 1 0 CONT
1 0 0 1 0 CONT
2 1 0 0 1 PUCONT
3 0 0 1 0 CONT
4 0 0 1 0 CONT
5 0 0 1 0 CONT
6 0 0 1 0 CONT
7 0 0 1 0 CONT
8 0 0 1 0 CONT
9 0 0 1 0 CONT
C 0 0 1 0 CONT
D 0 0 1 0 CONT
E 0 1 1 0 JSTV
Ciclare in microprogram. Secventa: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, 3, 4, 5,….etc.
Secvente de microinstructiuni pentru controlul operatiilor in Microsecventiatorul AMD2909

31 30 29 28 27 26 25 24 Observatii
Adresa de
memorie, in R3 R2 R1 R0 P3 P2 P1 P0
memoria de Descrierea microinstructiunilor
control Adresa de Obtinerea µI individuale la nivel de mnemonice
salt urmatoare

0 0 0 1 0 CONT
1 0 0 1 0 CONT
2 0 0 1 0 CONT
3 1 1 0 0 0 1 0 1 JSR 0CH
4 0 0 1 0 CONT
5 0 0 1 0 CONT
6 0 0 0 0 0 0 0 1 JR 00H
7 . . . . . . . . ……….
8 . . . . . . . . ……….
9 . . . . . . . . ……….
C 0 0 1 0 CONT
D 0 0 1 0 CONT
E 0 1 1 0 RS
Salt la subrutina Secventa: 0, 1, 2, 3, C, D, E, 4, 5, 6, 0, 1, 2, 3, C, D,….etc.
Microsubrutine imbricate

µP Principal µSUB 0 µSUB 3


D CONT 0 JSR 0CH 3 JSR 0CH
E JSR 00H 1 JSR 06H 4 JSR 09H
F JR 0DH 2 RS 5 RS

µSUB 6 µSUB 9 µSUB C


6 JSR 0CH 9 JSR 0CH C RS
7 JSR 03H A RS
8 RS

Spatiul de adresare in memoria de comanda este urmatorul:


D, E, 0, 1, 6, D, 7, 3, D, 4, 9, A, 5, 8, 2, F, D etc

Microprogramul corespunzator este dat mai jos


Secvente de microinstructiuni pentru controlul operatiilor in Microsecventiatorul AMD2909
31 30 29 28 27 26 25 24 Observatii
Adresa de
memorie, in R3 R2 R1 R0 P3 P2 P1 P0
memoria de Descrierea microinstructiunilor
control Adresa de Obtinerea µI individuale la nivel de mnemonice
salt urmatoare

0 1 1 0 0 0 1 0 1 JSR 0CH
1 0 1 1 0 0 1 0 1 JSR 06H
2 0 1 1 0 RS
3 1 1 0 0 0 1 0 1 JSR 0CH
4 1 0 0 1 0 1 0 1 JSR 09H
5 0 1 1 0 RS
6 1 1 0 0 0 1 0 1 JSR 0CH
7 0 0 1 1 0 1 0 1 JSR 03H
8 0 1 1 0 RS
9 0 0 1 0 CONT
A 0 1 1 0 RS
C 0 1 1 0 RS
D 0 0 1 0 CONT
E 0 0 0 0 0 1 0 1 JSR 00H
F 1 1 0 1 0 1 0 1 JSR 0DH
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 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 Observatii
µI R3:0 P3:0 M I8:6 M I2:0 Cn I5:3 “A” “B” “D”
1 0 Descrierea microinstructiunilor
0 2 3 3 1 0 0 CONT INC R0
1 15 15 1 JRC 15 NOP
2 0 1 1 JR 0 NOP
15 2 1 CONT NOP
(INCREMENT & TEST)

0 2 3 7 3 0 0 CONT LOAD R0, 0


1 14 1 3 7 3 15 15 JR 14 LOAD R15,15
14 2 3 3 3 0 CONT READ R0
15 14 1 3 3 3 15 JR 14 READ R15
(INCARCARE & CITIRE/AFISARE)
Calculul numarului de unitati continute in cuvintele V0, V1, V2 stocate in trei registre R0, R1, R2, din RAM:
0 LOAD R0, V0
1 LOAD R1, V1
2 LOAD R2, V2
3 LOAD R4, V4 /V4 contine o valoare corespunzatoare numarului de biti explorati la nivel de cuvant
4 CLEAR R3
5 R0 ∩ D; D=0001
6 R0 ← R0/2; JSRNZF 14
7 R1 ∩ D; D=0001
8 R1 ← R1/2; JSRNZF 14
9 R2 ∩ D; D=0001
10 R2 ← R2/2; JSRNZF 14
11 DCR R4
12 JRZF 5
13 NOP; JR 15
14 RS; INC R3
15 READ R3; JR 15
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 Observatii
µI R3:0 P3:0 M I8:6 M I2:0 Cn I5:3 “A” “B” “D”
1 0 Descrierea microinstructiunilor
0 2 3 7 3 0 V0 CONT LOAD R0, V0
1 2 3 7 3 1 V1 CONT LOAD R1, V1
2 2 3 7 3 2 V2 CONT LOAD R2, V2
3 2 3 7 3 4 4 CONT LOAD R4, 4
4 2 3 3 4 3 CONT LOAD R4, 0
5 2 1 5 4 0 0 1 CONT R0 ∩ MSK (0001)
6 14 4 5 3 3 0 JSNZF 14 ← R0/2
R0←
7 2 1 5 4 1 1 1 CONT R0 ∩ MSK (0001)
8 14 4 5 3 3 1 JSNZF 14 ← R1/2
R1←
9 2 1 5 4 2 2 1 CONT R2 ∩ MSK (0001)
10 14 4 5 3 3 2 JSNZF 14 ← R2/2
R2←
11 2 3 3 0 1 4 CONT DCR R4
12 5 0 1 JRNZF 5 NOP
13 15 1 1 JR 15 NOP
14 6 3 3 1 0 RS INC R3
15 15 1 1 3 3 JR 15 READ R15
Implementarea unui contor pe 16 biti.
Contorul este realizat prin concatenarea registrelor de cate 4 biti: R3, R2, R1, R0. Se presupune ca microprogramul incepe de la
adresa 7:
7 ← R0 + 1
R0← 12 JRNZF 7
8 JRNZF 7 ← R3 + 1
13 R3←
9 ← R1 + 1
R1← 14 JRNZF 7
10 JRNZF 7 15 JR 7
← R2 + 1
11 R2←

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 Observatii


µI R3:0 P3:0 M I8:6 M I2:0 Cn I5:3 “A” “B” “D”
1 0 Descrierea microinstructiunilor
7 2 3 3 1 0 CONT ← R0 + 1
R0←
8 7 0 1 JRNZF 7 NOP
9 2 3 3 1 1 CONT ← R1+ 1
R1←
10 7 0 1 JRNZF 7 NOP
11 2 3 3 1 2 CONT ← R2 + 1
R2←
12 7 0 1 JRNZF 7 NOP
13 2 3 3 1 3 CONT ← R3 + 1
R3←
14 7 0 1 JR 7 NOP
Evaluarea perioadei ceasului.

6 7
M µ Secv.
Conditii U AMD2910
X

8
MUX
MUX
Memorie
de
control 1 2 6, 4
LSB /G, /P MSB R
R Cn+4 C
µI A,B,I,Cn OVR o
Conditii
2901 B 2901 B F3 n
CK Y Cn YCK F=0 d
5

/G
Cn AMD 2902 Cn+z /P

Ceas (CK) CK Registru dr Date


Evaluarea intarzierilor in propagarea semnalelor:
Unitatea de executie
µI
1. Rµ Cesa → Iesire 15 ns
2. 2901 B A,B → /G0, /P0 50 ns
3. 2902 /G0, /P0 → Cn+z 10 ns
4. 2901 B Cn → Cn+4, OVR,Y 29 ns
5. RCond,MUX Intr→ Ies 21 ns
6. 2901B RAM3 setup 16 ns

Total: 141 ns

Unitatea de Comanda.

µI
1. Rµ Cesa → Iesire 15 ns
6. MUX Selectie → Iesire 20 ns
7. 2910 Conditii → Iesire 45 ns
8. PROM Timpul de Acces 55 ns
µI
1. Rµ Setup 5 ns

Total: 140 ns
140 ns

Ceas (CK)
Unitati de executie integrate
Unitatile de executie se prezinta sub forma unor circuite integrate pe scara medie/larga. De
regula ele sunt structurate transe de biti astfel incat, prin concatenare si prin utilizarea unor
circuite aditionale, se pot construi sisteme de prelucrare pentru date organizate pe 4, 8, 16, 24,
32, 48 sau 64 de biti.
Din punct de vedere structural unitatile de executie sunt constituite dintr-o unitate aritmetica-
logica, logica de generare a indicatorilor de conditii, un ansamblu de registre generale, unul
sau mai multe circuite de selectie, unn circuit de deplasare si din porturi de acces pentru
intrarea/iesirrea datelor.
Semnalele de comanda se aplica la intrarile special prevazute, fie codificate pe campuri, fie
complet decodificate.
Sistemul functioneaza sincron cu un ceas a carui frecventa de tact este conditionata de
intarzierile semnalelor in unitatea de executie ( propagarea transportului, timpul de basculare a
bistabilelor dintr-o stare in alta etc).
Unitatile de executie integrate s-au comercializat in asociatie cu unitatile de comanda
corespunzatoare si cu o serie de circuite aditionale, formand ceea ce se chiama microprocesoare
pe transe de biti, microprocesoare "bit-slice", microprocesoare "multi-chip" etc.
Printre celemai raspindite familii de microprocesoare"bit-slice"
s-au aflat si cele produse de compania Advanced Micro Devices, sub numele de AMD 2900.
In cele ce urmeaza va fi prezentata unitatea de executie AMD 2901 sub aspect structural-
functional. De asemenea, se vor prezenta modalitatile de realizare a unor unitati de executie
pentru prelucrarea datelor pe 16 biti, unitatile de comanda corespunzatoare, cat si elemente
privind microprogramarea acestora.
Unitatea de executie AMD 2901.
Unitatea de executie AMD 2901 este organizata pe transe de 4 biti/circuit si este prevazuta cu
elementele necesare cuplarii in cascada.
Semnalele de comanda se aplica sub forma unor vectori binari la terminalele circuitului, fiind, de
regula, preluate sub controlul unui circuit micro-secventiator integrat ( AMD 2909, 2911 ) de la
o memorie cu continut permanent. Aceasta solutie se foloseste in cazul unitatilor de comanda
microprogramate. Uneori, pentru a mari viteza de operare, in locul unitatii de comanda
microprogramate se utilizeaza automate conventionale cu porti, bistabile si registre.
Unitatea de executie AMD 2901 dispune de urmatoarele resurse:
- un ansamblu de 16 registre generale de cite 4 biti, organizate sub forma unei memorii
(RAM) biport, cu doua intrari de adrese, o intrare de date si doua iesiri de date;
- o unitate aritmetica-logica, cu transport anticipat, capabila sa efectueze 3 operatii aritmetice
binare si 5 operatii logice si sa genereze, atit indicatorii de conditii: depasire, zero, semn,
transport (Cn+4), cat si conditiile de propagare (P) si generare(G) ale transportului, la
nivelul intregului circuit;
- un selector de date (selector surse UAL) pentru cele doua intrari ale unitatii aritmetice-
logice, care pot reprezenta combinatii intre iesirile memoriei biport (A,B), o intrare externa
de date (D), constanta "zero" si iesirea unui registru su plimentar-extensie (Q);
- un selector de iesire din circuit, care furnizeaza prin intermediul unor tampoane TS fie
datele de la iesirea A, a memoriei biport, fie datele de la iesirea UAL;
- un registru auxiliar-extensie (Q), care poate fi incarcat fie cu datele de la iesirea UAL, fie cu
propriul sau continut deplasat stanga/dreapta prin intermediul unei retele logice de
deplasare-multiplexor QSHIFT;
- o retea de deplasare-multiplexor RAMSHIFT, plasata pe intrarea B a memoriei biport
RAM.
Indicatorii de conditii trebuie stocati intr-un registru dupa fiecare operatie efectuata de UAL.
Circuitul afost realizat in diverse variante tehnologice: AMD 2901, 2901A, 2901B, 2901C, cu
sporuri de viteza de 25%, 50% si - respectiv 75%, fata de 2901.
In figura se prezinta schema bloc a circuitului AMD 2901.
Continuturile celor 16 cuvinte din RAM pot fi citite la iesirile A si B, pe baza adreselor A si B,
fiind stocate in doua circuite tampon/latch. Stocarea are loc pe frontul crescator al semnalului de
ceas. Dupa tranzitia negativa a semnalului de ceas, in RAM, in locatia specificata de adresa B, se
poate inscrie o noua valoare.
Astfel, in cadrul unei perioade de ceas se efectueaza o operatie de citire si o operatie de scriere
in RAM. Datele fortate in RAM sunt preluate direct sau deplasate dreapta/stinga, prin
intermediul multiplexorului RAMSHIFT, de la iesirea F a UAL.
Unitatea aritmetica-logica poate efectua, sub controlul semnalelor I3:5, trei operatii aritmetice
binare si cinci operatii logice, asupra operanzilor aplicati la intrarile R si S.
4

RAM0 RAM3 Q0 Q3
0 RAMSHIFT 3 0 QSHIFT 3
Ceas
4 4
Adrersa “A” “B” DATAIN F QREG Q
Citire
4 4 RAM 16 × 4 CP I6:8
Citire/Scriere
Adresa “B” DATA OUT WE 4
“A” “B”
Data D 4
4 4 0

I0:2 D A B 0 Q
Selector sursa
R S
4 4

Cn G, P
Cn R S
UAL
I3:5 (Cn+4, OVR, F=0, F3)
4 4

OE A F
Selector Iesire
I6:8

Intrarile R si S ale UAL sunt preluate de la iesirile unui circuit selector (Selector sursa UAL),
care sub controlul semnalelor I0:2, din intrarile D (Date externe), A, B, 0 si Q, poate furniza
combinatiile AB;AD; AQ; A0; DQ; D0; Q0; BD; BQ; B0. In tabelul de mai jos se prezinta
selectia surselor de operanzi pentru UAL.
Tab.1.

Mnemonica Microcod Codul Sursa


octal
I2 I1 I0 R S

AQ 0 0 0 0 A Q
AB 0 0 1 1 A B
ZQ 0 1 0 2 0 Q
ZB 0 1 1 3 0 B
ZA 1 0 0 4 0 A
DA 1 0 1 5 D A
DQ 1 1 0 6 D Q
DZ 1 1 1 7 D Z

Intrarea directa D este folosita pentru a introduce date in circuit, in RAM si in registrul Q.
Registrul Q este utilizatin operatiilede inmultire si impartire, ca extensie sau ca
acumulator/registru in unele aplicatii.
Microcodul: I8:0 ( Structura vectorului de comanda ).

9biti

I8:6 I5:3 I2:0


Destinatie UAL Functie UAL Sursa UAL

8 7 6 5 4 3 2 1 0

Operatiile efectuate de UAL sint prezentate in tabelul de mai


jos:
Tab. 2.

Mnemonica Microcod Cod Functia Simbol


octal UAL
I5 I4 I3

ADD 0 0 0 0 R Plus S R+S


SUBR 0 0 1 1 S Minus R S-R
SUBS 0 1 0 2 R Minus S R-S
OR 0 1 1 3 R OR S R∪ S
AND 1 0 0 4 R AND S R∩ S
NOTRS 1 0 1 5 R AND S R& S
EXOR 1 1 0 6 R EXOR S R⊕ S
EXNOR 1 1 1 7 R EXNOR S R≡S

Pe baza informatiilor din tabelele 1 si 2 se pot genera functiile aritmetice si logice realizate de
unitatea de executie AMD 2901:
AMD 2901 Functiile aritmetice. Tab.3.

Microcod octal Cn=0 (Low) Cn=1(High)

I5:3,I2:0 Grup Functie Grup Functie

0 0 ADD A+Q ADD Plus1 A+Q+1


0 1 A+B A+B+1
0 5 D+A D+A+1
0 6 D+Q D+Q+1
0 2 Pass Q Increment Q+1
0 3 B B+1
0 4 A A+1
0 7 D D+1

1 2 Decrement Q-1 Pass Q


1 3 B-1 B
1 4 A-1 A
2 7 D-1 D

2 2 Comple- -Q-1 Comple- -Q


2 3 mentul -B-1 mentul -B
2 4 fata de 1 -A-1 fata de 2 -A
1 7 -D-1 -D

1 0 Scadere Q-A-1 Scadere Q-A


1 1 in com- B-A-1 in com- B-A
1 5 plementul A-D-1 plemnetul A-D
1 6 ata de 1 Q-D-1 fata de 2 Q-D
2 0 A-Q-1 A-Q
2 1 A-B-1 A-B
2 5 D-A-1 D-A
2 6 D-A-1 D-Q

AMD 2901 Functii logice. Tab.4.

Microcod octal Grup Functie


I5:3,I2:0

4 0 AND A∩ Q
4 1 A ∩ B
4 5 D ∩ A
4 6 D ∩ Q
3 0 OR A ∪ Q
3 1 A ∪ B
3 5 D ∪ A
3 6 D∪ Q

6 0 EXOR A⊕ Q
6 1 A⊕ B
6 5 D⊕ A
6 6 D⊕ Q
7 0 EXNOR A≡Q
7 1 A≡B
7 5 D≡A
7 6 D≡Q
7 2 INVERT Q
7 3 B
7 4 A
7 7 D
6 2 PASS Q
6 3 B
6 4 A
6 7 D
3 2 PASS Q
3 3 B
3 4 A
3 7 D
4 2 "ZERO" 0
4 3 0
4 4 0
4 7 0
5 0 MASK A ∩ Q
5 1 A ∩ B
5 5 D ∩ A
5 6 D ∩ Q

Campul "Destinatie UAL" (I8:6) din vectorul de comanda I8:0 are o semnificatie complexa prin
faptul ca specifica:
- operarea RAM (deplasare/incarcare/inactiv);
- operarea registrului Q (deplasare/incarcare/inactiv);
- conexiunile la RAMSHIFT (RAM0 si RAM3);
- conexiunile la QSHIFT (Q0 si Q3);
- iesirea Y.
Terminalele RAM0/RAM3 si Q0/Q3, din punct de vedere electric, sunt terminale de
intrare/iesire, controlul lor fiind asigurat de campul I8:6, din microcod.
In tabelul de mai jos se prezinta semnificatiile campului I8:6, in conditiile in care:
- B reprezinta locatia din RAM adresata pe baza adresei B;
- UP inseamna deplasarea catre MSB;
- DOWN specifica deplasarea catre LSB.

Comanda destinatiei UAL Tab.5.

Mnemo- M.cod Cod Functia RAM Functia Q Ies RAMSHIFT QSHIFT


nica oct
I8I7I6 Depl Incarc. Depl Incarc. Y RAM0 RAM3 Q0 Q3
QREG 000 0 * Nu * Q← F F * * * *
NOP 001 1 * Nu * Nu F * * * *
RAMA 010 2 Nu B← F * Nu A * * * *
RAMF 011 3 Nu B← F * Nu F * * * *
RAMQD 1 0 0 4 DOWN B← F/2 DOWN Q← Q/2 F F0 IN3 Q0 IN3
RAMD 101 5 DOWN B← F/2 * Nu F F0 IN3 Q0 *
RAMQU 1 1 0 6 UP B← 2F UP Q← 2Q F IN0 F3 IN0 Q3
RAMU 111 7 UP B← 2F * Nu F IN0 F3 * Q3

*)Din punct de vedere electric terminalul asigura o intrare TTL, conectata intern cu o iesire TS
aflata in starea de mare impedanta.
Intrarea B in RAM este furnizata de un multiplexor RAMSHIFT. Acesta, sub controlul
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
terminalele RAM3/RAM0 sunt selectate cu ajutorul altor biti (MUX1, MUX0 ) din microcodul de
comanda si cu un hardware aditional,constituit din doua multiplexoare AMD 25LS-253, cu cate
8 intrari si 2 iesiri.
Multiplexoarele AMD 25LS253, amintite mai sus, solutioneaza si problemele circuitului
QSHIFT, care asigura una din intrarile registrului Q.
Iesirea Y este realizata cu un circuit TS. Sub controlul semnalului OE, iesirea Y se conecteaza
la o magistrala de date.
Intrarea de ceas in circuitul AMD 2901 controleaza resursele RAM, Q si tampoanele-latch A si
B, plasate pe iesirile RAM. Cand semnalul de ceas este pe nivel ridicat tampoanele A si B sunt
activate, preluand datele din locatiile citite din RAM, pentru a le furniza la iesire, ca surse UAL.
Pe durata nivelului coborat al semnalului de ceas tampoanele A si Bstocheaza datele incarcate
anterior. In cazul in care se activeaza semnalul WE, pe nivelul coborat al semnalului de ceas se
poate stoca in RAM noua data plasata la intrarea B, prin intermediul circuitului RAMSHIFT.

I7 I7
MUX0 MUX1 MUX0 MUX1

1G A B 2G LSB MSB 1G A B 2G
1C0 1C0
H 1C1 1C1 H
Q0 Q1
1C2 1Y 1Y 1C2
1C3 25LS-253 25LS-253 1C3
2C0 AMD 2901 2C0
H 2C1 2Y RAM1RAM3 2Y 2C1 H
2C2 2C2
2C3 2C3
MSB-Fn
In continuare se va perzenta schema bloc partiala a unei unitati de executie pe 16 biti, constituita
din patru circuite AMD 2901 si un circuit cu transport anticipat AMD 2902
D0:3 D12:15
Q0I/O Q15I/O
RAM0I/O Q0 Q3 Q0 Q3 RAM15I/O
RAM0 RAM3 RAM0 RAM3
/G /G
/P /P
AMD 2901(1) AMD 2901(4)
Cn+4 Cn+4
OVR OVR
F3 F3
Cin Cn F=0 Cn F=0

/P0 /G0 /P1 /G1 /P2 /G2 /P3 /G3


Cn AMD 2902 /G
Cn+x Cn+y Cn+z /P

F=0(2) F=0(3) 470Ω


+5V
Observatie:
Pentru marcarea unor semnale active pe nivel coborat, in cazul de fata, numele semnalului a fost
precedat de simbolul “/”.
Unitatea de executie poate utiliza si multiplexoare 4:1 obisnuite, in locul celor produse de catre
AMD, 25LS-253. In schema de mai jos se arata modul in care sunt interconectate logic cele 4
multiplexoare.
Plecand de la elementele prezentate anterior se poate construi formatul cuvantului de comanda,
al microinstructiunii, pentru controlul unitatii de executie.
In scop didactic se va considera data de prelucrat continuta in microinstructiune, intr-un camp
D. In cazul unei unitati de prelucrare pe 4 biti, campul D va avea, de asemenea, 4 biti. Pe masura
ce creste lungimea cuvantului prelucrat, va creste si dimensiunea campului D, din
microinstructiune.
“0”

MUX MUX MUX MUX

MUX1,MUX0
RAM SHIFT QSHIFT
0 3 0 3 F3

In conditiile plasarii unor multiplexoare pe intrarile de deplasare ale circuitelor RAMSHIFT si


QSHIFT registrele R si Q se pot concatena in vederea efectuarii unor deplasari sau rotiri duble,
conform tabelului de mai jos (originea de indexare este la stanga):

MUX1MUX0 TIP DREAPTA (JOS) STANGA (SUS)

0 0 ZERO RAM3 ← 0; RAM0 ← 0;


Q3 ← 0 Q0 ← 0
0 1 ROTIRE RAM3 ← RAM0 ; RAM0 ← RAM3;
Q3 ← Q0 Q0 ← Q3
1 0 ROTIRE CU RAM3 ← Q0; RAM0 ← Q3;
LUNGIME DUBLA Q3 ← RAM0 Q0 ← RAM3
1 1 DEPLASARE RAM3 ← F3 ; RAM0 ← Q3;
DUBLA Q3 ← RAM0 Q0 ← 0
ARITMETICA
Cuvantul (microinstructiunea) de comanda al unitatii de executie va avea structura urmatoare:

23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

M I8 I7 I6 M I2 I1 I0 Cn I5 I4 I3 A3 A2 A1 A0 B3 B2 B1 B0 D3 D2 D1 D0
U Selectie U Selectie Operatie Adresa “A” Adresa “B” Data “D”
X destinatie X sursa UAL
1 2

Se poate observa ca, microinstructiunea care controleaza unitatea de executie poseda 24 de biti.
Bitii 0,..,3 au aparut ca urmare a inglobarii datei in microinstructiune (microinstructiune cu
operand imediat). Campul D se va extinde in incrementi de 4 biti odata cu extinderea lungimii
cuvantului prelucrat de catre unitatea de executie. Campul Cn este asociat cu transportul in
rangul cel mai putin semnificativ al unitatii de executie, fiind la latitudinea celui care scrie
microprogramul.
Unitati de comanda integrate. Secventiatorul de microprogram AMD 2909.

Secventiatorul de microprogram AMD 2909 face parte din familia de circuite AMD2900 si
constituie elementul de baza in jurul caruia este organmizata unitatea de comanda
microprogramata.
Dupa cum s-a aratat in paragraful anterior, atat unitatea de executie AMD 2901, cat si circuitele
asociate acesteia sunt controlate cu ajutorul unui vector de comanda constituit din campuri de
biti, cu functii bie precizate. Un asemenea vector controleaza operatii aritmetice elementare,
care se pot efectua pe durata unei perioade de ceas. Vectorul semnalelor de comanda poate fi
generat cu ajutorul unui circuit secvential, in cazul unitatilor de comanda conventionale, sau
extras dintr-o memorie cu continut permanent, in cazul unitatilor de comanda microprogramate.
Operatiile cu caracter complex, printre care se numara si instructiunile calculatoarelor
conventionale, se implementeaza sub forma unor secvente de vectori de comanda. In sistemele
microprogramate aceste secvente sunt stocate intr-o memorie de control sau memorie de
microprograme.
Un cuvant al memoriei de control reprezinta un vector de comanda sau o microinstructiune.
Secventiatorul de microprogram, structurat pe transe de cate 4 biti, este destinat generarii
adreselor de microinstructiuni si asigurarii inlantuirii acestora.
Secventiatorul, prezentat mai jos, are ca resurse hardware:
- Contorul de MicroProgram (CMP);
- Registrul de Ramificare (RR);
- Indicatorul de Stiva (IS);
- STiVa (STV) cu capacitate de 4 cuvinte × 4 biti;
- INCrementatorul (INC);
- MultipleXorul (MUX) 4 × (4 : 1);
- Tampon cu trei Stari (TS) si alte circuite logice combinationale auxiliare.
Schema bloc a unitatii de comanda va contine, pe langa microsecventiator, si elementele
necesare realizarii unei unitati de comanda:
- Memoria de Microprogram (MM);
- Registrul MicroInstrucriunii (RMI);
- un Comutator de Adrese (CA);
- o memorie de tip PROM.
R[3:0] FE PUP(PUSH/POP)

RE
RR[4] IS
D3:0

STV Ceas
S0 4 cuv.× 4 biti
D RR STV CMP
MUX
S1
X[4]
CMP[4]
ORi
SAU-NU Cn+4
INC
ZERO
Cn
SI

TS

OE Y[4]

Prin conectarea in cascada a trei asemenea circuite se asigura o adresa de microinstructiune de


12 biti, ceea ce permite accesul la o memorie de comanda cu capacitatea de 4096 cuvinte.
Secventiatorul furnizeaza o adresa Y[4] de microinstructiune, care reprezinta iesirea X[4] a
multiplexorului prelucrata logic. Multiplexorul are ca intrari selectabile cu ajutorul semnalelor
S1,S0:
- adresa externa D;
- continutul Registrului de Ramificare (RR);
- continutul varfului stivei (STV)
- continutul Contorului de MicroProgram.
Iesirea Y este furnizata prin intermediul unui circuit tampon TS, controlat de semnalul OE.
Din punct de vedere logic, Y[4] se exprima astfel:
Y[4] = ZERO ∩ (Y[4] ∪ OR[4])
unde OR[4] este un vector logic aplicat din exterior, adesea avand toti bitii egali cu 1. ZERO
este, de asemena, un vector logic, care paote face ca Y[4]a aibe toate rangurile egale cu 0. In
acest mod se pot forta valori particulare pentru adresa microinstructiunii urmatoare sau se pot
efectua transferuri relative la adresa curenta.
Secventierea microinstructiunilor este realizata prin controlul circuitului 2909 cu ajutorul
semnalelor preluate din campurile de control ale microinstructiunii si de la conditiile externe.
Operarea microsecventiatorului este descrisa cu ajutorul urmatoarelor tabele:
Selectie MUX: Controlul Iesirii:

S1 S0 IESIRE ORi ZERO OE Yi


0 0 CMP * * 1 Z (TS)
0 1 RR * 0 0 0
1 0 STV 1 1 0 1
1 1 D 0 1 0 IES MUX

Operarea Stivei:

FE PUP OPERATIE
1 * inactiva
0 1 IS ← INC(IS); PUSH(CMP)
0 0 POP(STV); DCR(IS)

In functie de semnalele de control si de conditiile externe, microsecventiatorul poate realiza


urmatoarele operatii de control, la nivelul microprogramului:
- transfer neconditionat la adresa X – mnemonica J X;
- chemare de micro subrutina – mnemonica CALL X;
- revenire din microsubrutina – mnemonica RETURN;
- trecerea la microinstructiunea urmatoare din secventa – mnemonica CONTINUE.
Transferul neconditionat la adresa X se realizeaza prin aplicarea vectorului binar X la intrarea D
a multiplexorului si a urmatorului vector binar la intrarile de control ale microsecventiatorului:
S1 S2, FE, PUP, OR[4], ZERO = 1 1, 1, *, 0000, 1
Chemarea unei microsubrutine, de la adresa X, este asigurata prin fortarea adresei X in registrul
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
Revenirea dintr-o microsubrutina este implementata folosind un vector de control al
microsecventiatorului cu urmatoarea structura:
S1 S2, FE, PUP, OR[4], ZERO = 1 0, 0, 0, 0000, 1
Trecerea la urmatoarea microinstructiune din secventa impune ca adresa Y sa corespunda
continutului Contorului de Microprogram, ceea ce se realizeaza cu ajytorul urmatorului vector
de comanda:
S1 S2, FE, PUP, OR[4], ZERO = 0 0, 1, *, 0000, 1
Conform celor aratate mai sus, microsecventiatorul efectueaza urmatoarele operatii privitoare la
generarea adresei Y a microinstructiunii urmatoare si la modificarea continuturilor Contorului
de MicroProgram si Stivei:
Y = (((CMP ! RR ! STV ! D) * DCD0:3(S1,S0) ∪ OR0:3) ! 4 0)* (ZERO, ZERO)
CMP ← ((INC(CMP ! RR ! STV ! D) * DCD0:3(S1,S0) ∪ OR0:3) ! 4 0)* (ZERO, ZERO)
STV ← ((STV1:3 ! STV0) ! (CMP ! CMP ! STV0:2) ! STV ! STV) * DCD0:3(FE, PUP)
Conectarea in cascada a circuitelor microsecventiatorului pemite explorarea unui spatiu mai
mare in memoria de microprogram. Mai jos se prezinta interconectarea in cascada a trei
microsecventioatoare AMD 2909.
R D
4 12 12 4
4
4
R D R D R D
S0:1 S0:1 S0:1
AMD2909 AMD2909 AMD2909
OR0:3 OR0:3 OR0:3
Cn Cn+4 Cn Cn+4 Cn Cn+4
altele altele altele
Y0:3 Y0:3 Y0:3
S0:1
OR0:3
altele

Y0:11
Dupa cum s-a mai aratat, pentru realizarea unei unitati de comanda, microsecventiatorul trebuie
prevazut cu o serie de circuite auxiliare, care sunt prezentate in figura de mai jos:

RR[4] IS
CA

STV
AMD29751 4 cuv.× 4 biti
D RR STV CMP
A0 MUX
PROM X[4]
A4:1 CMP[4]
CS P3:0 AMD2909 Y[4]
Cn+4
INC

MM Cn

RMI
AMD2918
MUX0,MUX1
ADRESA “A”
ADRESA “B”
DATA “D”
SELECTIE SURSA (I2:0)
OPERATIE UAL (I5:3)
SELECTIE DESTINATIE (I8:6)
SELECTIE COD CONDITIE (P3:0)
CODUL CONDITIEI SELECTATE
Intre acestea un rol deosebit il joaca memoria PROM 29751, care furnizeaza semnalele de
comanda pentru microsecventiator. Continutul acestei memorii PROM este citit pe baza unei
adrese obtinute dintr-un camp P0:3, al registrului microinstructiunii RMI. Bitii P0:3 ai
microinstructiunii se transforma in bitii de adresa A1:4, ai memoriei PROM, in timp ce bitul A0
este furnizat de iesirea unui multiplexor la intrarile caruia se aplica indicatorii de conditii, cat si
alte semnale. Intrarile de date ale multiplexorului au fost stabilite pe durata executiei
microinstructiunii precedente. Intrarile de selectie ale multiplexorului sunt asigurate tot de bitii
P0:3, furnizati de microinstructiunea curenta. In figura de mai jos se prezinta o schema bloc a
unitatii de comanda, cu indicarea elementelor discutate anterior.

Magistrala pentru date si instructiuni

Registrul Instructiunii RI

Cod operatie adresa, etc.

PROM mapare adresa

D[4] R[4]
O5 OR[4]
PROM
29751 O4 ZERO
MUX O3 PUP AMD 2909
A0 O2 FE
O1 S1 Cn+4
O0 S0 Cn
A4A3A2A1 Yout

Adresa

Memoria de
4 4 microprogram R3:0

RMI Semnale de
P3:0 comanda
Operarea unitatii de comnada microprogramata este stabilita prin continutul memoriei PROM,
care furnizeaza la iesire semnalele O5:0, care reprezinta vectorul de comanda al
microsecventiatorului: OR[4], ZERO, PUP, FE, S1, S0. In locatiile memoriei PROM, adresate cu
ajutorul campului P3:0, sunt stocati vectori de comanda, care impun unitatii de comanda
microprogramate efectuarea operatiilor prezentate in tabelul de mai jos:

P3:0 Operatie Mnemonica


cod hexa
0 Ramificare la adresa R daca F ≠ 0 JRNZF
1 Ramificare neconditionata la adresa R JR
2 CONTINUA CONT
3 Ramificare la adresa D JD
4 Ramificare la subrutina cu adresa R daca F ≠ 0 JSRNZF
5 Ramificare la subrutina cu adresa R JSR
6 Revenire din subrutina RS
7 Ramificare la adresa continuta in varful stivei (fara POP) JSTV
8 Terminare de ciclu si POP daca F = 0 TCPOZF
9 PUSH si CONTINUA PUCONT
A POP si CONTINUA POCONT
B Terminare de ciclu si POP daca Cn+4 = 1 TCPOC
C Ramificare la adresa R daca F = 0 JRZF
D Ramificare la adresa R daca F3 = 1 JRF3
E Ramificare la adresa R daca OVR = 1 JROVR
F Ramificare la adresa R daca Cn+4 = 1 JRC

Se poate observa, in ultima schema bloc, faptul ca intrarea R a microsecventiatorului este


preluata direct de la iesirea memoriei de comanda, fara a mai fi stocat in prealabil in registrul
microinstructiunii RMI. In acest mod adresa de ramificare se incarca direct in registrul R al
microsecventiatorului.
Din cele prezentate rezulta ca operarea microsecventiatorului este controlata de doua campuri
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.
Prin concatenarea mai multor microsecventiatoare campul P ramane constant ca lungime, in
timp ce campul R se modifica, in incrementi de cate 4 biti, pentru a furniza spatii de adresare
mai mari in memoria de microprogram.
Structura unui cuvant – microinstructiune, destinat controlului unui microsecventiator AMD
2909, este formata din doua campuri de cate patru biti:
- campul P, care specifica modul de obtinere a microinstructiunii urmatoare, si
- campul R, care defineste adresa de salt, daca este cazul.

31 30 29 28 27 26 25 24

R3 R2 R1 R0 P3 P2 P1 P0

Adresa de Obtinerea µI
salt urmatoare

Microprogramarea unui procesor “bit-slice”, constituit cu ajutorul circuitelor AMD 2901


si AMD 2909, in vederea prelucrarii datelor pe 4 biti.
(Urmeaza mai multe exemple de microprograme)
Sinteza circuitelor combinationale
Minimizarea folosind diagrama Karnaugh. (D-K)
1. Copiaza tabela de adevar in (D-K)
2. Identifica subcuburile: selecteaza la fiecare pas pe cel mai mare subcub, chiar
daca se suprapune cu alte cuburi selectate anterior, pana la acoperirea tuturor
unitatilor (Incearca: 4×4, 2×4 si 4×2, 1×4 si 4×1, 2×1 si 1×2, in final 1×1) .
3. Genereaza realizarea minimala ca Suma de Produse (SP).

Termenii incercuiti poarta numele de implicanti. Un implicant care nu estcontinut


complet intr-un alt implicant poarta numele de implicant prim.

Cazul SP nonminimale
Structuri utile de porti.
Logica pentru Sumatorul Complet (SC)

Ecuatia transportului C0 poate fi simplificata destul de usor:

C0 = BC + AB+ AC

In schimb, suma, S, nu are o realizare simpla de SP, chiar daca ea poate fi


implementata cu doua porti XOR, cu cate doua intrari.

Sinteza logica folosind multiplexoare (MUX-uri)


Implementarea sistematica a logicii combinationale.

Optimizari in cazul logicii cu MUX-uri

Sinteza bazata pe Tabele de Cautare (Lookup Tables)

Teoretic, se poate construi oricare bloc logic combinational, cu o iesire, folosind


multiplexoare. Pentru o functie de N variabile este necesar un multiplexor cu 2N
intrari.
Structura unui Multiplexor
Multiplexoarele pot fi partitionate in doua sectiuni cu functiile de decodificare si
selectare. Decodificatorul identifica intrarea dorita, iar Selectorul transfera la iesire
acea intrare.
Prin partajarea sectiunii de decodificare, multiplexoarele pot fi utilizate la
implementarea tabelelor de cautare cu un numar oarecare de iesiri.

Decodificatorul
Decodificatorul dispune de k intrari, denumite intrari de selectie si N=2k iesiri de date.

Se poate construi un tablou bidimensional format din decodificatoare si selectoare,


dupa cum se arata in continuare.
Partajarea logicii de decodificare.

Astfel, se poate realiza un dispozitiv universal de tip tabela de cautare, denumit


Memorie cu Continut Permanent (ROM – Read Only Memory), cu ajutorul careia se
poate implementa oricare tabela de adevar si, astfel, oricare dispozitiv logic
combinational.
ROM - detalii de implementare
Logica SI cablata, logica SAU programabila
Avantaje:
- proiect cu o structura regulata
- proiectarea poate fi complet automatizata

Dezavantaje:
- Tranzistoarele “trage sus” sunt active, ceea ce implica cosum static de putere
- Trasee lungi de metal, cu capacitati mari
- Viteza de lucru relativ mica.

Terminologie:
- Intrarille circuitului ROM: adrese
- Iesirile decodificatorului: linii de cuvint
- Iesirile selectorului: linii de bit
Cresterea vitezei in cazul ROM
Cresterea vitezei in cazul ROM se poate realiza prin reducerea capacitatiilor
traseelor lungi de metal, care strabat structura.
Cea mai buna metoda consta in realizarea unei structuri patrate.
Intrebari:
- De ce sau folosit circuite NOR?
- Nu se puteau elimina unele inversoare in cazul folosirii circuitelor NAND?

Observatii privind utilizarea circuitelor ROM


pentru implementarea logicii combinationale
- ROM nu tine seama de structura functiilor combinationale
- Dimensiunea, planul (layout) si proiectul sunt independente de functie
- Oricare tabela de adevar poate fi implementata/”programata” prin reconfigurari
minore:
- stratul de metal (ROM cu masca)
- fuzibile (PROM –Field programmable ROM)
- sarcini pe portile flotante (EPROM – Erasable PROM) etc
Model: valorile functiei in tabela de cautare se iau din tabela de adevar.
Intrari: “ADRESE” corespunzatoare celor N intrari
Dimensiunea ROM ≈ 2N × Nr.iesiri.
Intrebari:
- De ce dimensiunile ROM cresc cu un factor egal cu 4?
- La iesirea unui circuit ROM se pot observa “glitch-uri”? Explicatie.

Exemplu: Zar cu 7 fatete.


Intrucat mecanic nu se poate realiza un zar cu 7 fatete, se va incerca o implementare
electronica, pornind de la fatetele de zar de mai jos:

Cu ajutorul unui tablou de LED-uri, marcate ca mai jos, se pot afisa fatetele zarului:

Proiectare bazata pe ROM


Proiectul consta in scrierea tabelei de adevar

Optimizari: eliminarea iesirilor redundante si examinarea adresarii.


O implementare ROM simpla

PLA (Programmable Logic Array -Tablou Logic Programabil)


In cazul in care termenii AND ai decodificatorului din ROM ar putea fi
programabili, ca si termenii SAU, s-ar putea folosi o serie de metode de minimizare
in scopul reducerii dimensiunilor tabloului ROM. Se obtine un dispozitiv universal.

Implementarea PLA a Zarului cu 7 fatete

Ca si in cazul ROM, PLA asigura sinteza functiilor logice arbtrare utilizand


implementari bazate pe SP.
Avantaje:
- implementari minimizate si rapide
- structuri regulate:
- generare automata
- proiectare facila
- mai lenta decat implementarea optimala cu porti.

Impachetarea PLA
Adesea aceeasi linie de bit poate fi partajata de doua iesiri. I mod similar, este
posibil, sa se aduca intrarile pe ambele laturi ale tabloului, ceea ce face ca desenul sa
arate ca o pereche de PLAuri in oglinda.

PAL (Programmable Array Logic – Tablouri ProgramabileLogice)


O alta abordare a proiectarii logice structurate o constituie PAL-urile. Aceste
dispozitive au fost in voga in anii 80 intrucat au inlocuit cu succes portile TTL si au
contribuit la lansarea microprocesoarelor. Actualmente sunt depasite..
PAL-urile au un decodificator programabil (planul AND) si o logica de slectie fixa.

Aceste dispozitive au fost utile pentru implementarea expresiilor logice sub forma de
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
echipamente ieftine.

Concluzii:
Multiplexoarele:
- Un multiplexor cu N intrari poate implementa tabele de adevar cu N intrari si o
iesire
ROM-urile
- Logica de decodificare partajata
- Genereaza toate produsele
- Pot implementa tabele de adevar cu un numar oarecare de iesiri
- Usor de specificat
- Plan (layout) regulat
- Utilizare ineficienta a spatiului/timpului
PLA-urile
- Asigura realizari minimizate pentru SP
- Genereaza numai produsele necesare
- Pentru proiecte compacte este necesara minimizarea
- Plan (layout) regulat
PAL-urile
- Usor de prefabricat si de impachetat

Metode moderne: Celule Standard


Se creaza, mai intai, o biblioteca de celule logice: porti, registre, multiplexoare,
sumatoare, ploturi de I/E etc. O foaie de catalog, pentru fiecare celula, descrie functia,
aria ocupata, puterea consumata, timpul de propagare, timpii de crestere si de cadere
ca functii de sarcina etc

Exemplu de celula standard


Ca si in cazul proiectarii plachetelor la nivel de componente, cu doua decade in urma,
uneltele CAD plaseaza si interconecteaza celulele, urmarindu-se:
- minimizarea ariei ocupate
- satisfacerea restrictiilor de timp.
Arii/Tablouri de Porti: Scurtarea timpului de realizare a proiectului
Tablourile de porti utilizeaza tablouri fixe de tranzistoare, care sunt “personalizate” in
etapa finala de procesare in care se adauga fire/trasee metalice si contacte.
Cea mai populara arhitectura este “Marea de Porti” (Sea of Gates), in care nucleul
circuitului integrat este un tablou continuu de tranzistoare MOS. Trasarea straturilor
de metal se efectueaza peste partea superioara a tranzistoarelor nefolosite.

Avantaje:
- pot fi prefabricate
- sunt personalizate numai ultimele masti.
Tablou de porti: Exemplu.

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