1.INTRODUCERE. 1.1. Scurt istoric privind dezvoltarea - 3x2CB - iNES
1.INTRODUCERE. 1.1. Scurt istoric privind dezvoltarea - 3x2CB - iNES
1.INTRODUCERE. 1.1. Scurt istoric privind dezvoltarea - 3x2CB - iNES
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>1.INTRODUCERE</strong>.<br />
<strong>1.1.</strong> <strong>Scurt</strong> <strong>istoric</strong> <strong>privind</strong> <strong>dezvoltarea</strong> echipamentelor de prelucrare a datelor.<br />
Un calculator modern reprezinta un sistem complex care inglobeaza in constructia sa<br />
tehnologii diverse: electronice, magnetice, electromecanice, electrono-optice etc. Astfel, in<br />
prezent, pentru realizarea unitatii centrale a unui calculator, care asigura stocarea<br />
programului si a datelor pe termen scurt, secventierea instructiunilor si efectuarea<br />
operatiilor de calcul, se utilizeaza, cu precadere, tehnologii microelectronice. Pentru<br />
stocarea datelor si a programelor pe termen lung se folosesc suporturi magnetice sub forma<br />
de benzi sau discuri, bazate pe diverse tehnologii magnetice/optice. Pentru implementarea<br />
operatiilor de intrare/iesire sunt folosite in principal tehnologiile electronice si<br />
electromecanice.<br />
Evolutia calculatoarelor este strans legata de progresele inregistrate de tehnologiile amintite<br />
mai sus. Cercetarile efectuate pentru realizarea de calculatoare cat mai performante au<br />
impulsionat aprofundarea unor noi aspecte in cadrul acestor tehnologii.<br />
Calculatoarele moderne reprezinta rezultatul unui indelungat proces de cautari ale unor<br />
mijloace tehnice adecvate pentru mecanizarea si automatizarea operatiilor de calcul.<br />
In evolutia mijloacelor de tehnica de calcul se pot evidentia mai multe etape.<br />
1. Etapa instrumentelor de calcul.<br />
• Secolul 12 en., China - abacul.<br />
• Sfarsitul sec. 17 si inceputul sec.18, J. Napier si R. Bissaker -rigla de calcul.<br />
2. Etapa masinilor mecanice de calcul ( bazate pe roti dintate angrenate: roata dintata<br />
joaca rolul elementului cu mai multe stari stabile, fiecare stare codifica o cifra zecimala. )<br />
• 1642. B. Pascal realizeaza o masina de adunat.<br />
• 1694. von Leibniz construieste o masina de adunat si inmultit.<br />
• 1823. Ch.Babbage proiecteaza primul calculator cu executie automata a programului.<br />
Proiectul prevedea principalele elemente ale calculatoarelor moderne (unitatile de:<br />
memorie, calcul, intrare, iesire si comanda ).<br />
• 1872 E. Barbour realizeaza prima masina de calcul cu imprimanta.<br />
• 1892. W. Burroughs construieste o masina de calcul de birou perfectionata.<br />
• 1912. F. Baldwin si J. Monroe incep productia de masa a masinilor mecanice de<br />
calculat, cu patru operatii aritmetice.<br />
3. Masini electromecanice de calculat (bazate pe roti dintate angrenate, actionate
electric ).<br />
• 1930. Productia de masa a masinilor electromecanice de calculat prevazute cu operatiile:<br />
adunare, scadere, inmultire, impartire, radacina patrata, subtotal etc.<br />
• 1937 - 1945. Masini electromecanice de calculat, bazate pe relee electromagnetice<br />
(Mark I ), cu program cablat. Releele electromagnetice si contactele lor joaca rolul<br />
elementelor bistabile. Cu ajutorul lor se pot codifica cifrele sistemului de numeratie binar.<br />
In 1937 Howard Aiken, de la Universitatea Harward, a propus proiectul Calculatorului cu<br />
Secventa Automata de Comanda. Acesta folosea principiile enuntate de Ch. Babbage si<br />
tehnologia de implementare pentru calculatoarele electromecanice produse de IBM.<br />
Constructia calculatorului Mark I a inceput in 1939 si s-a terminat la 7 august 1944, data ce<br />
marcheaza inceputul erei calculatoarelor.<br />
4. Masinile electronice de calcul cu program memorat, bazate la inceput pe tuburi<br />
electronice, apoi pe tranzistori si circuite integrate pe scara simpla (SSI: sub 20 de<br />
tranzistori pe pastila de Si), medie (MSI: 20 - 1000 de tranzistori pe pastila de Si), larga<br />
(LSI: 1000 – 50.000 de tranzistori pe pastila de SI), foarte larga (VLSI: 50.000 – 100.0000<br />
de tranzistori pe pastila de Si) si ultra larga (ULSI: peste 1.000.000 de tranzistori pe pastila<br />
de Si).<br />
Primele calculatoare realizate cu tuburi electronice:<br />
• 1943: la Universitatea din Pennsylvania a inceput constructia primului calculator bazat<br />
pe tuburi electronice ENIAC ( Electronic Numerical Integrator And Computer ), de catre o<br />
echipa avand in frunte pe J.P. Eckert, J.W. Mauchly si J. von Neumann. Cu aceasta ocazie<br />
s-a folosit ideea de a stoca in aceeasi memorie, atat datele, cat si programul, ceea ce a<br />
permis modificarea relativ usoara a programului;<br />
• 1945: a inceput constructia unui alt calculator electronic EDVAC (Electronic Discrete<br />
Variable Automatic Computer) pe baza lucrarii lui J.von Neumann: "Prima schita de Raport<br />
asupra lui EDVAC". Dupa elaborarea structurii logice de baza a calculatorului cu<br />
program memorat, au fost stabilite entitatile functionale care concurau la realizarea acestuia:<br />
- un mediu de intrare care sa permita introducerea unui numar nelimitat de operanzi si<br />
instructiuni;<br />
- o memorie din care se citesc operanzi sau instructiuni si in care se pot introduce, in<br />
ordinea dorita, rezultatele;<br />
- o sectiune de calcul, capabila sa efectueze operatii aritmetice sau logice asupra<br />
operanzilor cititi din memorie;
- un mediu de iesire, care sa permita livrarea unui numar nelimitat de rezultate catre<br />
utilizator;<br />
- o unitate de comanda, capabila sa interpreteze instructiunile citite din memorie si sa<br />
selecteze diverse variante de desfasurare a operatiilor, in functie de rezultatele obtinute<br />
pe parcurs.<br />
Marea majoritate a calculatoarelor construite pana in prezent se bazeaza pe aceste principii,<br />
purtand numele de calculatoare de tip von Neumann.<br />
Pe baza proiectului EDVAC, Eckert si Mauchly au produs, in 1951, in cadrul unei<br />
companii proprii, primul calculator comercial UNIVAC 1.<br />
La Universitatea Princeton, von Neumann a condus realizarea, in 1951, a calculatorului<br />
IAS, care dispunea de posibilitatea de a-si modifica partea de adresa din instructiune.<br />
Aceasta facilitate asigura reducerea spatiului ocupat in memorie de catre program, ceea ce<br />
permite prelucrarea unor seturi mai mari de date.<br />
Avand in vedere tehnologiile utilizate in constructia calculatoarelor, incepand cu anul 1946,<br />
se pot evidentia cinci generatii de calculatoare. Intrucit functia de prelucrare a datelor este<br />
legata si de cea de transmitere a datelor, printre caracteristicile specifice fiecarei generatii de<br />
calculatoare trebuie incluse si elementele reprezentative <strong>privind</strong> tehnologiile<br />
telecomunicatiilor.<br />
In tabelul de mai jos se prezinta caracteristicile generatiilor de sisteme de calcul si de<br />
telecomunicatii.<br />
Tabelul 1.<br />
Evolutia generatiilor de calculatoare si a telecomunicatiilor.<br />
Generatia I ( 1946-1956 ).<br />
1. Hardware calculatoare: relee, tuburi electronice, tambur mag netic, tub catodic.<br />
2. Software calculatoare: programe cablate, cod masina, autocod.<br />
3. Exemple de calculatoare: ENIAC, EDVAC, UNIVAC 1, IBM 650, CIFA 1-4 1 ,<br />
CIFA 101-102, MARICCA, MECIPT-1 .<br />
4. Tehnologia telecomunicatiilor: teletype, telefon.<br />
5. Performantele calculatoarelor: capacitate memorie 2 Koct, viteza de operare 10.000<br />
instr/s.<br />
1 Denumirile calculatoarelor produse in Romania sunt prezentate cu litere cursive
Generatia a II-a ( 1957 - 1963 ).<br />
1. Hardware calculatoare: tranzistoare, memorii cu ferite, cablaj imprimat, discuri<br />
magnetice.<br />
2. Software calculatoare: limbaje de nivel inalt (Algol, FORTRAN).<br />
3. Exemple de calculatoare: NCR 501, IBM 7094, CDC 6600, DACICC-1/2,<br />
CET 500/501, MECIPT-2,DACICC-200.<br />
4. Tehnologia telecomunicatiilor: transmisiuni numerice, modulatie in coduri de impulsuri.<br />
5. Performantele calculatoarelor: capacitatea memoriei 32 Koct,viteza de operare<br />
2.000.000 instr/s.<br />
Generatia a III-a ( 1964 -1981 )<br />
1. Hardware calculatoare: circuite integrate, memorii semiconductoare, cablaj imprimat<br />
multistrat, microprocesoare, discuri magnetice, minicalculatoare.<br />
2. Software calculatoare: limbaje de nivel foarte inalt, programare structurata, LISP,<br />
sisteme de operare orientate pe limbaje ( Algol, Pascal ),timp<br />
partajat, grafica pe calculator, baze de date.<br />
3. Exemple de calculatoare: IBM 360-370, PDP11/XX, Spectra 70, Honeywell 200,<br />
Cray-1, Illiac IV, Cyber 205, RIAD 1-2, Felix C-256/512/1024,<br />
Independent 100/102F, Coral 4001/4030.<br />
4. Tehnologia telecomunicatiilor: comunicatii prin satelit, microunde, retele, fibre optice,<br />
comutare de pachete.<br />
5. Performantele calculatoarelor: capacitatea memoriei 2 Moct, viteza de operare 5 mil.op/s.<br />
Generatia a IV-a ( 1982 - 1989 ).<br />
1. Hardware calculatoare: VLSI, sisteme distribuite, discuri optice, microcalculatoare de<br />
16/32 biti,superminicalculatoare, supercalculatoare.<br />
2. Software calculatoare: sisteme de operare evoluate, ADA, pachete de programe de larga<br />
utilizare, sisteme expert, limbaje orientate pe obiecte, baze de<br />
date relationale.<br />
3. Exemple de calculatoare: IBM-43xx, VAX-11/7xx, IBM-308x, RIAD3, Coral 4021,<br />
Independent 106, Felix 5000, Coral 8730.<br />
4. Tehnologia telecomunicatiilor: retele integrate de comunicatii numerice ( digitale ).<br />
5. Performantele calculatoarelor: capacitatea memoriei 8 Moct, viteza de operare 30<br />
mil.instr/s
Generatia a V-a ( 1990 - ).<br />
1.Hardware calculatoare: tehnici evoluate de impachetare si interconectare, ULSI,<br />
proiectare circuite integrate 3D, tehnologii Ga-AS si Josephson,<br />
componente optice, arhitecturi paralele pentru prelucrarea<br />
inferentelor, retele neuronale.<br />
2. Software calculatoare: sisteme de operare cu interfata evoluata cu utilizatorul, limbaje<br />
concurente, programare functionala, prelucrare simbolica<br />
(limbaje naturale, recunoasterea formelor: imagini/voce), Prolog,<br />
baze de cunostinte, sisteme expert evoluate, CAD, CAM, CAE,<br />
multimedia, realitate virtuala, web.<br />
3. Exemple de calculatoare: statii de lucru, super-calculatoare, retele de supercalculatoare,<br />
proiectul japonez si alte proiecte elaborate in unele tari sau<br />
grupuri de tari din Europa.<br />
4. Tehnologia telecomunicatiilor: <strong>dezvoltarea</strong> extensiva a sistemelor distribuite, retele<br />
locale, retele din fibra optica de mare capacitate retele de<br />
transmisii radio la frecvente de ordinul GHz cu spectru<br />
imprastiat, telefonie digitala mobila, fuzionarea<br />
tehnologiilor comunicatiilor si calculatoarelor, Internet.<br />
5. Performantele calculatoarelor: capacitatea memoriei zeci-sute Moct, viteza de operare<br />
1 Ginstr - 1 Tinstr/s.<br />
In prezent pentru circuitele integrate folosite in calculatoarele electronice se folosesc<br />
numeroase tehnologii care se pot grupa in tehnologii bipolare si tehnologii MOS<br />
Tehnologii bipolare:<br />
• TTL (Transistor Transistor Logic):<br />
- TTL-S (Schottky TTL),<br />
- TTL-LS (Low-Power Schottky TTL),<br />
- TTL-AS (Advanced Schottky TTL),<br />
- TTL-ALS (Advanced Low-power Schottky TTL),<br />
- FAST (Fairchild Advanced Schottky TTL).<br />
• ECL (Emitter Coupled Logic).<br />
• I2L (Integrated Injection Logic).<br />
Tehnologii MOS:
• PMOS (MOS canal P).<br />
• NMOS (MOS canal N):<br />
- HMOS (High performance MOS).<br />
• CMOS (Complementary MOS):<br />
- HCMOS (High density CMOS),<br />
- ACL (Advanced CMOS Logic).<br />
• MNOS (Metal Nitride Oxide Semiconductor):<br />
- FAMOS (Floating gate Avalanche injection MOS),<br />
- FLOTOX (FLOating gate Tunnel Oxid)e.<br />
Circuitele integrate care se folosesc in constructia calculatoreor se plaseaza in categoriile:<br />
standard, specifice aplicatiilor ( ASIC - Application Specific Integrated Circuits ) si<br />
programabile/configurabile.<br />
La rindul lor circuitele ASIC se impart in:<br />
• Circuite personalizate la cerere ( Semi-Custom ):<br />
- Circuite configurabile ( Programmable Logic Devices ),<br />
- Circuite predifuzate ( Gate Arrays ).<br />
• Circuite realizate la comanda ( Custom ):<br />
- Circuite precaracterizate ( Standard Cells ),<br />
- Circuite realizate complet la cerere ( Full Custom ).<br />
Se aminteste ca tranzistorul a fost inventat in anul 1947 si ca primele exemplare ocupau o<br />
suprafata de 3,5 mm 2 . La sfirsitul anilor 50 a aparut circuitul integrat care, grupand pe<br />
aceeasi pastila mai multi tranzistori, a avut o evolutie spectaculoasa in sensul dublarii<br />
numarului de componente pe pastila, la fiecare 18 luni. Aceasta s-a datorat in primul rand<br />
numeroaselor perfectionari ale proceselor tehnologice, care permit rezolutii de ordinul a<br />
2,5µm – 0,18 µm.<br />
In continuare se vor da unele date <strong>privind</strong> tehnologiile circuitelor VLSI, in general, evolutia<br />
memoriilor si a procesoarelor.
Reprezentarea sistemelor de calcul pe niveluri ierarhice.<br />
Nivelul PMS Structuri: retele, sisteme de procesoare multiple,<br />
(Processor, calculatoare.<br />
Memory Componente: procesoare, memorii, comutatoare,<br />
Switches ) traductoare, operatori asupra datelor,<br />
legaturi, controlere.<br />
Nivelul Subnivelul Aplicatii Structuri: pachete statis tice, ecuatii cu derivate<br />
Progra- Limbajelor partiale, simulatoare de sisteme<br />
melor. evoluate. energetice.<br />
Componente: biblioteci matemetice, rutine, rutine de<br />
formatare.<br />
Rutine Structuri: functii matematice, pachete pentru<br />
aplicative aplicatii grafice.<br />
Componente: subrutine, alocatoare de memorie.<br />
Pachete de Structuri: alocatoare de memorie, rutine de I/E,<br />
asistenta in sisteme de fisiere.<br />
in timpul Componente: apeluri ale sistemului de operare.<br />
executiei.<br />
Sisteme Structuri: planificatoare, alocatoare, comunicatii.<br />
Operare Componente: subrutine, corutine, programe.<br />
Subnivelul Structuri: set de instructiuni.<br />
ISP Componente: stare memorie, stare procesor, calcul<br />
(Instruction adresa efectiva, decodificare<br />
Set Processor) instructiuni, executie instructiuni.<br />
Nivelul Subnivelul Unitate Micropro- Structuri: microprogram, microrutina.<br />
proiec- transferu- de co- gramata Componente: microsecventi ator, memorie<br />
tarii rilor intre manda de microinstructiuni.<br />
registre<br />
Conven- Structuri: secventiator.<br />
tionala Componente: masini secventiale.<br />
Unitate de executie Structuri: unitate aritmetica, registre<br />
generale.<br />
Componente: registre, operatori asupra<br />
datelor.<br />
Subnivelul Circuite secventiale Structuri: numaratoare, genratoare<br />
circuitelor functionale, registre.<br />
de comuta- Componente: bistabile, latch-uri,linii de<br />
tie. intarziere
Circuite combina- Structuri: codificatoare, decodificatoare,<br />
tionale. operatori asupra datelor.<br />
Componente: porti logice.<br />
Nivelul circuitelor. Structuri: amplificatoare,elemente de intirziere,<br />
orologiu /ceas, porti.<br />
Componente: tranzistoare, relee, rezistente, capaci-<br />
tati.<br />
Bibliografie:<br />
1. A.Petrescu. Calculatoare numerice. Note de curs.1999- 2000-2001, ( site-ul: www.csitsun.pub.ro<br />
si pe suport magnetic).<br />
2. A.Petrescu. I. Francisc, Z. Racovita. Initiere in Structura Calculatoarelor Electronice.<br />
Editura Teora. 1996.<br />
3. A.S. Tanenbaum. Organizarea Structurata a Calculatoarelor. Editura AGORA, 1999.<br />
4. L.N. Vintan. Arhitecturi de Procesoare cu Paralelism la Nivelul Instructiunilor. Editura<br />
Academiei Romane. 2000.<br />
5. D. Grigoras. Calcul Paralel. De la sisteme la programarea aplicatiilor. AGORA. 2000.<br />
6. J. Hennessy, D. Paterson. Computer Architecture. A Quantitative Approach. 2 nd ed.<br />
1996. Morgan Kaufmann Publishers, Inc.<br />
7. Z.F. Baruch. Sisteme de intrare/iesire ale calculatoarelor. Editura Albastra. 2000<br />
8. S.G. Shiva. Computer Design and Architecture. 3 rd Ed. Marcel Dekker Publishing<br />
House. 2000.<br />
9. J. Hennessy, D. Paterson. Computer Organization and Design. The Hardware/Software<br />
Interface. 2 nd ed.. 1998. Morgan Kaufmann Publishers, Inc.<br />
10. R. Baron, L. Higbie. Computer Architecture. 1992. Addison Wesley Publishing<br />
Company.<br />
11. M. Morris Mano, Ch. R. Kime. Logic and Computer Design Fundamentals 2 nd ed.<br />
Prentice Hall International. Inc.<br />
12. David Van den Bout. The Practical XILINX ® Designer Lab Book.Version 1.5, 1999.<br />
Prentice Hall.<br />
13. V..P. Heuring, H. F. Jordan. Computer Systems Design and Architecture. Addison<br />
Wesley Longman, Inc. 1997.
1.2 Elemente introductive <strong>privind</strong> informatia.<br />
Memorarea, regasirea si prelucrarea informatiei reprezinta operatii de baza intilnite in<br />
studiul oricarui capitol al stiintei calculatoarelor.<br />
Din punct de vedere lexicografic, informatia reprezinta cunostintele transmise sau<br />
receptionate, care se refera la circumstante sau fapte particulare.<br />
Sub aspect filosofic informatia se afla in urmatoarea relatie, in raport cu entitatile:<br />
data, cunostinta, intelepciune: data < informatie < cunostinta < intelepciune.<br />
Domeniul ingineriei considera ca informatia inlatura/elimina incertitudinea. Astfel,<br />
informatia nu are nimic de-a face cu cunostinta sau semnificatia. Informatia este, in mod<br />
natural, “ceea ce nu se poate prezice”.<br />
In cadrul procesului edificarii domeniului teoriei informatiei s-au dat si precizat o serie<br />
de definitii formale <strong>privind</strong> continutul informational al unui mesaj ( Hartley - 1928,<br />
Kolmogorov - 1942, Wiener - 1948, Shannon - 1949 ).<br />
Se considera un sistem reprezentand o multime formata din n obiecte, avand proprietatea<br />
ca fiecare obiect poseda o probabilitate independenta pi de aparitie.<br />
Incertitudinea H asociata acestui sistem este definita ca:<br />
n<br />
H = - ∑ pi log2 (pi),<br />
i=1<br />
in timp ce valoarea –H, reprezinta cantitatea de informatie asociata sistemului<br />
Se presupune existenta unei urne cu 8 bile numerotate de la 1 la 8. Probabilitatea de a<br />
extrage o cifra data, in urma unei trageri, este egala cu 1/8. Incertitudinea medie asociata<br />
cu numarul selectat poate fi calculata cu ajutorul formulei de mai sus:<br />
8<br />
H = - ∑ 1/8. log2 (1/8) = - log2 (1/8) = log2 (1/8) = 3 biti.<br />
i=1<br />
Pentru a masura incertitudinea asociata sistemului s-a folosit o unitate de masura numita<br />
bit (binary digit). Un bit este o masura a incertitudinii sau a informatiei asociate unei<br />
conditii cu doua stari: fals/adevarat, inchis/deschis etc. Astfel, atunci cand se afirma ca<br />
rezultatul aruncarii unei monede este “pajura”, s-a comunicat o informatie de: log2(2/1) =<br />
1 bit.
Cantitatea de informatie care se castiga este egala cu cantitatea de incertitudine inlaturata<br />
(in cazul de fata prin aflarea numarului extras din urna).<br />
In situatia numarului selectat din urna s-a calculat ca sunt necesari trei biti de informatie<br />
pentru a afla numarul de pe bila extrasa. Din punctul de vedere al definitiei bitului,<br />
aceasta inseamna ca este permisa punerea a trei intrebari cu raspuns de tipul da - nu,<br />
pentru a cunoaste numarul extras:<br />
n
Legatura dintre mesaj si informatie reprezinta o aplicatie c:<br />
c<br />
M � I,<br />
care asociaza ( pune in corespondenta ) mesajului M, informatia I. Corespondenta c<br />
poarta numele de schema de codificare (cod, regula, de interpretare, cifru , cheie etc. ).<br />
Adesea se pune problema cantitatii medii de informatie continuta intr-un sir de date,<br />
reprezentand M mesaje. Aceasta poarta numele de entropie si poate fi calculata cu<br />
ajutorul urmatoarei formule:<br />
unde:<br />
N<br />
entropia = ∑ (Mi/N).log2(N/Mi),<br />
i=1<br />
- (Mi/N) reprezinta probabilitatea mesajului i, iar<br />
- log2(N/Mi) constituie informatia din mesajul i.<br />
Codificarea informatiei.<br />
Codificarea informatiei se refera la reprezentarea acesteia. Gasirea unei codificari<br />
corespunzatoare si eficiente constituie o problema extrem de importanta intrucat aceasta<br />
are un impact pe o serie de niveluri.<br />
Astfel, la nivelul echipamentelor de calcul si memorare, are influenta asupra numarului<br />
de componente. In ceea ce priveste nivelul eficientei, influenta se refera la numarul de biti<br />
utilizati. Sunt influentate, de asemenea, nivelul fiabilitatii, sub aspectul zgomotului si<br />
nivelul securitatii, in ceea ce priveste criptarea.<br />
Codificarea cu lungime fixa.<br />
In cazul in care evenimentele au aceeasi probabilitate de aparitie, se pot utiliza codurile<br />
de lungime fixa. Un asemenea cod trebuie sa foloseasca un numar suficient de biti pentru<br />
a putea reprezenta continutul informational. De exemplu, in cazul cifrelor zecimale<br />
{0,1,2,3,4,5,6,7,8,9} se foloseste un cod de 4 biti (binar-zecimal), denumit , in engleza,<br />
BCD (Binary Coded Decimal). Lungimea codului (numarul de biti) rezulta din<br />
urmatoarea expresie:
10<br />
∑ (1/10).log2(10) = 3,322 < 4 biti<br />
i=1<br />
De asemenea, pentru cele 84 de caractere din Engleza: {A-Z (26), a-z (26), 0-9 (10),<br />
punctuatie (9), matematice(9), financiare (4)} se foloseste un cod binar de 7 biti denumit<br />
ASCII (American Standard Code for Information Interchange). Lungimea codului ASCII<br />
rezulta din expresia de mai jos:<br />
84<br />
∑ (1/84).log2(84)= 6,392 < 7 biti.<br />
i=1<br />
In continuare se vor prezenta exemple de codificari de lungime fixa.<br />
Codificarea numerelor.<br />
Numerele pozitve se pot codifica direct, sub forma unei secvente de biti, carora li se<br />
asociaza ponderi diferite. De la dreapta la stanga, aceste ponderi reprezinta, in ordine<br />
crescatoare, puteri ale lui 2. Valoarea v a unui numar de n biti, codificat in acest mod,<br />
este data de expresia:<br />
n-1<br />
v = ∑ 2 i .bi<br />
i=0<br />
unde bi constituie rangul i (bitul i) al reprezentarii.<br />
Pentru numarul binar:<br />
2 11 2 10 2 9 2 8 2 7 2 6 2 5 2 4 2 3 2 2 2 1 2 0<br />
0<br />
1<br />
1 0<br />
1 0<br />
se va obtine valoarea 1721 in zecimal.<br />
1 1<br />
1 0<br />
0 1<br />
Adesea, reprezentarea numerelor in binar este greoaie, datorita numarului mare de<br />
ranguri. Reprezentari cu lungime mai scurta se obtin in cazul utilizarii unor baze, care<br />
sunt puteri ale lui 2. De exemplu: 8 si 16. In aceste situatii trecerea de la reprezentarea<br />
binara la cea octala/hexazecimala si invers se realizeaza mecanic, impartind numarul
inar, de la dreapta la stanga, in triade/tetrade binare, carora li se pun in corespondenta<br />
cifrele octale/hexazecimale corespunzatoare.<br />
Baza 8 Baza 16<br />
Triada binara Cifra octala Tetrada binara cifra hexa. Tetrada binara cifra hexa.<br />
000 - 0 0000 - 0 1000 - 8<br />
001 - 1 0001 - 1 1001 - 9<br />
010 - 2 0010 - 2 1010 - a<br />
011 - 3 0011 - 3 1011 - b<br />
100 - 4 0100 - 4 1100 - c<br />
101 - 5 0101 - 5 1101 - d<br />
110 - 6 0110 - 6 1110 - e<br />
111 - 7 0111 - 7 1111 - f<br />
Astfel, numarul binar:<br />
011010111001(2) va avea urmatoarele reprezentari:<br />
octala:<br />
3271(8) si<br />
hexazecimala:<br />
6b9(16),<br />
care sunt de trei ori si, respectiv, de patru ori mai scurte.<br />
Numere cu semn, reprezentarea in complementul fata de 2.<br />
Un numar cu semn, in reprezentarea pe n biti, complementara fata de 2, va avea<br />
urmatoarea structura:<br />
-2 n-1<br />
2 n-2<br />
…. ….<br />
n biti<br />
….<br />
bit de semn Gama de reprezentare:[ -2 n-1 , 2 n-1 -1] virgula zecimala<br />
(0 pentru ≥ 0,<br />
1 pentru < 0)<br />
Astfel, numerele zecimale 47(10) si –47(10), vor avea urmatoarele reprezentari binare, pe 8<br />
biti, in complementul fata de 2:<br />
47(10) 00101111(2)<br />
-47(10) 11010001(2)<br />
2 3<br />
2 2<br />
2 1<br />
2 0
Reprezentarea numerelor intregi cu semn, in complementul fata de 2, permite utilizarea<br />
aceleiasi proceduri mod 2 n , atat pentru adunare, cat si pentru scadere. De asemenea,<br />
procedura se utilizeaza si in cazul numerelor fara semn.<br />
Deplasand virgula zecimala spre stanga, se pot reprezenta si numerele fractionare, ca in<br />
exemplul urmator:<br />
1101,0001 = -2 3 + 2 2 + 2 0 + 2 -4 = -8 + 4 + 1 + 0,0625 = -2,9357<br />
Codificarea cu lungime variabila.<br />
In cazul unor evenimente cu probabilitati diferite de aparitie, se vor folosi secvente mai<br />
scurte pentru codificarea evenimentelor cu probabilitati mari de aparitie, in timp ce<br />
pentru codificarea evenimentelor cu probabilitati mici de aparitie se vor folosi secvente<br />
mai lungi.<br />
Exemplul 1.<br />
Se considera 4 evenimente: A, B, C, D, cu probabilitatile de aparitie si cu codurile<br />
asociate, conform tabelei de mai jos:<br />
Eveniment A B C D<br />
Prob. aparitie (pi) 1/2 1/4 1/8 1/8<br />
Codificare 0 11 100 101<br />
Informatia medie = (0,5).(1) + (0,25).(2) + (2).(0,125).(3) = 1,750 biti<br />
Transmiterea informatiei <strong>privind</strong> 1000 de evenimente necesita, in medie, 1750 biti.<br />
O schema de decodificare a unui mesaj ce contine codurile unei secvente de evenimente<br />
A, C, D, A, B, C etc. se conformeaza urmatoarei structuri arborescente:<br />
0 1<br />
A 0 1<br />
0 1 B<br />
C D
Pentru a realiza o codificare mai efeicienta, in mod current, se codifica secvente de<br />
evenimente si nu evenimente individuale. Aceasta abordare este intalnita in algoritmii de<br />
compresie a fisierelor.<br />
Exemplul 2.<br />
In cadrul acestui nou exemplu se considera suma a doua zaruri, in sensul evaluarii<br />
continutului de informatie existent in suma obtinuta la o aruncare. Rezultatele inregistrate<br />
in cadrul mai multor aruncari au probabilitati diferite. Posibilitatile de obtinere a<br />
diferitelor sume sunt prezentate mai jos:<br />
Informatia medie, la o aruncare, furnizata de suma a doua zaruri este urmatoare:<br />
12 12<br />
imed = ∑ (Mj/N).log2(N/Mj) = ∑ (pj).log2(1/pj) = 3,275 biti.<br />
j=2 j=2<br />
In continuare, se pune problema codificarii sumelor obtinute in cadrul aruncarilor a<br />
doua zaruri.<br />
Cel mai mare intreg dupa 3,274 este 4. Astfel, cu 4 biti, se pot codifica cele 11 valori ale<br />
sumelor. Vor mai ramane neutilizate 5 coduri, corespunzatoare lui 0, 1, 13, 14, si 15.<br />
Se pune problema daca exista o solutie de codificare mai buna?<br />
Avand in vedere continuturile informationale diferite, ale diferitelor combinatii obtinute<br />
la aruncarea zarurilor, se poate recurge la coduri de lungime diferita. Astfel, se poate<br />
construi un arbore binar, selectand recursiv cele doua simboluri cu cea mai mica
probabilitae, combinandu-le apoi intr-un nod si inserand acest nod ca un nou simbol a<br />
carui probabilitate de aparitie este egala cu suma probabilitatilor celor doi copii. Procesul<br />
se continua pana cand se ajunge la un singur simbol.<br />
Rezultatul acestei proceduri este arborele reprezentat mai jos, in cadrul caruia au fost<br />
atribuite codificari fiecarui smbol prin etichetarea fiecarui copil din extrema dreapta cu<br />
“1” si a fiecarui copil din extrema stanga cu ”0”.<br />
Codificarea pentru fiecare simbol particular se obtine prin parcurgerea arborelui pe o<br />
cale ce porneste de la radacina acestuia pana la simbolul care intereseaza. Aceasta forma<br />
de codificare cu lungime variabila poarta numele de codificare Huffman.<br />
Eficienta codificarii.<br />
Eficienta unei metode de codificare poate fi masurata prin diferenta intre continutul<br />
informational (entropia) al unui sir de simboluri si dimensiunea medie a codului.<br />
Dimensiunea medie a codului stabilit pentru sumele obtinute la aruncarea a doua zaruri<br />
se calculeaza astfel:<br />
dmed = (1/36).5 + (2/36).4 + (3/36).3 + (4/36).3 + (5/36).3 + (6/36).3 +<br />
+ (5/36).3 + (4/36).3 + (3/36).4 + (2/36).4 + (1/36).5 = 3,306<br />
Rezultatul obtinut: dmed = 3,306 se apropie destul de mult de imed = 3,275.<br />
In continuare se pune problema gasirii unor metode si mai eficiente de codificare.
Consideratii <strong>privind</strong> codificarea.<br />
Schemele de codificare, care isi propun sa corespunda continutului informational al unei<br />
secvente de date, se bazeaza pe reducerea redundantei. Acestea sunt in esenta tehnici de<br />
compresie a datelor.<br />
In multe cazuri insa se urmareste cresterea redundantei in vederea cresterii rezistentei<br />
(coduri detectoare si corectoare de erori)la zgomot a sirului de date sau a simplificarii<br />
manipularii datelor, prin stabilirea unor coduri de lungime fixa.<br />
Detectarea si corectarea erorilor.<br />
Se presupune ca se doreste transmisia sigura a rezultatului aruncarii unei monede, ceea ce<br />
corespunde unei informatii de un bit.. Daca pe parcursul transmisiei a aparut o eroare de<br />
un singur bit, un rezultat “0” va fi receptionat ca “1” si invers. Ambele coduri sunt valide<br />
si nu se poate stabili , la receptie, faptul ca, in timpul transmisiei, a aparut o eroare.<br />
In acest context se pune problema numarului de pozitii binare in cadrul carora bitii<br />
corespunzatori a doua coduri valide, de aceeasi lungime, sunt diferiti. Aceasta mai poarta<br />
numele de distanta Hamming. Astfel, modificarea unui bit, intr-un rang dat al unui cod,<br />
sa nu-l transforme pe acesta intr-un alt cod valid. In exemplul privitor la rezultatul<br />
aruncarii unei monede si al comunicarii acestuia, distanta Hamming intre cele doua<br />
coduri este egala cu unu.<br />
Detectarea erorii.<br />
In mod natural se doreste un sistem de codificare in cadrul careia o eroare de un singur<br />
bit sa nu produca un alt cod valid. Pentru a asigura detectarea unei erori de un singur bit ,<br />
in cadrul unui cod de lungime oarecare, se adauga un bit de paritate. In acest mod<br />
distanta Hamming minima intre doua coduri valide devine egala cu 2. Spre exemplificare<br />
se prezinta mai jos o diagrama de codificare a rezultaului aruncarii unei monede, folosind<br />
un bit suplimentar de paritate para, ceea ce inseamna ca bitul suplimentar va fi astfel ales<br />
incat numarul total de unitati din cuvantul cod sa fie par.
Daca D este distanta minima Hamming intre doua cuvinte-cod, se pot detecta pana la<br />
(D –1) erori la nivel de bit.<br />
Detectarea erorilor.<br />
Marind distanta Hamming intre doua cuvinte-cod valide la 3, se poate garanta ca<br />
perechile de cuvinte-cod, care se obtin in cazul unei erori de un bit, nu se suprapun. In<br />
cazul in care se detecteaza o eroare, aceasta se poate corecta intrucat pozitia bitului eronat<br />
poate fi localizata. Aceasta rezulta din diagrama- hipercub de mai jos.<br />
Daca D este distanta Hamming minima intre doua cuvinte-cod valide, se pot corecta<br />
⎣(D-1)/⎦ biti eronati.<br />
Intrebari:<br />
- se pot detecta in mod sigur doi biti eronati in timp ce se corecteaza o eroare de un<br />
bit?<br />
- intotdeauna este necesara triplarea numarului de biti?
Schema de codificare cu 4 biti.<br />
Prin folosirea a 4 biti se pot genera 8 codificari cu distanta Hamming egala cu 1, ceea ce<br />
permite detectarea unei erori la nivelul unui singur bit. Astfel, se pot codifica 3 biti de<br />
informatie cu 4 biti. Formatele de biti care contin o eroare difera de formatele codurilor<br />
valide prin paritate, adica numarul de unitati este impar. Aceasta rezulta din diagrama de<br />
mai jos, care constituie reprezentarea in plan a hipercubului corespunzator codificarii.<br />
Din pacate schema de codificare cu 4 biti nu este mai buna decat schema de codificare cu<br />
3 biti, din punctual de vedere al numarului de coduri separate la o distanta Hamming<br />
egala cu 3. Se pot gasi insa doua codificari cu distanta Hamming egala cu 4, ceea ce<br />
permite detectarea a doua erori de cate un bit si corectia unei singure erori de un bit.<br />
Dupa cum se vede din diagrama de mai sus exista doar doua coduri care sunt separate<br />
printr-o distanta Hamming egala cu 3.<br />
Schema de codificare cu 5 biti.<br />
Pentru a obtine mai mult de doua coduri separate printr-o distanta Hamming egala cu 3,<br />
trebuie utilizati 5 biti pentru codificare.
Mai jos se prezinta 5 coduri {0000, 01111, 10101, 1010} separate printr-o distanta<br />
Hamming ≤ 3.<br />
In aceste conditii se poate corecta o eroare de 1 bit si se pot detecta unele dintre erorile de<br />
2 biti (dar nu toate).<br />
Aplicatiile teoriei codurilor.<br />
Codificarea permite solutionarea multor probleme:<br />
- detectarea erorilor multi-bit: folosind verificarea redundantei ciclice (CRC);<br />
- corectarea erorilor in rafala: coduri reed-Solomon;<br />
- imbunatatirea raportului S/Z: codificari/decodificari Viterbi, PRML;<br />
In practica se utilizeaza combinatii de coduri diferite. Spre exemplu, in canalul numeric<br />
satelit-receptor (DBS TV):
3. Elemente introductive <strong>privind</strong> operarea si organizarea unui sistem numeric.<br />
Un calculator numeric este constituit dintr-un ansamblu de resurse fizice ( hardware ) si<br />
de programe de sistem ( software de baza ), care asigura prelucrarea automata a<br />
informatiilor, in conformitate cu algoritmii specificati de catre utilizator, prin programele<br />
de aplicatii ( software de aplicatii - utilizator ).<br />
Conform principiilor stabilite de John von Neumann un calculator trebuie sa posede<br />
urmatoarele elemente:<br />
- un mediu de intrare, pentru instructiuni si date ( operanzi );<br />
- o memorie in care se stocheaza programul, datele initiale, rezultatele partiale si finale;<br />
- un ansamblu de prelucrare, capabil sa efectueze operatii aritmetice si logice, in<br />
conformitate cu un algoritm dat, specificat prin program;<br />
- un mediu de iesire, pentru extragerea rezultatelor si prezentarea acestora intr-o forma<br />
accesibila utilizatorului;<br />
- un element de decizie care, pe baza rezultatelor partiale obtinute pe parcursul<br />
prelucrarii, va selecta una din optiunile posibile de continuare a calculelor.<br />
Programul elaborat, pentru un calculator numeric, reprezinta descrierea algoritmului de<br />
rezolvare a unei probleme ( clase de probleme ) date, cu ajutorul instructiunilor pe care le<br />
poate executa calculatorul respectiv.<br />
Conform propunerii lui von Neumann, datele si programul sunt plasate in aceeasi<br />
memorie, ceea ce a permis, la calculatoarele din generatia I-a, efectuarea unor operatii<br />
aritmetice sau logice asupra unor campuri din instructiune, in vederea reducerii<br />
dimensiunilor programelor.<br />
Functionarea calculatorului are un caracter secvential, constand in citiri si executii<br />
succesive ale instructiunilor programului.<br />
Intr-un calculator pot fi evidentiate, pe parcursul executiei unui program, doua fluxuri de<br />
informatii: fluxul datelor, care se prelucreaza, si fluxul instructiunilor, care controleaza,<br />
comanda procesul de calcul.<br />
Calculatoarele bazate pe principiile amintite mai sus se numesc calculatoare de tip von<br />
Neumann sau conventionale, fiind comandate de fluxul de instructiuni.
In prezent se studiaza si realizeaza sub forma de modele de laborator noi tipuri de<br />
calculatoare, neconventionale, bazate pe fluxul de date si fluxul de cereri.<br />
In primul caz sunt amorsate, la un moment dat, toate operatiile din program pentru care<br />
sunt disponibile datele implicate.<br />
In al doilea caz necesitatea unui rezultat activeaza toate operatiile de calcul asociate.<br />
Intrucat un calculator numeric este folosit, in esenta, pentru implementarea automata a<br />
unui algoritm, se reaminteste ca un algoritm reprezinta un set finit de reguli, care<br />
precizeaza o secventa de operatii, pentru solutionarea unei clase date de probleme.<br />
Un algoritm poseda cinci elemente mai importante:<br />
- caracter finit: trebuie sa se termine dupa un numar finit de pasi;<br />
- caracter determinist: fiecare pas al unui algoritm trebuie definit in mod precis, actiunile<br />
care se executa trebuie sa fie specificate riguros, fara ambiguitati, pentru fiecare caz.<br />
- intrare: un algoritm are una sau mai multe intrari, reprezentind datele initiale;<br />
- iesire: un algoritm are una sau mai multe iesiri, care reprezinta rezultatele, aflate intr-o<br />
anumita relatie cu intrarile;<br />
- eficacitate: un algoritm trebuie sa se execute exact si intr-un interval finit de timp.<br />
Printre altele, analiza algoritmilor are ca scop determinarea performantelor acestora, in<br />
sensul ca, daca pentru o problema exista mai multi algoritmi, trebuie sa se decida care din<br />
ei este mai potrivit, sub aspectul numarului de operatii, al spatiului de memorie necesare<br />
si, uneori, al puterii consumate, pentru implementare.<br />
Teoria algoritmilor trateaza, in principal, problemele existentei sau nonexistentei<br />
algoritmilor eficienti,pentru efectuarea unor calcule particulare.<br />
Inainte de a incerca o descriere formala a unei metode de calcul se vor preciza unele<br />
notiuni:<br />
- variabilele de stare reprezinta marimi primare, care presupun unele valori bine definite<br />
(ele pot reprezenta parametrii unui sistem fizic);<br />
- un ansamblu de variabile de stare, in care fiecare poarta un nume, reprezinta multimea<br />
variabilelor de stare;<br />
- o atribuire data de valori pentru toate variabilele multimii variabilelor de stare poarta<br />
numele de stare a multimii sau o stare presupune o valoare data fiecarei variabile de stare;
- ansamblul tuturor starilor posibile, pentru o multime data de variabile de stare,<br />
formeaza spatiul starilor pentru acea multime;<br />
- un calcul in spatiul starilor reprezinta o secventa de stari in acel spatiu, primul element<br />
al secventei reprezinta starea initiala, iar ultimul constituie starea finala.<br />
Din punct de vedere formal, metoda de calcul reprezinta un cuadruplu:<br />
< Q, I, E, f >,<br />
in care s-au facut urmatoarele notatii:<br />
Q -multimea starilor calculului,<br />
I - multimea intrarilor,<br />
E -multimea iesirilor,<br />
f - multimea functiilor de calcul, definite in Q.<br />
In plus:<br />
I⊂ Q si E⊂ Q,<br />
iar pentru ∀ q, q ⊂ E , f trebuie sa lase nemodificate elementele multimii E, adica:<br />
f(q) = q,<br />
Fiecare intrare x in multimea I defineste o secventa de calcul:<br />
x0, x1, x2,..,xk,...., dupa cum urmeaza:<br />
x0 = x si x(k+1) = f(xk), pentru k > 0.<br />
Se poate spune ca secventa de calcul se termina in k pasi, daca k este cel mai mic intreg<br />
pentru care xk este in E. In acest caz se spune ca intrarea x produce iesirea xk.<br />
Se observa ca daca xk ⊂ E, la fel si x(k+1) ⊂ E, intrucat, conform definitiei date mai sus,<br />
x(k+1) = xk.<br />
Unele secvente de calcul pot avea o lungime infinita.<br />
Un algoritm reprezinta o metoda de calcul care se termina dupa un numar finit (eventual<br />
foarte mare) de pasi, pentru toate intrarile x ⊂ I.<br />
Exemplu: Algoritmul MAX.<br />
Acest algoritm gaseste elementul cu valoarea cea mai mare al multimii { A(i) },<br />
unde 1 ≤ i ≤ n, si o atribuie iesirii MAX.<br />
In cele ce urmeaza operatorul " " specifica atribuirea unei valori variabilei de stare<br />
din membrul stang, obtinuta prin evaluarea functiei din membrul drept al expresiei.
Se vor folosi doua variabile de stare pentru calcul: xc ( x-curent ), xm (x-maxim ).<br />
ALGORITM: MAX.<br />
intrari: { A(i) }, 1 ≤ i ≤ n,<br />
iesiri: MAX,<br />
var.de stare: { xc, xm }.<br />
f: secventa de calcul:<br />
1. if n < 1 go to STOP<br />
2. if n = 1 then MAX A(1) and go to 9 (STOP)<br />
3. xm A(1); xc A(2);<br />
4. if xm < xc then xm xc<br />
5. xc A(i)<br />
6. i i+1<br />
7. if i > n then MAX xm and go to STOP<br />
8. go to 4<br />
9. STOP<br />
Mecanizarea acestui algoritm presupune existenta unui modul, care dispune de<br />
urmatoarele resurse hardware:<br />
- RC: registru in care se aduce valoarea curenta A(i);<br />
- RM: registru in care se plaseaza valoarea curenta maxima A(j);<br />
- N si UNU: registre in care se pastreaza constantele n si 1;<br />
- CNT: contor pentru indexul i;<br />
- RD: registru in care se plaseaza rezultatul scaderii;<br />
- MAX: registru de iesire ( coincide ca nume cu iesirea MAX );<br />
- START: bistabil in care se inregistreaza comanda externa start;<br />
- SUM/DIF: unitate logica combinationala, care efectueaza adunarea/scaderea;<br />
- un automat cu 10 stari distincte.<br />
Se considera ca intrarile A(i) sunt furnizate din exterior in mod curent si ca nu sunt<br />
stocate in modul. Astfel, se pot observa, in continuare, unele diferente nesemnificative<br />
functional in implementarea fizica a algoritmului, in raport cu prezentarea lui teoretica.<br />
Schema care va efectua automat algoritmul va purta numele MODULE: MAX si va<br />
opera cu numere binare intregi si pozitive.
Urmeaza descrierea modulului si a modului sau de operare (nu se specifica lungimea<br />
operanzilor ).<br />
Operatorul " " specifica fortarea valorii numerice, obtinuta ca urmare a evaluarii<br />
termenul din dreapta al expresiei, in registrul din termenul din stanga al expresiei.<br />
MODULE: MAX<br />
INTRARI: A(i); start; RESET; n;<br />
IESIRI: MAX;<br />
MEMORII: RC; RM; N; UNU; CNT; RD; MAX; START /* Registre care corespund<br />
/* variabilelor de stare, atat pentru unitatea de executie, cat si pentru unitatea de comanda<br />
1. if (START = 0) then go to 1 /* cicleaza pentru START<br />
2. RC 0; RD 0; RM 0; N n; UNU 1; CNT 1;<br />
START 0 /* Initializare<br />
3. if N = 0 then go to 1<br />
4. RC A(CNT)<br />
5. RD DIF(RC,RM) /* DIF(RC,RM) = RC - RM<br />
6. if RD > 0 then RM RC<br />
7. CNT SUM(CNT,UNU) /* SUM(CNT,UNU) = CNT + UNU<br />
8. RD DIF(N,CNT) /* DIF(N,CNT) = N - CNT<br />
9. if RD < 0 then MAX RM and go to 1<br />
10. go to 4<br />
ENDSEQ /* Sfarsit secventa<br />
if RESET = 1 then go to 1 /*Operatia RESET indiferent de stadiul executiei in<br />
/*secventa<br />
if start = 1 then START = 1 /* Fortarea in 1 a bistabilului START, la aparitia intrarii<br />
/*start = 1<br />
ENDMODULE /* Sfarsitul descrierii modulului<br />
Implementarea fizica a modulului presupune existenta urmatoarelor elemente:<br />
- un ceas, care asigura sincronizarea sistemului;<br />
- o intrare start, sincrona cu ceasul, care este stocata temporar intr-un bistabil (START);<br />
- o intrare asincrona RESET,care forteaza sistemul instarea 1.
Intrarea RESET este indicata la sfirsitul descrierii secventei de lucru, deoarece se aplica<br />
asincron.<br />
Descrierea secventei se termina cu marcajul ENDSEQ, modulul fiind cuprins intre<br />
numele MODULE si marcajul ENDMODULE.<br />
Stabilirea schemei modulului presupune evidentierea unitatii de executie, in care se<br />
prelucreaza fluxul de date, si a unitatii de comanda, care asigura fluxul de control,<br />
mentionindu-se resursele hardware asociate.<br />
Prima iteratie a procesului de realizarea/”mecanizare” a algoritmului MAX este data mai<br />
jos:<br />
A[i]<br />
n<br />
RC SUM/DIF N<br />
RM RD UNU<br />
MAX CNT<br />
RESET Ceas RD … ….. Comenzi<br />
start<br />
START<br />
…… AUTOMAT<br />
DE<br />
COMANDA<br />
CEAS<br />
RESET<br />
Unitatea de Executie<br />
MAX<br />
Unitatea de Comanda
Evolutia automatului din unitatea de comanda poate fi ilustrata cu ajutorul grafului de<br />
mai jos, in care nodurile marcate cu cifre reprezinta starile automatului, iar arcele<br />
orientate marcheaza taranzitiile conditionate/neconditionate.<br />
RESET START=0<br />
1.<br />
start START=1<br />
2.<br />
3.<br />
4.<br />
5.<br />
6.<br />
7.<br />
8.<br />
9.<br />
10<br />
N ≠ 0<br />
N = 0<br />
RD ≥ 0<br />
RD < 0
Diagrama de stari prezentata mai sus se utilizeaza pentru proiectarea automatului de<br />
comanda, care asigura fluxul de control necesar derularii algoritmului MAX.<br />
Procesul de proiectare a sistemului numeric, corespunzator algoritmului dat, necesita mai<br />
multe etape, care vor fi ilustrate in cadrul cursului Calculatoare Numerice.<br />
Masina Turing. In literatura de specialitate consacrata studierii posibilitatilor de<br />
mecanizare a algoritmilor Masina Turing joaca un rol important.<br />
Masina Turing se caracterizeaza prin doua principii de baza:<br />
- descompunerea in operatii elementare a executiei unui algoritm este dusa la limita,<br />
de exemplu adunare se implementeaza prin incrementari repetate;<br />
- memoria masinii se prezinta sub forma unei benzi nelimitate, formata din<br />
compartimente succesive in care se poate afla un simbol, reprezentind o informatie;<br />
- conceptul de memorie infinita este pur matematic.<br />
Masina opereaza asupra informatiilor reprezentate prin simboluri luate dintr-un alfabet<br />
finit: a0, a1, a2,....,ai, exterior masinii. Printre simboluri se afla un simbol special V, care<br />
indica lipsa unei informatii.<br />
Fiecare compartiment al benzii, la un moment dat, contine un singur simbol.<br />
Functionarea are loc in cicluri succesive, tratandu-se la fiecare pas cate un singur simbol.<br />
Masina poseda un cod de instructiuni, specificat intr-un alfabet intern: F0, F1, F2,....,Fp.<br />
O instructiune defineste in fiecare ciclu starea dispozitivului de prelucrare. Unul din<br />
codurile de instructiuni, notat cu A, specifica oprirea masinii.<br />
In fiecare ciclu un simbol de pe banda este prelucrat pe baza unui operator Fi.<br />
In afara benzii infinite masina Turing mai contine:<br />
- un element de executie si comanda: operatorul Ω,<br />
- o celula de memorie, M, in care se stocheaza instructiunea ( functia ) urmatoare,<br />
- un dispozitiv, d, de antrenare a benzii in ambele sensuri, prin fata unui cap de<br />
citire/scriere; comanda de antrenare a benzii este codificata dupa cum urmeaza:<br />
"+" deplasare la stanga,<br />
"-" deplasare la dreapta,<br />
"0" fara deplasare.<br />
Schema bloc a masinii Turing este data mai jos:
Informatia de prelucrat Instructiunea curenta<br />
aI ai Fi<br />
.<br />
Cap citire/<br />
scriere<br />
. aj d Fj<br />
. Informatia prelucrata Instructiunea urmatoare<br />
. Banda infinita/Memoria<br />
.<br />
. -<br />
d<br />
0 Comanda deplasarii<br />
+<br />
Functionare. Incepand cu o informatie ai, de pe banda, masina intra in functiune. Daca<br />
operarea are loc in timp finit, adica se va intalni simbolul A, masina va prelucra<br />
informatia ai. In caz contrar, operarea are loc fara oprire si masina nu poate trata<br />
informatia respectiva.<br />
Operarea masinii Turing este definita prin tabelul de corespondenta intre dubletii de<br />
intrare < ai, Fi > si tripletii de iesire < aj, Fj, d >. In fiecare ciclu de lucru operatorul Ω<br />
efectueaza transformarea:<br />
< ai, Fi > < aj, Fj, d >,<br />
simbolul ai fiind inlocuit cu simbolul aj.<br />
Banda este deplasata conform codului simbolului d, iar Fj este stocat in memoria M, pana<br />
in ciclul urmator.<br />
Operatorul Ω M<br />
In vederea executiei, un algoritm trebuie descris sub forma urmatorului tablou:
Fi<br />
ai aj Fj d<br />
Structura acestui tablou este continuta in organizarea interna a operatorului Ω. Operarea<br />
poate fi amorsata cunoscand continutul celulei de pe banda, plasata in fata capului de<br />
citire/scriere, si instructiunea initiala.<br />
Pentru exemplificare, se va considera cazul unui numar zecimal n care va fi incrementat.<br />
Se presupune ca pe banda se afla, in celule succesive, cifrele unui numar zecimal,<br />
incadrate la stanga si la dreapta de simbolul V.Algoritmul consta in examinarea cifrelor<br />
incepand de la dreapta.<br />
Se incrementeaza prima cifra la dreapta si procesul se opreste daca rezultatul este diferit<br />
de zero. In cazul in care rezultatul este zero ( depaseste 9 ) se mai efectueaza o deplasare<br />
a benzii spre dreapta, incrementandu-se noua cifra.<br />
Alfabetul extern al masinii consta in 10 cifre zecimale si din simbolul vid V.<br />
Alfabetul instructiunilor Fi contine functia F, care asigura incrementarea si functia A<br />
care comanda oprirea.<br />
Tabelul de functionare este urmatorul<br />
Informatia ai Instructiunea Fi<br />
0 1 A 0<br />
1 2 A 0<br />
2 3 A 0<br />
3 4 A 0<br />
4 5 A 0<br />
5 6 A 0<br />
6 7 A 0<br />
7 8 A 0<br />
8 9 A 0<br />
9 0 F -<br />
V 1 A 0
In cazul cifrelor 0 – 8, are loc incremntarea si oprirea masinii, iar in cazul cifrei 9<br />
procesul continua prin incrementarea simbolului si propagarea transportului, cu<br />
deplasarea benzii spre dreapta si incrementarea urmatorului simbol. Daca urmatorul<br />
simbol este din gama 0 - 9 situatia este aceeasi. Daca simbolul este V, are loc inlocuirea<br />
lui cu 1 si masina se opreste.<br />
Concluzii. Masina Turing reprezinta cea mai simpla entitate care se poate imagina in<br />
vederea prelucrarii automate a informatiei.<br />
In masina Turing se pot regasi o serie de elemente comune cu calculatoarele numerice:<br />
- codificarea informatiei; exista doua limbaje/coduri independente: limbajul extern,<br />
pentru codificarea informatiilor manipulate de catre masina, si limbajul propriu al<br />
instructiunilor/functiilor masinii;<br />
- functionarea automata a masinii se bazeaza pe un set limitat de instructiuni/functii;<br />
- operarea masinii are un caracter secvential, executia instructiunii curente este insotita<br />
de pregatirea executiei operatiei urmatoare;<br />
- executia unui algoritm de catre masina se traduce prin examinarea unui tablou care<br />
contine toate situatiile posibile, ceea ce corespunde unui program cablat, reprezentand un<br />
algoritm independent de informatia care se trateaza;<br />
- unele informatii de baza pot avea un caracter conditional, evenimentul urmator va<br />
depinde de rezultatul operatiei curente;<br />
- memoria M este ireductibila si aminteste contorul programului/registrul instructiunii<br />
din calculatoarele conventionale;<br />
- masina Turing are un program fix; pentru a-l modifica trebuie reconstruita masina.<br />
Masina Turing nu are un caracter universal. Pentru a deveni universala trebuie sa<br />
indeplineasca urmatoarele conditii:<br />
- sa accepte toate alfabetele, conditie usor de realizat daca alfabetele se codifica binar, iar<br />
masina va trata toate codurile binare;<br />
- sa aibe posibilitatea de a i se introduce din exterior un tabel de functionare, pentru a<br />
executa un algoritm dat, adica un program,ceea ce caracterizeaza masina von Neumann.
4. Modalitati de reprezentare a calculatoarelor.<br />
Un calculator poate fi examinat, atat subaspect functional, cat si structural.<br />
Din punct de vedere functional, sub forma cea mai generala, un calculator se poate reprezenta<br />
prin tripletul:<br />
unde:<br />
< I, E, C >,<br />
- I constituie multimea intrarilor,<br />
- E corespunde multimii iesirilor,<br />
- C ⊂ I x E reprezinta o submultime a produselor carteziene intre elementele multimii I si<br />
elementele multimii E. C realizeaza aplicatii din multimea intrarilor I, in multimea iesirilor E.<br />
Pentru a facilita studiul unui calculator sub aspect functional, adesea se recurge la reprezentarea<br />
lui sub forma unei ierarhii de niveluri imbricate.<br />
Un nivel este constituit din multimea aplicatiilor asupra elementelor multimii de intrare pentru<br />
nivelul dat, cat si asupra elementelor multimilor de intrare si iesire de la nivelul inferior,<br />
imbricat. Aplicatiile de la un nivel dat pot constitui aplicatii si pentru nivelul superior urmator.<br />
O posibilitate de reprezentare este data mai jos unde se pot distinge trei niveluri imbricate:<br />
- aplicatiile/functiile primitive ale masinii de baza implementate in hardware, capabila sa execute<br />
operatii elementare,<br />
- functiile standard/predefinite reprezentate prin nivelul instruciunilor masinii conventionale,<br />
- functiile construite de utilizator, pe baza instructiunilor masinii conventionale, pentru diverse<br />
tipuri de aplicatii concrete.<br />
Nivelul aplicatiilor/functiilor primitive<br />
masina de baza ( realizata in hardware )<br />
capabila sa execute operatii elementare.<br />
Nivelul functiilor standard/predefinite; nivelul<br />
instructiunilor masinii conventionale.<br />
Nivelul functiilor construite de utilizator pe baza functiilor de<br />
la nivelul inferior. Acesta este nivelul aplicativ al calculatorului.
La nivelul masinii conventionale se defineste notiunea de arhitectura a unui calculator numeric<br />
prin cuadruplul:<br />
A = < PI,PE,RG,I ><br />
unde:<br />
PI = { PI0,....,PIi } este multimea porturilor de intrare,<br />
PE = { PE0,....,PEj } este multime porturilor de iesire,<br />
RG = { RG0,....,RGk } este ansamblul registrelor generale din unitatea de executie,<br />
I = { I0,......,Il } este setul instructiunilor calculatorului.<br />
Porturile de intrare si iesire sunt utilizate pentru schimbul de informatii cu mediul inconjurator,<br />
prin intermediul echipamentelorperiferice, in timp ce registrele generale sunt folosite pentru<br />
stocarea diferitelor variabile de stare.<br />
Sub forma unui prim exemplu se prezinta mai jos arhitectura microprocesorului Intel 8080.<br />
7 0 7 0<br />
PI0<br />
……..<br />
PI255<br />
PE0<br />
…….<br />
PE255<br />
7 0<br />
PC<br />
15 0<br />
Atat porturile de intrare PI0,.....,PI255, cat si porturile de iesire PE0,....,PE255 au cate 8 biti.<br />
In cadrul registrelor generale se intalnesc si o serie de registre cu caracter specializat in ceea ce<br />
priveste utilizarea:<br />
- A este registrul acumulator principal, folosit in cele mai multe operatii aritmetice si logice;<br />
- B, C, D, E, H, L sint registre de uz general, desi unele au si utilizari speciale ( H si L sunt<br />
folosite adesea pentru formarea unor adrese de operanzi pe 16 biti );<br />
F<br />
A<br />
B<br />
D<br />
- F este registrul indicatorilor de conditii, furnizati de unitatea de executie dupa fiecare operatie<br />
C<br />
E<br />
H L<br />
SP
( CY - transport in afara rangului de semn, AC - transportauxiliar intretetradele octetului<br />
rezultat, S - semnul rezultatului, Z - indicator de rezultat zero, P - indicator <strong>privind</strong><br />
paritatea numarului de unitati din rezultat ). Pozitiile ocupate de acesti indicatori de conditii in<br />
registrul F sunt date mai jos:<br />
7 6 5 4 3 2 1 0<br />
S 7 Z 6 * 5 AC 4 * 3 P 2 * 1 CY 0<br />
- SP este indicatorul de stiva, care asigura accesul la o structura de tip stiva organizata in<br />
memorie;<br />
- PC contor program, pentru adresarea instructiunilor din memorie.<br />
Lista de instructiuni a microprocesorului 8080 contine 78 de instructiuni.<br />
Un alt exemplu il constituie arhitectura microprocesorului 8086:<br />
15 8 7 0<br />
AX: AH AL Acumulator<br />
BX: BH BL<br />
Registru - baza<br />
CX: CH CL<br />
Registru - contor<br />
DX: DH DL<br />
Registru - date<br />
SP<br />
BP<br />
SI<br />
DI<br />
Indicatorii de conditii<br />
Indicator - stiva<br />
Indicator - baza<br />
Indicator - sursa<br />
Indicator - destinatie<br />
15 12 11 10 9 8 7 6 5 4 3 2 1 0<br />
* * O D I T S Z * A * P * C
Semnificatiile indicatorilor de conditii sint urmatoarele: O - depasira aritmatica, D - directia la<br />
explorarea sirurilor, I - activare/dezactivare intreruperi, T - capcana pentru lucrul pas cu pas, S -<br />
semn, Z - zero, A - transport auxiliar, P - paritate, C - transport in afara rangului de semn.<br />
15 0<br />
15 0<br />
Registrul segmentului de cod<br />
Registrul segmentului de date<br />
Registrul segmentului stivei<br />
Registrul segmentului suplimentar<br />
Indicator de instructiune<br />
(Contorul Programului)<br />
Microprocesorul 8086 mai poseda cate doua tablouri de porturi de intrare/iesire, a cate 65536<br />
octeti fiecare:<br />
65536 Porturi de Intrare organizate pe octe<br />
65536 Porturi de Iesire organizate pe octeti<br />
Nota: Porturile de I/E pot fi organizate si pe cuvinte de 16 biti, la dimensiunea de 32768 cuvinte<br />
fiecare tablou de porturi.<br />
Tinand seama de toate modurile de adresare, microprocesorul 8086 dispune peste 300 de<br />
instructiuni diferite.<br />
CS<br />
SS<br />
DS<br />
ES<br />
IP<br />
PI0, ……………,.PI65536<br />
PE0, ……………,.PE65536<br />
Ultimul exemplu se refera la unitate centrala a calculatorului FELIX 5000, care este vazuta de<br />
catre programator sub formaa 16 registre generale RG0,...,RG15, de cate 32 de biti, si a unui<br />
cuvant dublu de stare program ( PSW Program Status Word ), care stocheaza contorul<br />
program si o serie de indicatori de conditii:
0 31<br />
Registrele Generale<br />
Cuvantul de stare program ( PSW ):<br />
0 ……………………………….8 9 ……………………………………………….31<br />
32 33 34 35 36 37 38 39 40 41<br />
42 43 44 ………….47 48 …………………..54 55 56 57 …63<br />
Campurile PSW au urmatoarele semnificatii:<br />
PC - contor program;<br />
Masti de depasire:<br />
DI,DS - depasire inferioara/superioara in virgula mobila:<br />
- 64 < E < 64 , ( E = exponent );<br />
DD- depasire zecimala;<br />
DB - depasire binara: -1 < n < 1, ( n = mantisa ).<br />
Daca masca este unu atunci derutarea este interzsisa.<br />
Indicatorii de conditii ai rezultatului:<br />
Z = 1 - rezultat nul;<br />
S = 1 - rezultat < 0;<br />
D = 1 - depasire;<br />
C = 1 - transport.<br />
Masti de intrerupere:<br />
IS - masca intreruperi de I/E;<br />
RG0<br />
…………………………………………………..<br />
RG15<br />
DI DS DD DB Z S D C IS IE<br />
CE NP CA ……………………….. MR PM NIT<br />
PC
IE - masca intreruperi externe;<br />
CE - masca intreruperi contor nul.<br />
Daca masca este unu, intreruperea este inhibata si ramane in asteptare.<br />
Nivelul programului:<br />
NP = 0 - unitatea centrala opereaza in modul privilegiat ( poate executa toate instructiunile );<br />
NP = 1 - unitate centrala opereaza in modul normal ( incercarea de a executa instructiunile de<br />
sistem genereaza o derutare ).<br />
Cheia de acces:<br />
CA = cheia de acces la paginile de memorie, de cite 2Ko, protejate prin chei de protectie.<br />
Masca de rotunjire:<br />
MR = 0 - se rotunjeste rezultatul operatiei in virgula mobila;<br />
MR = 1 - rezultatul nu se rotunjeste.<br />
Paritate memorie:<br />
PM = 0 - eroarea de paritate la memorie este tratata prin deru tare;<br />
PM = 1 - eroarea se trateaza prin intrerupere.<br />
Nivelul de intrerupere asociat programului:<br />
NIT- defineste nivelul de prioritate al programului in curs de executie ( pot exista cel mult 128<br />
niveluri de prioritate ).<br />
Calculatorul FELIX 5000 are implementate 102 instructiuni, din 128 instructiuni posibile.<br />
Cunoscand arhitectura unui calculator ( porturile de I/E, setul registrelor generale, indicatorii de<br />
conditii, lista de instruc-tiuni - inclusuiv modurile de calcul pentru adresa efectiva- ) se pot scrie<br />
programe la nivelul masinii conventionale ( in limbaj de asamblare ).<br />
Reprezentarea structurala a unui calculator pleaca de la ideea ca acesta reprezinta un<br />
agregat/sistem, care consta din componente primitive ( primitive functionale ) interconectate<br />
intr-o maniera data, pentru a putea executa operatii specifice, de prelucrare a informatiei.<br />
Componentele se caracterizeaza printr-o serie de atribute, iar atributele - prin valori. Informatia<br />
poate fi masurata in biti, ranguri zecimale, caractere alfanumerice etc. Pe linga functiile<br />
specifice de prelucrare a informatiei, componentele primitive se mai caracterizeaza prin<br />
debit de transfer si capacitate de stocare ale informatiilor.
Aceste caracteristici prezintaimportantapentru studiul sistemelor de calcul cu ajutorul metodelor<br />
cercetarii operationale, in numeroase aplicatii ( multiprogramare, multiprelucrare, timp di-<br />
vizat, retele de calculatoare etc. ), in care intervin congestii, cozi de asteptare, zone tampon<br />
( buffer ), debite de transfer al datelor etc.<br />
Din punct de vedere structural sistemul de calcul poate fi descompus in:<br />
- unitatea de intrare ( UI ),<br />
- unitatea centrala ( UCe ),<br />
- unitatea de iesire ( UE ).<br />
I E<br />
Unitatile de intrare si de iesire asigura legatura sistemului cu echipamentele periferice primare<br />
( traductoarele/ elementele de executie ) care preiau informatia din mediul extern si o furni-<br />
zeaza in sistem sau care executa diferite actiuni asupra mediului extern, ca urmare a interpretarii<br />
informatiei prelucrate de calculator.<br />
Unitatea centrala asigura stocarea programului, a datelor si realizeaza prelucrarea automata a<br />
acestora pe baza interpretariiprogramului dat.<br />
Pentru a putea intelege organizarea si operarea unor sisteme complexe cum sunt calculatoarele<br />
se impune descompunerea lor in unitati functionale mai simple, cu precizarea semnalelor<br />
manipulate si al modului lor de dialog.<br />
Astfel, rafinarea structurii sistemului de calcul evidentiaza in zonele UI si UE:<br />
- subsistemul de intrare ( SI ),<br />
- subsistemul de iesire ( SE ),<br />
- echipamentele periferice de intrare ( EPI ) si echipamentele periferice de iesire ( EPE ).<br />
EPI au rolul de a prelua datele de la diverse traductoare, evenual stocata pe diversi purtatori<br />
fizici, si a le aduce la o forma compatibila cu intrarile SI ( ca naturafizica,format de reprezen-<br />
tare etc ).<br />
UI UCe UE
EPE au functia de a prelua datele prelucrate, furnizate prin SE, si de a le aduce la o forma<br />
corespunzatoare destinatiei: semnale specifice diferitelor elemente de executie ( in cazul<br />
conducerii proceselor tehnologice ) sau de a le plasa pe un anumit suport fizic etc.<br />
Subsistemele de I/E asigura transferul, autonom sau sub controlul UCe, al informatiilor intre<br />
UCe si EP prin realizarea unei adaptari de debite de transfer ( vitezele de operare ale acestora<br />
difera cu mai multe ordine de marime ). Uneori sint implementate si alte operatii: modificarea<br />
formatului de reprezentare a datelor, validari, verificari etc.<br />
La nivelul UCe se pot distinge urmatoarele unitati functionale:<br />
- unitatea de memorie ( UM ),<br />
- unitatea de executie ( UE ),<br />
- unitatea de comanda ( UC ).<br />
Date/<br />
UCe<br />
EPI SI<br />
UM<br />
SE EPE<br />
Instr. Instr. Date<br />
date /adrese<br />
instructiuni<br />
comenzi,<br />
Conditii<br />
Comenzi<br />
conditii/indicatori de stare/stari.<br />
Date Rez. Comenzi<br />
Cond Cond<br />
UE UC<br />
Com<br />
Comenzi
Unitatea de memorie are functia de stocare a datelor initiale, a programului, a rezultatelor<br />
intermediare si finale. In sistemele moderne ea poate opera autonom, atat cu SI/SE, cat si cu<br />
procesorul ( ansamblul unitate de comanda - unitate de executie ). Unitatea de memorie are o<br />
organizare liniara, constand in celule de stocare a informatiei, al caror continut poate fi<br />
manipulat prin specificarea adresei celulei date.<br />
(m-1) 0<br />
Registrul de adrese<br />
m<br />
Memoria<br />
(n-1) 0<br />
Adresa ia valori cuprinse intre 0 si 2 (m-1) unde m este numarul de ranguri binare ale registrului<br />
de adrese.<br />
Adresa i<br />
Unitatea de executie asigura, sub controlul unitatii de comanda, o succesiune de operatii<br />
aritmetice si logice asupra datelor preluate din unitatea de memorie sau din memoria locala-<br />
proprie (implementata sub forma unor registre generale -RG-), rezultatele fiind returnate in<br />
unitatea de memorie sau in registrele generale.<br />
Dupa fiecare operatie UE actualizeaza starea unor indicatori de conditii, care reflecta<br />
caracteristicile rezultatului curent ( < 0, > 0, = 0, paritate, transport, depasire etc. ).<br />
Unitatea de comanda prelucreaza fluxul de instructiuni, care constituie programul. Ea furnizeaza<br />
semnale de comanda pentru celelalte unitati, coordonind functionarea lor in conformitate cu<br />
cerintele programului. UC poate examina, in cadrul executiei unei instructiuni date, informatia<br />
de stare asociata fiecarei unitati, luand in continuare deciziile corespunzatoare pentru executia<br />
corecta a programului.<br />
Celula 0<br />
Celula 1<br />
Celula i<br />
(m -1)<br />
Celula 2
Unitatea de comanda se poate implementa sub forma conventionala ( ca automat secvential cu<br />
stari codificate sau cu stari complet decodificate ) sau sub forma microprogramata ( cu stocarea<br />
semnalelor de comanda, in maniera statica, intr-o memorie rapida ).<br />
Inunele cazuri UC este denumita si unitate deprelucrare a instructiunilor - unitatea I, iar unitatile<br />
de executie si de memorie sunt notate cu E si respectiv cu M.<br />
Astfel, un calculator C ( unitatea centrala ) poate fi reprezentat prin expresia:<br />
C = I [ E - M ].<br />
In cadrul notatiei structurale PMS ( in care sunt folosite drept componente primitive: P -<br />
procesorul, M - memoria, S - comutatorul, D - operatorul asupra datelor, K - operatorul de<br />
comanda, L - legatura, T - terminalul/traductorul ) un calculator C se descrie prin formula:<br />
C = M - P - T<br />
Prima notatie este utila in cazul sistemelor constituite din mai multe unitati de executie si<br />
memorii asociate, controlate de o singura unitate de comanda( Sisteme cu un singur Flux de<br />
Instructiuni si mai Multe Fluxuri de Date - SIMD - Single Instruction Stream Multiple Data<br />
Stream ).<br />
Sistemele obisnuite au un singur flux de instructiuni si un singur flux de date SISD - Single<br />
Instruction Stream Single Data Stream ).<br />
In rezumat se poate observa ca:<br />
- ansamblul: UE + UC = P ( Procesor sau Unitate Centrala de Prelucrare - UCP sau CPU ),<br />
- ansamblul: P + M = UC ( Unitate Centrala ),<br />
- ansamblul: UC + SI + SE + Software = Sistem de calcul.<br />
In continuare se vor prezenta cateva exemple de sisteme de calcul, folosind notatia PMS:<br />
- sistem de calcul in care terminalele ( echipamentele de I/E ) transfera datele cu memoria prin<br />
intermediul p[rocesorului:<br />
M P S K1 T1<br />
K2 T2
- sistem de calcul in care unele terminale ( echipamentele de I/E ) transfera date cu memoria<br />
direct ( T1 ) sau prin intermediul procesorului ( T2, T3 ):<br />
M S1 P S2 K2 T2<br />
Instructiunile calculatorului reprezinta o colectie de informatii <strong>privind</strong> operatiile operatiile care<br />
se pot efectua intr-un calculator dat.<br />
Sub forma cea mai generala instructiunile se impart in doua categorii:<br />
- instructiuni operationale si de transfer al informatiilor, inclusiv instructiunile de I/E;<br />
- instructiuni cu caracter de decizie, care modifica secventa de executie a programului in mod<br />
conditionat de o serie de indicatori sau in mod neconditionat.<br />
Instructiunile sunt formate din mai multe cimpuri, dintre care se mentioneaza urmatoarele:<br />
- codul de operatie/functia, care specifica operatia/actiunea elementara evocata de instructiune:<br />
aritmetica, logica, transfer de date, transfer al comenzii etc.;<br />
- adresa operandului/instructiunii, care specifica locatia de memorie cu care se face transferul<br />
de date sau de la care se citeste o instructiune.<br />
In cazul instructiunilor cu caracter operational, structura instructiunii poate contine, pe linga<br />
campul codului de operatie, unul sau mai multe campuri pentru adrese.<br />
Instructiunea cu o adresa:<br />
COP ADRESA<br />
K1<br />
K3 T3<br />
T1
Instructiunea cu doua adrese:<br />
Instructiunea cu trei adrese:<br />
In primul caz instructiunea specifica adresa unui singur operand, cel de-al doilea operand (in<br />
cazul operatiilor ce implica doi opeanzi) fiind deja adus in UE. De regula, rezultatul ramane in<br />
UE.<br />
In cazul al doilea sunt prezente adresele celor doi operanzi (adresa operandului destinatie si<br />
adresa operandului sursa - rezultatul operatiei se stocheazalaadresaoperandului destinatie).<br />
Campul ADRESA3, in cel de-al treilea caz, poate specifica adresa la care se trimite rezultatul.<br />
Instructiunile cu trei adrese sunt extrem de rar intilnite.<br />
Campul de adresa din instructiune poate avea mai multe semnificatii:<br />
- contine chiar operandul, in cazul operandului imediat;<br />
- reprezinta adresa unui operand din memorie, in situatia adresarii directe;<br />
- reprezinta adresa unei celule de memorie in care se afla adresa unui operand, in cazul adresarii<br />
indirecte.<br />
In unele situatii, la continutul cimpului de adresa din instructiune se aduna continuturile unor<br />
registre speciale:<br />
COP ADRESA1 ADRESA2<br />
COP ADRESA1 ADRESA2 ADRESA3<br />
- registrele baza, la adresarea bazata;<br />
- registrele index, la adresarea indexata.<br />
Cu ajutorulacestor facilitati se pot adresa diverse date stocate in memorie, care sunt structurate<br />
sub forma de masive, multidimensionale, in cazuri particulare: matrici si vectori.<br />
Registrul baza contine adresa de start ( baza ) a structurii, adresa din instructiune reprezinta o<br />
deplasare in structura data, iar registrul index asigura adunarea unei cantitati variabile
( incrementabile/decrementabile - eventual automat ).<br />
Adresa obtinuta in urma unor asemenea operatii, adesea combinate, poarta numele de adresa<br />
efectiva.<br />
In consecinta, instructiunea va contine campuri aditionale, care vor specifica adresarea bazata,<br />
indirecta, indexata etc, deci modul de calcul al adresei efective.<br />
Aceste artificii sunt impuse de faptul ca, in calculatoarele conventionale, memoria este<br />
organizata liniar, in cadrul ei informatia fiind stocata sub forma unor structuri date. Diversele<br />
moduri de adresare faciliteaza accesul la componentele acestor structuri.<br />
Trebuie mentionat faptul ca listele de instructiuni pentru cele mai multe calculatoare contin si<br />
instructiuni fara adresa. Acestea se bazeaza pe facilitatile implementate in hardware care permit<br />
adresarea si manipularea datelor plasate intr-o structura speciala numita stiva ( stack - LIFO -<br />
Last In Last Out ), organizata in memorie sau ( mai rar ) in asamblaje de registre aflate in<br />
unitatea de executie ( microprocesorul Intel 8008 ). Accesul la informatia plasata in stiva se<br />
realizeaza numai prin intermediul varfului stivei, folosind doua operatii de baza: plasarea unui<br />
nou cuvant in stiva ( PUSH ) si extragerea cuvintului din varful stivei ( POP ). Adresa celulei<br />
ocupate din varful stivei este stocata intr-un registru indicator de stiva ( Stack Pointer - SP ) al<br />
carui continut este automat incrementat dupa o operatie POP si respectiv - decrementat, dupa o<br />
operatie PUSH.<br />
Instructiunile, care afecteaza executia programului, trebuie sa specifice in campul codului de<br />
operatie conditiile testate, iar in campul de adresa deplasarea necesara calculului adresei efec-<br />
tive. Si in acest caz adresa efectiva se poate obtine direct, indirect, bazat, idexat sau ca urmare a<br />
unor operatii combinate.<br />
Formatul instructiunii calculatorului FELIX 5000, contine in cadrul a 32 de biti mai multe<br />
campuri:<br />
unde:<br />
0 1 3 4 7 8 9 15 16 31<br />
I B Q X F D<br />
- I poate lua valoarea 0 in cazul adresarii directe si 1, in cazul adresarii indirecte;
- B poate lua valori intre 0 si 7, specificand pentru valori mai mari decat 0, adresarea bazata cu<br />
unul din registrele generale RG9 - RG15, iar pentru 0 adresarea nebazata;<br />
- Q poate specifica, printre altele, ( registrul general, care contine unul din operanzi, o<br />
constanta sau un vector logic sau adresa de origine si lungimea unui operand, in cazul<br />
manipularii sirurilor ) si registrul general RG0 - RG15 folosit la indexare;<br />
- X ia valoarea 0, in cazul adresarii neindexate si valorea 1, in cazul adresarii indexate;<br />
- D specifica deplasarea, folosita pentru calculul adresei efective, prin adunarea cu registrul<br />
baza. Daca registrul baza nu este specificat, D asigura adresarea pe o zona de 64 Ko. Pentru<br />
explorarea intregului spatiu de memorie se aduna in mod curent continutul lui D cu continutul<br />
registrului baza.<br />
Modurile de adresare intilnite la FELIX 5000:<br />
- Adresare directa: I = 0; X = 0; B 0.<br />
Aef = ( B + 8 ) + D; unde ( B + 8 ) specifica registrul general utilizat ca baza.<br />
- Adresarea indirecta: I = 1; X = 0; B 0.<br />
Prima adresa efectiva, Aef, calculata va reprezenta adresa unui cuvant din memorie in care se<br />
gaseste o informatie care este tratata, din punctul de vedere al calculului unei noi adrese efective,<br />
ca o instructiune. Astfel, la adresa efectiva:<br />
Aef1 =( B + 8 ) + D se va gasi un cuvant care va avea campurile: I1, B1, Q1, X1, F1, D1.<br />
Daca I1 = 1, atunci se va calcula noua adresa efectiva:<br />
Aef2 = ( B1 + 8 ) + D1, de la care se va citi un nou cuvant, procesul putand continua pe<br />
maximum 5 niveluri de adresare indirecta, pana cand Ii = 0.<br />
Adresarea indexata directa: I = 0; X = 1.<br />
Aef = ( Q ) + ( B + 8 ) + D, unde ( Q ) specifica RG folosit ca registru index.<br />
Adresarea indexata indirecta: I = 1; X = 1.<br />
Aef1 = ( B + 8 ) + D,<br />
Aef(k+1) = ( Bk + 8 ) + Dk<br />
Aef = ( Q ) + Aef(k+1) = ( Q ) + ( Bk + 8 ) + Dk.
5. Conventii de proiectare.<br />
Dupa cum s-a aratat intr-un capitol anterior, un sistem numeric poate fi partitionat in:<br />
- sectiunea de date ( unitatea de executie ),<br />
- sectiunea de comanda ( unitatea de comanda ).<br />
Intrare: Date Registre si Logica aferenta Iesire: Date/Rezultate<br />
(Sectiunea /Unitatea de Date/Executie)<br />
Semnale de Conditii<br />
comanda<br />
Intrare: Conditii Circuit secvential de comanda Iesire: Comenzi<br />
(Sectiunea/Unitatea de Comanda)<br />
Unitatea de executie asigura prelucrarea datelor, reprezentate sub forma unor vectori binari,<br />
prin transferul acestora intre registrele sursa si registrele destinatie.Transferul se efectueaza prin<br />
intermediul unor retele/circuite logice combinationale.<br />
Transferurile intre registre.<br />
Intrucat prelucrarea datelor are la baza transferul intre registre, proiectarea unui sistem<br />
numeric, in vederea executiei unui algoritm, consta intr-o planificare, ce va defini fiecare<br />
transfer, prin specificarea ordinii/temporizarii ( timing ) in care aceste transferuri vor avea loc.<br />
In continuare se prezinta mecanismele hardware de implementare a transferurilor intre registre<br />
si notatiile corespunzatoare folosite. Registrele sunt notate cu majuscule avand, de regula, o<br />
semnificatie mnemotehnica. Pe scurt, se vor folosi "mnemonice".<br />
Transferul continutului unui registru sursa intr-un registru destinatie, fara a afecta continutul<br />
sursei, se noteaza astfel:<br />
AC RD<br />
Daca registrul AC are patru biti, anularea/fortarea in unu a tuturor bistsbililor se pot nota dupa<br />
cum urmeaza:
AC 0,0,0,0<br />
AC 1,1,1,1<br />
Implementarea registrelor se bazeaza pe bistabile JK si D, cu intrari de sincronizare de ceas, Ck,<br />
si cu intrari de tip PRESET/CLR.<br />
Transferurile sincrone au loc sub controlul semnalului de ceas pe fronturile anterior, pentru<br />
bistabilele de tip D, sau pe frontul posterior, pentru bistabilele master-slave, de tip JK.<br />
Transferurile implementate prin semnale de comanda aplicate pe intrarile PRESET/CLR au, in<br />
general, caracter asincron. Mai jos se vor prezenta, pentru cazul unui bistabil D controlat pe<br />
frontul anterior al semnalului de ceas, reprezentarea simbolica si diagrama temporala de operare.<br />
Se observa ca datele la intrarea D sunt stabile inaintea aparitiei frontului crescator al semnalului<br />
de ceas, cand are loc fortarea datei in bistabil. Iesirea va lua valoarea corespunzatoare intrarii cu<br />
o anumita intarziere in raport cu frontul crescator al semnalului de ceas.<br />
Data<br />
Ceas<br />
In cazul bistabilelor de tip master-slave fortarea datelor are loc pe frontul anterior al semnalului<br />
de ceas, iar aparitia lor la iesire se constata pe frontul posterior al ceasului. Mai jos se prezinta<br />
simbolul si diagrama temporala pentru operarea bistabilului JK.<br />
7476<br />
In continuare se vor considera elemente bistabile de tip master-slave, atat pentru sectiunea de<br />
date, cat si pentru sectiunea de comanda.<br />
2<br />
3<br />
2<br />
Ceas (CLK)<br />
Data 4<br />
J Q<br />
15 Iesire<br />
Ceas 1<br />
CLK<br />
Data (J/K)<br />
Data 16<br />
K<br />
4<br />
D PRE<br />
CLK Q<br />
CLR<br />
PRE<br />
CLR<br />
Q<br />
7474<br />
Q<br />
5<br />
6<br />
14<br />
Iesire<br />
Ceas (CLK)<br />
Data (D)<br />
Iesire (Q)<br />
Iesire (Q)
Un circuit secvential de comanda furnizeaza, pentru sectiunea de date, diverse semnale de<br />
comanda, sincrone cu ceasul sistemului, cu perioade egale cu durata unei perioade de ceas sau<br />
cu multipli ai acesteia. Acestea sunt semnalele de comanda de tip nivel.<br />
Semnalele de Comanda de tip Nivel (SCN) vor avea un sufix numeric i ce va specifica numarul<br />
iesirii de comanda a automatului (SCNi). Semnalele SCNi pot fi strobate/esantionate cu<br />
semnalul curent de ceas, pentru a forma Semnale de Comanda de tip Impuls(SCIi), cu durata<br />
activa corespunzatoare semnalului curent de ceas.<br />
Conditii<br />
Ceas<br />
Presupunem ca in etapa i (pasul i al implementarii/executiei) algoritmului trebuie sa se efectueze<br />
transferul continutului registrului de doi biti RA[2], numerotati de la 0 la 1 ( RA0:1 ),in registrul<br />
destinatie RB[2] ( RB0:1 ):<br />
i. RB0:1 RA0:1<br />
Circuit Secvential (Unitate e Comanda)<br />
SCN(i-1) SCNi<br />
Ceas<br />
SCN(i-1)<br />
SCI(i-1)<br />
SCNi<br />
SCIi<br />
Considerand, in continuare, ca se vor folosi numai bistabile master-slave JK sau D (se face<br />
presupunerea ca si bistabilele de tip D opereaza in maniera master-slave ), schemele hardware<br />
pentru implementarea acestui transfer vor fi urmatoarele:<br />
Ceas<br />
1<br />
2<br />
7408<br />
3<br />
SCIi
4<br />
1<br />
16<br />
4<br />
1<br />
16<br />
J<br />
2<br />
PRE<br />
CLK<br />
K<br />
CLR<br />
3<br />
2<br />
PRE<br />
3<br />
Q<br />
Q<br />
7476<br />
7476<br />
15<br />
14<br />
J<br />
15<br />
QRA1<br />
4<br />
J<br />
15<br />
QRB1<br />
CLK<br />
1<br />
CLK<br />
K<br />
CLR<br />
Q<br />
14<br />
4<br />
1<br />
16<br />
16<br />
J<br />
2<br />
PRE<br />
CLK<br />
K<br />
CLR<br />
3<br />
2<br />
PRE<br />
3<br />
Diagrama de timp care arata modul in care noua informatie se transfera in RB este data mai jos:<br />
Ceas<br />
SCNi<br />
SCIi<br />
SCN1<br />
Ceas<br />
SCN1<br />
Ceas<br />
1<br />
2<br />
2<br />
3<br />
2<br />
3<br />
1<br />
2<br />
4<br />
D PRE<br />
1<br />
RA0<br />
7408<br />
CLK Q<br />
CLR<br />
4<br />
D PRE<br />
Q<br />
CLK Q<br />
CLR<br />
1<br />
RA0<br />
7474<br />
Q<br />
3<br />
5<br />
6<br />
5<br />
6<br />
7474<br />
7408<br />
Vechea Valoare din RB \\<br />
3<br />
2<br />
3<br />
2<br />
3<br />
K<br />
CLR<br />
4<br />
1<br />
RB0<br />
Q<br />
Q<br />
7476<br />
Q<br />
D PRE<br />
7476<br />
CLK Q<br />
CLR<br />
4<br />
D PRE<br />
1<br />
Q<br />
CLK Q<br />
CLR<br />
15<br />
14<br />
14<br />
RB0<br />
5<br />
6<br />
7474<br />
RA1 RB1<br />
Noua Valoare din RB<br />
Q<br />
5<br />
6<br />
7474
Adesea, intr-un registru trebuie sa se transfere, in momente diferite, vectori diferiti, de la diverse<br />
surse.<br />
Fie registrele sursa: RA, RB si registrul destinatie RC. Se cere implementarea, la momentele<br />
1, 2 a urmatoarelor transferuri:<br />
1. RC RA<br />
2. RC RB<br />
sub controlul semnalelor SCN1, SCN2.<br />
2<br />
3<br />
2<br />
3<br />
2<br />
3<br />
2<br />
3<br />
4<br />
D PRE<br />
CLK Q<br />
41<br />
CLR<br />
D PRE<br />
1<br />
Q<br />
CLK Q<br />
CLR<br />
4<br />
D PRE<br />
7474<br />
Q<br />
CLK Q<br />
CLR<br />
1<br />
4<br />
D PRE<br />
1<br />
Se cere implementarea hardware a transferurilor:<br />
1. RA 1,1<br />
2. RA 0,0<br />
3. RA RB<br />
5<br />
6<br />
5<br />
6<br />
7474<br />
Q<br />
CLK Q<br />
CLR<br />
RA0<br />
RA1<br />
RB0<br />
5<br />
6<br />
7474<br />
RB1<br />
Q<br />
5<br />
6<br />
7474<br />
1<br />
2<br />
1<br />
2<br />
SCN1<br />
1<br />
2<br />
1<br />
2<br />
SCN2<br />
7408<br />
7408<br />
7408<br />
7408<br />
3<br />
3<br />
3<br />
3<br />
SCN1<br />
SCN2<br />
1<br />
2<br />
1<br />
2<br />
Pentru a stabili expresia functiei logice combinationale, care reprezinta intrarea Di a bistabilului<br />
destinatie RAi, se utilizeaza diagrama Karnaugh, cu variabila RBi introdusa in diagrama:<br />
1<br />
2<br />
U9A<br />
7432<br />
U10A<br />
3 1<br />
CLK<br />
7432<br />
2<br />
3<br />
7432<br />
3<br />
7408<br />
3<br />
2<br />
3<br />
2<br />
3<br />
4<br />
D PRE<br />
CLK Q<br />
CLR<br />
1<br />
4<br />
D PRE<br />
1<br />
Q<br />
CLK Q<br />
CLR<br />
5<br />
6<br />
7474<br />
Q<br />
5<br />
6<br />
7474
SCN1, SCN2<br />
00 01 11 10<br />
SCN3 Functia de excitatie Di este data de expresia:<br />
* * * 1<br />
0 Di = SCN1 ∪ RBi .SCN3<br />
RBi * * *<br />
1<br />
Aceasta va duce la urmatoarea implementare:<br />
RB0<br />
RB1<br />
SCN1<br />
SCN3<br />
SCN2<br />
SCN1<br />
In cazul in care se urmareste implementarea operatiei elementare:<br />
j. RAi RBi.RCi<br />
se poate folosi schema de mai jos:<br />
RBi<br />
RCi<br />
SCNj<br />
Ceas<br />
1<br />
2<br />
1<br />
2<br />
1<br />
2<br />
1<br />
2<br />
1<br />
2<br />
8<br />
U41A<br />
7408<br />
7408<br />
7408<br />
3<br />
3<br />
3<br />
7408<br />
SCIj<br />
3<br />
SCN3<br />
CLK<br />
9<br />
1<br />
2<br />
1<br />
2<br />
1<br />
2<br />
2<br />
3<br />
U7A<br />
4<br />
D PRE<br />
CLK Q<br />
CLR<br />
1<br />
RAi<br />
Q<br />
7432<br />
7432<br />
7408<br />
5<br />
6<br />
7474<br />
3<br />
3<br />
3<br />
2<br />
3<br />
2<br />
3<br />
4<br />
D PRE<br />
CLK Q<br />
CLR<br />
1<br />
4<br />
D PRE<br />
1<br />
Q<br />
CLK Q<br />
CLR<br />
RA0<br />
5<br />
6<br />
7474<br />
RA1<br />
Q<br />
5<br />
6<br />
7474
Reprezentarea componentelor constructive logice combinationale si secventiale (SSI/MSI).<br />
In realizarea practica a unui sistem numeric de complexitate mica/medie (in afara cazurilor cand<br />
se folosesc circuite programabile FPGA/FPLD) sunt utilizate atat componente logice<br />
combinationale, cat si secventiale standard, integrate pe scara simpla si medie. Pentru o tratare<br />
unitara a celor doua tipuri de componente, mai jos, se prezinta o modalitate de tratare unitara a<br />
acestora.<br />
Componentele combinationale.<br />
Sub forma cea mai generala o componenta combinationala (Circuit Logic Combinational – CLC)<br />
se poate reprezenta sub forma unei “cutii negre” avand m intrari de date X[m], p intrari de<br />
comanda C[p] si n iesiri Z[n]. Intrarile si iesirile se pot reprezenta sub forma unor vectori binari<br />
X[m], C[p], Z[n], iar operarea componentei/circuitului poate fi descrisa cu ajutorul unei tabele.<br />
m X[m] Operatia Descrierea Comanda<br />
p CLC<br />
Functia C(p-1) ………C0<br />
C[p] F0 Z = F0(X) 0 …………0 0<br />
n Z[n] F1 Z = F1(X) 0 …………0 1<br />
….. ………… ………………<br />
F(2^p-1) Z = F(2^p-1)(X) 0 …………0 0<br />
Se poate observa ca iesirea Z este prezenta atata timp cat este sunt prezente intrarile X si C, fapt<br />
mentionat prin utilizarea semnului “=” intre termenii din dreapta si stanga, in coloana<br />
“Descriere”. Iesirea Z este definita, ca functie de intrarea X, pentru cele 2 p valori pe care le<br />
poate lua vectorul de comanda C. In continuare sevor prezenta cateva cazuri particulare.<br />
Circuitul AND (7408).<br />
Modelul Componenta din Tabelul de descriere<br />
biblioteca<br />
A[4] B[4] Operatia Descrierea Comanda<br />
4 4 AND Z = A ∩ B ------<br />
1<br />
7408<br />
7408<br />
4 Z[4] ¼ din pastila 7408<br />
2<br />
3
Circuitul de mai sus poate fi reprezentat in conditiile in care intrarile A[4] sunt controlate de<br />
catre acelasi semnal si devin, astfel, intrari de comanda:<br />
A[1] 1 B[4] Operatia Descrierea Comanda<br />
4 A[4] 4 A[1]<br />
7408<br />
ZERO Z = 0000 0<br />
4 Z[4]<br />
Circuitul sumator 7483.<br />
TRUE Z = B 1<br />
Modelul Componenta din Tabelul de descriere<br />
biblioteca<br />
A[4] B[4] C0[1] Operatia Descrierea Comanda<br />
4 4 1 1<br />
14<br />
A4 C4<br />
ADD C4,S = ADD(A,B,C0) -----<br />
7483<br />
A3<br />
15<br />
C4[1] 1 4 S[4]<br />
Circuitul XOR (7486).<br />
7483A<br />
Modelul Componenta din Tabelul de descriere<br />
biblioteca<br />
A[4] B[4] Operatia Descrierea Comanda<br />
4 4 XOR Z = A ⊕ B ------<br />
1<br />
3<br />
7486<br />
2<br />
4 Z[4] ¼ din pastila 7486<br />
Ca si in cazul circuitului AND (7408), pentru circuitul XOR (7486) intrarile A[4] pot fi<br />
controlate de catre acelasi semnal de comanda, ceea ce va permite implementarea pe 4 biti a<br />
functiilor TRUE si NEG, conform tabelului de mai jos.<br />
3<br />
8<br />
10<br />
16<br />
4<br />
7<br />
11<br />
13<br />
A2 SUM4<br />
A1<br />
B4 SUM3<br />
B3<br />
B2 SUM2<br />
B1<br />
C0 SUM1<br />
7486<br />
2<br />
6<br />
9
A[1] 1 B[4] Operatia Descrierea Comanda<br />
4 A[4] 4 A[1]<br />
7486<br />
TRUE Z = B 0<br />
4 Z[4]<br />
Multiplexorul 74157<br />
NEG Z = B 1<br />
Modelul Componenta din Tabelul de descriere<br />
biblioteca<br />
A[4] B[4] Operatia Descrierea Comanda<br />
S=A/B 4 4 5<br />
1B 1Y<br />
G S=A/B<br />
7<br />
2Y<br />
74157<br />
SELA Z = A 0 0<br />
G 13<br />
4A<br />
12 SELB Z = B 0 1<br />
15<br />
4 Z[4] STROBEG STROB Z = 0000 1 *<br />
Intrarile active pe nivel coborat sunt marcate cu un cerc<br />
Circuite secventiale.<br />
2<br />
3<br />
6<br />
11<br />
10<br />
14<br />
1<br />
1A<br />
2A<br />
2B<br />
3A<br />
3B<br />
4B<br />
74157<br />
3Y<br />
4Y<br />
SELECTAB<br />
4<br />
9<br />
In cazul circuitelor secventiale intervine si semnalul de ceas, pe langa semnalul de comanda.<br />
Pentru a marca faptul ca iesirea circuitului isi pastreaza valoarea si dupa disparitia datelor de la<br />
intrare, atribuirea valorii expresiei logice din termenul din dreapta variablei din termenul din<br />
stanga se specifica prin “ “. Intrarile de ceas sunt marcate printr-un varf de sageata.<br />
C[p] m X[m] Operatia Descrierea Comanda<br />
p CLS<br />
Functia C(p-1) ………C0<br />
CLK F0 Q F0(X) 0 ………..0 0<br />
n Q[n] F1 Q F1(X) 0 ………..0 1<br />
….. ………… ………………<br />
F(2^p-1) Q F(2^p-1)(X) 0 ………..0 0
Circuit bistabil JK (7473).<br />
Modelul Componenta din Tabelul de descriere<br />
biblioteca<br />
Operatia Descrierea Comanda<br />
J 14<br />
12<br />
J Q<br />
J K<br />
K 1<br />
Bistab.JK<br />
CLK<br />
NOP Q Q 0 0<br />
CLK K Q<br />
CLEAR Q 0 0 1<br />
Contor binar 74163<br />
4 Q[4] PRESET Q 1 1 0<br />
COMPL Q Q 1 1<br />
Modelul Componenta din Tabelul de descriere<br />
biblioteca<br />
ENT A[4] Operatia Descrierea Comanda<br />
CLR 3<br />
14<br />
CLR LOAD ENP<br />
4<br />
A QA<br />
13<br />
ENP 5<br />
B QB<br />
12 NOP Q Q 1 1 0<br />
6<br />
C QC<br />
74163<br />
11<br />
D QD<br />
15<br />
LOAD 2<br />
RCO INC Q ADD(Q,T) 1 1 1<br />
7<br />
CLK ENP LOAD Q A 1 0 *<br />
RC0 Q[4] CLEAR Q 0 0 * *<br />
Registru de deplasare 74178<br />
3<br />
10<br />
9<br />
CLR<br />
CLK<br />
ENT<br />
LOAD<br />
CLR<br />
7473<br />
13<br />
74163<br />
SER A[4] Operatia Descrierea Comanda<br />
SH 1 4 SH LOAD<br />
LOAD 74178<br />
NOP Q Q 0 0<br />
CLK LOAD Q A 0 1<br />
4 Q[4] SHIFT Q Q2:0, SER 1 *
In cazul in care intrarea SEReste folosita drept intrare de comanda se realizeaza functiile din<br />
tabelul de mai jos:<br />
Modelul Componenta din Tabelul de descriere<br />
biblioteca<br />
A[4] Operatia Descrierea Comanda<br />
SER 9<br />
SERIAL<br />
4<br />
SER SH LOAD<br />
11<br />
LOAD QA<br />
SHIFT<br />
SH 6 NOP Q Q * 0 0<br />
2<br />
QB<br />
74178<br />
1<br />
A<br />
8<br />
LOAD 13<br />
B QC LOAD Q A * 0 1<br />
CLK SHIFT0 Q Q2:0, 0 0 1 0<br />
74178<br />
Q[4] SHIFT1 Q Q2:0, 1 1 1 0<br />
Registru cu doua intrari multiplexate 74298<br />
Modelul Componenta din Tabelul de descriere<br />
biblioteca<br />
A[4] B[4] Operatia Descrierea Comanda<br />
WS 4 4 3<br />
15<br />
WS<br />
2<br />
A1 QA<br />
CKL<br />
74298<br />
4<br />
A2<br />
14<br />
1<br />
B1 QB LOADA Q A 0<br />
4 Q[4]<br />
10<br />
9<br />
5<br />
7<br />
6<br />
11<br />
3<br />
12<br />
5<br />
C<br />
D<br />
WS<br />
CLK<br />
QD<br />
B2<br />
C1 QC<br />
C2<br />
D1 QD<br />
D2<br />
CLK<br />
13<br />
12<br />
74298<br />
10<br />
LOADB Q B 1
Scheme combinate.<br />
Schema unui sumator/scazator<br />
Schema se bazeaza pe utilizarea a doua circuite: XOR (7486) si ADD (7483)<br />
C4<br />
D<br />
1<br />
1<br />
Operatia Descrierea Comanda<br />
ADD Z = C4,ADD(A,B) 0<br />
SUB Z = C4,SUB(A,B) 1<br />
In functie de valoarea 0/1 a semnalului de comanda D, schema efectueaza adunarea/scaderea.<br />
Schema se poate extinde usor pentru operatiile pe 8 biti. In acest mod se pot realiza structuri<br />
complexe, noi blocuri constructive, a caror operare poate fi descrisa concis cu ajutorul tabelelor.<br />
Conexiuni prin magistrale.<br />
In numeroase cazuri implementarea in hardware a unui algoritm de prelucrare a datelor impune,<br />
la diverse etape ale executiei sale, conectarea unor registre-sursa la anumite registre-destinatie.<br />
Conexiunile directe ofera posibilitatea unui inalt grad de paralelism al transferurilor de date. In<br />
schimb sunt neeconomice sub aspectul consumului de circuite logice.<br />
Pentru exemplificare se vor considera, pe de-o parte, doua registre-sursa: RA si RB, iar pe de<br />
alta parte doua registre-destinatie: RC si RD, intre care se realizeaza urmatoarele transferuri:<br />
1. RC RA<br />
2. RD RB<br />
3. RC RB<br />
4. RD RA<br />
4<br />
A[4] B[4]<br />
7483<br />
4 4<br />
5. RC RA; RD RB<br />
6. RC RD; RC RA<br />
4<br />
Z[4]<br />
7486<br />
4<br />
C0 1<br />
D
Aceste transferuri se vor realiza sub controlul semnalelor de comanda de tip nivel: SCN1,<br />
SCN2, SCN3, SCN4, SCN5, SCN6 si al semnalelor de comanda de tip impuls: SCI1, SCI2,<br />
SCI3, SCI4, SCI5, SCI6.<br />
O ilustrare a implementarii transferurilor de mai sus este prezentata in continuare, considerand,<br />
pentru simplificare, registre de cate un bit.<br />
SCN2<br />
1<br />
2<br />
SCN5<br />
SCN3<br />
1<br />
2<br />
SCN6<br />
SCN6<br />
1<br />
2<br />
SCN5<br />
SCN4<br />
1<br />
2<br />
SCN1<br />
2<br />
3<br />
2<br />
3<br />
4<br />
D PRE<br />
4<br />
D PRE<br />
1<br />
Considerand ca sunt s registre-sursa, avand n biti, si d registre-destinatie, de cate n biti se poate<br />
stabili o functie de cost, pe baza numarului de porti SI, SAU si a numarului de biti al fiecarui<br />
registru. Astfel,<br />
CLK Q<br />
CLR<br />
7432<br />
CLK Q<br />
CLR<br />
1<br />
7432<br />
7432<br />
7474<br />
- numarul de porti SI = s.d.n,<br />
- numarul de porti SAU = d.n<br />
RB<br />
Q<br />
Q<br />
7432<br />
Rezulta o functie de cost ≈ n.d.(s + 1)<br />
3<br />
7474<br />
RA<br />
5<br />
6<br />
3<br />
3<br />
5<br />
6<br />
3<br />
1<br />
2<br />
1<br />
2<br />
1<br />
2<br />
1<br />
2<br />
7408<br />
7408<br />
7408<br />
7408<br />
3<br />
3<br />
3<br />
3<br />
CLK<br />
SCN6<br />
SCN5<br />
SCN4<br />
SCN2<br />
SCN6<br />
SCN5<br />
SCN3<br />
SCN1<br />
CLK<br />
1<br />
2<br />
1<br />
2<br />
1<br />
2<br />
2<br />
3<br />
4<br />
5<br />
1<br />
2<br />
2<br />
3<br />
4<br />
5<br />
7432<br />
7408<br />
7432<br />
7408<br />
3<br />
3<br />
3<br />
3<br />
1<br />
1<br />
2<br />
3<br />
2<br />
3<br />
4<br />
D PRE<br />
CLK Q<br />
CLR<br />
1<br />
4<br />
D PRE<br />
1<br />
Q<br />
CLK Q<br />
CLR<br />
RD<br />
5<br />
6<br />
7474<br />
Q<br />
RC<br />
5<br />
6<br />
7474
Pentru a reduce costul conexiunilor intre surse si destinatii se utilizeaza magistralele. Acestea<br />
reprezinta, de regula, trasee metalice/fire pe circuite imprimate sau la nivelul structurilor<br />
integrate pe siliciu. Modelul conexiunilor, prin intermediul magistralei, este ilustrat mai jos.<br />
RB<br />
Se poate observa ca portile SI, care conecteaza iesirile registrelor RA si RB, la magistrala sunt<br />
de tipul “colector deschis” OC. Conexiunile Registrelor RA si RB, la magistrala MAG/BUS se<br />
realizeaza sub controlul unor semnale de comanda de tip nivel, specificate in desen prin<br />
expresiile: MAG/BUS = RA si MAG/BUS = RB. Fortarea continutului magistralei MAG/BUS<br />
in registrele RC si RD are loc sub controlul semnalelor de comanda de tip impuls, specificate in<br />
desen prin expresiile: RC MAG/BUS si RD MAG/BUS.<br />
Magistrala joaca rolul unui circuit SAU, conform figurii de mai jos.<br />
Transferurile nu se mai pot efectua in paralel, de la surse la destinatii. Ele vor avea un caracter<br />
secvential. Astfel, transferul:<br />
Q<br />
1<br />
2<br />
RAMAG/BUS<br />
= RB<br />
Q<br />
1<br />
2<br />
MAG/BUS = RA<br />
1. RC RA, se va efectua prin operatiile:<br />
1. MAG/BUS = RA; RC MAG/BUS,<br />
3<br />
OC<br />
3<br />
OC<br />
MAG/BUS<br />
CLK<br />
1<br />
2<br />
CLK<br />
1<br />
+5V<br />
2<br />
R<br />
RD
2<br />
3<br />
2<br />
3<br />
4<br />
D PRE<br />
CLK Q<br />
CLR<br />
1<br />
4<br />
Q<br />
Q<br />
D PRE<br />
Q<br />
CLK Q<br />
CLR<br />
1<br />
7474<br />
7474<br />
5 1<br />
6 2<br />
5 1<br />
6 2<br />
Functia de cost va fi data de numarul portilor SI, al portilor SAU, cat si de numarul de biti ai<br />
vectorilor transferati:<br />
MAG/BUS = RB<br />
RA<br />
MAG/BUS = RA<br />
- numarul de porti SI = s.n,<br />
- numarul de porti SAU = n<br />
Rezulta o functie de cost ≈ n.(s + 1)<br />
De cele mai multe ori conexiunile registrelor-sursa la magistrala se realizeaza prin circuite “Tri-<br />
state”, care inlocuiesc circuitele de tip “OC”.<br />
3<br />
1<br />
2<br />
3<br />
MAG/BUS<br />
7432<br />
3<br />
CLK<br />
1<br />
2<br />
RD
6. INTRODUCERE IN LIMBAJUL DE PROGRAMARE HARDWARE AHPL.<br />
( AHPL - A Hardware Programming Language ).<br />
In functie de scopul urmarit, un calculator numeric poate fi descris folosind diverse mijloace.<br />
Astfel, la nivelul etapei de proiectare, se folosesc adesea diagrame bloc, organigrame, limbaje<br />
specializate, tabele de cablaj etc.<br />
In cadrul acestei lucrari calculatorul numeric este descris in termenii unor secvente de<br />
transferuri ale datelor intre diferitele primitive functionale ale calculatorului, in vederea imple-<br />
mentarii unui algoritm dat. Se considera ca, dupa terminarea acestei etape de proiectare,<br />
elaborarea schemelor logice si a schemelor de cablaj reprezinta operatii mecanice, de rutina, care<br />
se pot automatiza cu usurinta.<br />
Sistemele numerice de calcul prelucreaza in principal date structurate sub forma de vectori<br />
binari, stocati in registre sau memorii organizate sub forma de matrici, cu acces la linii.<br />
In acest context apare evidenta utilitatea unui limbaj prevazut cu facilitati pentru manipularea<br />
vectorilor si matricilor.<br />
Un asemenea limbaj a fost propus de K.E. Iverson in anul 1960 sub numele APL<br />
(A Programming Language ). Limbajul APL cunoaste o larga raspindire, ca limbaj<br />
conversational in sistemele cu multiacces IBM 360/370 si chiar in cadrul calculatoarelor<br />
personale IBM-PC compatibile. Trebuie mentionata, de asemenea, si implementarea realizata in<br />
tara noastra pe sistemele FELIX C-266/512.<br />
APL este un limbaj foarte puternic. El permite descrierea concisa a algoritmilor si verificarea lor<br />
prin executie, pe calculator. Pentru scopurile urmarite de proiectare, limbajul APL trebuie<br />
completat cu instructiuni si alte constructii, care permit o implementare directa in hardware.<br />
Un asemenea limbaj AHPL ( A Hardware Programming Language ) a fost propus de catre<br />
F. Hill si G. Peterson in 1974, fiind apoi perfectionat pe parcurs ( 1978, 1983 ). AHPL, ca limbaj<br />
de descriere a transferurilor intre registre, asigura o corespondenta directa intre notatia folosita<br />
si implementarea ei in hardware.<br />
AHPL foloseste, pe linga constructiile proprii, si un subset de constructii din APL, care isi<br />
gasesc un corespondent in hardware. Frecvent, in scopul facilitarii comunicarii si documenarii, in<br />
programele AHPL se mai utilizeaza unele notatii APL, care descriu algoritmul de operare al unui<br />
calculator numeric.
In momentul traducerii in hardware a descrierii AHPL a modulului numeric dat, aceste notatii<br />
nu sunt luate in consideratie.<br />
Autorii limbajului AHPL au elaborat si un compliator pentru hardware, care are ca intrare<br />
descrierea AHPL a sistemului numeric, iar ca iesire - schema sistemului, la nivel de diagrame.<br />
Indiferent de implementarea unui algoritm, este o buna practica aceea de a descrie mai intai<br />
algoritmul in APL si de a-l executa pe un calculator, prevazut cu un compliator de APL.<br />
In continuare algoritmul descris in APL poate fi implementat in hardware, firmware<br />
(microprogram) sau poate fi executat direct, fiind implementat in software.<br />
Conventii <strong>privind</strong> operanzii folositi in AHPL.<br />
Operanzii manipulati in limbajul AHPL reprezinta marimi constante sau variabile.<br />
Constantele sunt date numerice sau alfanumerice. Ele se reprezinta prin numere standard,<br />
respectiv - prin litere standard sau numere cuprinse intre semnele apostrof.<br />
Variabilele pot fi scalari, vectori, matrici.<br />
Este important de facut distinctie intre variabile si valori.In limbajele conventionale de<br />
programare o variabila reprezinta un nume prin care se face o referire la un operand; o valoare<br />
reprezinta marimea pe care o ia efectiv operandul. In AHPL, prin variabila se intelege numele<br />
unui registru al carui continut este manipulat printr-o instructiune a programului, iar prin valoare<br />
- data care se plaseaza in registru.<br />
Tipurile de operanzi in AHPL se vor deosebi prin conventii tipografice: litere mici pentru<br />
scalari, majuscule pentru vectori si majuscule ingrosate pentru matrici.<br />
Transferul unei constante ( binare - in cazul de fata ) intr-un registru AC se noteaza astfel:<br />
AC 0,1,1,1,1,0,1,0<br />
Transferul continutului unui registru RD, intr-un registru AC, fara a se modifica continutul lui<br />
RD se reprezinta prin instructiunea:<br />
AC ← RD<br />
Un vector constituie o colectie de operanzi avand o structura unidimensionala. Numarul<br />
componentelor vectorului reprezinta dimensiunea vectorului. Pentru a specifica dimensiunea<br />
unui vector oarecare (AC) se va folosi notatia ρAC, unde ρ reprezinta operatorul “dimensiune”.<br />
Daca AC are 16 biti (ranguri binare), atunci ρAC = 16. In aceasta lucrare, in cazul in care nu se
vor face mentiuni speciale, pozitiile bitilor individuali vor fi specificate prin indici cu originea 0,<br />
plasata in extrema stanga: AC0 ,AC1 ,......,ACρAC-1<br />
Trebuie observat ca aceasta notatie este destul de greoaie in textele dactilografiate, ceea ce<br />
face ca, in multe cazuri, indicii sa fie plasati pe aceeasi linie cu numele registrului, de exemplu:<br />
ACi - bitul de rang i din registrul AC. Pentru a specifica un grup de biti adiacenti, dintr-un<br />
registru se foloseste notatia: A i:j sau A(i:j), unde sunt inclusi si bitii i si j.<br />
Operanzii de tip matricial se reprezinta sub forma unui tablou bidimensional, constituit din<br />
elemente cu indici inferiori si superiori. Indicii inferiori specifica coloanele, iar cei superiori<br />
liniile. Se considera matricea M avind ρ1M coloane si ρ2M linii, unde ρ1 si ρ2 reprezinta<br />
notatiile pentru operatorii care aplicati lui M furnizeaza numarul de coloane si numarul de linii<br />
ale tabloului M.<br />
M 0 0 M 0 1 …….....….......M 0 ρ1M-1<br />
...................……..…..……....<br />
.......….……. M i j.......……….<br />
M ρ2M-1 0 M ρ2M-1 1........……. M ρ2M-1 ρ1M-1<br />
Linia i a matricii M se specifica prin notatia M i sau M, iar coloana j - prin notatia Mj sau<br />
M[j]. Liniile succesive i...k, ale matricii M se noteaza prin M i:k sau M, iar coloanele<br />
succesive j...l - prin Mj:l sau M[j:l].<br />
Conventii <strong>privind</strong> operatorii APL si AHPL.<br />
Operatorii folositi sunt operatorii primitivi si operatorii de tip mixt.<br />
Operatorii primitivi manipuleaza, de regula, operanzi de tip scalar, desi ei pot fi extinsi atat la<br />
vectori, cat si matrici. Acesti opeatori se pot referi la o singura variabila (operatori unari) sau la<br />
doua variabile (operatori binari). In cele ce urmeaza se prezinta operatorii primitivi aritmetici,<br />
logici si relationali. In scopul facilitarii comunicarii, in textele ce reprezinta programe AHPL pot<br />
fi intalniti toti acesti operatori. Implementari directe in hardware au insa numai operatorii logici.<br />
Operatorii aritmetici si relationali sunt specifici limbajului APL.
Operatorii aritmetici manipuleaza numere reale:<br />
x + y adunare; suma algebrica, ( APL ),<br />
x - y scadere; diferenta algebrica, ( APL ),<br />
x ∗ y inmultire; inmultire algebrica, ( APL ),<br />
x % y impartire algebrica; ( APL ).<br />
|x valoare absoluta; ( APL ).<br />
Operatorii logici manipuleaza numere binare ( vectori binari ):<br />
x NU (APL si AHPL),<br />
x ∩ y SI (APL si AHPL),<br />
x ∪ y SAU (APL si AHPL),<br />
x ⊕ y SAU-Exclusiv (APL si AHPL).<br />
Operatorii relationali sunt de forma:<br />
( x ℜ y ) unde ℜ ∈ { } ( APL ).<br />
In versiunile existente de APL, incercarea de a folosi alte tipuri de variabile, cu exceptia celor<br />
logice, conduce la eroare de domeniu.<br />
In raport cu operatorii aritmetici si relationali nu exista limitari <strong>privind</strong> folosirea variabilelor.<br />
In exemplele urmatoare se considera:<br />
x = 1, y = -3, W = ( 4,-5,0,2 ) si U = ( 1,2,1,-1 ).<br />
Instructiune: Rezultat:<br />
z ← x + y z = -2<br />
z ← x z = 0<br />
Z ← W + U Z = ( 5,-3, 1,1 )<br />
Z ← W * U Z = ( 4,-10,0,-2 )<br />
Z ← W % U Z = ( 4,-2.5,0,-2 )<br />
z ← ( x < y ) z = 0<br />
z ← ( x > y ) z = 1<br />
Operatorii de tip mixt sunt extrem de puternici, deoarece permit manipularea unor combinatii<br />
de scalari, vectori si matrici. In cele ce urmeaza se vor prezenta operatorii de tip mixt, cu<br />
specificarea limbajelor in care se utilizeaza.
Notatie Denumire Semnificatie Observatii<br />
X,Y Inlantuire/ X0 ,...,XρX-1 ,Y0 ,....,YρY-1 APL si AHPL<br />
Concatenare<br />
M!N Inlantuire O matrice cu ρ2M+ρ2N linii AHPL<br />
linii. cu liniile lui M peste liniile lui N.<br />
k↑X Extragere Se extrag primele k elemente APL<br />
din vextorul X.<br />
k↓X Eliminare Se elimina primele k elemente APL<br />
din vectorul X.<br />
⊥ X Decodificare Echivalentul zecimal al vectorului APL<br />
binar X<br />
nΤp Codificare Un vector cu n elemente binare, APL si AHPL<br />
binara. obtinut prin repre zentarea<br />
numarului zecimal p in baza doi.<br />
@/X Reducere X0 @X1 @X2 @............@XρX-1 APL si AHPL<br />
X ← @/M Reducere X i ← @/M i AHPL si APL<br />
linie<br />
X ← @//M Reducere Xj ← @/Mj AHPL si APL<br />
coloana<br />
X ← U/Y Comprimare Vectorul X este obtinut APL si AHPL<br />
din vectorul Y prin su- in descrierea<br />
primarea rangurilor Xi unitatilor logice<br />
pentu care Ui =0 combinationale<br />
U este vector binar.<br />
A ← U/M Comprimare Ai ← U/M i Idem linii.<br />
A ← U//M Comprimare Aj← U/Mj Idem coloane<br />
coloane<br />
Nota1: @ este un operator logic sau aritmetic.<br />
Nota2: A si M sunt matrici, iar U este un vector binar.
In exemplele care urmeaza se ilustreaza utilizarea operatorilor de tip mixt.<br />
Inlantuirea.<br />
Fie: X = ( 1,2,3,4 ) si Y = ( 5,6,7 ),<br />
daca Z ← X,Y atunci, rezulta: Z = ( 1,2,3,4,5,6,7 )<br />
Inlantuirea permite descrierea operatiilor de deplasare si rotire ale vectorilor si matricilor.<br />
In cele ce urmeaza se vor prezenta notatiile AHPL pentru deplasari si rotiri de vectori.<br />
Fie vectorul A = ( A0 ,A1 ,A2 ,......,AρA-1)<br />
Deplasare logica - dreapta (cu inserta unui zero in bitul 0).<br />
A ← 0, A0 ,A1 ,A2 ,......,AρA-2<br />
Deplasare logica - stanga (cu insertia unui zero in bitul de rang ρA-1).<br />
A ← A1 ,A2 ,......,AρA-1,0<br />
Deplasare aritmetica dreapta (cu extinderea bitului de rang 0 in bitul de rang 1).<br />
A ← A0, A0 ,A1 ,A2 ,......,AρA-2<br />
Deplasarea aritmetica stanga este identica cu deplasarea logica stanga.<br />
Rotire -dreapta.<br />
A ← AρA-1, A0 ,A1 ,A2 ,......,AρA-2<br />
Rotire - stanga.<br />
A ← A1 ,A2 ,......,AρA-1, A0<br />
In operatiile de deplasare si rotire, inaintea bitului de rang 0 si dupa bitul de rang ρA-1, se pot<br />
plasa biti individuali reprezentand indicatori de conditii ( de exemplu, din unitatea de executie,<br />
bitul de transport). Cele mai multe microprocesoare dispun de instructiuni care implementeaza<br />
asemenea operatii de deplasare. Ele sunt folosite pentru instructiunile de transfer conditionat al<br />
comenzii.<br />
In continuare sint ilustrate operatiile de rotire/deplasare circulara a liniilor unei matrici.<br />
Fie: 1 0 0<br />
M = 1 1 0<br />
0 1 1<br />
Deplasare circulara in sus.<br />
1 1 0<br />
Daca N ← M 1:2 ! M 0 , atunci rezulta: N = 0 1 1<br />
1 0 0
Deplasre circulara in jos.<br />
0 1 1<br />
Daca N ← M 2 ! M 0:1 , atunci rezulta: N = 1 0 0<br />
1 1 0<br />
Extragerea.<br />
Fie: X = (1,2,3,4,5,6)<br />
daca Y ← 4↑X, atunci rezulta: Y = ( 1,2,3,4 ) in APL<br />
Eliminarea.<br />
daca, Y ← 4↓X atunci rezulta: Y = ( 4,5,6 ) in APL.<br />
In AHPL notatiile echivalente vor fi urmatoarele:<br />
Y ← X0:3 ( extragere ) si respectiv Y← X4:6 ( eliminare )<br />
Decodificare binara.<br />
Fie: X = ( 1,1,0,1 ) si Y = ( 1,0,0,0,1 )<br />
daca: x ← ⊥ X si y ← ⊥ Y, atunci: x = 13 si y = 17<br />
Codificarea binara.<br />
Fie: x = 13 si y = 17<br />
daca: X ← 4 Τ x si Y ← 5 Τ y, atunci: X = ( 1,1,0,1 ) si Y = ( 1,0,0,0,1 ).<br />
Reducere.<br />
Fie @ un operator binar care se aplica unui vector binar X,rezultatul operatiei va fi de forma:<br />
x ← ( ....(( X0@X1 )@X2 )@.....XρX-1 )<br />
Expresia:<br />
x ← +/X este echivalenta cu :<br />
ρX-1<br />
x ← Σ Xi<br />
i=0<br />
Daca X este un vector logic ( cu componente binare ), atunci urmatoarele operatii vor furniza<br />
informatii <strong>privind</strong>:<br />
x ← +/X, numarul de unitati din vectorul X;<br />
x ← ∪ /X, prezenta a cel putin unei unitati diferita de zero, daca x 0;<br />
x ← ∩ X, prezenta tuturor componentelor egale cu unu, daca x = 1.
Fie matricea M:<br />
1 0 0 1<br />
M ← 0 1 0 0 , atunci: +/M = ( 2,1,3 ); +//M = ( 2,1,1,2,) si +/(+//(M)) = 6.<br />
1 0 1 1<br />
Comprimare.<br />
Fie U = ( 1,0,0,1 ) si A = ( 1,2,3,4 ), atunci: X ← U/A, conduce la rezultatul: X = ( 1,4 )<br />
Considerind matricea M si vectorul U de mai sus, comprimarea pe linii N ← U/M va furniza<br />
matricea N, de forma:<br />
1 1<br />
N ← 0 0<br />
1 1<br />
Comprimarea coloanelor va fi exemplificata cu un vector logic V, de forma: V = ( 1,1,0 ).<br />
N
Se poate observa ca vectorul U se pute genera simplu prin opeatia:<br />
U ← (M0 ∩ M1 ∩ M2 ∩ M3)<br />
Deci, tot programul secvential de mai sus se poate inlocui cuexpresia:<br />
N ← (M0 ∩ M1 ∩ M2 ∩ M3) // M<br />
Conventii AHPL pentru descrierea logicii combinationale.<br />
S-a aratat ca procesul de prelucrare a datelor consta in trans-ferul acestora intre registrele sursa<br />
si registrele destinatie prin intermediul unor retele logice combinationale. Acestea din urma<br />
reprezinta resurse hardware, care pot fi folosite in mod repetat, cu diverse argumente, in puncte<br />
diferite ale secventei AHPL, care descrie algoritmul.<br />
Se considera o retea logica combinationala, care realizeaza operatia NAND ( SI-NU ) asupra<br />
rangurilor a doi vectori de 4 biti.<br />
C ← ( A0 ∩ B0 , A1 ∩ B1 ,A2 ∩ B2 , A3 ∩ B3)<br />
Daca expresia de mai sus apare in mod repetat in secventa AHPL, se poate folosi o notatie<br />
prescurtata:<br />
C ← NAND(A;B), care este asemanatoare unei notatii de subrutina intr-un limbaj de<br />
programare. In contextul de fata NAND(A;B) va fi mentionata ca o functie sau o unitate logica<br />
combinationala.<br />
Intr-un program AHPL, ea va fi descrisa o singura data, dupa care poate fi apelata in mod<br />
repetat, cu diferite argumente.<br />
Sub forma generala descriera unei asemenea functii fi delimitata de titlu si de sfirsit ( END ).<br />
UNIT: NAND(A;B)<br />
END<br />
conexiuni<br />
.........<br />
conexiuni<br />
Dupa titlu pot urma declaratii <strong>privind</strong> vectorii manipulati, lungimea lor etc. Conexiunile sunt<br />
instructiuni care se traduc direct in hardware sub forma unor legaturi intre intrarile si iesirile<br />
unor circuite logice combinationale.<br />
Intr-un alt paragraf se vor da mai multe exemple <strong>privind</strong> descrierea unor unitati logice<br />
combinationale: BUSFN, DCD, ADD etc.
7. Descrierea sistemelor numerice la nivelul transferurilor<br />
intre registre folosind limbajul AHPL.<br />
Sistemele numerice de calcul au un caracter complex ceea ce conduce la o serie de dificultati,<br />
atat in privinta descrierii lor functionale, cat si a proiectarii lor.<br />
Plecand de la modul lor de functionare, ele pot fi partajate in subsisteme sau module mai<br />
simple, cu specificatii bine precizate in legatura cu semnalele de intrare si iesire, care vor<br />
reprezenta date, comenzi, stari, sincronizari etc, pe de-o parte, cat si in legatura cu algoritmul de<br />
operare.<br />
Sub aspect functional, un sistem numeric poate fi descris prin proceduri si functii, plecind de la<br />
algoritmul pe care trebuie sa-l execute. Astfel, intr-o prima etapa, descriera sistemului numeric<br />
va fi asemanatoare cu cea a unui program de mare complexitate.<br />
Procedurile vor avea ca implementari fizice modulele, in timp ce functiile vor fi realizate prin<br />
unitati logice combinationale.<br />
In cadrul modulelor pot fi evidentiate unitatile de executie si de comanda. In descrierea<br />
modulelor se intilnesc in mod frecvent functii a caror implementare conduce la scheme logice<br />
combinationale. Pentru prezentarea modalitatilor de descriere ale modulelor si functiilor se va<br />
folosi forma BNF ( Backus-Naur Form ).<br />
Structura unei proceduri ( modul ) este urmatoarea:<br />
MODULE: < nume modul ><br />
END<br />
< lista de declaratii ><br />
< lista de pasi AHPL ><br />
ENDSEQ<br />
< lista de instructiuni individuale nesincronizate si instructiuni ><br />
< lista de declaratii >:= < MEMORY ( memorii ) ><br />
< INPUTS ( intrari ) ><br />
< OUTPUTS ( iesiri ) ><br />
< BUSES ( magistrale ) ><br />
< LABELS ( etichete ) ><br />
< ONE-SHOTS ( monostabile ) ><br />
< COMBUSES ( magistrale decomunicatii)>
MEMORY >: < lista de bistabile >;< lista de registre >;<br />
< lista de bistabile >:= < nume bistabil >;...;< nume bistabil ><br />
< lista de registre>:= < nume registru[i]>;...;<br />
< i, j >:= dimensiunile registrelor<br />
< i, j >:= 1|2|.......|n<br />
< lista de memorii >:= < nume memorie[m;n] >;...;< nume memorie[r;q]<br />
< m,r >:= numar de cuvinte in memorii<br />
< n,q >:= numar de biti in cuvintele de memorie<br />
< m, n, q, r >:= 1|2|......|n<br />
< INPUTS >: < lista de vectori >;< lista de semnale individuale><br />
< lista de vectori >:= < nume vector[i] >;...;< nume vector[j] ><br />
< lista de semnale individuale >:= < nume semnal >;...;< nume semnal ><br />
: < lista de vectori >;...;< lista de semnale individuale ><br />
< BUSES >: < lista de magistrale ><br />
< lista de magistrale >:= < nume magistrala[i] >;...;< nume magistrala[j] ><br />
< i,j >:= dimensiunile magistralelor<br />
< LABELS >: < lista de etichete ><br />
< lista de etichete >:= < nume eticheta >;...; < nume eticheta ><br />
( etichetele sunt folosite pentru a referi campuri din anumite registre - subregistre etc )<br />
< ONE-SHOTS >: < lista de monostabili ><br />
< lista de monostabili >:= < numemonostabil[i] >;...;< nume monostabil[j] ><br />
< i,j >:= duratele semnalelor la iesirile monostabilelor, date in multipli ai perioadei de tact<br />
< COMBUSES >: < lista de magistrale de comunicatii ><br />
< lista de magistrale de comunicatii >:= < nume magistrala[i] >;< nume magistrala[j]<br />
( magistrala de comunicatii trebuie sa fie conectata la un set de linii de intrare/iesire in/din<br />
modul ><br />
Exemplu de declaratii: Se considera un modul FILTRU DE CUVINTE plasat intre doua<br />
sisteme numerice A ( emitator ) si B ( receptor ), care permite trecerea unor vectori binari ce<br />
indeplinesc anumite conditii. Modulul poseda registrele de intrare si iesire<br />
REGIN[16] si REGIES[16], registrul intern A[4] si bistabilul a,
intrarea X[16] si iesirile Z[16], gatain, gataies.<br />
Descrierea modulului va incepe astfel:<br />
MODULE: FILTRU DE CUVINTE<br />
MEMORY: REGIN[16]; REGIES[16]; A[4], a<br />
INPUTS: X[16]<br />
OUTPUTS: Z[16]; gatain; gataies<br />
In continuare se va prezenta secventa de pasi AHPL. Un pas AHPL contine toate operatiile<br />
elementare, sincrone cu o perioada a ceasului, care au loc la nivelurile resurselor unitatilor de<br />
executie si comanda. Fiecare pas de comanda va consta din instructiuni AHPL de atribuire<br />
(actiune si o instructiune AHPL de ramificare/control ).<br />
< secventa de pasi AHPL >:= < pas AHPL><br />
< pas AHPL ><br />
............<br />
< pas AHPL ><br />
< pas AHPL >:= < lista de instructiuni de atribuire >;< instructiune de ramificatie ><br />
< instructiune de atribuire >:= < nul >|< transfer sincron >|< conexiune >|< transfer sicron;<br />
conexiune ><br />
< instructiune de ramificare >:= < nul >|< → (F)/(Sj) >|< → (Sj) >|< DEAD END-fara<br />
continuare ><br />
< nul >:= < absenta instructiunii de atribuire >|< instructiune implicita de ramificare la pasul<br />
urmator ><br />
< transfer sincron >:= < VD |< VD ← MLCS*F >|< MD*F ← VLCS ><br />
VD - vector destinatie. El reprezinta fie un registru simplu, fie un vector format din unul sau<br />
mai multe elemente de memorie asamblate pe baza unor operatori de selectie. Indicii superiori si<br />
inferiori, care afecteaza operanzii, sunt in mod obligatoriu constante.<br />
Se folosesc urmatorii operatori de selectie:<br />
Aj - elementul j din vectorul<br />
A m:n - elementele m, pina la n, din vectorul A<br />
, - inlantuire ( concatenare )<br />
A ! B - inlantuire pe linii<br />
M j - linia j din matricea M
Mm:n - liniile m, pina la n, din matricea M.<br />
VLCS reprezinta un vector logic combinational sursa, constituit din expresii logice<br />
combinationale evaluate, ale caror argumente (operanzi) pot fi: elemente de memorie, intrari,<br />
functii logice, magistrale, constante binare.<br />
Operatorii din expresii sint de tip logic: ∩ (SI), ∪ (SAU), (NU), ∩ / ( SI aplicat<br />
elementelor vectorului ), ∪ / (SAU aplicat elementelor vectorului), ⊕ / (SAU-Exclusiv),<br />
SYN (sincronizare).<br />
In absenta parantezelor, in expresiile din VLCS, operatorii logici si de selectie vor avea<br />
urmatoarele prioritati:<br />
1. Negatia si Sincronizarea,<br />
2. Toti operatorii de selectie, cu exceptia inlantuirii,<br />
3. ∩<br />
4. ∪ sau ⊕ ,<br />
5. Inlantuirea.<br />
MD - matrice de memorie sau asamblaj de registre de memorare.<br />
MLCS - matrice logica combinationala sursa, constituita din asamblaje de vectori logici<br />
combinationali.<br />
F - vector de selectie, ale carui componente sint expresii logice combinationale evaluate, care se<br />
exclud mutual:<br />
F = ( f1 ( x1 ,...,xn ),.....,fm (x1 ,...,xn),<br />
unde: ( fi ∩ f j =0 ) si ( ∪ /F ) = 1; i,j = 1,...,n; i = j; xI ∈ { 0,1 }.<br />
Expresiile: MLCS*F si MD*F sint echivalente cu expresiile:<br />
F/MLCS si F/MD ( selectie pe linii ).<br />
< conexiune > := < BUS = VLCS >|< BUS = MLCS*F >|< Z = VLCS >|< Z = MLCS*F ><br />
Exemple:<br />
D ← Am:n , Bp:q<br />
D ← A + B,C<br />
Fie matricea logica combinationala sursa: ( A ! B ! C ), unde A, B, C sunt vectori logici<br />
combinationali, si vectorul logic:<br />
F = ( d, e, f ).
In aceste conditii se pot scrie urmatoarele instructiuni de atribuire:<br />
1. D ← ( A ! B ! C ) * ( d, e, f )<br />
echivalenta cu:<br />
D ← d ∩ A U e ∩ B U f ∩ C<br />
2. ( A ! B ! C ) * ( d, e, f ) ← D<br />
echivalenta cu:<br />
d ∩ A ∪ e ∩ B ∪ f ∩ C ← D<br />
3. BUS = ( A ! B ! C ) * ( d, e, f )<br />
reprezenand o conexiune conditionala la magistrala BUS a unuia dintre vectorii A, B, sau C.<br />
In instructiunea de tip ramificatie, F are semnificatia prezentata mai sus, iar E constituie un<br />
vector ale carui componente (Ei) sunt numere/etichete de pasi AHPL, din secventa data, la care<br />
poate avea loc ramificarea ( transferul comenzii ).<br />
De exemplu, ramificarea:<br />
→ ( x, x )/( Ei, Ej)<br />
asigura transferul comenzii la linia Ei , daca x = 1 sau la linia Ej , daca x = 0.<br />
DEAD END marcheaza sfirsitul comenzii, terminarea operarii in sensul ca instructiunea de<br />
comanda nu mai genereaza trecerea la pasul urmator din secventa, acesta lipsind.<br />
Dupa END SEQ ( sfirsitul secventei de pasi AHPL ), in descrierea modulului sint plasate<br />
instructiunile individuale de atribuire nesincronizate, conexiunile permanente, operatiile de<br />
comanda asincrone, cum ar fi operatia RESET(1), care forteaza reluarea secventei numerotate<br />
de pasi AHPL de la linia 1.<br />
Descrierea AHPL a unei functii.<br />
UNIT: < nume de functie >( )<br />
< declaratii ><br />
< secventa de instructiuni de conexiune, contorizare,<br />
transfer al comenzii ><br />
END<br />
< parametri > := < lista de intrari ><br />
< lista de intrari >:= < VLC >|< MLC ><br />
< declaratii >: < INPUTS ><br />
< OUTPUTS >
INPUTS >: < lista de intrari separate prin ; ><br />
< OUTPUTS >:< vector logic combinational ><br />
< secventa de instructiuni > := < conexiune >| < atribuire de valoare unui indice >|< transfer<br />
conditionat al comenzii ><br />
< atribuire de valoare unui indice > := < nume indice ⇐ valoare binara | zecimala ><br />
< transfer conditionat al comenzii >:= < ⇒ (F)/(S) ><br />
Efectul executiei unui program AHPL, ce descrie o unitate, reprezinta compilarea - generarea<br />
schemei hardware pentru acea unitate combinationala. Numai instructiunile de conexiune<br />
genereaza efectiv hardware. Instructiunile care manipuleaza indici si cele de transfer asigura<br />
efectuarea unor operatii de ciclare pentru generarea unor copii multiple ale aceleiasi scheme.<br />
Folosirea functiilor, in cadrul unor module, presupune descrierea lor ca unitati, o singura data,<br />
in vederea compilarii/generarii schemei logice combinationale specifice. Unitatea poate fi apelata<br />
ca functie, in cadrul instructiunilor de atribuire ( transfer | conexiune ), din secventa de pasi<br />
AHPL, a unui modul.<br />
In rezumat structura bloc a unui sistem numeric consta din module si functii:<br />
Sistem Numeric<br />
*) Specifica o conexiune<br />
Modul<br />
Nume modul<br />
Declaratii Pas secv.<br />
Procedura Modul Secventa de comanda Pas secv.<br />
Sfarsit secventa Pas secv.<br />
Transferuri si conexiuni<br />
Modul Sfarsit<br />
Unitate<br />
Nume unitate<br />
Declaratii Pas secv.<br />
Functie Unitate Secventa de conexiuni Pas secv.<br />
Sfarsit Pas secv<br />
Unitate<br />
* )
Sintaxa unui pas de comanda din secventa:<br />
NUL<br />
Instructiune de conectare<br />
Actiune Transfer sincron<br />
Transferuri si conexiuni<br />
Pas din secventa<br />
de comanda → (F)/(E)<br />
→ (Ej)<br />
Ramificatie NUL<br />
Fara continuare (DEAD END)<br />
Transferul sincron poate avea unul din urmataoarele formate:<br />
VD ← VLCS<br />
Transfer sincron VD ← MLCS * F<br />
MD * F ← VLCS<br />
Instructiunea de conectare poate avea unul din urmatoarele formate:<br />
BUS = VLCS<br />
Instructiune de conectare BUS = MLCS*F<br />
z = VLCS<br />
z = MLCS * F<br />
Exemple de descrieri AHPL ale unor UNITATI (Circuite Logice Combinationale) si ale<br />
unor module.<br />
1. Sumatorul Complet (FULLADD).<br />
Sumatorul Complet reprezinta un circuit logic combinational cu trei intrari: x, y, cin si doua<br />
iesiri: sum, cout. Intrarile x si y sunt intrari de date de cate un bit (corespunzatoare unui rang<br />
oarecare i, in cazul adunarii a doi vectori binari X si Y), iar cin este intrarea de transport (din<br />
rangul inferior). Iesire sum corespunde sumei, pentru rangul curent, iar cout constituie<br />
transportul in rangul urmator. x y<br />
cout cin<br />
FULLADD<br />
sum
Ecuatiile logice pentru sum si cout sunt urmatoarele:<br />
sum = ( x ∩ y ∩ cin ) ∪ ( x ∩ y ∩ cin ) ∪ ( x ∩ y ∩ cin ) ∪ ( x ∩ y ∩ cin )<br />
cout = ( x ∩ y ) ∪ ( x ∩ cin ) ∪ ( y ∩ cin )<br />
Aceste ecuatii se pot implementa cu ajutorul portilor SI, SAU, NU.<br />
Folosind si porti SAU-EXCLUSIV, expresiile de mai sus devin mai simple:<br />
sum = x ⊕ y ⊕ cin<br />
cout = ((x ⊕ y) ∩ cin ) ∪ ( x ∩ y )<br />
Cu ajutorul ecuatiilor de mai sus se poate prezenta o secventa AHPL, de descriere a Sumatorului<br />
Complet, sub forma unei Unitati:<br />
UNIT: FULLADD(x ; y ; cin)<br />
END<br />
INPUTS: x ; y ; cin<br />
OUTPUTS: FULLADD[2]<br />
1. a = x ⊕ y<br />
2. b = x ∩ y<br />
3. sum = a ⊕ cin<br />
4. c = a ∩ cin<br />
5. cout = b ∪ c<br />
6. FULLADD0 = cout<br />
7. FULLADD1 = sum<br />
Primele cinci instructiuni reprezinta pasi de conectare, iar ultimele doua instructiuni constituie<br />
iesirile.<br />
Se poate observa ca secventa care descrie un Sumator Complet are un caracter “spatial”, in<br />
sensul ca pasii reprezentati corespund iesirilor/intrarilor portilor logice, care intra in componenta<br />
unei retele spatiale. Pasii 1-7 nu sunt legati de vreun mecanism de temporizare. Elementul timp<br />
intervine, in acest context, numai in legatura cu intarzierea in propagarea semnalelor prin porti..<br />
Intrarile x, y si cin trebuie sa fie stabile pana la obtinerea rezultatelor sum si cout.<br />
Pe baza Unitatii FULLADD se poate genera un sumator cu transport succesiv pentru numere<br />
binare de cate 16 biti.
Sumator, ADD, cu transport succesiv, pentru numere binare de cate 16 biti.<br />
Pentru realizarea unui asemenea sumator, se vor utiliza, in caltate de blocuri constructive,<br />
componentele Sumatorului Complet: FULLADD0 si FULLADD1. Acestea vor fi chemate<br />
succesiv, in cadrul unor cicluri, pentru fiecare bit al sumatorului ADD. In cadrul programului<br />
AHPL, pentru controlul ciclurilor se va introduce un indice i, care va fi initializat, decrementat si<br />
testat. Operatiile corespunzatoare manipularii indicelui i vor fi marcate cu sageti cu corp dublu,<br />
care vor fi tratate intr-o maniera specifica de catre compilatorul, care va genera schema lui ADD.<br />
UNIT: ADD( X; Y )<br />
END<br />
INPUTS X[16]; Y[16]<br />
OUTPUTS: ADD[17]<br />
1. C16 = 0<br />
2. i ⇐ 15<br />
3. Ci = FULLADD0 ( Xi; Yi; Ci+1)<br />
4. Si = FULLADD1 ( Xi; Yi; Ci+1)<br />
5. i ⇐ i – 1<br />
6. ⇒ ( i ≥ 0)/(3)<br />
7. ADD = C0, S0:17<br />
Compilarea manuala a acestui program AHPL, va genera elementele schemei sumatorului ADD,<br />
in maniera prezentata mai jos la nivelul primelor doua si al ultimei parcurgeri a programului.
X15 Y15<br />
1. C15 C16<br />
2. X14 Y14 X15 Y15<br />
S15<br />
C14 C15 C16<br />
S14 S15<br />
3. X0 Y0 X14 Y14 X15 Y15<br />
2. Decodificatorul DCD.<br />
C0 C14 C15 C16<br />
C0 S0 S14 S15<br />
ADD0 ADD1 ADD14 ADD15<br />
Decodificatorul DCD(A), unde A este un vector binar de n biti, este un circuit combinational cu<br />
n intrari si 2 n iesiri. Pentru oricare vector binar, aplicat la intrare, numai o singura iesirea<br />
decodificatorului va fi activa.<br />
A0 DCD0<br />
A1 DCD1<br />
DCD<br />
FADD<br />
An DCD2 n -1<br />
Descrierea DCD(A) in AHPL este urmatoarea:<br />
UNIT: DCD(A)<br />
INPUTS: A[n]<br />
OUTPUTS: DCD( 2 n )<br />
1. i ⇐ 0<br />
2. DCDi = ∩ /(( n Τ i ) / A), ( n Τ i ) / A)<br />
3. i ⇐ i + 1<br />
4. i ⇒ ( i < 2 n )/(2)<br />
END<br />
FADD<br />
FADD<br />
FADD<br />
FADD<br />
FADD
Primul pas initializeaza indexul i, pentru a stabili iesirea decodificatorului, care urmeaza sa fie<br />
evaluata. Operatiile inceteaza dupa evaluarea tuturor iesirilor decodificatorului DCD.<br />
Pentru a intelege cum se evalueaza iesirile decodificatorului, sa considera cazul particular n = 4<br />
si i = 5.<br />
DCD5 = ∩ /(( 4 Τ 5 ) / A), ( 4 Τ 5 ) / A )<br />
= ∩ /((0,1,0,1) / A), (0,1,0,1) / A)<br />
= ∩ /(( A1, A3 ), (A0, A2)) = A0 ,A1, A2, A3<br />
In cazul in care A = A0 ,A1, A2, A3 = (0, 1, 0, 1) se obtine DCD5 =1. Celelalte iesiri DCDj, pentru<br />
care j ∈ {0, 1, 2,….., 2 n-1 } ∩ j ≠ 5, vor lua valoarea 0.<br />
3. Circuitul, BUSFN, de citire a unui cuvant dintr-o memorie M.<br />
Se considera o memorie M, alcatuita din mai multe registre M 0 , M 1 , ……, M 2↑m –1 . Memoria<br />
primeste informatiile de adresa de la un registru RA si efectueaza operatiile de citire/scriere prin<br />
intermediul unui registru RD.<br />
Adresa<br />
Scrie Citeste<br />
Data<br />
Memoria M dispune de o unitate de comanda, care asigura controlul operatiilor de scriere si<br />
citire, pe baza semnalelor primite din exterior.<br />
Operatiile de citire si scriere se pot descrie, la nivelul transferurilor intre registre, dupa cum<br />
urmeaza:<br />
• Citire<br />
R<br />
A<br />
Comnada<br />
( DCD),<br />
(BUSFN)<br />
i. RA ← Adresa<br />
(i +1). RD ← BUSFN( M; DCD(RA)); Citeste = 1<br />
• Scriere<br />
j. RA ← Adresa; RD ← Data<br />
(j +1). M* DCD(RA) ← RD; Scrie = 1<br />
M 0<br />
M 1<br />
…..<br />
2↑m -1<br />
M<br />
RD
BUSFN(M; DCD(RA)) reprezinta o functie logica combinationala, care are ca argumente o<br />
matrice M, cu ρ2M linii si ρ1M coloane, pe de-o parte si un vector DCD(RA), cu 2 m<br />
componente, pe de alta parte, unde ρ2M = 2 m .<br />
Daca in locul vectorului DCD(RA) se utilizeaza un vector R[r], iar ρ1M este egal cu p, se poate<br />
obtine urmatoarea descriere AHPL:<br />
UNIT: BUSFN( M ; R )<br />
END<br />
INPUTS: M[ r : p ]<br />
OUTPUTS: BUSFN[ p ]<br />
1. N 0 = M 0 ∩ R0<br />
2. i ⇐ 1<br />
3. N i = ( M i ∩ Ri ) ∪ N i-1<br />
4. i ⇐ i + 1<br />
5. i ⇒ ( i < r )/(3)<br />
6. BUSFN = N r-1<br />
O schita a implementarii unitatii BUSFN, in contextul operatiei de citirere, este data mai jos.<br />
SCNi<br />
citeste<br />
M0 M1 Mp2M-1<br />
DCD0 DCD1<br />
DCDp2M-1<br />
0 1<br />
N N<br />
BUSFN(M;DCD(RA))<br />
MAG/BUS
4. Implementarea secventei start/reset (PRESET).<br />
Implementarea primilor pasi dintr-o secventa AHPL, din cadrul descrierii unui modul a carui<br />
operare este lansata de semnalul start, este prezentata mai jos. Primul bistabil (1), cat si celelalte<br />
bistabile (2), (3), (4) ale schemei de comanda au fost fortate, printr-un semnal reset/PRE/CLR<br />
asincron, in starile Q1 = 1 si, respectiv, Q2 =0, Q3 =0, Q4 =0. Comanda reset, in cazul de fata<br />
PRESET, are un caracter asincron si apare, in secventa AHPL, intre specificatiileENDSEQ si<br />
END, sub forma: PRESET(1), unde (1) constituie linia AHPL, la care se efectueaza saltul (un<br />
GO TO 1 asincron).<br />
Ceas<br />
PRESET<br />
Ceas<br />
start<br />
SYN(start)<br />
SCN1<br />
SCN2<br />
SCN3<br />
PRE<br />
D Q<br />
C<br />
D Q<br />
D Q<br />
D Q<br />
1 2 3 4<br />
C<br />
CLR<br />
C<br />
CLR<br />
C<br />
CLR<br />
SYN(start)<br />
SCN2 SCN3 SCN4
In continuare, operarea automatului cu stari complet decodificate, la nivelul primului bistabil,<br />
este prezentata sub forma diagramei de tranzitii:<br />
SYN(start) PRESET(1)<br />
1<br />
SYN(start)<br />
Dupa cum se constata, automatul va parasi starea (1) numai in conditiile in care semnalul<br />
SYN(start) va trece pe nivel ridicat. In caz contrar, starea (1) se va extinde pe un numar indefinit<br />
de perioade de ceas.<br />
5. Sincronizarea semnalului start.<br />
In cele prezentate mai sus, s-a vazut necesitatea existentei unui semnal de start, pentru activarea<br />
automatului de comanda al unui modul. De cele mai multe ori semnalul start este dat manual,<br />
ceea ce face ca el sa fie asincron cu ceasul sistemului si sa aibe o durata relativ mare.<br />
Sincronizarea semnalului start, specificata prin operatorul SYN(start), se poate realiza cu<br />
ajutorul diferitelor scheme. Mai jos se prezinta una dintre acestea, impreuna cu diagramele de<br />
semnale.<br />
start<br />
ceas<br />
ceas<br />
start<br />
SYN(start)<br />
SYNI(start)<br />
SNP(SYN(start))<br />
PRE<br />
D Q<br />
C<br />
2<br />
SYN(start)<br />
PRE<br />
D Q<br />
C<br />
SYNI(start)<br />
SNP(SYN(start))
Se poate usor observa ca, cel de-al doilea bistabilul reproduce sub forma negata, la iesirea Q,<br />
semnalul SYN(start), intarziat cu o perioada de ceas. Prin efectuarea produsului logic intre<br />
SYN(start) si semnalul SYNI(start) se obtine un semnal de start sincronizat, de tip nivel, cu<br />
durata unei perioade de ceas: SNP(SYN(start)).<br />
6. Comanda citirii instructiunii dintr-o memorie principala asincrona.<br />
Memoriile principale ale calculatoarelor numerice reprezinta module, care opereaza asincron, de<br />
cele mai multe ori.<br />
Secventa AHPL, pentru citirea unei instructiuni dintr-o memorie M, prevazuta cu registrele de<br />
adresa RA si registrul de date RD, in registrul de instructiuni RI, are urmatorul aspect:<br />
2. RA ← CP /* CP este contorul programului<br />
3. RD ← BUSFN(M;DCD(RA))<br />
4. RI ← RD<br />
In cazul unei memorii asincrone, al carei model logic este dat mai jos, adresele si datele<br />
presupun, pe de-o parte, folosirea unor magistrale: ADR, DATIN, DATIES, iar comanda, pe de<br />
alta parte, utilizarea unor semnale de control citeste, scrie si de stare ocupat.<br />
ADR<br />
R<br />
A<br />
M<br />
DATIN<br />
citeste<br />
Comanda<br />
scrie ocupat<br />
DATIES MAG<br />
Modelul logic al modulului memoriei principale.<br />
R<br />
D
In aceste conditii secventa AHPL, de citire a unei instructiuni, din memorie, capata urmatorul<br />
aspect:<br />
2. ADR ← CP; citeste = 1<br />
→ SYN(ocupat)/(2)<br />
3. nul<br />
→ SYN(ocupat)/(3)<br />
4. FARA INTARZIERE<br />
(1)<br />
ceas<br />
ceas<br />
MAG = DATIES; RI ← MAG<br />
SCN2<br />
citeste<br />
ocupat<br />
SYN(ocupat)<br />
SCN3<br />
SCN4<br />
citeste<br />
D Q<br />
ADR
7. Exemple de module descrise in AHPL.<br />
Umatoarele doua exemple de module sunt preluate din lucrarea Calculatoare numerice.<br />
Hardware-structura si proiectare, autori F.J. Hill si G.R.Peterson, Editura Tehnica 1981.<br />
7.1.Unitate de comanda pentru o masina unealta.<br />
Se cere proiectarea unei unitati de comanda, pentru o masina unealta, care foloseste o memorie<br />
ROM[1024:18] pentru a stoca patru secvente, de cate 256 cuvinte x 18 biti, structurati sub<br />
forma a trei campuri, pentru a specifica pozitia uneltei in trei dimensiuni. Pozitia curenta a<br />
uneltei este memorata intr-un registru PR[18], care furnizeaza, conform structurarii sale pe cele<br />
trei campuri, vectori binari, de cate sase biti, pentru trei convertoare numeric/analogice CN/,<br />
care comanda echipamentul de actionare al masinii unelte. Comunicarea cu operatorul se<br />
realizeaza cu ajutorul unui bistabil start/stop ss (controlat din exterior de catre semnalele de<br />
comanda start si stop) si al unui registru RSECV[2] (comandat di exterior prin semnalul<br />
SECV[2], in care se memoreaza numarul secventei, care se executa: 00, 01, 10, 11.<br />
Prin fortarea in unu a bistabilului ss, se va lansa in executie secventa al carei numar este stocat in<br />
RSECV.<br />
Daca, pe parcursul functionarii sistemului, operatorul forteaza in unu intrarea stop, bistabilul ss<br />
va lua valoarea zero, secventa curenta se va termina si in registrul RP se va stoca un vector binar<br />
cu 18 componente egale cu zero, iar unitatea de comanda va trece in starea initiala (1).<br />
In cazul terminarii normale a secventei curente vor avea loc operatiile:<br />
ss ← 0 ; PR ← 18 Τ 0 ; → (1)<br />
Modificarile continuturilor lui ss si RSECV vor fi sincronizate cu ceasul.<br />
Solutie: Pentru implementare, pe langa resursele mentionate mai sus, se va mai introduce un<br />
registru de adrese RA[10] de 10 biti. Cele patru secvente sunt notate cu A, B, C, D si vor avea,<br />
in zecimal, urmatoarele adrese de start: 0, 256, 512, 768. Frecventa ceasului este compatibila cu<br />
rata impusa de citirile efectuate de masina unealta. Un cuvant se citeste din memeorie intr-o<br />
singura perioada de tact.<br />
SECV<br />
RSECV<br />
start R ROM<br />
R IESRP<br />
A<br />
P<br />
ss<br />
stop
MODULE: Unitate_de _comanda_pentru_o_masina_unealta<br />
MEMORY: ROM[1024:18]; RP[18]; RA[10]; RSECV[2]; ss<br />
INPUTS: SECV[2]; start; stop<br />
OUTPUTS: IESRP[18]<br />
1. RSECV ← SECV<br />
→ (ss, ss)/(1,2)<br />
2. RA ← RSECV0, RSECV1, 8 Τ 0<br />
3. RP ← BUSFN(ROM; DCD(AR))<br />
4. RA ← INC(RA)<br />
→ (( ∩ /RA 2:9 ∩ ss ), ss, ( ∩ /RA 2:9 ∩ ss ))/(5, 6 ,3)<br />
5. ss ← 0<br />
6. RP ← 18 Τ 0<br />
→ (1)<br />
ENDSECV<br />
END<br />
ss ← (1 ! 0) * (start, stop)<br />
IESRP = RP<br />
Plecand de la descrierea AHPL, de mai sus, sa se detalieze sectiunea de executie si sectiunea de<br />
comanda la nivelul schemelor cu porti, bistabile, registre, inclusiv semnalele de comanda.<br />
71. Verificator de caractere duble.<br />
Sa se proiecteze un modul numeric destinat verificarii caracterelor duble, prezente intr-un sir de<br />
caractere de cate 8 biti. Modulul poseda o linie de intrare, data, care va fi activata, pe nivel<br />
ridicat, de catre sursa de caractere, atunci cand un nou caracter este disponibil pe cele 8 linii de<br />
intrare CAR. Tranzitiile pe intrarile data si CAR[8] sunt sincronizate cu ceasul verificatorului de<br />
caractere. O linie de iesire, accept, va furniza un semnal de tip nivel, cu durata unei perioade de<br />
tact, dupa acceptarea caracterului de la intrarea CAR. O linie de iesire, y, conectata la un<br />
vistabil, Y, va fi activa pe nivel ridicat, in cazul in care cel mai recent caracter receptionat<br />
reprezinta o dublura a oricarui alt caracter din sirul de 16 caractere receptionate anterior. Iesirea
y va trece in 0 atunci cand accept este fortat in 1, ceea ce indica receptionarea unui nou caracter.<br />
Intervalul intre spsirile a doua caractere succesive este suficient de mare pentru a permite<br />
verificarea seriala a existentei vreunei dubluri.<br />
Sa se prezinte descrierea in AHPL a verificatorului de caractere duble.<br />
CAR[8]<br />
data y<br />
accept<br />
Solutie: Verificatorul de caractere duble va contine un tablou de 8 registre de deplasare, a cate<br />
16 biti fiecare. Acest tablou de registre va fi vazut ca o memorie MRD de 16 cuvinte a cate 8<br />
biti: MRD[16:8]. In schema trebuie prevazute un registru de intrare RIN[8] si un contor<br />
CNT[4], de caractere. Caracterul curent, receptionat in RIN, este comparat cu fiecare caracter,<br />
stocat in MRD, in procesul rotirii caracterelor catre linia superioara. CNT va contoriza<br />
verificarea celor 16 caractere din MRD. Dupa terminarea verificarii ultimului caracter din MRD,<br />
caracterul curent, din RIN, este fortat in MRD 15 , in timp ce cuvantul, inregistrat de cel mai mult<br />
timp, care se afla in MRD 0, este pierdut. La detectarea unui caracter dublu semnalul y este fortat<br />
in 1.<br />
Descrierea AHPL a modulului.<br />
MODULE: Verificator_de_caractere_duble<br />
MEMORY: MRD[16:8]; RIN[8]; CNT[4]; Y[1]<br />
INPUTS: CAR[8]; data<br />
OUTPUTS: accept; y<br />
1. → (data, data)/(1, 2)<br />
2. accept = 1; y ← 0<br />
RIN[8]<br />
CNT[4]<br />
RIN ← CAR; CNT ← 4Τ 0<br />
MRD[16:8] Y[1]
3. Y * ∪ /(RIN ⊕ MRD 0 ) ← 1<br />
CNT ← INC(CNT)<br />
MRD ← (MRD 1:15 ! MRD 0 )<br />
→ ( ∩ /CNT, ∩ /CNT )/(4,3)<br />
4. MRD ← (MRD 1:15 ! RIN)<br />
→ (1)<br />
ENDSEQUENCE<br />
y =Y<br />
END
module calculator;<br />
// declaratii registre, memorie etc<br />
reg [7:0] ac, ri, rd;<br />
reg [3:0] ra, cp;<br />
reg z,s,c,reset;<br />
reg [7:0] m[0:15];<br />
//incarcarea programului<br />
initial begin: incarca_prog<br />
//incarcarea programului<br />
$readmemb("prog2.v",m);<br />
//afisarea rezultatelor simularii sub forma tabelara<br />
$display(" timp cp ra rd ri ac z s reset");<br />
$monitor("%d %d %h %h %h %h %h %h %h",<br />
$time, cp,ra,rd,ri,ac,z,s,reset);<br />
//afisarea formelor de unda<br />
$vw_dumpvars();<br />
$vw_group("all",$time,cp,ra,rd,ri,ac,z,s,reset);<br />
//aplicarea semnalului reset (vezi task-ul apply_reset)<br />
apply_reset;<br />
end<br />
//oprire simulare<br />
initial begin: stop_at<br />
#300; $stop;<br />
end<br />
//bucla principala<br />
always begin:bucla_principala<br />
if (!reset)<br />
begin<br />
#10; fetch;<br />
#10; execute;<br />
end<br />
else<br />
#10;<br />
end<br />
// mijloace de depanare<br />
task apply_reset;<br />
begin<br />
reset = 1;<br />
#10;
eset = 0;<br />
cp = 0;<br />
ac = 0;<br />
end<br />
endtask<br />
// Task-urile principale: fetch, execute<br />
task fetch;<br />
begin<br />
rd = m[cp];<br />
cp = cp + 1;<br />
end<br />
endtask<br />
task execute;<br />
begin<br />
ri = rd;<br />
case(ri[7:4])<br />
4'b0000:begin // LAC<br />
ra = ri[3:0];<br />
rd = m[ra];<br />
ac = rd;<br />
end<br />
4'b0001:begin // SAC<br />
ra = ri[3:0];<br />
rd = ac;<br />
m[ra] = rd;<br />
end<br />
4'b0010:begin // ADN<br />
ra = ri[3:0];<br />
rd = m[ra];<br />
ac = ac+rd;<br />
s = ~ac[7];<br />
z = ~(|ac);<br />
end<br />
4'b0011:begin //SCD<br />
ra = ri[3:0];<br />
rd = m[ra];<br />
ac = ac-rd;<br />
s = ~ac[7];<br />
z = ~(|ac);<br />
end<br />
4'b0100: begin//AND<br />
ra = ri[3:0];<br />
rd = m[ra];
ac = ac & rd;<br />
end<br />
4'b0101:begin // OR<br />
ra = ri[3:0];<br />
rd = m[ra];<br />
ac = ac | rd;<br />
end<br />
4'b0110:begin // XOR<br />
ra = ri[3:0];<br />
rd = m[ra];<br />
ac = ac ^ rd;<br />
end<br />
4'b0111:begin // NAC<br />
ac = ~ac;<br />
end<br />
4'b1000:begin // JMP<br />
cp = ri[3:0];<br />
end<br />
4'b1001:begin // JPZ<br />
if(z)begin<br />
cp = ri[3:0];<br />
end<br />
else<br />
cp = cp;<br />
end<br />
4'b1010:begin // JN<br />
if(~z) begin<br />
cp = ri[3:0];<br />
end<br />
else<br />
cp = cp;<br />
end<br />
4'b1100:// HLT<br />
begin<br />
$display("halt");<br />
$stop;<br />
end<br />
default: $display("cod de operatie inexistent");<br />
endcase<br />
end<br />
endtask<br />
endmodule
prog2.v<br />
00001100<br />
01001101<br />
00001100<br />
01011101<br />
00001100<br />
01101110<br />
11000000<br />
00000000<br />
00000000<br />
00000000<br />
00000000<br />
00000000<br />
10100101<br />
01011010<br />
10101010<br />
00000000<br />
Veriwell -k C:\Program Files\VeriWell\exe\VeriWell.key -l C:\Program<br />
Files\VeriWell\exe\VeriWell.log calculator2.V<br />
VeriWell for Win32 HDL Tue Nov 21 08:19:37 2000<br />
This is a free version of the VeriWell for Win32 Simulator<br />
Distribute this freely; call 1-800-VERIWELL for ordering information<br />
See the file "!readme.1st" for more information<br />
Copyright (c) 1993-96 Wellspring Solutions, Inc.<br />
All rights reserved<br />
Memory Available: 0<br />
Entering Phase I...<br />
Compiling source file : calculator2.V<br />
The size of this model is [7%, 7%] of the capacity of the free version<br />
Entering Phase II...<br />
Entering Phase III...<br />
No errors in compilation<br />
Top-level modules:<br />
calculator<br />
timp cp ra rd ri ac z s reset<br />
0 x x xx xx xx x x 1<br />
10 0 x xx xx 00 x x 0<br />
20 1 x 0c xx 00 x x 0<br />
30 1 c a5 0c a5 x x 0
40 2 c 4d 0c a5 x x 0<br />
50 2 d 5a 4d 00 x x 0<br />
60 3 d 0c 4d 00 x x 0<br />
70 3 c a5 0c a5 x x 0<br />
80 4 c 5d 0c a5 x x 0<br />
90 4 d 5a 5d ff x x 0<br />
100 5 d 0c 5d ff x x 0<br />
110 5 c a5 0c a5 x x 0<br />
120 6 c 6e 0c a5 x x 0<br />
130 6 e aa 6e 0f x x 0<br />
140 7 e c0 6e 0f x x 0<br />
halt<br />
Stop at simulation time 150<br />
C1>
CSCI 320 Computer Architecture<br />
Handbook on Verilog HDL<br />
By<br />
Dr. Daniel C. Hyde<br />
Computer Science Department<br />
Bucknell University<br />
Lewisburg, PA 17837<br />
Copyright 1995<br />
By Daniel C. Hyde<br />
August 25, 1995<br />
Updated August 23, 1997
1. Tabla de materii<br />
1. Introducere …….............................................................…………….................<br />
1.1 Ce este Verilog?...................................................................…..……….....<br />
1.2 Ce este VeriWell?...............................................................…........………<br />
1.3 De ce se utilizeaza Verilog HDL? ....................................…..........……...<br />
2. Limbajul Verilog…….. ……...........................................................……………<br />
2.1 Primul Program Verilog....................................................…..........………<br />
2.2 Conventii Lexicale.....................................................…....…..........………<br />
2.3 Structura unui Program .....................................................…..........………<br />
2.4 Tipuri de Date……...............................................................….......……….<br />
2.4.1 Tipuri de Date Fizice.........................................................….…......<br />
2.4.2 Tipuri de Date Abstracte................................................….……......<br />
2.5 Operatori…................................................................................…..………..<br />
2.5.1 Operatori Arithmetici. Binari...................................................……..<br />
2.5.2 Operatori Arithmetici. Unari......................................................……<br />
2.5.3 Operatori Relationali.....................................................................….<br />
2.5.4 Operatori Logici ...............................................................................<br />
2.5.5 Operatori la Nivel de Bit...................................................................<br />
2.5.6 Operatori Unari de Reducere............................................................<br />
2.5.7 Alti Operatori....................................................................................<br />
2.5.8 Operator de Precedenta.....................................................................<br />
2.6 Constructii de Control................................................................………........<br />
2.6.1 Selectia: Instructiunile - if si case.......................…...........................<br />
2.6.2 Repetarea: Instructiunile - for, while si repeat...................................<br />
2.7 Alte Instructiuni......................................................................……………...<br />
2.7.1 Instructiunea - parameter .................................................................<br />
2.7.2 Atribuirea Continua .........................................................................<br />
2.7.3 Atribuiri Procedurale Blocante si Non – blocante............................<br />
2.8 Task-uri si Functii ...........................................................….....……….......<br />
2.9 Controlul Sincronizarii (Timing)................................................………......<br />
2.9.1 Controlul Intarzierii (#) ...................................................................<br />
2.9.2 Evenimente........................................................................................<br />
2.9.3 Instructiunea wait....................................................................…......<br />
2.9.4 Instructiunile fork and join...............................................................<br />
2.10 Examplu: Semafor de Trafic......................................................……........<br />
3.Utilizarea simulatorului Veriwell.....................................…………….………....<br />
3.1Crearea Fisierului Model ...........................................................………......<br />
3.2 Pornirea simulatorului..........................................................……..……......<br />
3.3 Cum se iese din Simulator? . ........................................................………...<br />
3.4 Optiunile Simulatorului..................................................................……......<br />
3.5 Depanarea ...............................................................................…………....<br />
4. Functiile si Task-urile de Sistem........................................……………………..<br />
4.1 $cleartrace................................................................…………….................<br />
4.2 $display ..............................................................................……………......<br />
4.3 $finish........................................................................……………...............<br />
4.4 $monitor .......................................................................……………............
4.5 $scope ..............................................................................……………........<br />
4.6 $settrace........................................................................……………............<br />
4.7 $showscopes.............................................................................…………....<br />
4.8 $showvars................................................................................………….....<br />
4.9 $stop......................................................................................……………....<br />
4.10 $time ....................................................................................……………..<br />
Bibliografie..............................................................................………………….…<br />
1. Introducere<br />
Verilog reprezinta un Limbaj de Descriere a Hardware-lui (Hardware Description<br />
Language -HDL).<br />
Un asemenea limbaj este utilizat pentru descrierea sistemelor numerice, de exemplu, un<br />
calculator sau o componenta a acestuia. Un sistem numeric poate fi descris, la niveluri diferite,<br />
in functie de aspectele care intereseaza. Astfel, un HDL poate descrie amplasarea traseelor de<br />
legatura (firele), a rezistoarelor si tranzistoarelor pe un circuit integrat, adica la nivel de<br />
comutator. Limbajul HD poate descrie sistemul numeric avand in vedere portile logice si<br />
bistabilele componente, adica la nivel de poarta. La un nivel mai ridicat sistemul numeric poate<br />
fi descris in termenii transferurilor vectorilor de informatie intre registre. Acesta reprezinta<br />
Nivelul Transferurilor intre Registre (Register Transfer Level - RTL). Limbajul Verilog<br />
suporta toate aceste niveluri. In cele ce urmeaza se va pune accent pe aspectele limbajului<br />
Verilog, care se refera nivelul RTL.<br />
<strong>1.1.</strong> Ce este Verilog?<br />
Verilog reprezinta unul dintre cele doua limbaje importante HDL, folosite de catre proiectantii<br />
din industrie si din mediile academice. VHDL reprezinta cel de-al doile limbaj. In ceea ce<br />
priveste industria parerile sunt impartite. Unii cred ca Verilog este mai usor de invatat si de<br />
utilizat decat VHDL. Standardul IEEE, pentru VHDL, a aparut in 1987, in timp ce standardul<br />
IEEE, pentru Verilog, a fost elaborat in 1995. Verilog este asemanator limbajului C, care este<br />
foarte raspandit in randurile inginerilor electronisti si de calculatoare. VHDL este asemanator cu<br />
limbajul Ada, mai putin cunoscut de catre inginerii amintiti mai sus.<br />
Verilog a fost lansat, in 1985, de catre Gateway System Corporation, care a fost preluata de<br />
catre Cadence Design Systems, Inc.’s Systems Division. Pana in 1990, cand a luat fiinta Open<br />
Verilog International (OVI), HDL Verilog a fost proprietatea companiei Cadence. Ulterior,<br />
Cadence a plasat Verilog in Domeniul Public, cu speranta deschiderii unei piete de produse<br />
software legate de Verilog VHDL, in conditiile in care acesta se va bucura de o larga raspandire.
Cadence a realizat faptul ca utilizatorii de Verilog HDL doresc alt software si alte servicii, care<br />
sa se bazeze pe pe acest limbaj, in vederea elaborarii de unelte de dezvoltare.<br />
Verilog HDL permite proiectantului de hardware sa descrie proiectele, atat la un inalt nivel de<br />
abstractizare, cum ar fi cel al arhitecturii sau comportamental, cat si la niveluri mai joase de<br />
implementare ( nivelurile portii si comutatorului), conducand la mastile/sabloanele pentru<br />
Circuitele Integrate pe Scara Foarte Larga (Very Large Scale Integration –VLSI-Integrated<br />
Circuits –IC- ) si la fabricarea circuitului.<br />
O prima utilizare a HDL-eurilor este acea legata de simularea proiectelor inainte de a fi<br />
introduse in fabricatie. Textul de fata nu acopera toate aspectele ce privesc Verilog HDL, ci<br />
numai acelea ce privesc nivelurile arhitectural si comportamental. Textul se axeaza pe<br />
proiectarea la nivel RTL.<br />
1.2. Ce este VeriWell?<br />
VeriWell reprezinta o implementare cuprinzatoare a lui Verilog HDL, dezvoltata initial de catre<br />
Wellspring Solutions, Inc. VeriWell suporta limbajul Verilog, conform specificatiilor<br />
Manualului de Referinta a limbajului, eleborat de catre OVI. VeriWell a fost lansat in decembrie<br />
1992 si a fost elaborat pentru a fi compatibil, atat cu standardul OVI, cat si cu Verilog-XL, al<br />
companiei Cadence. VeriWell este distribuit si vandut de catre SynaptiCAD Inc.<br />
Pentru platformele Windows 95/NT, Windows 3.1,Macintosh, SunOS si Linux, SynaptiCAD<br />
Inc.ofera versiuni “free” ale produsului, care sunt identice cu cele ale produsului comercial, cu<br />
exceptia limitarii la 1000 de linii de cod HDL<br />
1.3. De ce se utilizeaza Verilog HDL?<br />
Sistemele numerice sunt extrem de complexe. La nivelul celor mai mici detalii, ele constau in<br />
sute de miloane de elemente de tipul tranzistoarelor sau al portilor. De aceea, pentru sistemele<br />
numerice mari, proiectarea la nivelul portilor este practic imposibila. Pe durata mai multor<br />
decade, schemele logice au servit ca lingua franca pentru proiectarea logica, ceea ce nu mai este<br />
cazul, in conditiile de astazi. In prezent, complexitatea hardware-lui a devenit atat de mare incat<br />
o schema la nivelul portilor logice este aproape inutila. Schema devine un paienjenis de<br />
conexiuni, care nu mai arata functionalitatea proiectului.<br />
Incepand cu 1970, inginerii de calculatoare si inginerii electronisti au apelat la limbajele de<br />
descriere a hardware-lui (HDL). Cele mai raspandite HDL-euri in industrie sunt Verilog si<br />
VHDL. In urma cu 5 ani Verilog se afla pe primul loc cu peste 10.000 de utilizatori/proiectanti<br />
la companii de renume cum sunt: Sun Microsystems, Apple Computer, Motorola s.a.
Limbajul Verilog ofera proiectantului mijloace de descriere a unui sistem numeric in cadrul unei<br />
largi game de niveluri de abstractizare si, in acelasi timp, ii asigura accesul la uneltele de<br />
proiectare asistata de calculator, la nivelurile avute in vedere.<br />
Verilog permite proiectantilor de hardware sa descrie proiectele cu ajutorul constructiilor<br />
comportamentale, amanand detaliile de implementare pentru stadiile ulterioare ale procesului de<br />
proiectare. O reprezentarea abstracta ajuta proiectantul in explorarea alternativelor arhitecturale<br />
prin simulari, pentru a detecta congestiile proiectului inaintea inceperii proiectarii detaliate.<br />
Desi nivelul comportamental Verilog reprezinta un nivel inalt de descriere a unui sistem<br />
numeric, el reprezinta o notatie precisa. Exista unelete de proiectarea asistata, materializate prin<br />
programe, care vor “compila” programele elaborate in Verilog pana la nivelul circuitelor<br />
constand in porti si bistabile.<br />
Astfel, se poate merge in laborator pentru a se conecta circuitele logice prin cablaje in vederea<br />
obtinerii unui sistem functional. Alte unelte de proiectare pot “compila” programele descrise in<br />
Verilog intr-o descriere a mastilor de circuite integrate , pentru Integrarea pe Scara Larga<br />
(VLSI). De aceea, cu ajutorul unor unelte automatizate corespunzatoare se poate crea o<br />
descriere a proiectului VLSI in Verilog, in vederea transmiterii ei prin posta electronica, catre o<br />
“topitorie de siliciu”, pentru a primi ulterior, in cateva saptamani, circuitul integrat.<br />
Verilog permite, de asemenea, proiectantului sa specifice proiectele la nivelul portii logice,<br />
folosind constructiile porti si la nivelul tranzistorului, utilizand constructiile comutator.<br />
Scopul urmarit, in materialul de fata, nu este acela de a crea circuite VLSI, ci de a folosi<br />
limbajul Verilog pentru a descrie precis functionalitatea oricarui sistem numeric, de exemplu,<br />
un calculator.<br />
In orice caz, un circuit VLSI, proiectat pe baza constructiilor comportamentale din Verilog, va fi<br />
destul de lent si va ocupa o arie importanta pe pastila de siliciu. Nivelurile mai coborate ale<br />
limbajului Verilog permit inginerilor sa optimizeze circuitele logice si mastile/sabloanele VLSI<br />
pentru a maximiza viteza si a minimiza aria circuitului VLSI<br />
2. Limbajul Verilog.<br />
Aceste note de curs nu isi propun o descriere completa a limbajului Verilog. Vor fi descrise<br />
numai acele elemente ale linbajului, care vor permite studentului sa exploreze aspectele<br />
arhitecturale ale calculatoarelor. De fapt, aceste note acopera numai o fractiune a limbajului.
Pentru o descriere completa a Verilog HDL se pot examina lucrarile date la bibliografie, cat si<br />
standardul IEEE.<br />
Studiul limbajului Verilog va fi inceput prin parcurgerea unui exemplu, constand intr-un<br />
program simplu Verilog<br />
Examinarea instructiunilor de atribuire permite observarea similitudinii limbajului Verilog cu<br />
limbajul C. Comentariile sunt asemanatoare cu cele din C++, adica “//”, la inceputul liniei.<br />
Limbajul Verilog descrie un sistem numeric sub forma unui set de module, dar, in cele ce<br />
urmeaza va fi prezent un singur modul numit “simple”<br />
2.1 Primul program Verilog.<br />
//Dan Hyde; August 9, 1995<br />
// Un prim model numeric in Verilog<br />
module simple;<br />
// Exemplu simplu la nivel RTL, pentru a demonstra Verilog.<br />
// Registrul A este incrementat cu unu. Apoi primii patru biti ai registrului B sunt incarcati cu<br />
// valorile negate ale ultimilor patru biti din A. C reprezinta o reducere “and” a ultimilor doi biti<br />
// din A.<br />
//declare registers and flip-flops<br />
reg [0:7] A, B;<br />
reg C;<br />
// Cele doua constructii “initial” si always” opereaza concurent<br />
initial begin: stop_at<br />
// Va opri executia dupa 20 unitati de simulare.<br />
#20; $stop;<br />
end<br />
// Aceste instructiuni sunt executate la timpul simulat 0 ( nu exista #k).<br />
initial begin: Init<br />
// Initializeaza registrul A. Celelalte registre au valori “x”.<br />
A = 0;<br />
// Antetul de afisare.<br />
$display("Time A B C");<br />
// Afisaza valorile A, B, C in cazurile in care acestea se modifica.<br />
$monitor(" %0d %b %b %b", $time, A, B, C);
end<br />
//main_process va cicla pana la terminarea simularii.<br />
always begin: main_process<br />
// #1 insemna executia dupa o unitate de timp de simulare.<br />
#1 A = A + 1;<br />
#1 B[0:3] = ~A[4:7]; // ~ este operatorul "not" la nivel de bit<br />
#1 C = &A[6:7]; // reducerea "and" a ultimilor doi biti ai registrului<br />
end<br />
endmodule<br />
In module simple au fost declarate doua registrea A si B de cate 8 biti si un registru C, de un bit<br />
sau bistabil. In interiorul modulului, o constructie “always” si doua constructii “initial” descriu<br />
firele de control, care se executa in acelasi timp sau concurent. In constructia initial<br />
instructiunile sunt executate secvential ca in C sau in alte limbaje imperative traditionale.<br />
Constructia always este asemanatoare cu constructia initial cu exceptia ca aceasta cicleaza<br />
continuu, cat timp opereaza simulatorul.<br />
Notatia #1 semnifica faptul ca instructiunea care urmeaza se va executa cu o intarziere de o<br />
unitate de timp simulat. De aceea, firul de control, provocat de catre prima constructie initial,<br />
va intarzia, cu 20 unitati de timp simulat, chemarea task-ului de sistem $stop si va opri<br />
simularea.<br />
Task-ul de sistem $display permite proiectantului sa tipareasca mesajele in maniera in care<br />
printf o face in limbajul C. La fiecare unitate de timp simulat, cand una dintre variabilele listate<br />
isi modifica valoarea, task- ul de sistem $monitor tipareste un mesaj. Functia de sistem $time<br />
intoarce valoarea curenta a timpului simulat.<br />
Mai jos se prezinta iesirea Simulatorului VeriWell: ( A se vedea Sectiunea 3, referitoare la<br />
utilizarea Simulatorului VeriWell).<br />
Time A B C<br />
0 00000000 xxxxxxxx x<br />
1 00000001 xxxxxxxx x<br />
2 00000001 1110xxxx x<br />
3 00000001 1110xxxx 0<br />
4 00000010 1110xxxx 0<br />
5 00000010 1101xxxx 0
7 00000011 1101xxxx 0<br />
8 00000011 1100xxxx 0<br />
9 00000011 1100xxxx 1<br />
10 00000100 1100xxxx 1<br />
11 00000100 1011xxxx 1<br />
12 00000100 1011xxxx 0<br />
13 00000101 1011xxxx 0<br />
14 00000101 1010xxxx 0<br />
16 00000110 1010xxxx 0<br />
17 00000110 1001xxxx 0<br />
19 00000111 1001xxxx 0<br />
Stop at simulation time 20<br />
Acest program, cat si rezultatele simularii trebuie studiate cu atentie. Structura programului este<br />
tipica pentru programele Verilog, care vor fi scrise in acest curs: o constructie initial, pentru a<br />
specifica durata simularii, o alta constructie initial, pentru initializarea registrelor si pentru a<br />
specifica registrele care se monitorizeaza si o constructie always, pentru sistemul numeric<br />
modelat. De observat ca toate instructiunile din cea de-a doua constructie initial sunt efectuate la<br />
timpul time = 0, deoarece nu sunt prevazute instructiuni de intarziere: #.<br />
2.2 Conventii Lexicale.<br />
Conventiile lexicale sunt asemanatoare cu cele din limbajul C++. Comentariile sunt specificate<br />
prin // la inceputul liniei, fiind valabile pentru acea linie. Comentariile pe mai multe linii incep<br />
cu /* si se termina cu */. Cuvintele cheie, de exemplu, module, sunt rezervate si utilizeaza<br />
literele mici ale alfabetului. Limbajul este sensibil la literele mici si la majuscule. Spatiile sunt<br />
importante prin aceea ca delimiteaza obiectele in limbaj.<br />
Numerele sunt specificate sub forma traditionala ca o serie de cifre cu sau fara semn, in maniera<br />
urmatoare:<br />
< format baza><br />
unde contine cifre zecimale care specifica dimensiunea constantei ca numar de<br />
biti.<br />
Campul este optional. Campul are un singur caracter ’ urmat<br />
de unul dintre urmatoarele caractere b, d, o si h, care specifica baza de numeratie: binara,
zecimala, octala si hexazecimala. Campul contine cifre care corespund lui < format<br />
baza>.<br />
Exemple:<br />
549 // numar zecimal<br />
'h 8FF // numar hexzecimal<br />
'o765 // numar octal<br />
4'b11 // numarul binar cu patru biti 0011<br />
3'b10x // numar binar cu 3 biti, avand ultimul bit necunoscut<br />
5'd3 // numar zecimal cu 5 ranguri<br />
-4'b11 // complementul fata de 2, pe patru ranguri al numarului 0011 sau 1101<br />
Campul poate sa nu aibe semn. Oricare semn trebuie sa fie plasat la inceput.<br />
Un sir reprezinta o secventa de caractere plasate intre ghilimele: “acesta este un sir”.<br />
Operatorii pot fi exprimati prin unul, doua sau trei caractere (sectiunea 2.5).<br />
Un identificator este specificat printr-o litera sau “underscore” urmat de zero sau mai multe<br />
litere, cifre, semne dolar sau “underscores”. Identificatorii pot avea pana la 1024 caractere.<br />
2.3 Structura unui Program.<br />
Limbajul Verilog descrie un sistem numeric ca un set de module. Fiecare dintre aceste module<br />
are o interfata cu alte module, pentru a specifica modul in care sunt interconectate. De regula se<br />
plaseaza un modul intr-un fisier, fara ca aceasta sa fie o cerinta obligatorie. Modulele opereaza<br />
concurent. In general, exista un modul pe nivelul cel mai inalt, care specifica un sistem inchis ce<br />
contine, atat datele de test, cat si modelele hardware. Modulul de pe nivelul cel mai inalt invoca<br />
aparitii ale celorlalte module.<br />
Modulele reprezinta parti hardware, care pot fi de la simple porti pana la sisteme complete ex.,<br />
un microprocesor. Modulele pot fi specificate, fie comportamental, fie structural (sau o<br />
combinatie a celor doua). O specificare comportamentala defineste comportarea unui sistem<br />
numeric (modul) folosind constructiile limbajelor de programare traditionale, de exemplu: if,<br />
instructiuni de atribuire. O specificare structurala exprima comportarea unui sistem numeric<br />
(modul) ca o conectare ierarhica de submodule. La baza ierarhiei componentele trebuie sa fie<br />
primitive sau sa fie specificate comportamental.<br />
Primitivele Verilog includ atat porti, cat si tranzistoare de trecere (comutatoare).<br />
Structura unui modul este urmatoarea:<br />
module ();
<br />
endmodule<br />
Mai sus reprezinta un identificator care, in mod unic, denumeste modulul. De<br />
asemenea, constituie o lista de porturi de intrare (input), iesire (output) sau<br />
intrare/iesire (inout), care sunt folosite pentru conectarea cu alte module. Sectiunea<br />
specifica obiectele de tip date ca registre (reg), memorii si fire (wire), cat si<br />
constructiile procedurale ca function-s si task-s<br />
Sectiunea poate contine: constructii initial, constructii always,<br />
atribuiri continue sau aparitii/instante ale modulelor.<br />
Semantica constructiei unui module in Verilog este diferita de cea a subrutinelor, procedurilor<br />
si a functiilor din alte limbaje. Un modul nu este chemat niciodata. Un modul are o instanta la<br />
inceputul unui program si este prezent pe intreaga durata a programului. O instanta a unui modul<br />
Verilog este utilizata ca model al unui circuit hardware la care se presupune ca nu se efectueaza<br />
modificari de cablaj. La fiecare instanta a modulului, acesteia i se da un nume.<br />
De exemplu NAND1 si NAND2 sunt nume de instante ale porti NAND, in exemplul de mai jos.<br />
In acest exemplu este data o specificare comportamentala a unui modul NAND.<br />
Iesirea out este negatia produsului and al intrarilor in1 si in2.<br />
// Modelul Comportamenta al portii Nand.<br />
// Dan Hyde, August 9, 1995<br />
module NAND(in1, in2, out);<br />
input in1, in2;<br />
output out;<br />
// instructiune de atribuire continua. o<br />
assign out = ~(in1 & in2);<br />
endmodule<br />
Porturile in1, in2 si out sunt etichete pe fire. Atribuirea continua assign urmareste in<br />
permanenta eventualele modificari ale variabilelor din membrul drept, pentru reevaluarea<br />
expresiei si pentru propagarea rezultatului in membrul stang (out).<br />
Instructiunea de atribuire continua este utilizata pentru a modela circuitele combinationale la<br />
care iesirile se modifica ca urmare a modificarilor intrarilor.
Specificarea structurala a unui modul AND, obtinuta ca urmare a conectarii iesirii unui NAND<br />
la cele doua intrari ale altui NAND.<br />
module AND(in1, in2, out);<br />
// Modelul structural al unei porti AND formata din doua porti NAND.<br />
input in1, in2;<br />
output out;<br />
wire w1;<br />
// doua instante ale modulului NAND<br />
NAND NAND1(in1, in2, w1);<br />
NAND NAND2(w1, w1, out);<br />
endmodule<br />
Acest modul are doua instante ale lui NAND, numite NAND1 si NAND2, conectate printr-un fir<br />
intern w1<br />
Forma generala pentru invocarea unei instante este urmatoarea:<br />
();<br />
unde are valorile parametrilor, care sunt transferate catre instanta. Un<br />
exemplu de parametru transferat ar fi intarzierea pe o poarta.<br />
Urmatorul modul reprezinta un modul de nivel inalt, care stabileste anumite seturi de date si<br />
care asigura monitorizarea variabilelor.<br />
module test_AND;<br />
// Modul de nivel inalt pentru testarea altor doua module.<br />
reg a, b;<br />
wire out1, out2;<br />
initial begin // Datele de test<br />
a = 0; b = 0;<br />
#1 a = 1;<br />
#1 b = 1;<br />
#1 a = 0;<br />
end<br />
initial begin // Activarea monitorizarii<br />
$monitor("Time=%0d a=%b b=%b out1=%b out2=%b",<br />
$time, a, b, out1, out2);
end<br />
// Instantele modulelor AND si NAND<br />
AND gate1(a, b, out2);<br />
NAND gate2(a, b, out1);<br />
Endmodule<br />
De notat ca valorile a si b trebuie mentinute pe toata durata operarii. De aceea este necesara<br />
utilizarea unor registre de cate un bit. Variabilele de tip reg stocheaza ultima valoare care le-a<br />
fost atribuita procedural. Firul, wire, nu are capacitatea de memorare. El poate fi comandat in<br />
mod continuu, de exemplu, prin instructiunea de atribuire continua sau prin iesirea unui modul<br />
Daca firele de intrare nu sunt conectate, ele vor lua valoarea x – necunoscuta.<br />
Atribuirile continue folosesc cuvantul cheie assign in timp ce atribuirile procedurale au forma<br />
= unde trebuie sa fie un registru sau o memorie<br />
Atribuirile procedurale pot aparea numai in constructiile initial si always<br />
Instructiunile din blocul primei constructii initial vor fi executate secvential, dintre care unele<br />
vor fi intarziate de #1 cu o unitate de timp simulat. Constructia always se comporta in acelasi<br />
mod ca si constructia initial cu exceptia ca ea cicleaza la infinit (pana la terminarea simularii).<br />
Constructiile initial si always sunt utilizate pentru modelarea logicii secventiale (automate cu<br />
stari finite)<br />
Verilog face o importanta distinctie intre atribuirile procedurale si atribuirea continua assign.<br />
Atribuirile procedurale modifica starea unui registru, adica a logicii secventiale, in timp ce<br />
atribuirea continua este utilizata pentru a modela logica combinationala. Atribuirile continue<br />
comanda variabile de tip wire si sunt evaluate si actualizate atunci cand un operand de intrare<br />
isi modifica valoarea. Este important de inteles si de memorat aceste diferente.<br />
Toate cele trei module vor fi plasate intr-un fisier, care va fi executat de catre simulator pentru a<br />
produce urmatoarea iesire:<br />
Time=0 a=0 b=0 out1=1 out2=0<br />
Time=1 a=1 b=0 out1=1 out2=0<br />
Time=2 a=1 b=1 out1=0 out2=1<br />
Time=3 a=0 b=1 out1=1 out2=0<br />
Intrucat simulatorul iese din cadrul evenimentelor, nu a mai fost necesara oprirea explicita a<br />
simularii.
2.4 Tipuri de Date<br />
2.4.1 Tipuri de Date Fizice.<br />
Intrucat scopul limbajului Verilog este acela de a modela hardware-ul numeric, tipurile primare<br />
de date vor fi destinate modelarii registrelor (reg) si firelor (wire). Variabilele reg stocheaza<br />
ultima valoare, care le-a fost atribuita procedural, in timp ce variabilele wire reprezinta<br />
conexiuni fizice intre entitati structurale cum ar fi portile. Un fir (wire) nu stocheaza o valoare.<br />
O variabila wire reprezinta numai o eticheta pe un fir. Trebuie remarcat faptul ca tipul de date<br />
wire reprezinta unul dintre tipurile de date net prezente in Verilog in care mai sunt incluse:<br />
“and cablat (wand)”, “or cablat (wor)” si “magistrala cu trei stari (tri)”. Aceste note se<br />
limiteaza numai la tipul de date wire.<br />
Obiectele reg si wire , care reprezinta date, pot lua urmatoarele valori:<br />
0 valoarea logica zero sau fals<br />
1 unu logic sau adevarat<br />
x valoare logica necunoscuta<br />
z impedanta ridicata a unei porti “tristate”.<br />
La inceputul simularii variabilele reg sunt initializate la valoarea x. Oricare variabila wire<br />
neconectata la ceva are valoarea x.<br />
In declaratii se poate specifica dimensiunea unui registru sau a unui fir. De exemplu,<br />
declaratiile:<br />
reg [0:7] A, B;<br />
wire [0:3] Dataout;<br />
reg [7:0] C;<br />
specifica registrele A si B ca avand 8 biti, cu cel mai semnificativ bit avand indicele zero, in<br />
timp ce registrul C, de opt biti, are indicele sapte, pentru cel mai semnificativ bit. specify<br />
Firul Dataout are 4 biti.<br />
Bitii unui registru sunt specificati prin notatia:[:].<br />
De exemplu, in cea de-a doua atribuire procedurala, din secventa:<br />
initial begin: int1<br />
A = 8'b01011010;<br />
B = {A[0:3] | A[4:7], 4'b0000};<br />
end
B este fortat la o valoare egala cu suma logica a primilor patru biti din A si a ultimilor patru<br />
biti din A, concatenata cu 0000. B are acum valoarea 11110000. Parantezele {} specifica faptul<br />
ca bitii a doua sau ai mai multor argumente, separati prin virgule sunt concatenati impreuna.<br />
Un argument poate fi replicat prin specificarea numarului de repetitii sub forma:<br />
{numar_repetitii{exp1, exp2, ... , expn}}<br />
Iata cateva exemple:<br />
C = {2{4’b1011}}; //lui C I se asigneaza vectorul de biti: 8’b10111011<br />
C = {{4{A[4]}}, AA[4:7]}; // primii 4 biti reprezinta extensia semnului.<br />
Intr-o expresie gama de referire trebuie sa aibe, pentru indici, expresii constante. Un singur bit<br />
poate fi referit ca o variabila. De exemplu:<br />
reg [0:7] A, B;<br />
B = 3;<br />
A[0: B] = 3'b111; // ILEGAL – indicii trebuie sa fie constanti!!<br />
A[B] = 1'b1; // Referirea la un singur bit este LEGALA.<br />
Aceasta cerinta stricta <strong>privind</strong> valorile constante pentru indici, la referirea unui registru, este<br />
impusa de faptul ca se doreste ca expresia sa fie realizabila fizic, in hardware.<br />
Memoriile sunt specificate ca vectori de registre. De exemplu Mem are 1K cuvinte de cate 32<br />
de biti.<br />
reg [31:0] Mem [0:1023];<br />
Notatia Mem[0] asigura referirea la cuvantul cua adresa zero din memorie. Tabloul de indici<br />
pentru o memorie (vector de registre) poate fi un registru. De remarcat faptul ca o memorie nu<br />
poate fi accesata la nivel de bit, in Verilog. Pentru a realiza aceasta operatie, cuvantul din<br />
memorie trebuie transferat mai intai intr-un registru temporar.<br />
2.4.2 Tipuri de Date Abstracte.<br />
Intr-un model de hardware, pe landga variabilele, care modeleaza hardware-ul, se gasesc si alte<br />
tipuri de variabile. De exemplu, proiectantul doreste sa foloseasca o variabila integer, pentru a<br />
contoriza numarul de aparitii ale unui eveniment. Pentru comoditatea proiectantului, Verilog<br />
HDL poseda mai multe tipuri de date carora nu le corespund realizari hardware. Aceste tipuri de<br />
date include integer, real si time. Tipurile de date integer si real se comporta ca si in alte<br />
limbaje, de exemplu C.
Trebuie subliniata faptul ca variabila reg este fara semn, in timp ce variabial integer reprezinta<br />
un intreg de 32 de biti cu semn. Acest fapt are o mare importanta la scadere.<br />
Variabila time specifica cantitati, pe 64 de biti, si sunt folosite in conjunctie cu functia de<br />
sistem $time. Sunt acceptate tablouri de variabile integer si time , dar nu de reali. In Verilog<br />
nu sunt permise tablouri multidimensionale Iata cateva exemple:<br />
integer Count; // intreg simplu, cu semn, pe 32 de biti.<br />
integer K[1:64]; // un tablou de 64 intregi.<br />
time Start, Stop; // doua variabile timp de 64 de biti.<br />
2.5 Operatori<br />
2.5.1 Operatori Aritmetici binari.<br />
Operatorii aritmetici binari opereaza cu doi operanzi. Operanzii de tip reg si net sunt tratati ca<br />
fara semn. Operanziide tip real si integer pot avea semn. Daca un bit oarecare, al unui operand,<br />
este necunoscut (‘x’), atunci rezultatul este necunoscut.<br />
Operator Nume Comentarii<br />
+ Adunare<br />
- Scadere<br />
* Inmultire<br />
/ Impartire Impartirea cu zero furnizeaza un x, necunoscut<br />
% Modul<br />
2.5.2 Operatori Aritmetici Unari.<br />
Operator Nume Comentarii<br />
- Minus Unar Modifica semnul operandului sau<br />
2.5.3 Operatori Relationali.<br />
Operatorii relationali compara doi operanzi si intorc o valoare logica, adica TRUE(1) sau<br />
FALSE(0). Daca un bit oarecare este necunoscut, relatia este ambigua si rezultatul este<br />
necunoscut.<br />
Operator Nume Comentarii<br />
> Mai mare decat<br />
>= Mai mare decat sau egal<br />
< Mai mic decat<br />
!= Inegalitae logica<br />
2.5.4 Operatori Logici<br />
Operatorii logici opereaza cu operanzi logici si intorc o valoare logica, adica TRUE(1) sau<br />
FALSE(0). Sunt utilizati in instructiunile if si while. A nu se confunda cu operatorii logici<br />
Booleeni la nivel de bit. De exemplu, ! este un NOT logic iar ~ este NOT la nivel de bit. Primul<br />
neaga, ex., !(5 == 6) este TRUE. Al doile complementeaza bitii, de exemplu: ~{1,0,1,1} este<br />
0100.<br />
Operator Nume Comentarii<br />
! Negatia logica<br />
&& AND logic<br />
|| OR logic<br />
2.5.5 Operatori la nivel de bit.<br />
Opeartorii la nivel de bit opereaza pe bitii operandului sau operanzilor. De exemplu, rezultatul<br />
lui A& B este AND pentru bitii corespunzatori din A si B. Operand pe un bit necunoscut, se<br />
obtine un bit necunoscut (x) in valoarea rezultatului. De exemplu, AND-ul unui x cu un FALSE<br />
este un x. OR-rul unui x cu un TRUE este un TRUE.<br />
Operator Nume Comentarii<br />
~ Negatia la nivel de bit<br />
& AND la nivel de bit<br />
| OR la nivel de bit.<br />
^ XOR la nivel de bit<br />
~& NAND la nivel de bit<br />
~| NOR la nivel de bit<br />
~^ sau ^~ Echivalenta la nivel de bit NOT XOR<br />
2.5.6 Operatori unari de reducere.<br />
Operatorii unari de reducere furnizeaza un rezultat de un singur bit prin aplicarea operatorului<br />
la toti bitii operandului. de exemplu, &A va efectua AND pe toti bitii lui A.<br />
Operator Nume Comentarii<br />
& reducere AND<br />
| reducere OR<br />
^ reducere XOR<br />
~& reducere NAND
2.5.7 Alti Operatori.<br />
~| reducere NOR<br />
~^ reducere XNOR<br />
Operatorul conditional se comporta ca si in limbajul C.<br />
Operator Nume Comentarii<br />
=== Egalitatea Case. Comparatia la nivel de bit include compararea<br />
valorilor x si z. Toti bitii trebuie sa se potriveasca,<br />
pentru egalitate. Intoarce TRUE sau FALSE.<br />
!== Inegalitatea Case Comparatia la nivel de bit include compararea<br />
valorilor x si z. Oricare diferenta intre bitii<br />
comparati produce o inegalitate. Intoarce TRUE sau<br />
FALSE.<br />
{ , } Concatenarea Reuneste bitii separati, furnizati de doua sau mai<br />
multe expresii separate prin virgule, de exemplu:<br />
{A[0], B[1:7]} concateneraza bitul zero din A cu<br />
bitii 1pana la 7 din B.<br />
Deplasare la dreapta Pozitiile din stanga eliberate se incarca cu zero<br />
?: Conditional Atribuie una dintre cele doua valori, in functie de<br />
2.5.8 Precedenta operatorilor.<br />
Conditional, de exemplu: A = C>D ? B+3 : B-2<br />
semnifica faptul ca daca C > D, atunci valoarea lui<br />
A este B+3 altfel B-2.<br />
Precedenta operatorilor este prezentata mai jos: Varful tabelei corespunde celei mai ridicate<br />
precedente, in timp ce baza corespunde celei mai coborate precedente.Operatorii de pe aceeasi<br />
linie au aceeasi precedenta si asociaza termenul stang celui drept intr-o expresie. Parantezele<br />
sunt utilizate pentru a modifica precedenta sau pentru a clarifica situatia. Pentru a usura<br />
intelegerea, se recomanda utilizarea parantezelor.
operatori unari: ! & ~& | ~| ^ ~^ + - (cea mai ridicata precedenta)<br />
2.6 Constructiile de Control.<br />
* / %<br />
+ -<br />
><br />
< > =<br />
== != === ~==<br />
& ~& ^ ~^<br />
| ~|<br />
&&<br />
||<br />
?:<br />
Verilog poseda o bogata colectie de instructiuni de control, care pot fi utilizate in sectiunile<br />
procedurale de cod, adica in cadrul blocurilor initial si always. Cele mai multe sunt familiare<br />
programatorului, care cunoaste limbajele traditionale de programare, cum ar fi limbajul C.<br />
Principala diferenta consta in aceea ca in locul parantezelor { }, din limbajul C, Verilog<br />
utilizeaza begin si end. In Verilog, parantezele { } sunt utilizate pentru concatenarea sirurilor de<br />
biti. Deoarece cei mai multi utilizatori sunt familiarizati cu limbajul C, urmatoarele subsectiuni<br />
vor contine numai cate un exemplu din fiecare constructie.<br />
2.6.1 Selectia – Instructiunile if si case.<br />
Instructiunea if este usor de utilizat:<br />
if (A == 4)<br />
else<br />
begin<br />
end<br />
begin<br />
end<br />
B = 2;<br />
B = 4;<br />
Spre deosebire de instructiunea case din C, prima care se potriveste cu valoarea lui
este selectata si instructiunea asociata este executata, apoi controlul este transferat<br />
dupa endcase, adica nu sunt necesare instructiuni break ca in C.<br />
case ()<br />
: <br />
: <br />
default: <br />
endcase<br />
In urmatorul exemplu se verifica valoarea semnalului de 1 bit .<br />
case (sig)<br />
1'bz: $display("Semnal flotant");<br />
1'bx: $display("Semnal necunoscut");<br />
default: $display("Semnalul este %b", sig);<br />
endcase<br />
2.6.2 Repetitia – Instructiunile for, while si repeat.<br />
Instructiunea for este foarte apropiata de instructiunea for din C, cu exceptia ca operatorii ++ si<br />
– nu sunt prezenti in Verilog. De aceea se va folosi i = i + 1.<br />
for(i = 0; i < 10; i = i + 1)<br />
begin<br />
end<br />
$display("i= %0d", i);<br />
Instructiunea while opereaza in forma normala:<br />
i = 0;<br />
while(i < 10)<br />
begin<br />
end<br />
$display("i= %0d", i);<br />
i = i + 1;<br />
Instructiunea repeat repeta urmatorul bloc de un numar fixat de ori, in exemplul urmator de 5<br />
ori:<br />
repeat (5)<br />
begin<br />
$display("i= %0d", i);
end<br />
i = i + 1;<br />
2.7 Alte Instructiuni.<br />
2.7.1 Instructiunea parameter.<br />
Instructiunea parametru permite programatorului sa dea unei constante un nume. In mod tipic se<br />
utilizeaza pentru a specifica numarul de biti ai unui registru sau intarzierile. De exemplu, se pot<br />
parametriza declaratiile unui model:<br />
parameter byte_size = 8;<br />
reg [byte_size - 1:0] A, B;<br />
2.7.2 Atribuirea Continua.<br />
Atribuirea continua comanda variabile de tip wire, fiind evaluate si actualizate ori de cate ori o<br />
intrare operand isi modifica valoarea. In cele ce urmeaza valorile de pe firele in1 si in2 sunt<br />
inmultite pentru a comanda iesirea out. Cuvantul cheie assign este utilizat pentru a face<br />
distinctia intre atribuirea continua si atribuirea procedurala. Instructiunea urmatoare efecteaza<br />
produsul semnalelor de pe firele in1 si in2, neaga rezultatul si comanda continuu firul out.<br />
assign out = ~(in1 & in2);<br />
2.7.3 Atribuiri Procedurale Blocante si Nonblocante.<br />
Limbajul Verilog are doua forme pentru instructiunea de atribuire procedurala: blocanta si<br />
nonblocanta. Cele doua forme se deosebesc prin operatorii de atribuire = si
A = 3;<br />
#1 A
unde este o lista de expresii, care corespund prin pozitie lui din definitie. Porturi argumente, in definitie pot fi: input, inout sau output.<br />
Deoarece din definitia task-ului arata ca si alte declaratii, programatorul<br />
trebuie sa fie atent, in ceea ce priveste adaugarea declaratiilor la inceputul task-ului.<br />
// Testarea task-urilor si a functiilor<br />
// Dan Hyde, Aug 28, 1995<br />
module tasks;<br />
task add; // definitia task-ului<br />
input a, b; // doua porturi de intrare argumente<br />
output c; // un port de iesire argument<br />
reg R; // declaratie de registru<br />
begin<br />
end<br />
endtask<br />
R = 1;<br />
if (a == b)<br />
else<br />
c = 1 & R;<br />
c = 0;<br />
initial begin: init1<br />
end<br />
reg p;<br />
add(1, 0, p); // invocarea task-ului cu 3 argumente<br />
$display("p= %b", p);<br />
endmodule<br />
Parametri input si inout sunt transferati prin valoare catre task, iar parametrii output si inout<br />
sunt transferati inapoi prin valoare, catre constructia care a invocat task-ul. Chemarea prin<br />
referire nu este disponibila. Alocarea tuturor variabilelor este statica. Astfel, un task se poate<br />
autoinvoca, dar la fiecare invocare se va folosi aceeasi memorie, ceea ce inseamna ca variabilele<br />
locale nu sunt fortate in stiva. Deoarece firele concurente pot invoca acelasi task, programatorul<br />
trebuie sa fie atent la natura statica a alocarii spatiului de memorie, pentru a evita suprascrierea<br />
spatiului partajat de memorie.
Scopul unei functii este acela de a returna o valoare care urmeaza sa fie folosita intr-o expresie.<br />
Definitia unei functii trebuie sa contina cel putin un argument de intrare, input. Transferul<br />
argumentelor in functii este asemanator ca si la task-uri.<br />
Definitia unei functii este urmatoarea:<br />
function ; //Nota: nu exista lista de parametri sau ().<br />
< porturi argumente><br />
<br />
<br />
endfunction<br />
unde este tipul rezultatelor returnate expresiei, care a chemat<br />
functia. In interiorul functiei, trebuie sa se asigneze o valoare numelui functiei. Mai jos este<br />
prezentata o functie, care este similara task-ului de mai sus.<br />
// Testarea functiilor<br />
// Dan Hyde, Aug 28, 1995<br />
module functions;<br />
function [1:1] add2; // definitia functiei<br />
input a, b; // doua porturi argumente de intrare<br />
reg R; // declararea registrului<br />
begin<br />
end<br />
R = 1;<br />
if (a == b)<br />
else<br />
endfunction<br />
add2 = 1 & R;<br />
add2 = 0;<br />
initial begin: init1<br />
end<br />
reg p;<br />
p = add2(1, 0); // invocarea unei functii cu doua argumente<br />
$display("p= %b", p);<br />
endmodule
2.9 Control Sincronizarii/Timing-ului.<br />
Limbajul Verilog ofera doua tipuri explicite de control al sincronizarii, atunci cand urmeaza sa<br />
apara instructiuni procedurale.<br />
Primul tip il reprezinta comanda intarzierii in care o expresie specifica durata de timp intre<br />
prima aparitie a instructiunii si momentul in care ea se executa.<br />
Al doilea tip de comanda a intarzierii il reprezinta expresia eveniment, care permite executia<br />
instructiunii.<br />
A treia sectiune descrie instructiunea wait, care asteapta modificarea unei variabile specifice..<br />
Verilog constituie un simulator bazat pe evenimente in timp discret, adica evenimentele sunt<br />
planificate la momente discrete de timp si plasate intr-o coada de asteptare, ordonata in timp.<br />
Cel mai timpuriu eveniment se afla in fruntea cozii de asteptare iar evenimentele ulterioare sunt<br />
dupa el. Simulatorul inlatura toate evenimentele pentru timpul curent de simulare si le<br />
prelucreaza. In timpul prelucrarii, pot fi create mai multe evenimente si plasate in locul<br />
corespunzator, in coada pentru prelucrarea ulterioara. Cand toate evenimentele pentru timpul<br />
curent au fost procesate, simulatorul trece la urmatorul pas in timp si prelucreaza urmatoarele<br />
evenimente din fruntea cozii. Daca nu exista controlul sincronizarii, timpul de simulare nu<br />
evolueaza. Timpul de simulare poate progresa numai in una din urmatoarele situatii:<br />
1. specificarea intarzierii pe poarta sau fir;<br />
2. un control al intarzierii, introdus prin simbolul #;<br />
3. un eveniment de control, introdus prin simbolul @;<br />
4. instructiunea wait.<br />
Ordinea executiei evenimentelor in acelasi interval de timp/ceas este impredictibila.<br />
2.9.1 Controlul Intarzierii (#)<br />
O expresie de control al intarzierii specifica durata de timp intre prima aparitie a instructiunii<br />
si momentul executiei acesteia. De exemplu:<br />
#10 A = A + 1;<br />
specifica o intarziere de 10 unitati de timp inainte de a executa instructiunea de asignare<br />
procedurala. Simbolul # poate fi urmat de o expresie cu variabile.<br />
2.9.2 Evenimente.<br />
Executia unei instructiuni procedurale poate fi amorsat de o schimbare de valoare pe un fir sau<br />
intr-un registru sau de aparitia unui eveniment cu nume.:
egin<br />
end<br />
@r begin // controlat printr-o modificare a valorii in registrul r<br />
end<br />
A = B&C;<br />
@(posedge clock2) A = B&C; // controlat de frontul pozitiva al lui clock2<br />
@(negedge clock3) A = B&C; // controlat de frontul negativ al lui clock3<br />
forever @(negedge clock) // controlat de frontul negativ<br />
A = B&C;<br />
In formele care folosesc posedge si negedge, trebuie sa fie urmate de o expresie de un bit, de<br />
regula un semnal de ceas. La o tranzitie de la 1 la 0 ( sau necunoscut), se detecteaza un negedge<br />
Un posedge este detectat la o tranzitie de la 0 la 1 (sau necunoscut). Verilog furnizeaza, de<br />
asemenea, facilitati pentru a denumi un eveniment si apoi sa amorseze aparitia acelui eveniment.<br />
Mai intai trebuie sa se declare acel eveniment:<br />
event event6;<br />
Pentru a amorsa un eveniment se va folosi simbolul → :<br />
→ event6;<br />
Pentru a controla un bloc de cod, se va folosi simbolul @, dupa cum se arata mai jos:<br />
@(event6) begin<br />
<br />
end<br />
Se va presupune ca evenimentul apare intr-un fir de control, adica concurent, iar codul de<br />
control se afla in alt fir. Mai multe evenimente pot fi sumate logic in interiorul parantezelor.<br />
2.9.3 Instructiunea wait.<br />
Instructiunea wait permite intarzierea unei instructiuni procedurale sau a unui bloc, pana ce<br />
conditia specificata devine adevarata:<br />
wait (A == 3)<br />
begin<br />
end<br />
A = B&C;
Diferenta intre comportamentul unei instructiuni wait si un eveniment este aceea ca<br />
instructiunea wait este sesizeaza nivelul, in timp ce un @(posedge clock); este amorsat de catre<br />
o tranzitie a semnalului sau sesizeaza frontul.<br />
2.9.4 Instructiunile fork si join.<br />
Folosind constructiile fork si join, Verilog permite existenta mai multor fire de control in cadrul<br />
constructiilor initial si always. De exemplu, pentru a avea trei fire de control, se ramifica (fork)<br />
controlul in trei si apoi fuzioneaza (join), dupa cum se va vedea mai jos:<br />
fork: trei // desface firul in trei; cate unul pentru fiecare begin-end<br />
begin<br />
end<br />
// codul pentru firul1<br />
begin<br />
end<br />
// codul pentru firul2<br />
begin<br />
end<br />
// codul pentru firul3<br />
join // fuziunea firelor intr-un singur fir.<br />
Fiecare instructiune intre fork si join, in acest caz cele trei blocuri begin-end, este executata<br />
concurent. Dupa terminarea celor trei fire, este executata urmatoarea instructiune dupa join.<br />
Trebuie sa existe certitudinea ca intre cele trei fire diferite nu exista interferente. De exemplu,<br />
nu se poate modifica continutul unui registru, in aceeasi perioada de ceas, in doua fire diferite.<br />
2.10 Exemplu: Comanda semaforului de trafic.<br />
Pentru a demonstra task-urile si evenimentele, se va prezenta un model de controlor de semafor<br />
de trafic.<br />
// Model numeric pentru un controlul unui semafor de trafic.<br />
// By Dan Hyde August 10, 1995<br />
module traffic;<br />
parameter on = 1, off = 0, red_tics = 35,<br />
amber_tics = 3, green_tics = 20;<br />
reg clock, red, amber, green;<br />
// va opri simularea dupa 1000 unitati de timp
initial begin: stop_at<br />
#1000; $stop;<br />
end<br />
// initializeaza luminile si seteaza monitorizarea registrelor.<br />
initial begin: Init<br />
red = off; amber = off; green = off;<br />
$display(" Timpul green amber red");<br />
$monitor("%3d %b %b %b", $time, green, amber, red);<br />
end<br />
// task de asteptare pentru aparitiile fronturilor pozitive ale ceasului<br />
// inainte de a stinge (off) luminile<br />
task light;<br />
output color;<br />
input [31:0] tics;<br />
begin<br />
repeat(tics) // asteapta detectarea fronturilor pozitive ale ceasului<br />
@(posedge clock);<br />
color = off;<br />
end<br />
endtask<br />
// forma de unda pentru o un ceas cu o perioada de doua unitati de timp<br />
always begin: clock_wave<br />
#1 clock = 0;<br />
#1 clock = 1;<br />
end<br />
always begin: main_process<br />
red = on;<br />
light(red, red_tics); // cheama task-ul de asteptare<br />
green = on;<br />
light(green, green_tics);<br />
amber = on;<br />
light(amber, amber_tics);
end<br />
endmodule<br />
Iesirea simulatorului de semafor de trafic este urmatoarea:<br />
Time green amber red<br />
0 0 0 1<br />
70 1 0 0<br />
110 0 1 0<br />
116 0 0 1<br />
186 1 0 0<br />
226 0 1 0<br />
232 0 0 1<br />
302 1 0 0<br />
342 0 1 0<br />
348 0 0 1<br />
418 1 0 0<br />
458 0 1 0<br />
464 0 0 1<br />
534 1 0 0<br />
574 0 1 0<br />
580 0 0 1<br />
650 1 0 0<br />
690 0 1 0<br />
696 0 0 1<br />
766 1 0 0<br />
806 0 1 0<br />
812 0 0 1<br />
882 1 0 0<br />
922 0 1 0<br />
928 0 0 1<br />
998 1 0 0<br />
Stop at simulation time 1000<br />
3. Utilizarea Simulatorului.<br />
3.1 Crearea Fisierului Model<br />
Se introduce codul Cerilog, generat cu ajutorul unui editor oarecar, de exemplu Edit. Ca<br />
extensie pentru fisierul sursa se va folosi “.v”.<br />
3.2 Pornirea Simulatorului.<br />
VeriWell este executat din fereastra UNIX shell. Se tasteaza"veriwell" urmat de numele<br />
fisierelor care contin modelele si optiunile. Optiunile pot aparea intr-o ordine oarecare, oriunde<br />
in linia de comanda. De exemplu:
host-name% veriwell cpu.v bus.v top.v -s<br />
Aceasta va incarca fiecare fisier in memorie, le va compila si va intra in modul interactiv. Prin<br />
inlaturarea optiunii "-s" , simularea va incepe imediat. Optiunile sunt prelucrate in ordinea in<br />
care apar in linia de comanda.Fisierele sunt prelucrate in ordinea in care ele apar dupa<br />
prelucrarea optiunilor.<br />
3.3 Iesirea din Simulator.<br />
Pentru a iesi din simulator se tasteaza $finish; sau Control-d.<br />
Pentru a stopa simularea se tasteaza Control-c. Executia unui task de sistem $stop; in cadrul<br />
codului Verilog va stopa simularea.<br />
3.4Optiunile Simulatorului.<br />
Optiunile utilizate in mod curent, in linia de comanda, sunt prezentate mai jos. Pentru alte<br />
optiuni se recomanda consultarea lucrarii: VeriWell User’s Guide.<br />
-i <br />
Specifica un fisier care contine comenzi interactive, care urmeaza sa fie executate imediat ce se<br />
intra in modul interactiv. Aceasta optiune trebuie sa fie utilizata cu optiunea "-s". Aceasta poate<br />
fi utilizata pentru a initializa variablele si pentru a stabili limitele timpului de simulare.<br />
-s<br />
Asigura intrarea in modul interactiv inaintea inceperii simularii.<br />
-t<br />
Realizeaza trasarea/urmarirea tuturor instructiunilor. Acest mod poate fi dezactivat prin task-ul<br />
de sistem $cleartrace.<br />
3.5 Depanarea in Modul Interactiv VeriWell.<br />
VeriWell este interactiv. Dupa lansare, simularea poate fi controlata prin comenzi simple. De<br />
asemenea, VeriWell accepta oricare instructiune Verilog statement (dar nu pot fi adaugate noi<br />
module sau declaratii).<br />
Modul interactiv poate fi introdus pe trei cai:<br />
1). La folosirea optiunii "-s" in linia de comanda sau in fisierul de comanda, se lanseaza modul<br />
interactiv, inaintea inceperii simularii.<br />
2). Cand simularea intalneste task-ul de sistem $stop.<br />
3). Atunci cand utilizatorul tasteaza Control-c, in timpul simularii (nu in timpul compilarii).<br />
Comenzi Interactive.<br />
Continua ('.') [period]
Relanseaza executia de la locatia curenta.<br />
Pas singular cu urmarire (',') [comma]<br />
Executa o singura instructiune si afisaza rezultatul trasarii.<br />
Pas singular fara trasare (';') [semicolon]<br />
Executa o singura instructiune fara urmarire.<br />
Locatia curenta (':') [colon]<br />
Afisaza locatia curenta.<br />
Control-d sau $finish;<br />
Iesirea din simulatorul VeriWell.<br />
In mod tipic, instructiunile Verilog executate interactiv sunt utilizate pentru depanare si<br />
colectare de informatii. $display si $showvars pot fi tastate, in modul interactiv, pentru a arata<br />
valorile variabilelor. De remarcat faptul ca trebuie tastate task-ul de sistem, parametrii si (‘;’).<br />
$scope(); si $showscopes; pot fi tastate pentru a traversa ierarhia modelului. $settrace;<br />
si $cleartrace; vor activa/dezactiva modul de urmarire. Tastarea "#100; $stop;" va opri<br />
executia dupa 100 unitati de timp simulat.<br />
4. Task-urile de Sistem si Functiile.<br />
Task-urile de sistem nu sunt parti ale limbajului Verilog. Ele reprezinta task-uri construite si<br />
pastrate in biblioteca. Cateva dintre cele mai des utilizate task-uri de sistem sunt prezentate mai<br />
jos.<br />
4.1 $cleartrace<br />
Task-ul de sistem $cleartracedezactiveaza urmarirea.. A se vedea task-ul de sistem $settrace<br />
pentru activarea trasarii.<br />
4.2 $display<br />
$cleartrace;<br />
Afisaza text pre ecran ca si printf pentru limbajul C. Forma generala este:<br />
$display(, , ... );<br />
unde poate fi un sir intre ghilimele, o expresie care intoarce o valoare sau un<br />
parametru nul. De exemplu, afisarea unui antet:<br />
$display("Registre: A B C");<br />
Caracterul special % indica faptul ca urmatorul caracter reprezinta o specificatie de format.<br />
Pentru fiecare caracter %, care apare in sir, trebuie sa fie furnizata o expresie corespunzatoare
dupa sir. De exemplu, urmatoarele instructiuni vor tipari valoarea lui A in binar, octal, zecimal<br />
si hexazecimal:<br />
$display("A=%b binar %o octal %d zecimal %h hex",A,A,A,A);<br />
generandu-se urmatoarea iesire:<br />
A=00001111 binar 017 octal 15 zecimal 0f hex<br />
Specificatorii uzuali de format sunt:<br />
%b afisaza in format binar<br />
%c afisaza in format ASCII<br />
%d afisaza in format zecimal<br />
%h afisaza in format hexazecimal<br />
%o afisaza in format octal<br />
%s afisaza in format sir<br />
Un 0 intre % si specificatorul de format aloca numarul exact de caractere cerut pentru afisarea<br />
rezultatului evaluarii expresiei, in locul numarului necesar pentru valoarea cea mai mare pe care<br />
ar lua-o expresia. De exemplu, aceasta este utila la afisarea timpului, dupa cum se va observa<br />
din exemplele de mai jos, care contin doua instructiuni $display.<br />
$display("Timp = %d", $time);<br />
$display("Timp = %0d", $time);<br />
si care genereaza uramatoarele iesiri:<br />
Timp = 1<br />
Timp = 1<br />
Intr-un sir pot fi introduse secvente “Escape”. Secventele “Escape” mai frecvent folosite sunt<br />
urmatoarele:<br />
\n caractelul linie noua<br />
\t caracterul tab<br />
\\ caracterul \<br />
\ caracterul " the "<br />
%% semnul procent<br />
Parametrul nul genereaza un spatiu de un caracter, la afisare. Un parametru nul este caracterizat<br />
prin doua virgule adiacente in lista de parametri. $display adauga autoamat un caracter linie-<br />
noua, la sfarsitul iesirii. A se vedea $write, in “Verilog Language Reference Manual” , daca nu<br />
se doreste o linie noua.
4.3 $finish<br />
Task-ul de sistem $finish asigura iesirea din simulator catre sistemul de operare gazda. A nu se<br />
uita tastarea (‘;’), in modul interactiv.<br />
$finish;<br />
4.4 $monitor<br />
Task-ul de sistem $monitor permite monitorizarea si afisarea valorilor oricarei variabile sau<br />
expresii specificate ca parametru al task-ului. Parametrii sunt specificati ca si in cazul task-ului<br />
de sistem $display. Cand se invoca task-ul $monitor simulatorul stabileste un macanism prin<br />
care, de fiecare data cand o variabila sau o expresie, din lista de parametri, isi modifica valoarea,<br />
cu exceptia lui $time, intreaga lista a parametrilor este afisata la sfarsitul pasului de timp, ca si<br />
cand ar fi fost raportata de catre task-ul $display. Daca doi sau mai multi parametri isi schimba<br />
valoarile in acelasi timp se va realiza o singura afisare. De exemplu, instructiunea urmatoare va<br />
afisa o linie ori de cate ori se modifica unul dintre registrele A, B sau C.<br />
$monitor(" %0d %b %b "%b, $time, A, B, C);<br />
La un moment dat numai o instructiune $monitor trebuie sa fie activa. Monitorizarea poate fi<br />
activata/dezactivata prin urmatoarele instructiuni:<br />
4.5 $scope<br />
$monitoroff;<br />
$monitoron;<br />
<br />
Task-ul de sistem $scope ofera utilizatorului posibilitatea de a atribui, ca domeniu interactiv, un<br />
nivel particular al ierarhiei, pentru identificarea obiectelor. $scope este util in timpul depanarii<br />
intrucat utilizatorul poate modifica domeniul, pentru a inspecta valorile diverselor variabile, din<br />
diferite module, task-uri si functii.<br />
$scope();<br />
Parametrul trebuie sa fie numele complet ierarhic al unui modul, task, functii sau bloc<br />
cu nume. A se vedea task-ul de sistem $showscopes, pentru afisarea numelor.<br />
4.6 $settrace<br />
Task-ul de sistem $settrace activeaza urmarirea activitatii de simulare. Urmarirea consta in<br />
obtinerea diferitelor informatii, inclusiv a timpului curent de simulare, a numarului liniei, a<br />
numelui fisierului, a modulului si a oricarui rezultat al instructiunii care se executa.<br />
$settrace;
urmarirea se poate dezactiva prin task-ul de sistem $cleartrace .<br />
4.7 $showscopes<br />
Task-ul de sistem $showscopes afisaza o lista completa a tuturor modulelor, task-urilor,<br />
functiilor si a modulelor cu nume din domeniul curent.<br />
4.8 $showvars<br />
$showscopes;<br />
Task-ul de sistem $showvars furnizeaza informatia de stare pentru variabilele registre si fire,<br />
atat scalari, cat si vectori. Invocat fara parametri, $showvars afisaza starile tuturor variabilelor<br />
din domeniul curent. Invocat cu o lista de variabile, el arata numai stareaacelora specificate.<br />
4.9 $stop<br />
$showvars;<br />
$showvars();<br />
Task-ul de sistem $stop opreste simulatorul, trece la modul interactiv si transfera comanda catre<br />
utilizator.<br />
4.10 $time<br />
$stop;<br />
Functia de sistem $time system intoarce timpul curent de simulare sub foma unui intreg de 64<br />
de biti. $time trebuie utilizat intr-o expresie.<br />
Bibliografie<br />
1. Cadence Design Systems, Inc., Verilog-XL Reference Manual.<br />
2. Open Verilog International (OVI), Verilog HDL Language Reference Manual (LRM), 15466<br />
Los Gatos Boulevard, Suite 109-071, Los Gatos, CA 95032; Tel: (408)353-8899, Fax: (408)<br />
353-8869, Email: OVI@netcom.com, $100.<br />
3. Sternheim, E. , R. Singh, Y. Trivedi, R. Madhaven and W. Stapleton, Digital Design and<br />
Synthesis with Verilog HDL, published by Automata Publishing Co., Cupertino, CA, 1993,<br />
ISBN 0-9627488-2-X, $65.<br />
4. Thomas, Donald E., and Philip R. Moorby, The Verilog Hardware Description Language,<br />
second edition, published by Kluwer Academic Publishers, Norwell MA, 1994, ISBN 0-7923-<br />
9523-9, $98, includes DOS version of VeriWell simulator and programs on diskette.<br />
5. Bhasker, J., A Verilog HDL Primer, Star Galaxy Press, 1058 Treeline Drive, Allentown, PA<br />
18103, 1997, ISBN 0-9656277-4-8, $60.
6. Wellspring Solutions, Inc., VeriWell User’s Guide 1.2, August, 1994, part of free distribution<br />
of VeriWell, available online.<br />
7. World Wide Web Pages:<br />
FAQ for comp.lang.verilog - http://www.comit.com/~rajesh/verilog/faq/alt_FAQ.html<br />
comp.lang.verilog archives - http://www.siliconlogic.com/Verilog/<br />
Cadence Design Systems, Inc. - http://www.cadence.com/<br />
Wellspring Solutions - ftp://iii.net/pub/pub-site/wellspring<br />
Verilog research at Cambridge, England - http://www.cl.cam.uk/users/mjcg/Verilog/
9.1. Introducere.<br />
9. Bazele Aritmetice ale Calculatoarelor Numerice.<br />
Intrucat elementele de memorare sunt constituite din dispozitive cu doua stari stabile, iar iar<br />
elementele de prelucrare a informatiei sunt bazate pe circuite logice, care opereaza pe baza<br />
logicii bivalente, intr-un calculator numeric datele sunt reprezentate in binar, sub forma unor<br />
succesiuni de unitati si zerouri. Exista numeroase posibilitati pentru reprezentarea datelor, care<br />
se deosebesc intre ele prin expresibilitate, cost de implementare, usurinta conversiilor de la un<br />
format la altul, cat si prin alte considerente.<br />
Astfel, in cadrul unui calculator numeric, la nivel hardware, se folosesc mai multe tipuri de date:<br />
- Bit: 0,1<br />
- Sir de biti: secvente de biti de lungimi date:<br />
- Caracter:<br />
- Zecimal:<br />
- tetrada: 4 biti,<br />
- octet/byte: 8 biti,<br />
- semicuvant: 16 biti,<br />
- cuvant: 32 de biti,<br />
- cuvant dublu: 64 de biti<br />
- ASCII: cod de 7 biti<br />
- cifrele zecimale 0-9 codificate binar 00002 -10012 (doua cifre zecimale pot fi<br />
impachetate pe un octet sau intr-un octet se poate plasa o singura cifra zecimala);<br />
- Intreg (Virgula fixa):<br />
- fara semn,<br />
- cu semn, reprezentare in:<br />
- Real (Virgula mobila):<br />
- precizie simpla,<br />
- precizie dubla,<br />
- precizie extinsa.<br />
- semn si modul (cod direct),<br />
- complementul fata de 1 (cod invers),<br />
- complementul fata de 2 (cod complementar).
Calculatoarele poseda elemente de stocare a datelor, de tipul registrelor sau al celulelor de<br />
memorie, care dispun de un numar finit de elemente/ranguri, ceea ce afecteaza precizia<br />
calculului. Astfel, la programarea unor aplicatii numerice, trebuie avute in vedere aspectele<br />
legate de precizia limitata a reprezentarii informatiei.<br />
9.2. Sisteme de numeratie.<br />
9.2.1. Reprezentarea numerelor.<br />
Un sistem de numeratie consta in totalitatea regulilor si simbolurilor/cifrelor folosite pentru<br />
reprezentarea numerelor. Sistemele de numeratie pot fi de doua tipuri: pozitionale si<br />
nepozitionale. Intr-un sistem pozitional valoarea/ponderea unui simbol depinde de pozitia pe<br />
care o ocupa in reprezentarea unui numar dat, in timp ce intr-un sistem nepozitional acest lucru<br />
nu are loc. Ca exemplu de sistem nepozitional se poate da sistemul de numeratie roman.<br />
Sistemele de numeratie pozitionale mai poarta numele si de sisteme de numeratie ponderate,<br />
intrucat valoarea unei cifre depinde de pozitia ei in reprezentarea numarului dat.<br />
Un numar intreg N este reprezentat, intr-un sistem de numeratie pozitional, in baza b, sub<br />
forma unui n-tuplu de simboluri xi,<br />
Nb = xn-1 xn-2 xn-3 … xi… x1 x0<br />
unde xi reprezinta o cifra a sistemului de numeratie.<br />
O cifra xi poate lua valori intregi cuprinse intre 0 si b-1, baza b reprezentand numarul valorilor<br />
posibile pe care le poate lua o cifra oarecare xi.<br />
In general, un numar, constituit dintr-o parte intreaga si o parte subunitara are umatoarea<br />
reprezentare in baza b:<br />
Nb = xn-1 xn-2 xn-3 … xi… x1 x0 , x-1 x-2 x-3 … x-i… x-m , (o ≤ xi ≤ b-1).<br />
Valoarea N a numarului Nb se calculaeza cu ajutorul urmatoarei expresii:<br />
n-1<br />
N = Σ xi. b i<br />
i=-m<br />
Fie numarul (435,25)10, in baza 10 (n=3, m=2 si b=10).<br />
4 x 10 2 + 3 x 10 1 + 5 x 10 0 + 2 x 10 -1 + 5 x 10 -2 =<br />
(400)10 + (30)10 + (5)10 (1) + (2/10)10 + (5/100)10 = (435,25)10
In continuare se considera numarul (1011,01)2, pentru care: n = 4, m = 2 si b = 2:<br />
1 x 2 3 + 0 x 2 2 + 1 x 2 1 + 1 x 2 0 + 0 x 2 -1 + 1 x 2 -2 =<br />
(8)10 + (0)10 + (2)10 + (1)10 + (0/2)10 + (1/4)10 = (11,25)10<br />
In ultimul exemplu se prezinta metoda polinomiala de conversie a numerelor, reprezentate in<br />
baza 2, in numere reprezentate in baza 10.<br />
9.2.2. Conversia numerelor dintr-o baza in alta.<br />
Intr-un sistem de calcul datele sunt reprezentate in mai multe sisteme de numeratie. Astfel,<br />
datele de la intrare si cele de la iesire sunt, in general, reprezentate in baza 10. In memoria<br />
calculatorului si in unitatea de prelucrare datele sunt reprezentate in baza 2. Sunt situatii in care<br />
datele, care se prelucreaza, sunt reprezentate in baza 10, cifrele zecimale fiind codificate prin<br />
tetrade binare. Pentru a usura operatiile de programare, uneori, numerele binare sunt convertite<br />
in numere reprezentate in baza 8 sau baza 16.<br />
Plecand de la reprezentarea numerelor sub forma coeficientilor dezvoltarii polinomiale, in<br />
raport cu baza, conversia se poate efectua prin operatii repetate de impartire/inmultire in<br />
conditiile numerelor intregi/subunitare.<br />
Se presupune un numar N constituit dintr-o parte intreaga Ni si o parte subunitara Nf :<br />
Astfel:<br />
N = Ni + Nf<br />
Ni = xn-1 xn-2 xn-3 … xi… x1 x0 si<br />
Nb = 0, x-1 x-2 x-3 … x-i… x-m<br />
Conversia numerelor intregi din baza b in baza q presupune impartirea repetata a catului de la<br />
impartirea precedenta la noua baza si retinerea restului, mai mic decat noua baza, pana cand<br />
catul curent devine mai mic decat noua baza. Ca prim cat se ia numarul Ni , care urmeaza sa fie<br />
convertit. Resturile obtinute formeaza cifrele noului numar, incepand cu cea mai putin<br />
semnificativa. Toate operatiile se efectueaza in baza de plecare b.<br />
Din punctul de vedere al valorii exprimate:<br />
(Ni)b = (Ni)q<br />
(Ni)q se poate scrie ca un p-tuplu astfel:<br />
Ni = yp-1 yp-2 yp-3 … yi… y1 y0
Pentru a obtine coeficientii yi, ai dezvoltarii in baza q, se va recurge la urmatoarea secventa de<br />
operatii:<br />
Exemplu:<br />
(Ni)b : q = (Ni)b 1 + y0 /q , cifra curenta a noului numar este y0<br />
(Ni)b 1 : q = (Ni)b 2 + y1 /q , cifra curenta a noului numar este y1<br />
………………………………………………………………..<br />
(Ni)b p-2 : q = (Ni)b p-1 + yp-2 /q , cifra curenta a noului numar este yp-2<br />
unde 0 ≤ (Ni)b p-1 ≤ q reprezinta cifra cea mai semnificativa a noii reprezentari<br />
(17)10 = ( ? )2<br />
17 : 2 = 8 +1/2 , y0 = 1;<br />
8 : 2 = 4 +0/2 , y1 = 0;<br />
4 : 2 = 2 +0/2 , y2 = 0;<br />
2 : 2 = 1 + 0/2 , y3 = 0;<br />
( 17 )10 = 100012<br />
y4 = 1<br />
Conversia numerelor subunitare din baza b in baza q presupune inmultirea repetata a partii<br />
subunitare, care rezulta de la inmultirea precedenta, cu noua baza si retinerea partii intregi, pana<br />
cand partea subunitara curenta devine 0 sau pana cand se epuizeaza rangurile de reprezentare in<br />
noua baza. Ca prima parte subunitara se ia numarul Nf , care urmeaza sa fie convertit. Intregii<br />
obtinuti formeaza cifrele noului numar, incepand cu cea mai semnificativa. Toate operatiile se<br />
efectueaza in baza de plecare b.<br />
Din punctul de vedere al valorii exprimate:<br />
(Nf)b = (Nf)q<br />
(Nf)q se poate scrie ca un m-tuplu astfel:<br />
Nf = y-1 y-2 y-3 … y-i… y-m<br />
Pentru a obtine coeficientii y-i ai dezvoltarii in baza q se va recurge la urmatoarea secventa de<br />
operatii:<br />
(Nf)b × q = (Nf)b -1 + y0-1 , cifra curenta a noului numar este y-1<br />
(Nf)b -2 × q = (Nf)b -2 + y-2 , cifra curenta a noului numar este y-2<br />
………………………………………………………………..
(Nf)b -m+1 × q = 0 + y-m , cifra curenta a noului numar este y-m<br />
In cazul in care (Nf)b -i = 0, procesul se opreste. Se poate constata faptul ca procesul de<br />
conversie a numerelor subunitare poate fi insotit de erori, in cazul unui numar limitat de ranguri<br />
pentru reprezentarea in noua baza sau in cazul aparitiei unor secvente repetate de unitati si<br />
zerouri.<br />
Exemplu:<br />
(0,125)10 = (0,001)2<br />
Se considera urmatorul exemplu:<br />
(0,1)10 = ( ? )2<br />
0,1 × 2 = 0 + 0,2 ; y-1 = 0;<br />
0,2 × 2 = 0 + 0,4 ; y-2 = 0;<br />
0,4 × 2 = 0 + 0,8 ; y-3 = 0;<br />
0,8 × 2 = 1 + 0,6 ; y-4= 1;<br />
0,6 × 2 = 1 + 0,2 ; y-5 = 1;<br />
0,2 × 2 = 0 + 0,4 ; y-6 = 0;<br />
0,4 × 2 = 0 + 0,8 ; y-7 = 0;<br />
0,8 × 2 = 1 + 0,6 ; y-8 = 1;<br />
0,6 × 2 = 1 + 0,2 ; y-9 = 1;<br />
0,2 × 2 = 0 + 0,4 ; y-6 = 0;<br />
………………………………<br />
(0,1)10 = ( 0,00011000110.... )2<br />
Se poate observa ca, in acest ultim caz, conversia nu se efectueaza exact.<br />
Conversiile intre baze, care reprezinta puteri ale lui 2, constituie cazuri particulare, si se<br />
efectueaza mecanic. Astfel, in cazul numerelor reprezentate in octal/hexazecimal, cifrele<br />
octale/hexazecimale se inlocuiesc cu triadele/tetradele binare corespunzatoare si invers.<br />
Numerele octale/hexazecimale se exploreaza, pentru conversia in binar, de la dreapta la stanga.<br />
Mai jos se prezinta un tabel de corespondenta intre cifrele octale, zecimale si hexazecimale, pe<br />
de-o parte si echivalentele lor binare, pe de alta parte.
Exemple:<br />
binar octal zecimal hexazecimal<br />
(011101)2 = (011)2(101)2 = (3)8 (5)8 = (35)8<br />
(011101)2 = (0001)2(1101)2 = (1)16 (D)16 = (1D)16<br />
9.2.3. Reprezentarea informatiei numerice in calculatoare.<br />
Calculatoarele moderne opereaza atat cu numere intregi (cu semn si fara semn), cat si cu<br />
numere reale.<br />
In cazurile numerelor intregi cu semn si al mantisei numerelor reale semnul este codificat prin<br />
bitul plasat in extrema stanga. Semnul “-“ este codificat prin “1”, iar semnul “+” prin “0”.<br />
Pentru numerele intregi cu semn:<br />
Ni = xn-1 xn-2 xn-3 … xi… x1 x0<br />
semnul este codificat prin bitul xn-1.<br />
Un numar real Nr se reprezinta prin doua campuri: mantisa/fractia f, cu semn, si exponent e:<br />
unde:<br />
Nr = s e f<br />
- s reprezinta semnul mantisei, codificat printr-un bit, conform conventiei mentionate mai<br />
sus,<br />
- f constituie mantisa sub forma unui numar subunitar normalizat ( |m | ≤ 1/2 ),<br />
- e specifica exponentul, de regula, deplasat cu o anumita cantitate pentru a-l face ≥ 0 .<br />
O discutie mai amanuntita, <strong>privind</strong> reprezentarea numerelor reale se va face intr-un paragraf<br />
ulterior.
9.3. Coduri de reprezentare a numerelor intregi, cu semn, in calculatoare.<br />
Numerele intregi, cu semn, se pot reprezenta in calculatoare in trei moduri diferite, numite<br />
uneori si coduri de reprezentare:<br />
- semn si modul (cod direct),<br />
- complementul fata de 1 (cod invers),<br />
- complementul fata de 2 (cod complementar).<br />
Codul direct (semn si modul).<br />
[x]d = semn |x|<br />
[x]d = 0 xn-2 xn-3 … xi… x1 x0 , pentru x > 0;<br />
[x]d = 1 xn-2 xn-3 … xi… x1 x0 , pentru x < 0<br />
Se poate observa ca, in acest cod, 0 are doua reprezentari, daca este afectat de semn:<br />
[+0]d = 0 0000..000 si<br />
[-0]d = 11111..111<br />
Astfel, un numar x in cod direct, reprezentat pe n ranguri, poate lua valori in gama:<br />
ceea ce face ca pentru:<br />
-2 n-1 + 1 ≤ x ≤ 2 n-1 - 1,<br />
- n = 8 valorile minime/maxime sa fie –127 / +127, iar<br />
- n = 16 valorile minime/maxime sa fie –32767 / +32767.<br />
Reprezentarea in modul si semn este utila pentru implementarea operatiei de inmultire, dar<br />
prezinta unele dificultati la adunare si scadere.<br />
Codul invers (complementul fata de unu).<br />
Denumirea de complementul fata de unu provine de la faptul ca, reprezentarea in virgula fixa<br />
s-a realizat in calculatoare, mai intai, pentru numere subunitare, numerele negative fiind stocate<br />
sub forma complementului fata de 2, diminuat cu 1, prin scaderea lui |x| din 1. In cazul<br />
numerelor binare negative intregi, reprezentate pe n ranguri, codurile inverse se obtin prin<br />
scaderea modulelor acestora din 2 n – 1.<br />
unde: xi reprezinta inversul lui xi<br />
[x]i = 0 xn-2 xn-3 … xi… x0 , pentru x > 0;<br />
[x]i = 1 xn-2 xn-3 … xi… x0 , pentru x < 0<br />
Se poate observa ca, in acest cod, 0 are doua reprezentari, daca este afectat de semn:
[+0]i = 0 0000..000 si<br />
[-0]i = 11111..111<br />
Astfel, un numar x in cod invers, reprezentat pe n ranguri, poate lua valori in gama:<br />
ceea ce face ca pentru:<br />
-2 n-1 + 1 ≤ x ≤ 2 n-1 - 1,<br />
- n = 8 valorile minime/maxime sa fie –127 / +127, iar<br />
- n =16 valorile minime/maxime sa fie –32767 / +32767.<br />
Reprezentarea in codul invers este identica cu reprezentarea in cod direct, in cazul numerelor<br />
pozitive. Pentru a obtine codul invers al unui numar se inverseaza valorile binare ale tuturor<br />
rangurilor, operatie extrem de usor de realizat in hardware.<br />
Codul complementar (complementul fata de doi).<br />
Denumirea de complementul fata de doi provine de la faptul ca reprezentarea in virgula fixa<br />
s-a realizat in calculatoare mai intai pentru numere subunitare, iar numerele negative se stocau<br />
sub forma complementului fata de 2, prin scaderea lui |x| din 2. In cazul numerelor binare,<br />
intregi negative, reprezentate pe n ranguri, codurile inverse se obtin prin scaderea modulelor<br />
acestora din 2 n .<br />
[x]c = 0 xn-2 xn-3 … xi… x0 , pentru x ≥ 0;<br />
~ ~ ~ ~<br />
[x]c = 1 xn-2 xn-3 … xi… x0 , pentru x < 0<br />
unde: ~ ~ ~ ~<br />
1 xn-2 xn-3 … xi… x0 se obtine ca urmare a operatiei: 2 n - |x|<br />
Se poate observa ca, in acest cod, 0 are o singura reprezentare:<br />
[0]c = 0 0000..000<br />
Astfel, un numar x in cod complementar , reprezentat pe n ranguri, poate lua valori in gama:<br />
ceea ce face ca pentru:<br />
-2 n-1 ≤ x ≤ 2 n-1 - 1,<br />
- n = 8 valorile minime/maxime sa fie –128 / +127, iar<br />
- n = 16 valorile minime/maxime sa fie –32768 / +32767.<br />
Pentru: x > 0 [x]d = [x]i = [x]c<br />
Pentru: x < 0 [x]c = [x]i + 1 = 2 n - |x| .
Se poate observa usor ca, prin mijloace hardware, codul complementar al unui numar negativ se<br />
poate obtine adunand, la inversul numarului (obtinut prin negarea logica a tuturor rangurilor), o<br />
unitate in cel mai putin semnificativ rang.<br />
Reprezentarea in cod complementar faciliteaza realizarea hardware-lui necesar operatiilor de<br />
adunare si scadere in calculatoare.<br />
Reprezentarea in exces.<br />
Reprezentarea in exces este cunoscuta si sub numele de reprezentare deplasata. Ideea de baza<br />
consta in aceea de a atribui celui mai mic numar (numar negativ) valoarea cea mai mica intreaga<br />
ce se poate reprezenta in calculator, manipuland in acest mod numere fara semn. In cazul<br />
reprezentarii numerelor (14)10 si (-14)10 sub forma unor numere pe binare pe 8 biti, folosind<br />
forma excess 128 va trebui sa se obtina corespondentele binare ale numerelor (128 + 14 = 142)10<br />
si (128 + - 14 = 114)10. Astfel, codul binar in exces 128 pentru (-14)10 este (01110010)2.<br />
Nu exista o semnificatie numerica a valorii in excess, ea are ca efect deplasarea reprezentarii in<br />
complementul fata de doi. Pentru cazul studiat valoarea exces a fost astfel aleasa incat sa aibe<br />
acelas sablon de biti ca si cel mai mare numar negativ, ceea ce face ca numerele sa apara ca si<br />
cand ar fi sortate ca numere binare fara semn. Celui mai mic numar negativ (-128)10 ii va<br />
corespunde (00000000)2, in timp ce celui mai mare numar pozitiv (127)10 ii va corespunde<br />
(11111111)2. Aceasta reprezentare simplifica efectuarea operatiei de comparare a numerelor,<br />
ceea ce este esential pentru realizarea hardware-lui necesar operarii asupra exponentilor, la<br />
reprezentarea in virgula mobila.<br />
9.4. Codul binar-zecimal.<br />
Numerele pot fi reprezentate in sistemul de numeratie cu baza 10, in conditiile in care rangurile<br />
zecimale sunt codificate prin tetrade binare. Acesta este codul binar-zecimal sau BCD (Binary<br />
Coded Decimal). Posibilitatile de codificare oferite de catre o tetrada binara nu sunt epuizate in<br />
cazul BCD, deoarece raman neutilizate 6 tetrade dintr-un total de 16.<br />
In cazurile in care se doreste o codificare BCD cu semn, tetradele binare: (1100) si (1101) se<br />
folosesc pentru codificarea semnelor “+” si “-“, in timp ce tetradele binare (0000),….., (1001)<br />
se utilizeaza pentru codificarea cifrelor zecimale.<br />
Pe un octet/byte, in bitii cei mai putin semnificativi, poate fi plasata o singura tetrada: BCD<br />
“neimpachetat”. In cazul plasarii a doua tetrade BCD pe un singur octet, se spune ca BCD este<br />
“impachetat” .
Codurile BCD se utilizeaza in calculatoarele destinate calculelor comerciale, financiare,<br />
inlaturand necesitatea conversiilor zecimal-binar si binar-zecimal.<br />
Un numar negativ in baza 10, cu mai multe ranguri, se poate reprezenta in BCD in<br />
complementul fata de 9 sau fata de 10.<br />
In cazul numerelor (+402)10 si (-402)10 se pot da reprezentarile lor in complementul fata de 9<br />
si fata de 10:<br />
0000 0100 0000 0010 (+402)10<br />
a) (0)10 (4)10 (0)10 (2)10<br />
1001 0101 1001 0111 (-402)10 complementul fata de 9<br />
b) (9)10 (5)10 (9)10 (7)10<br />
1001 0101 1001 1000 (-402)10 complementul fata de 10<br />
c) (9)10 (5)10 (9)10 (8)10<br />
In ultimul exemplu numerele pozitive vor fi reprezentate in gama 0 – 4999, iar numerele<br />
negative in gama 5000 – 9999.<br />
9.5. Reprezentarea in virgula mobila.<br />
Reprezentarea numerelor in virgula fixa precizeaza un numar de ranguri la stanga virgulei,<br />
pentru partea intreaga, si un alt numar de ranguri la dreapta virgulei, pentru partea subunitara.<br />
In vederea asigurarii unei game largi de reprezentare, cat si a unei precizii convenabile, in cazul<br />
virgulei fixe trebuie sa se aloce un numar mare de ranguri. Astfel, in cazul in care se doreste<br />
manipularea numerelor cu valori pana la 1 trilion (10 12 ) sunt necesare 40 de ranguri binare ,<br />
intrucat 10 12 ≈ 2 40 . Acelasi numar de 40 ranguri binare este necesar in cazul asigurarii unei<br />
precizii de o trilionime. Numerele ar fi astfel reprezentate pe 80 de biti. In practica solicitarile<br />
<strong>privind</strong> gama si precizia pot fi si mai mari.<br />
Virgula mobila ofera posibilitatea reprezentarii cu un numar mic de ranguri binare a unei game<br />
largi de numere exprimabile, prin efectuarea unui compromis intre numarul de rangur, care<br />
asigura precizia, si numarul de ranguri, care asigura gama.<br />
In numarul, reprezentat in virgula mobila, de mai jos:<br />
0,36542 × 10 4
gama este stabilita de catre numarul de ranguri ale exponentului si de catre baza, care, in cazul<br />
de fata, este 10. Precizia este asociata cu numarul de ranguri ale partii subunitare, 5 in exemplul<br />
de mai sus. Precizia si gama impun un numar de 6 ranguri zecimale, la care se mai adauga unul<br />
pentru codificarea semnului partii subunitare/mantisei:<br />
+ 4 . 3 6 5 4 2<br />
semnul mantisei virgula<br />
exponent mantisa<br />
In afara compromisului intre precizie si gama, bazat pe modificarea numarului de biti din<br />
reprezentarile exponentului si mantisei, pentru marirea gamei de reprezentare, se mai poate<br />
actiona, si asupra bazei, in sensul cresterii acesteia. Prin aceasta creste precizia pentru numerele<br />
mici, iar pentru numerele mari scade.<br />
Reprezentarea normalizata. Un numar poate fi reprezentat, in virgula mobila, in mai multe<br />
moduri:<br />
3654,2 × 10 0 = 36,542 × 10 2 = 0,36542 × 10 4<br />
Pentru a evita reprezentarile multiple ale aceluiasi numar se introduce forma normalizata.<br />
Aceasta se obtine prin deplasarea spre stanga a mantisei, astfel incat, imediat la dreapta virgulei<br />
sa se afle o cifra diferita de 0. Pe masura deplasarii mantisei la stanga se incrementeaza si<br />
exponentul. Operatia nu are sens atunci cand mantisa are toate rangurile egale cu 0.<br />
Un exponent este, de regula, rezervat pentru reprezentarea lui zero si a altor cazuri speciale,<br />
cum ar fi ∞. Cu exceptia cazului cand este egala cu zero, mantisa poseda in bitul cel mai<br />
semnificativ o unitate, pentru o baza egala cu 2. Acest bit, egal cu 1, este prezent in mod<br />
implicit, ceea ce permite deplasarea mantisei spre stanga cu un bit, in scopul maririi preciziei.<br />
Bitul in cauza poarta numele de “bit ascuns".<br />
Terminologia folosita in legatura cu erorile de calcul.<br />
In analiza erorilor posibile <strong>privind</strong> prelucrarea datelor se folosesc o serie de termeni si concepte<br />
specifice.<br />
Precizia. Constituie un termen asociat cu lungimea cuvantului, numarul de biti disponibili intr-<br />
un cuvant pentru reprezentarea unui numar dat. In cazul unui registru de 8 biti, considerand ca<br />
se reprezinta numai numere naturale, precizia de reprezentare va fi de 1/256. Precizia nu trebuie<br />
confundata cu acuratetea.<br />
Acurateta. Aceasta reprezinta o masura a apropierii unei aproximatii fata de valoarea exacta.<br />
Acest termen nu trebuie confundat cu precizia. Ca exemplu se poate considera reprezentarea nu-
marului natural 6 in binar, pe 4 biti. Reprezentarea exacta, fara nici o eroare va fi 0110. Daca se<br />
ia numarul binar fractionar 0,10101010101,care trebuie reprezentat pe 8 biti se va obtine:<br />
0,1010101. Ultima forma constituie o reprezentare cu eroare a numarului initial. Astfel, in al<br />
doile caz reprezentarea, care contine o eroare, este mai precisa (8 biti in loc de 4), dar are o<br />
acurateta mai mica .<br />
Gama. Gama reprezinta multimea numerelor reprezentabile intr-un sistem dat. Astfel, in<br />
reprezentarea numerelor intregi in complementul fata de doi, pe patru biti, gama de reprezentare<br />
va fi de la -8 la + 7, adica (+7) - (-8) = 15.<br />
Rezolutia. Aceasta constituie marimea diferentei/distantei intre doua numere sau cifre adiacente.<br />
Pentru reprezentarea cu patru cifre zecimale, gama fiind intre 0000 si 9999, rezolutia este<br />
constanta si egala cu 1.<br />
In cazul reprezentarii in virgula mobila rezolutia nu mai este constanta in cadrul gamei. Ea este<br />
dependenta de valoarea exponentului utilizat.<br />
Trunchierea. Cunoscuta si sub denumirea de rotunjire prin lipsa, aceasta tehnica este utilizata in<br />
cazurile in care precizia nu este suficienta pentru reprezentarea corecta a numarului stocat.<br />
Considerand stocarea valorii lui pi = 3,141592654 intr-un dispozitiv capabil sa memoreze numai<br />
6 cfre zecimale, numarul pi = 3,14159 se va reprezenta cu o eroare de trunchiere egala cu<br />
0,000002654.<br />
Rotunjirea. Metoda prin care se cauta sa se selecteze valoarea cea mai apropiata de valoarea<br />
initiala a numarului poarta numele de rotunjire. In zecimal, daca cifra aflata la dreapta<br />
ultimei cifre, care intra in reprezentare, este mai mare sau egala cu 5 atunci ultima cifra se<br />
incrementeaza cu 1, in caz contrar se lasa neschimbata. In binar, daca cifra aflata la dreapta ulti-<br />
mei cifre, care intra in reprezentare, este 1 atunci la ultima cifra se adauga o unitate, in caz<br />
contrar cifra nu se modifica.<br />
Depasirea. Situatia de depasire apare cind rezultatul unui calcul este prea mare pentru a putea fi<br />
reprezentat in sistem. Spre exemplu, daca se lucreaza in binar cu numere intregi reprezentate in<br />
complementul fata de doi, pe 4 biti, gama de reprezentare fiind -8 la +7, orice rezultat care<br />
depaseste gama va conduce la depasire.<br />
Depasirea superioara si depasirea inferioara. Aceste situatii apar la reprezentarea numerelor in<br />
virgula mobila, atunci cand rezultatul este mai mare sau mai mic decat cel mai mare sau cel mai<br />
mic numar care poate sa fie reprezentat in sistem. Pentru a preveni obtinerea unor rezultate<br />
false/eronate/pseudorezultate se elaboreaza tehnici prin care se semnalizeaza aparitia unor
asemenea situatii.<br />
Erori introduse la conversia numerelor din baza zece in baza doi. Aceste erori apar datorita<br />
faptului ca cele mai multe numere nu reprezinta multipli ai unor fractii binare. Situatia se intal-<br />
neste in mod frecvent la introducerea datelor in calculator. De regula, numarul rangurilor binare<br />
este destul de mare pentru a se putea reprezenta numarul necesar de cifre zecimale.<br />
Reprezentarea numerelor reale.<br />
Calculatoarele destinate calculelor stiintifice si ingineresti opereaza in principal cu numere<br />
reale. Se cunoaste ca multimea numerelor reale este convexa, adica in oricare interval, indife-<br />
rent de marimea sa, exista un numar infinit de valori reale. Intr-un calculator pot fi reprezentate<br />
precis valori discrete, dintr-o multime finita, deoarece fiecare informatie/data poate fi<br />
reprezentata numai printr-un numar fix de biti. Astfel, oricare reprezentare a unor numere reale,<br />
intr-un calculator, constituie o aproximare a valorilor exacte.<br />
Un aspect important se refera la faptul ca datele reale presupun in acelasi timp atat o gama mare<br />
de valori, cat si o anumita precizie.<br />
In principiu numerele reale se pot reprezenta in doua moduri: in virgula fixa si in virgula<br />
mobila.<br />
Reprezentarea in virgula fixa presupune un numar dat de ranguri pentru partea intreaga si pentru<br />
partea subunitara:<br />
X = xn-1 xn-2 … xi… x1 x0 , x-1 x-2 … x-i… x-m<br />
Desi prin aceasta reprezentare se poate asigura o precizie satisfacatoare, in multe cazuri<br />
(in functie de numarul de ranguri n + m ) apar dificultati importante in privinta gamei de<br />
reprezentare a datelor de intrare, a rezultatelor partiale si finale in cadrul unui program executat<br />
pe un calculator. Aceasta implica introducerea unor factori de scara, care sa asigure limitarea<br />
valorilor maxime la posibilitatile reale de reprezentare, in calculatorul dat.<br />
Reprezentarea in virgula mobila sau notatia stiintifica foloseste in principal doua campuri:unul<br />
pentru exponent (e) si altul pentru mantisa/parte subunitara/fractie (f). Astfel, numarul real X se<br />
poate scrie:<br />
X = f.r e<br />
unde r este baza, f - mantisa, iar e - exponentul.<br />
Baza se ia egala cu 2 sau o putere a acestuia (64).
Mantisa f se reprezinta ca un numar subunitar, normalizat afectat de semn ( | f | ≥1/2 , pentru a<br />
nu pierde din precizie); numarul de biti din mantisa asigura precizia de reprezentare.<br />
Exponentul stabileste gama de reprezentare; pentru simplificarea algoritmilor de efectuare a<br />
operatiilor aritmetice, in virgula mobila, se utilizeaza numai exponenti pozitivi (deplasati), prin<br />
adunarea unei cantitati date, astfel incat, cel mai mic exponent sa nu ia o valoare negativa (sa fie<br />
zero).<br />
Daca exponentul are k biti si mantisa m biti (exclusiv semnul s), numarul X se va putea<br />
reprezenta astfel:<br />
X = s ek-1ek-2 ….e0 f-1 f-2 …..e-m<br />
Semnul s, al mantisei, va fi plasat in rangul cel mai semnificativ al reprezentarii binare.<br />
Stabilirea formatului de reprezentare a numerelor reale, in virgula mobila, a constituit obiectul a<br />
numeroase studii, care s-au concretizat prin elaborarea unui standard (IEEE 754). Astfel, au<br />
fost alese doua formate standard:<br />
- formatul scurt sau de baza, pe un cuvant de 32 de biti, care asigura o viteza mai mare de<br />
operare;<br />
- formatul lung sau dublu de baza, pe un cuvant de 64 de biti, care asigura o precizie mai mare<br />
de lucru.<br />
In alegerea bazei s-a plecat de la observatia ca aceasta trebuie sa permita cea mai buna precizie<br />
posibila si pentru formatul scurt. S-a demonstrat ca o baza egala cu 2 asigura o precizie mai<br />
buna in cazul rotunjirii mantisei rezultatului unei operatii aritmetice, decat alte baze (4, 8, 16),<br />
cel putin cu un rang in raport cu baza 16.<br />
In privinta reprezentarii se considera ca folosirea codului direct ( semn si modul ) este<br />
superioara codului complementar.<br />
Daca lungimea cuvintului este fixata gama si precizia se influenteaza reciproc.<br />
O gama de 10 +/-75 este insuficienta, in timp ce o gama de 10 +/-300 corespunde cerintelor<br />
celor mai multe aplicatii. De aceea in cazul formatului scurt a fost sacrificata gama, intr-o<br />
oarecare masura, pentru a asigura o buna precizie.<br />
Daca se foloseste aceeasi unitate aritmetica, atat pentru operatiile in formatul scurt, cat si pentru<br />
operatiile in formatul lung, in primul caz nu se vor inregistra depasiri de tip superior sau<br />
inferior. De asemenea, se poate observa ca numarul de biti (52) din mantisa in formatul lung<br />
este mai mare decat dublul numarului de biti (2 × 24) ai mantisei in formatul scurt. Aceasta<br />
face ca la inmultirea in formatul scurt adunarea produselor partiale sa nu fie afectata de erori.
Formatul scurt ( simplu - de baza ).<br />
s e f<br />
0 1 8 9 31<br />
- bitul 0: s = semnul mantisei ( s = 1 - mantisa negativa );<br />
- bitii 1-8: e = exponentul deplasat ( deplasarea este 2 7 - 1 );<br />
- bitii 9-31: f = mantisa/fractia ( cand e ≠ 0, se presupune un<br />
bit egal cu 1, la stanga lui f; virgula se plaseaza intre acest bit si primul bit explicit al mantisei;<br />
valoare: numarul reprezentat intr-un format scurt este:<br />
( -1 ) s 2 e-(2↑7- 1) .( 1 + f ), cu conditia e ≠0.<br />
Valoarea/marimea numerelor reprezentate este in gama: -2 -126 .(1,0) pana la 2 127 .( 2 – 2 -23 ),<br />
ceea ce reprezinta aproximativ –1,8 × 10 -38 pana la 3,40 × 10 38<br />
Formatul lung ( dublu - de baza ).<br />
s e f<br />
0 1 1112 63<br />
- bitul 0: s = semnul mantisei ( s = 1 - mantisa negativa );<br />
- bitii 1-11: e = exponentul deplasat ( deplasarea este 2 10 - 1 );<br />
- bitii 12-63: f = mantisa/fractia ( cand e ≠ 0, se presupune un<br />
bit egal cu 1, la stanga lui f; virgula se plaseaza intre acest bit si primul bit explicit al mantisei;<br />
valoare: numarul reprezentat intr-un format lung este:<br />
( -1 ) s 2 e-(2↑10 - 1) .( 1 + f ), cu conditia e ≠0.<br />
Observatii <strong>privind</strong> formatele.<br />
1. Baza a fost aleasa din considerente de echilibrare a gamei, cu restrictia ca toate<br />
numerele mici sa aibe valori reciproce reprezentabile. Contrar altor practici, gama<br />
obtinuta este deplasata pentru a putea asigura depasirea inferioara (underflow),<br />
deoarece aceasta situatie se poate rezolva mai usor, prin hardware, decat depasirea<br />
superioara (overflow)
2. S-a constatat ca prezenta unui prim bit implicit, inaintea bitilor mantisei, asigura<br />
depasirea inferioara gradata. Mai jos se va arata cum au fost rezolvate aspectele<br />
mentionate la punctele 1 si 2.<br />
3. Cazuri speciale.<br />
3.1 In conditiile unui exponent egal cu zero s-a rezervat un camp pentru:<br />
- zero: toti bitii sunt zero;<br />
- date initializate: bitul de semn este unu, iar ceilalti biti sunt zero;<br />
- numere denormalizate: toate formatele de biti cu exponent zero si mantisa diferita<br />
de zero se interpreteaza ca numere denormalizate; in efectuarea operatiilor<br />
aritmetice bitul cel mai semnificativ este fortat la zero iar bitul implicit unu este<br />
adunat la exponent, ceea ce va permite implementarea gradata a depasirii<br />
inferioare.<br />
Valoarea denormalizata va fi: ( -1 ) s 2 1-(2↑7- 1) .( 0 + f )<br />
3.2 In conditiile unui exponent cu toti bitii egali cu unu s-a rezervat un camp pentru:<br />
- +∞: semnul este zero, iar celalti biti sunt unu;<br />
- -∞: toti bitii sunt unu:<br />
- nedefinit: semnul si mantisa sunt zero, iar exponentul este format din unitati;<br />
- alte situatii: celelalte combinatii sunt rezervate pentru utilizari inca nedefinite.<br />
Standardul IEEE 754 pentru reprezentarea numerelor in virgula mobila.<br />
Acest standard a fost acceptat de numerosi producatori de microprocesoare si de unitati centrale<br />
pentru minicalculatoare si calculatoare de capacitate medie-mare.<br />
In aceste conditii se vor putea transporta, fara dificultati majore, pachetele de programe<br />
stiintifice intre diferite tipuri de echipamente de calcul.<br />
A. Formate.<br />
Formatele prezentate mai sus fac parte din standardul IEEE 754. In plus standardul mai contine<br />
formatul extins cu formele scurta (simpla) si lunga (dubla), in care mantisa este prevazuta cu<br />
un bit j, pentru specificarea explicita a partii intregi, care in formatul de baza discutat a fost<br />
presupus implicit. In acest format se dau alte valori minime si maxime pentru exponenti si<br />
mantise, in raport cu formatul de baza.<br />
In cele ce urmeaza se prezinta in rezumat caracteristicele tuturor formatelor.
Formatul simplu - de baza.<br />
Acest format este organizat pe 32 de biti: 1 bit pentru semnul mantisei, 8 biti pentru exponent si<br />
32 de biti pentru mantisa.<br />
Valoarea V a numarului se calculeaza astfel:<br />
- daca e = 255 si f ≠ 0, atunci V = NaN ( nu este un numar -Not a Number - simbol<br />
codificat in format );<br />
- daca e = 255 si f = 0, atunci V = (-1) s .∞<br />
- daca 0 < e < 255, atunci V = (-1) s .2 e-127 .(1,f);<br />
- daca e = 0 si f ≠0, atunci V = (-1) s .2 -126 .(0,f);<br />
- daca e = 0 si f = 0, atunci V = (-1) s .0 (zero).<br />
Formatul dublu - de baza.<br />
Acest format este organizat pe 64 de biti: 1 bit pentru semnul mantisei, 11 biti pentru exponent<br />
si 52 de biti pentru mantisa.<br />
Valoarea V a numarului se determina dupa cum urmeaza:<br />
- daca e = 2047 si f ≠ 0, atunci V = NaN ( nu este un numar -Not a Number - simbol<br />
codificat in format );<br />
- daca e = 2047 si f = 0, atunci V = (-1) s .∞<br />
- daca 0 < e < 2047 atunci V = (-1) s .2 e-1023 .(1,f);<br />
- daca e = 0 si f ≠0, atunci V = (-1) s .2 -1022 .(0,f);<br />
- daca e = 0 si f = 0, atunci V = (-1) s .0 (zero).<br />
Formatul simplu - extins.<br />
Acest format este structurat astfel: 1 bit de semn, 1 bit pentru partea intreaga (j) a mantisei, cel<br />
putin 31 de biti pentru partea fractionara a mantisei (f) si un exponent ce poate lua<br />
valori cuprinse intre minimum m = -1022 si maximum M = 1023.<br />
Valoarea V a numarului se determina dupa cum urmeaza:<br />
- daca e = M si f ≠0, atunci V = NaN;<br />
- daca e = M si f = 0, atunci V = (-1) s .∞;<br />
- daca m < e < M, atunci V = (-1) s .2 e .(j,f);<br />
- daca e = m si j = f = 0, atunci V = (-1) s . 0 (zero);<br />
- daca e = m si j ≠ 0 sau f ≠ 0, atunci V = (-1) s .2 e* .(j,f);<br />
unde e* este egal cu m sau m + 1, selectat la implementare.
Formatul dublu extins.<br />
Acest format are caracteristici identice cu formatul simplu extins, cu exceptia ca exponentul ia<br />
valori intre m = -16382 si M =16383, avand cel putin 63 de biti pentru partea fractionara (f).<br />
B.Rotunjirea.<br />
Operatia de rotunjire trateaza numarul ca avand o precizie infinita si il modifica pentru a<br />
corespunde formatului destinatie.<br />
Schema hardware va emite un semnal pentru a arata daca rezultatul este corect sau incorect.<br />
Standardul IEEE 754 include atat un mecanism standard-implicit de rotunjire, cat si alte trei<br />
metode ce pot fi selectate de utilizator.<br />
Mecanismul standard rotunjeste numarul la cea mai apropiata valoare reprezentabila. Daca sunt<br />
posibile doua valori, formatul este rotunjit la valoarea para, care face ca eroarea de rotunjire<br />
sa fie egala cu jumatate din valoarea celui mai putin semnificativ bit.<br />
Celelalte trei mecanisme de rotunjire selectabile sunt urmatoarele:<br />
- rotunjirea catre +∞ asigura cea mai apropiata valoare dar nu mai mica decat a<br />
numarului dat;<br />
- rotunjirea catre -∞ furnizeaza cea mai apropiata valoare, dar nu mai mare decat<br />
numarul dat;<br />
- rotunjirea catre 0 ( trunchiere ) asigura valoarea cea mai apropiata, dar nu mai mare<br />
decat numarul dat in modul.<br />
Operatia de rotunjire se aplica formatului destinatie. In formatul dublu sau formatul extins<br />
standardul permite utilizatorului sa specifice daca rotunjirea trebuie sa se efectueze in formatul<br />
simplu - de baza. Aceasta permite ca pe o masina, care are numai formatul dublu de baza sau<br />
formatul extins, sa se emuleze si formatul simplu de baza.<br />
C. Valori speciale.<br />
Standardul de reprezentare in virgula mobila suporta aritmetica cu numere infinite folosind<br />
modalitatile afina si proiectiva, selectabile de utilizator.<br />
Modalitatea infinit-afina este definita prin relatia:<br />
-∞ < ( oricare numar finit ) < +∞
Modalitatea infinit-proiectiva compara intotdeauna numerele egale, indiferent de semn.<br />
Standardul defineste un set de operatii astfel incat folosirea unui operand infinit nu va conduce<br />
la un rezultat eronat; pentru detectarea unor asemenea cazuri nu sunt prevazute capcane. In<br />
calculele cu valori infinite toate exceptiile care se vor discuta in continuare raman valabile.<br />
NaN constituie o valoare speciala, introdusa pentru a semnaliza operatii invalide sau operatii<br />
care produc rezultate invalide cu o valoare speciala. Standardul defineste posibilitatile de utili-<br />
zare si neutilizare ale capcanelor pentru NaN. Folosirea capcanei asigura activarea unei exceptii,<br />
la efectuarea unei operatii cu un operand NaN. Neutilizarea capcanei conduce numai la<br />
pozitionarea indicatorilor corespunzatori de eroare (conditii).<br />
D. Operatii.<br />
In standard sunt definite operatiile aritmetice de baza: adunarea, scaderaea, inmultirea si<br />
impartirea; radacina patrata si gasirea restului la impartire; conversia formatului in: virgula mo-<br />
bila, numere intregi si numere zecimale codificate binar BCD ( cu exceptia numerelor BCD<br />
extinse EBCD ); compararea numerelor in virgula mobila.<br />
Operatia de comparare conduce la unele situatii particulare, cand se folosesc operanzi NaN sau<br />
cu valori infinite. Relatiile permise sunt: "mai mic decat", "egal cu", "mai mare decat" si<br />
"neordonat". Ultimul caz apare cand cel putin un operand este NaN si cand un numar infinit este<br />
comparat in modalitatea proiectiva cu un numar finit. Relatia "neordonat" afirma predicatele<br />
"neordonat" si "< >", negand insa pe toate celelalte. Atunci cand se testeaza daca un numar are<br />
valoarea NaN, nu va fi posibila verificarea intre o constanta NaN si un numar, deoarece relatia<br />
este intotdeauna "neordonat".<br />
E. Exceptii si capcane.<br />
Standardul IEEE754 defineste atat exceptiile, care trebuie detectate, cat si informatiile necesare<br />
elementului, care manipuleza capcana, pentru gasirea exceptiilor. Implementarea va asigura<br />
cate un indicator pentru fiecare tip de exceptie. Raspunsul standard la exceptie consta in<br />
continuarea operatiei, fara activarea capcanei.<br />
Operatie invalida. Acest tip de exceptie se incadreaza in doua clase: exceptii de operand<br />
invalid si rezultat invalid. In ambele cazuri, daca nu este activata o capcana, rezultatul va fi<br />
NaN.<br />
Exceptiile de operand sunt provocate de urmatoarele evenimente:<br />
- un operand este NaN, fara a se genera un semnal pentru capcana si fara a se activa<br />
capcana;
- se executa una din urmatoarele operatii:<br />
- (∞) + (∞) - ( modalitatea proiectiva ),<br />
- (∞) + (-∞) - ( modalitatea afina ),<br />
- (∞)/(∞), 0/0 si 0 × ∞;<br />
- in operatia xREMy, de aflare a restului la impartire, fie x este infinit, fie y este zero;<br />
- cand se incearca extragerea radacinii patrate dintr-un numar negativ;<br />
- la conversia de la formatul in virgula mobila la intreg sau BCD, cand conversia corecta<br />
conduce la o depasire, la o valoare infinita sau NaN;<br />
- la comparatiile ce folosesc predicatele sau negatiile lor, cand relatia este de<br />
"neordonare" si cand nici un operand nu este"neordonat".<br />
Exceptiile de rezultat invalid apar cand rezultatul unei operatii nu este corect in raport cu<br />
formatul destinatie.<br />
Alte exceptii. Exceptiile standard sunt urmatoarele:<br />
- impartire cu zero;<br />
- depasire superioara;<br />
- depasire inferioara;<br />
- rezultat inexact, atunci cand nu se genereaza alte exceptii si cand valoarea rotunjita<br />
pentru rezultat conduce la depasire superioara, fara a activa capcana.<br />
Parametrii pentru capcana. Capcanele, care corespund fiecarei exceptii pot fi<br />
activate/dezactivate de utilizator. Cand este activata, exceptia transfera controlul la o rutina<br />
pentru manipularea capcanei (furnizata de utilizator sau de catre sistem).<br />
O asemenea rutina trebuie sa primeasca urmatoarele informatii:<br />
- tipul exceptiei, care a aparut,<br />
- tipul operatiei, care s-a executat,<br />
- formatul destinatiei,<br />
- rezultatul corect rotunjit ( in cazul depasirii superioare/inferioare, rezultatului<br />
inexact/invalid), pe langa alte informatii referitoare la faptul ca rezultatul nu<br />
corespunde formatului destinatie,<br />
- valorile operandului, in cazurile impartirii cu zero si exceptiilor de operand invalid.
Standardul aritmetic.<br />
Scopul urmarit prin aritmetica in virgula mobila este acela de a pune la dispozitia utilizatorului<br />
un sistem convenabil de reprezentare a numerelor prin care se obtin rezultate precise ca urmare<br />
a efectuarii operatiilor aritmetice. D. Knuth a sugerat un model de aritmetica in virgula mobila,<br />
care permite obtinerea unor rezultate in virgula mobila foarte apropiate de rezultatul corect.<br />
Algoritmii propusi de Knuth conduc la implementari extrem de costisitoare si nu ofera solutii<br />
pentru cazul rezultatelor aflate exact intre doua numere in virgula mobila.<br />
In continuare se prezinta atat un set de reguli, care specifica toate cazurile, cat si algoritmii de<br />
implementare ai acestui set de reguli.<br />
Reguli.<br />
1. Multimea numerelor in virgula mobila trebuie sa contina 0 si 1 (identitati aditive si<br />
multiplicative), iar daca x apartine multimii atunci si -x va apartine multimii.<br />
2. Daca rezultatul corect al unei operatii in virgula mobila esteun numar in virgula mobila,<br />
atunci acel numar trebuie sa fie generat de operatia respectiva, in caz contrar rezultatul va fi<br />
rotunjit conform regulei 3.<br />
3. Daca rezultatul corect se afla exact la mijlocul intervalului dintre doua numere in virgula<br />
mobila, atunci aritmetica respectiva trebuie sa genereze numarul cu mantisa para.<br />
Regulile de mai sus ( regula de rotunjire poarta numele de "rotunjire la par" ) asigura maximum<br />
de precizie.<br />
In continuare vor fi ilustrate metodele de implementare ale operatiilor aritmetice in virgula<br />
mobila (adunare, scadere, inmultire si impartire), care utilizeaza "rotunjirea la par", in ve-<br />
derea obtinerii rezultatului final.<br />
Pentru exemplificare se va considera un acumulator cu urmatoarea structura, pentru efectuarea<br />
operatiilor aritmetice cu numere avand mantisa de patru biti:<br />
D F1 F2 F3 F4 G R ST<br />
cu urmatoarele notatii:<br />
- D: bitul de depasire,<br />
- F1 - F4: cei 4 biti ai mantisei,<br />
- G: Bitul de garda,<br />
- R: bitul de rotunjire,
- ST: bitul de legatura/lipitura, "stiky".<br />
Bitul ST este pozitionat in unu, daca in procesul de denormalizare are loc transferul unei unitati<br />
din bitul R spre dreapta. Daca ST este pozitionat in unu el va ramane in aceasta stare pe toata<br />
durata operatiilor. Toate deplasarile in acumulator implica bitii D, G, R si ST. Bitul ST nu este<br />
modificat de deplasarea la stinga. Deplasarea la dreapta introduce zero in bitul D.<br />
In algoritmii de mai jos se considera ca acumulatorul este initializat la zero si ca operanzii au<br />
fost verificati daca sunt invalizi sau egali cu zero. Astfel, se considera numai operanzii valizi,<br />
normalizati, diferiti de zero. De asemenea, se considera ca operatiile aritmetice, <strong>privind</strong><br />
exponentii pentru inmultire, imparire si ajustare prin deplasare, sunt evidente, fara a necesita<br />
detalieri, si ca semnul rezultatului este stabilit in mod corespunzator.<br />
Adunarea si scaderea in virgula mobila vor fi tratate impreuna, evidentiind doua cazuri:<br />
- adunarea modulelor, atunci cand se aduna numere cu acelasi semn sau cand se scad<br />
numere cu semne diferite;<br />
- scaderea modulelor, atunci cand se scad numere cu acelasi semn sau se aduna numere<br />
cu semne diferite.<br />
1.Adunarea modulelor.<br />
<strong>1.1.</strong>Denormalizarea: numarul cu exponent mai mic se incarca in acumulator si se deplaseaza<br />
cu un numar de pozitii spre dreapta, egal cu diferenta exponentilor. Daca exponentii sunt egali<br />
oricare dintre numere/operanzi poate fi incarcat in acumulator, fara a se efectua vreo deplasare.<br />
1.2.Adunarea: cel de-al doilea operand este adunat la acumulator.<br />
1.3.Normalizarea: daca s-a pozitionat in unu bitul D atunci se deplaseaza continutul<br />
acumulatorului cu un bit spre dreapta.<br />
1.4.Rotunjirea: se aduna 1 la pozitia G, dupa care, daca G = R = ST = 0, se forteaza F4 ← 0.<br />
1.5.Renormalizarea: daca D este pozitionat in unu se face deplasarea continutului<br />
acumulatorului spre dreapta.<br />
1.6.Depasirea: se verifica daca a avut loc o depasire a exponenului.<br />
2.Scadera modulelor.<br />
2.1.Denormalizarea: se incarca numarul cu modulul cel mai mic in acumulator si se deplaseaza<br />
la dreapta, daca este necesar. Rezultatul va fi zero daca si numai daca operanzii sunt egali, aban-<br />
donadu-se operatiile urmatoare.<br />
2.2.Scadearea: se scade continutul acumulatorului din celalalt operand, pastrand rezultatul in<br />
acumulator ( daca ST = 1 se va genera un imprumut );
2.3.Normalizarea: se deplaseaza acumulatorul la stanga pana cand F1 devine egal cu 1;<br />
2.4.Rotunjirea: se aduna 1 la bitul G si apoi, daca G = R = 0 si ST = 0, se forteaza F4 ← 0; nu<br />
este necesara rotunjirea daca pentru normalizare au fost necesare mai multe deplasari la stanga;<br />
2.5.Renormalizarea: in cazul in care rotunjirea a condus la depasire, se efectueaza o<br />
deplasare spre dreapta.<br />
Inmultirea.<br />
In algoritmul pentru inmultirea in virgula mobila se considera prezente resursele hardware<br />
necesare pentru a forma produsul la doua numere in lungime dubla. In caz contrar se poate<br />
folosi algoritmul "aduna si deplaseaza la dreapta" in acumulator, pentru a forma produsul,<br />
incepand cu rangul inferior. In continuare partea mai putin semnificativa este pierduta pe masura<br />
ce este deplasata in afara bitului ST.<br />
1.Inmultirea: se formeaza produsul in lungime dubla;<br />
2.Normalizarea: pentru o eventuala normalizare a produsului se face o deplasare cu un bit;<br />
3.Pozitionarea bitilor G, R, ST: fie produsul normalizat in lungime dubla:<br />
F1 F2 F3 F4 F5 F6 F7 F8<br />
atunci G = F5, R = F6, ST = F7 ∪ F8.<br />
4.Rotunjirea: se realizeaza dupa cum s-a aratat mai sus;<br />
5.Renormalizarea: se realizeaza dupa cum s-a aratat mai sus;<br />
6.Erori: se verifica depasirea superioara/inferioara a expnentului.<br />
Impartirea.<br />
Se considera ca, in procesul efectuarii impartirii, restul este disponibil in orice moment.<br />
1.Impartirea: se formeaza primii sase biti ai catului normalizat:<br />
F1 F2 F3 F4 F5 F6<br />
2.Pozitionarea bitilor G, R, ST: se forteaza:<br />
G = F5, R = F6 si ST = rest;<br />
3.Rotunjirea: se efectueaza dupa regulile mentionate mai sus;<br />
4.Renormalizarea: se efectueaza dupa regulile mentionate mai sus.<br />
Prezenta bitului ST permite implementarea rotunjirii directionate, adica la dreapta sau la stanga<br />
pe un numar standard de biti.<br />
In algoritmii de mai sus s-a cautat obtinerea unei precizii maxime cu pretul reducerii vitezei,<br />
intr-o oarecare masura.
Erori in reprezentarea numerelor in virgula mobila.<br />
Precizia finita introduce erori, care pot sau nu pot sa fie acceptabile pentru aplicatia data. Spre<br />
exemplu, se considera reprezentarea unui milion, in virgula mobila, dupa care se scade 1, din<br />
aceasta. In cazul in care eroarea este mai mare decat 1, restul va fi tot de 1 milion.<br />
Pentru a caracteriza eroarea, gama si precizia, se vor face urmatoarele notatii:<br />
b – baza;<br />
f - numarul rangurilor semnificative ale mantisei/fractiei, in baza data;<br />
E - cel mai mare exponent;<br />
e - cel mai mic exponent.<br />
Numarul rangurilor semnificative din fractie este diferit de numarul de biti in cazul in care baza<br />
este diferita de 2. De exemplu, o baza egala cu 16 foloseste 4 biti pentru fiecare rang. Daca baza<br />
este de forma 2 k (o putere a lui 2), atunci sunt necesari k biti pentru fiecare rang exprimat in<br />
baza data. Utilizarea lui 1 ascuns mareste f cu 1 bit, chiar daca nu conduce la cresterea<br />
numarului de numere reprezentabile.<br />
In cadrul analizei reprezentarii in virgula mobila intereseaza urmatoarele aspecte:<br />
- numarul numerelor reprezentabile;<br />
- numarul care are valoarea/marimea cea mai mare;<br />
- numarul diferit de zero, care are valoare/marimea cea mai mica;<br />
- dimensiunea celei mai mari distante intre doua numere succesive;<br />
- dimensiunea celei mai mici distante intre doua numere succesive.<br />
Numarul numerelor reprezentabile se poate calcula luand in considerare numarul de valori pe<br />
care le pot lua campurile distincte ale reprezentarii in virgula mobila:<br />
- semnul poate lua doua valori;<br />
- numarul de exponenti este dat de expresia: ((M – m) + 1);<br />
- primul rang al fractiei: b-1;<br />
- celelalte ranguri ale fractiei: b f-1 ;<br />
- zero.<br />
Astfel, se obtine urmatoarea expresie:<br />
2 × ((M – m) + 1) × (b-1) × b f-1 + 1<br />
Trebuie aratat ca, in cazul exponentului, nu toate combinatiile de biti sunt valide. Spre exemplu,<br />
in standardul IEEE 754, desi sunt rezervati 8 biti pentru exponent, cel mai mic exponent este<br />
-126 si nu –128. Exponentii interzisi sunt folositi pentru reprezentari speciale: zero si infinit.
Se vor considera, in continuare, numarul care are valoarea/marimea cea mai mare si numarul<br />
diferit de zero, care are valoare/marimea cea mai mica;<br />
Numarul cu marimea cea mai mica are, de asemenea, cel mai mic exponent b m si cea mai mica<br />
fractie normalizata (diferita de zero), care va fi egala cu b -1 . Astfel, numarul cel mai mic va fi:<br />
b m-1 . In mod similar numarul cel mai mare va avea cel mai mare exponent b M si cea mai mare<br />
fractie (1 - b -f ), ceea ce conduce la valoarea b M . (1 - b -f ).<br />
Cea mai mica distanta si cea mai mare distanta intre doua numere consecutive sunt calculate<br />
intr-o maniera similara. Cea mai mica distanta apare atunci cand exponentul are cea mai mica<br />
valoare b m si cand se modifica cel mai putin bit semnificativ al fractiei, b -f . Aceasta conduce la o<br />
valoare minima a distantei egala cu b m-f . Cea mai mare distanta apare atunci cand exponentul are<br />
cea mai mare valoare b M si cand se modifica cel mai putin bit semnificativ al fractiei,b - f .<br />
Aceasta conduce la o valoare minima a distantei egala cu b M-f .<br />
Se va considera un exemplu, de reprezentare in virgula mobila, in care exista un bit de semn, un<br />
exponent pe 2 biti in exces 2, o fractie pe 3 biti normalizat, fara 1 ascuns. Reprezentarea lui zero<br />
este 000000. In figura de mai jos este data reprezentarea in acest format:<br />
Observatii:<br />
- au aparut distante mari intre zero si primele numere reprezentabile, deoarece<br />
reprezentarea normalizata nu permite structuri de biti in mantisa, care sa corespunda<br />
acestor distante;<br />
- cel mai mic exponent este –2 si cea mai mica fractie normalizata este (0,100)2, ceea ce<br />
face ca modulul celui mai mic numar reprezentabil, diferit de zero, sa fie 1/8.<br />
- cel mai mare exponent este 2 1 , iar cea mai mare fractie este (1 – 2 -3 ), ceea ce conduce<br />
la o valoare de 7/4 pentru cel mai mare numar reprezentabil;<br />
- cel mai mic exponent este –2, iar valoarea celui mai putin semnificativ bit al fractiei<br />
este 2 -3 , conducand la o valoare minima a distantei intre doua numere consecutive<br />
egala cu 2 -5 , adica 1/32;
- cel mai mare exponent este 1, iar valoarea celui mai putin semnificativ bit al fractiei<br />
este 2 -3 , conducand la o valoare maxima a distantei intre doua numere consecutive<br />
egala cu 2 -2 , adica 1/4;<br />
- datorita normalizarii numarul reprezentarilor valide este mai mic decat numarul<br />
reprezentarilor posibile;<br />
- numarul reprezentabile este dat de expresia:<br />
2 × ((M – m) + 1) × (b-1) × b f-1 + 1 = 2 × ((1 – (- 2) + 1) × (2-1) × 2 3-1 + 1= 33.<br />
- erorile relative sunt aproximativ aceleasi, comparand rapoartele intre distantele<br />
minime/maxime, intre doua numere consecutive, si valorile maxime ale celor mai<br />
mici/mari numere reprezentabile:<br />
( b m-f ) / (b × (1 - b -f ))= 1/( b f -1), pentru numerele mici<br />
distanta valoarea maxima pentru numarul cu exponent minim<br />
( b M-f ) / (b M × (1 - b -f ))= 1/( b f -1), pentru numerele mari<br />
distanta cel mai mare numar<br />
Observatie: Standardul IEEE 754 utilizeaza numere denormalizate pentru a umple distanta intre<br />
numerele plasate in apropierea zeroului.<br />
Exemplu. Sa se reprezinte in virgula fixa numarul (0,9375)10. Convertit in binar, in virgula fixa,<br />
acest numar va avea urmatoarea forma: (0,0011)2. Valoarea sa exprimata in virgula mobila va fi:<br />
1,1 × 2 -4 .<br />
Studiu de caz <strong>privind</strong> pierderea de precizie la conversia de la intregi la virgula mobila.<br />
In timpul razboiului din Golf, 1991-1992, s-au utilizat baterii de rachete Patriot, pentru<br />
urmarirea si distrugerea rachetelor irakiene Scud. Bateriile, prevazute cu radare si tehnica de<br />
calcul operau numai cateva ore, pentru a se evita detectarea lor. In 5 februarie, 1991, baracile<br />
armatei SUA, de la Dhahran au fost atacate cu rachete, inregistrandu-se 28 de morti, datorita<br />
unor erori in partea de prelucrare a datelor de la sistemele radar.<br />
Tintele sunt urmarite de radar, stabilindu-se, pe baza parametrilor calculati, pozitia viitoare a<br />
acesteia. Astfel, se genereaza o “poarta” in care se considera a fi plasata tinta, ceea ce va permite<br />
eliminarea altor zgomote, din afara “portii”.
Predictia urmatoarei pozitii a rachetei Scud se calcula pe baza vitezei acesteia. Viteza este<br />
determinata prin modificarea pozitiei in raport cu timpul. Timpul in sistemul Patriot este<br />
actualizat de catre ceasul intern la intervale de 100 ms. Viteza este reprezentata in virgula<br />
mobila pe 24 de biti, iar timpul ca un intreg pe 24 de biti. Pentru a calcula noua pozitie, timpul si<br />
viteza trebuie sa fie reprezentate in virgula mobila, pe 24 de biti. Conversia de la intreg la<br />
virgula mobila, pentru timp, s-a facut cu erori, care cresc proportional cu timpul de operare al<br />
sistemului. Astfel, poarta pentru noua pozitie a fost calculata eronat, eroarea depinzand de viteza<br />
rachetei si de durata de timp de cand sistemul era operational. In acea zi Patriot opera de peste<br />
100 de ore, eroarea stabilirii portii fiind de 687 metri, ceea ce a condus la pierderea tintei.<br />
Situatia fusese semnalata cu doua saptamani anterior de catre israelieni. Software-ul a fost<br />
modificat, a fost transmis pe campul de lupta, dar nu fusese instalat. O solutie simpla, pe<br />
moment, ar fi constat in “reboot-area” a sistemului, la intervale de cateva ore, pentru<br />
eliminarea erorilor acumulate la conversia timpului.
Coduri alfanumerice<br />
Spre deosebire de numerele reale, care au o gama infinita, numarul caracterelor alfanumerice<br />
este limitat, ceea ce permite ca un intreg set de caractere sa fie codificat cu un numar redus de<br />
biti pe caracter. In practica se utilizeaza doua sisteme de codificarea a caracterelor alfa<br />
numerice: ASCII ( American Standard Code for Information Interchange) si EBCDIC<br />
(Extended Binary Coded Decimal Interchange Code)<br />
Codul ASCII.<br />
Acest cod, utilizat pentru reprezentarea carcterelor alfanumerice, utilizeaza 7 biti pe caracter.<br />
Toate cele 2 7 coduri posibile reprezentand caractere valide. In tabela de mai jos se prezinta in<br />
hexazecimal codurile ASCII alfanumerice.<br />
Caracterele din pozitiile 00 – 1F si 7F, sunt caractere de control utilizate pentru transmisie,<br />
controlul afisaii/tiparirii, cat si pentru alte scopuri. Toate celelalte caractere sunt afisabile si<br />
incluzand: literele, cifrele, semnele de punctuatie si spatiul. Cifrele 0 – 9 apar in secventa ca si<br />
literele mici si mari, ceea ce simplifica manipularea caracterelor. Pentru a transforma<br />
reprezentarea alfanumerica a unei cifre zecimale in valoarea sa numerica este suficient sa se<br />
scada (30)16 din ea. Pentru a transforma codul unei majuscule in codul corespunzator al literei<br />
mici se va aduna la primul (20)16.
Codul EBCDIC.<br />
Codul ASCII permite reprezentarea a 128 de caractere, ceea ce reprezinta o limitare pentru cele<br />
mai multe tastaturi moderne. Aceste tastaturi contin, pe langa tastele alfanumerice si taste<br />
dedicate unor caractere speciale. Codul EBCDIC este un cod pe 8 biti utilizat de catre IBM. In<br />
tabelul de mai jos se prezinta, in codificare hexazecimala codurile EBCDIC.<br />
Adesea codul ASCII, pe 7 biti, este reprezentat pe un octet, avand 0 sau 1 in bitul cel mai<br />
semnificativ, care este folosit drept bit de paritate. Aceasta nu este de natura sa favorizeze codul<br />
ASCII in raport cu codul EBCDIC. In schimb, la transmisia seriala a datelor codurile pe 8 biti<br />
necesita mai mult timp, decat cele pe 7 biti.
Coduri detectoare de erori.<br />
Datele stocate, transmise si prelucrate in cadrul sistemelor numerice sunt reprezentate sub forma<br />
unor succesiuni de unitati si zerouri. Reprezentarea lor fizica se realizeaza prin niveluri ale unor<br />
tensiuni electrice, care pot fi afectate de diverse zgomote, avand cauze diferite. Zgomotele pot<br />
modifica unii biti din 0 in 1 si invers, ceea ce conduce la distorsionarea informatiei, la erori. Pe<br />
baza unui model statistic al erorilor este posibila crearea unei astfel de reprezentari a datelor<br />
incat sa fie posibile, atat detectarea, cat si corectarea erorilor.<br />
Daca se considera codul ASCII, in care sunt utilizate toate posibilitatile de codificare ale<br />
caracterelor, oricare modificare a unui bit intr-un cod al unui caracter dat va conduce la codul<br />
valid al altui caracter. Aceasta observatie sta la baza introducerii redundantei, sub forma unor<br />
biti suplimentari, ceea ce va permite detectarea si corectarea erorilor.<br />
Detectarea si corectarea erorilor.<br />
Distanta Hamming defineste distanta logica intre doua coduri de caractere valide si este<br />
masurata prin numarul de biti prin care difera acestea. Pentru codul ASCII aceasta distanta este<br />
egala cu 1. Adugand un singur bit redundant, la codul ASCII al fiecarui caracter alfanumeric, se<br />
poate detecta o singura eroare, intrucat codul eronat se va plasa intre doua coduri valide ASCII.<br />
O metoda de recodificare a codului ASCII, pentru a obtine o distanta Hamming egala cu 2,<br />
consta in introducerea unui bit de paritate, plasat la stanga codului normal ASCII. Acest bit va fi<br />
calculat pe baza sumei modulo 2 a bitilor egali cu 1 din codul ASCII. In cazul conventiei de<br />
paritate para, bitul de paritate va fi egal cu rezultatul sumei modulo 2, amintita mai sus, iar in<br />
cazul paritatii impare acesta va fi egal cu valoarea negata a acesteia.<br />
P 2 6 2 5 2 4 2 3 2 2 2 1 2 0 Caracterul<br />
1 1 1 0 0 1 0 0 d<br />
0 1 1 0 0 1 0 1 e<br />
0 1 1 0 0 1 1 0 f<br />
1 1 1 0 0 1 1 1 g<br />
0 1 0 0 0 1 0 0 D<br />
Bit de paritate Codul ASCII
In aceste conditii tabela codurilor ASCII, cu bit de paritate, va avea 256 de intrari/coduri, dintre<br />
care jumatate vor fi invalide. In cazul receptionarii unui caracter invalid se poate cere<br />
retransmisia, ceea ce in multe situatii nu este convenabil. O solutie ar fi aceea prin care se poate<br />
detecta si corecta aparitia unei reori. In acest scop trebuie sa se mareasca numarul bitilor<br />
redundanti din codul ASCII.<br />
Pentru detectarea si corectarea unei erori in cadrul fiecarei pozitii a unui cod ASCII, fiecarui<br />
cod valid ASCII trebuie sa i se asocieze alte 7 coduri invalide, in care se va modifica exact un<br />
singur bit. Acest lucru trebuie sa se intample cu fiecare cod valid ASCII, iar codurile invalide<br />
asociate fiecarui cod valid trebuie sa fie diferite. Spre exemplu codului ASCII valid pentru<br />
caracterul d i se vor asocia codurile invalide de mai jos:<br />
11001100 cod valid pentru d<br />
01001100<br />
10001100<br />
11101100<br />
11011100 coduri invalide pentru d<br />
11000100<br />
11001010<br />
11001101<br />
Problema se pune in legatura cu numarul necesar al bitilor redundanti. Pentru un cod de k biti,<br />
se considera ca numarul bitilor redundanti egal cu r. Pentru fiecare cele 2 k cuvinte initiale exista<br />
caractere de k biti, in care cate un bit este modificat, la care se adauga caracterele de r biti, cu<br />
cate un bit modificat plus caracterul nemodificat. Astfel, vor exista 2 k x (k + r + 1) coduri in<br />
total. Pentru a suporta toate aceste coduri trebuie sa fie suficiente combunatii de k + r biti.<br />
Relatia care trebuie indeplinita este data mai jos:<br />
2 k × (k + r + 1) ≤ 2 k+ r sau<br />
(k + r + 1) ≤ 2 r<br />
In cazul k = 7, daca se cauta intregul r care satisface relatia de mai sus, rezulta r = 4, ceea ce<br />
conduce la un cod ASCII, prevazut cu caractere redundante, de 7 + 4 = 11 biti.<br />
Asignarea celor 4 biti redundanti la cuvintele originale se va face astfel incat sa poata fi<br />
identificata o eroare la un singur bit. Fiecarui bit din cuvantul codificat, incluzand bitii de<br />
verificare/redundanti, ii este asignata o combinatie data de biti de verificare C8 C4 C2 C1.
Combinatiile sunt calculate, in figura de mai jos, ca reprezentari binare ale pozitiilor bitilor care<br />
sunt verificati, incepand cu pozitia 1. C1 este in pozitia de bit1, C2 in pozitia de bit 2, C4 in<br />
pozitia 4 samd. Plasarea lor in pozitii corespunzatoare puterilor lui 2 faciliteaza procesul de<br />
localizare a erorii. Acest mod particular de amplasare poarta numele de Cod de Corectare a unei<br />
Erori Singulare (CCES) sau SEC (Single Error Correcting)<br />
C8 C4 C2 C1 Bit verificat<br />
0 0 0 0 1<br />
0 0 0 1 2<br />
0 0 1 0 3<br />
0 0 1 1 4<br />
0 1 0 0 5<br />
0 1 0 1 6<br />
0 1 1 0 7<br />
0 1 1 1 8<br />
1 0 0 0 9<br />
1 0 0 1 10<br />
1 0 1 0 11<br />
Intrucat pozitiile unitatilor sunt unice in fiecare combinatie a bitilor de verificare, o eroare se<br />
poate localiza prin observarea bitilor redundanti eronati. Pentru exemplificare se considera codul<br />
ASCII al caracterului ‘a’<br />
Pozitia bitilor Bitii de verificare<br />
Valorile bitilor de verificare se stabilesc conform tabelului de mai sus. Bitul de verificare C1= 0<br />
realizeaza paritatea para pentru grupul de biti {1, 3, 5, 7, 9, 11}. Membrii acestui grup sunt luati<br />
din pozitiile, care au 1 in coloana lui C1, din tabela de mai sus. Bitul de verificare C2 = 0<br />
furnizeaza paritatea para pentru grupul de biti {2, 3, 6, 7, 10, 11}. In mod similar bitul de<br />
verificare C4 = 0 asigura paritatea para pentru grupul de biti {4, 5, 6, 7}. In final C8 = 0 stabileste<br />
paritatea para pentru grupul de biti {8, 9, 10, 11}. O posibilitate de cautare in tabela membrilor<br />
grupului de paritate, consta in aceea ca bitul n al cuvantului codificat este verificat prin bitii din
pozitiile 1,….,i a caror suma este egala cu n. De exemplu bitul 7 este verificat de bitii din<br />
pozitiile 1, 2, 4, deoarece 1+ 2 + 4 = 7.<br />
Se considera ca receptorul primeste sirul de biti 10010111001, in conditiile CCES pentru<br />
ASCII. Ce caracter a fost transmis?<br />
Se vor calcula paritatile pentru fiecare din bitii de verificare<br />
Bit eronat<br />
Paritate<br />
C1 verifica biti bitii{1, 3, 5, 7, 9, 11} para<br />
C2 verifica biti bitii{2, 3, 6, 7, 10, 11} impara<br />
C4 verifica biti bitii{4, 5, 6, 7} para<br />
C8 verifica biti bitii{8, 9, 10, 11} impara<br />
Pentru a localiza eroarea, se vor aduna pozitiile bitilor de verificare cu paritate impara:<br />
1 + 4 = 5. Astfel cuvantul care a fost transmis este: 10010101001. Daca se inlatura bitii de<br />
verificare, se va obtine codul ASCII al caracterului’D’.<br />
Schema de detectare si corectare a unei erori poate fi vizualizata pe un hipercub, in varfurile<br />
caruia sunt plasate codurile valide si invalide. Distanta Hamming separa codurile valide, in timp<br />
ce un cod invalid esteplasat la o distanta mai mica de un cod valid, ceea ce faciliteaza detectarea<br />
si corectarea erorii.<br />
In cazul aparitiei a doua erori, schema de mai sus permite detectarea lor, fara a oferi<br />
posibilitatea de a le corecta. In cazul a doua erori, care ar putea fi corectate, distanta minima<br />
Hamming trebuie sa fie egala cu 5.<br />
In general, pentru a detecta p erori distanta Hamming minima trebuie sa fie p + 1, iar o distanta<br />
Hamming de 2p + 1 permite corectarea a p erori<br />
Verificare prin redundanta verticala.<br />
Schema prezentata mai sus s-a referit la detectarea si corectarea unei erori singulare intr-un<br />
caracter individual. Aceasta mai poarta numele de verificarea redundanta<br />
orizontala/longitudinala (VRO).
O alternativa o reprezinta verificarea redundanta verticala/longitudinala (VRV) in cadrul<br />
careia, la sfarsitul unui grup de cuvinte transmise, se adauga o suma de control. In acest caz,<br />
paritatea este calculata pe coloane, suma de control fiind atasata, in final, la mesaj. La receptie,<br />
se calculaeaza din nou suma de contro, care se compara cu cea receptionata. Daca apare o eroare<br />
se solicita retransmiterea mesajului intrucat nu exista suficienta redundanta pentru identificarea<br />
pozitiei unei erori. Tehnicile VRO si VRV se pot utiliza pentru a imbunatati verificarea aparitiei<br />
unor erori.<br />
In unele cazuri erorile apar in rafala, modificand mai multi biti consecutivi, atat pe linii, cat si<br />
pe coloane, in cadrul unui mesaj. Pentu asemenea situatii se recomanda o schema mai puternica<br />
de verificare denumita Verificare Redundanta Ciclica (VRC sau CRC - Cyclic Redundancy<br />
Checking). VRC reprezinta o varianta a VRV.<br />
Problema. Sa se calculeze numarul necesar de biti de verificare pentru corectarea unei erori<br />
duble in codul ASCII.<br />
Solutie. In codul ASCII sunt folositi, pentru fiecare caracter, k = 7 biti, la care se vor mai<br />
adauga r biti redundanti de verificare. Pentru fiecare dintre cele 2 k caractere ASCII vor exista<br />
(k+ r) caractere eronate la nivelul unui bit si [(k+ r)( k+ r-1)]/2 caractere eronate la nivelul a doi<br />
biti, la care se mai adauga caracterul corect. Numarul caracterelor codificate cu (k+ r) biti este<br />
egal cu 2 (k+ r) . In aceste conditii trebuie sa se indeplineasca conditia de mai jos:<br />
2 k (k+ r)<br />
x { (k+ r) + [(k+ r)( k+ r-1)]/2 +1 }≤ 2<br />
Inlocuind k cu valoarea sa 7, rezulta ca valoarea cea mai mica pentru r, care satisface relatia de<br />
mai sus este r = 7.<br />
Intrucat, pentru corectarea a p erori trebuie pastrata o distanta Hamming egala cu 2p + 1, rezulta<br />
ca in acest caz, unde p = 2, distanta va fi egala cu 5. In cazul in care se mentine aceeasi distanta<br />
si pentru detectarea a erorilor, cunoscand ca distanta Hamming este egala cu numarul erorilor<br />
detectate p + 1, rezulta ca numarul erorilor detectate este egal cu 4.
Probleme.<br />
x
x) SEC inseamna Single Error Correcting
2.2.Inmultirea.<br />
Inmultirea numerelor consta in generarea si adunarea produselor partiale obtinute prin<br />
inmultirea rangului curent al inmultitorului cu deinmultitul. In cazul numerelor binare, produsul<br />
partial curent este egal cu deinmultitul, deplasat spre stanga conform pozitiei rangului<br />
inmultitorului, daca bitul curent al inmultitorului este unu, sau egal cu zero, daca bitul curent al<br />
inmultitorului este zero. Daca produsul partial curent este diferit de zero, el se aduna la suma<br />
produselor partiale anterioare.<br />
Exista si posibilitatea ca, dupa fiecare adunare, suma produselor partiale sa fie deplasata spre<br />
dreapta cu un rang.<br />
1.2.1 Inmultirea in cod direct.<br />
Inmultirea in cod direct/semn si modul presupune tratarea separata a semnelor si inmultirea<br />
modulelor.<br />
Fie numerele X si Y,<br />
X ≡ xn-1 xn-2… ………………. x1 x0,<br />
Y ≡ yn-1 yn-2… ………………. y1 y0,<br />
care urmeaza sa fie inmultite, pentru a furniza produsul Z:<br />
Z ≡ z2n-2 z2n-3… ……………z1 z0.<br />
Semnul produsului z2n-1 va fi obtinut astfel:<br />
z2n-2 = xn-1 ⊕ yn-1.<br />
Produsele partiale: P0,… ….,Pn-3, Pn-2 se obtin dupa cum urmeaza:<br />
P0 = |x| . y0. 2 0<br />
P1 = |x| . y1. 2 1<br />
… ……………….<br />
Pn-2 = |x| . yn-2. 2 n-2<br />
iar suma lor va conduce la produsul modulelor:<br />
z2n-3… ……………z1 z0<br />
Fie cazul a doua numere reprezentate in cod direct pe 5 biti:<br />
- deinmultitul x = 11000 si<br />
- inmultitorul y = 01000<br />
Pentru semn rezulta: z8 = 1 ⊕ 0 = 1,<br />
in timp ce modulul produsului se va obtine dupa cum se arata mai jos:
1000<br />
× 1001<br />
1000<br />
0000<br />
0000<br />
1000<br />
01001000<br />
z7… ……z1 z0 = 01001000.<br />
Astfel, produsul celor doua numere va avea 9 biti:<br />
z8 z7… ……z1 z0 = 101001000.<br />
In exemplul de mai sus produsele partiale s-au obtinut prin deplasarea spre stanga a<br />
deinmultitului, inmultit cu rangul corespunzator al inmultitorului.<br />
Solutie paralela.<br />
O implementare combinationala presupune utilizarea sumatoarelor complete si a unor porti<br />
AND. Astfel, se obtine un sumator modificat, pentru un rang, conform schemei de mai jos:<br />
SPi,j-1<br />
Yj<br />
Xi<br />
1<br />
2<br />
a) Sumator modificat b) Schema bloc a sumatorului modificat<br />
x3 0 x2 0 x1 0 x0 0 y0<br />
sumator<br />
modificat<br />
sumator<br />
modificat<br />
sumator<br />
modificat<br />
x3 x2 SP0,3 x1 SP0,2 x0 SP0,1 SP0,0 y1<br />
sumator<br />
modificat<br />
3<br />
1<br />
2<br />
3<br />
CI<br />
A0<br />
B0<br />
sumator<br />
modificat<br />
Cj Cj<br />
Z0<br />
CO<br />
4 SPi,j Sumator SPi,j<br />
Yj modificat<br />
5<br />
Xi<br />
sumator<br />
modificat<br />
SPi,j-1<br />
Ci+1 Ci+1<br />
sumator<br />
modificat<br />
SP1,4 SP1,3 SP1,2 SP1,1 SP1,0<br />
z4 z3 z2 z1 z0<br />
0<br />
sumator<br />
modificat<br />
0
S-a notat cu SPi,j bitul i al sumei produselor partiale j. Schema prezinta numai primele doua<br />
etaje ale dispozitivului paralel de inmultire.<br />
Sumatorul modificat poate fi utilizat in cadrul unei structuri de inmultire paralela, ca in figura de<br />
mai sus. Din punctul de vedere al implementarii algoritmului, se poate afirma ca, in acest caz,<br />
este vorba de o “programare spatiala”, care conduce la viteza ridicata de operare. Solutia<br />
necesita, pentru implementare, (n-1) 2 sumatoare modificate. In cel mai defavorabil caz,<br />
rezultatul inmultirii se obtine dupa propagarea semnalelor prin 4.(n – 1) porti.<br />
Se lasa pe seama cititorului elaborarea unei solutii bazate pe “sumatoare cu salvare a<br />
transportului” si sumatoare cu transport anticipat.<br />
Solutie seria l- paralela.<br />
In scopul reducerii cantitatii de hardware, dispozitivele de inmultire se realizeaza sub forma<br />
unei structuri paralele hardware, pentru un pas de inmultire, cu operare secventiala.<br />
Daca se noteaza produsul partial j cu ppj, atunci un pas de inmultire va avea urmatoarea forma:<br />
ppj = ppj-1 + x . yj. 2 j<br />
O schema bloc, pentru solutia mentionata mai sus, este prezentata in continuare:<br />
0<br />
x3 x2 x1 x0<br />
… ………<br />
… ………<br />
Operarea se efectueaza conform urmatoarei secvente:<br />
yj<br />
registru de deplasare dreapta cu 2.(n-1) ranguri<br />
in care se acumuleaza sumele produselor partiale.<br />
1. anuleaza continutul registrului in care se acumuleaza sumele produselor partiale;<br />
2. initializeaza numarul rangului bitului inmultitorului j = 0;<br />
3. formeaza produsul partial x . yj.<br />
Generator de produse partiale<br />
Sumator pe n biti<br />
… ……. … ……………<br />
4. aduna produsul partial la jumatatea superioara a registrului sumei produselor partiale;
5. efectueaza j = j + 1 si daca j = n treci la 8.<br />
6. deplaseaza la dreapta cu un rang continutul registrului sumei produselor partiale;<br />
7. treci la pasul 3;<br />
8. produsul cu 2.(n –1) ranguri s-a obtinut in registrul de deplasare.<br />
Rezultatul se poate stoca fie sub forma unui singur cuvant, pastrand jumatatea superioara, fie<br />
sub forma unui cuvant dublu. In primul caz va fi afectata precizia.<br />
Inmultirea numerelor in cod complementar.<br />
Intrucat, in marea majoritate a cazurilor, numerele negative se reprezinta in calculatoare in codul<br />
complementar, in continuare, vor fi examinate cateva metode de inmultire in acest cod.<br />
Mai intai se vor examina deplasarile aritmetice la stanga si la dreapta in cod complementar.<br />
Se considera urmatoarele cazuri:<br />
1. x > 0.<br />
[x]c = 0 xn-2… ………………. x1 x0,<br />
Deplasarea la stanga:<br />
[2.x]c = xn-2… ………………. x1 x00,<br />
Deplasarea la dreapta:<br />
[2 -1 .x]c = 00xn-2… ………………. x1,<br />
2. x < 0.<br />
~ ~ ~<br />
[x]c = 1xn-2… ………………. x1 x0,<br />
Deplasarea la stanga:<br />
~ ~<br />
[2.x]c = xn-2… ………………. x1 0,<br />
Deplasarea la dreapta:<br />
~ ~<br />
[2 -1 .x]c = 11xn-2… ………………. x1.<br />
Cateva metode pentru inmultirea numerelor reprezentate in cod complementar.<br />
Metoda 1.<br />
- Se modifica , daca este cazul, inmultitorul si deinmultitul astfel incat inmultitorul sa fie<br />
pozitiv.<br />
- Produsele partiale se calculeaza in mod obisnuit.
- Deplasarea spre stanga/ dreapta a deinmultitului/sumei produselor partiale se realizeaza<br />
conform regulilor de deplasare in cod complementar.<br />
Metoda 2.<br />
Aceasta metoda presupune inmultirea numerelor cu semn in maniera obisnuita, ca si cand ar fi<br />
vorba de numere intregi fara semn. Rezultatul va fi corect numai in cazul in care cei doi<br />
operanzi sunt pozitivi. In caz contrar sunt necesare corectii, care se incadreaza in trei cazuri.<br />
1. x > 0, y > 0.<br />
[x]c . [y]c = |x| . |y| = [x . y]c<br />
2. x < 0, y > 0; [x]c = 2 n - |x|; [y]c = |y|;<br />
[x]c . [y]c = 2 n .|y| - |x| . |y|; rezultat incorect<br />
[x]c . [y]c = 2 2n - |x| . |y|; rezultat corect<br />
Rezulta necesitatea unei corectii egala cu: 2 2n - 2 n .|y|, care se va aduna la rezultatul incorect.<br />
3. x > 0, y < 0; [x]c = |x|; [y]c = 2 n - |y|;<br />
[x]c . [y]c = 2 n .|x| - |x| . |y|; rezultat incorect<br />
[x]c . [y]c = 2 2n - |x| . |y|; rezultat corect<br />
Rezulta necesitatea unei corectii egala cu: 2 2n - 2 n .|x|, care se va aduna la rezultatul incorect.<br />
4. x < 0, y < 0; [x]c = 2 n - |x|; [y]c = 2 n - |y|;<br />
[x]c . [y]c = 2 2n - 2 n .|y| - 2 n .|x| + |x| . |y|; rezultat incorect<br />
[x]c . [y]c = |x| . |y|; rezultat corect<br />
Rezulta necesitatea unei corectii egala cu: -2 2n + 2 n .|y| + 2 n .|x|, care se va aduna la rezultatul<br />
incorect.<br />
Metoda este greoaie si are un caracter pur teoretic.<br />
Metoda 3. Algoritmul lui Booth.<br />
In acest caz se pleaca de la observatia ca, valoarea unui numar Y, reprezentat in cod<br />
complementar, se poate calcula astfel:<br />
Y = - yn-1 . 2 n-1 + yn-2 . 2 n-2 + yn-3 . 2 n-3 +… ……+ y1 . 2 1 + y0. 2 0 =<br />
unde:<br />
n-1<br />
= S (yi-1 - yi) .2 i<br />
i=0<br />
- yn-1 reprezinta rangul de semn, codificat cu 0/1 in cazul numerelor pozitive/negative;<br />
- y-1 constituie rangul aflat la dreapta rangului 0, avand initial valoarea 0.<br />
In aceste conditii valoarea produsului X.Y se va exprima dupa cum urmeaza:
n-1<br />
X.Y = S x. (yi-1 - yi) .2 i<br />
i=0<br />
Pe baza formulei de mai sus se poate calcula produsul partial de rang i :<br />
yi-1 yi produsul partial.<br />
0 0 0<br />
0 1 - x .2 i<br />
1 0 x .2 i<br />
1 1 0<br />
Pentru implementarea hardware se considera resursele corespunzatoare unei structuri orientate<br />
pe un singur acumulator:<br />
Deinmultit (X) Inmultitor (Y)<br />
RD RD<br />
Resursele hardware:<br />
n-1 .. RD.. 0 n-1 .. AC.. 0 n-1 .. MQ.. 0 MQq<br />
0 1 0/1<br />
MUX 0/1<br />
- AC – registrul acumulator;<br />
- RD – registrul de date al memoriei;<br />
activare<br />
selectare<br />
- MQ – registru de extensie al acumulatorului;<br />
- MQq – registru de un bit, extensia lui MQ;<br />
- CNT – contor de cicluri ( ρCNT = ⎡log2n⎤ );<br />
Sumator 0/1 CNT<br />
SL
- SL – structura logica pentru activarea si selectarea intrarilor multiplexorului, cat si pentru<br />
controlul transportului la sumator;<br />
- Sumator- sumator combinational cu n ranguri binare.<br />
Descrierea operarii dispozitivului se poate face cu ajutorul urmatoarei organigrame:<br />
MQ ← AC; AC ← n T 0<br />
0,1 MQ0,MQq 0,0; 1,1<br />
AC←ADD(AC,RD)<br />
Start<br />
RD ← Deinmultit<br />
AC ← Inmultitor<br />
CNT ← ⎡log2n⎤ T n<br />
MQ ← n T 0<br />
MQq ← 0<br />
AC←SUB(AC,RD)<br />
CNT←DEC(CNT)<br />
CNT = 0 ?<br />
NU<br />
AC,MQ,MQq← AC0, AC,MQ<br />
DA<br />
Z = AC,MQ(n-1:1)<br />
Stop
Programul AHPL:<br />
MODULE: Dispozitiv_de_inmultire<br />
MEMORY: RD[n]; AC[n]; MQ[n]; MQq; CNT[⎡log2n⎤]<br />
INPUTS: X[n]; Y[n]<br />
OUTPUTS: Z[2n-1]<br />
// se considera operanzii X si Y adusi in RD si AC<br />
1. MQ ← AC; MQq ← 0; CNT ← ⎡log2n⎤ T n<br />
2. AC ← n T 0<br />
3. → (MQ0 MQq , MQ0 MQq , MQ0 MQq , MQ0 MQq)/(6, 4, 5, 6)<br />
4. AC←ADD(AC,RD)<br />
→ (6)<br />
5 AC←SUB(AC,RD)<br />
6 CNT←DEC(CNT)<br />
7 → ( ∪/CNT, ∪/CNT )/(9,8)<br />
8 AC,MQ,MQq← AC0, AC,MQ<br />
→ (3)<br />
9 ENDSEQ<br />
Z = AC,MQ(n-1:1)<br />
END<br />
In continuare se va prezenta un program Verilog pentru simularea unui dispozitiv de inmultire.<br />
//Simularea unui dispozitiv de inmultire a numerelor reprezentate in complementul fata de doi,<br />
//folosind Algoritmul lui Booth<br />
module inmultitorb;<br />
parameter n=8;<br />
reg [n-1:0] RD,AC,MQ;<br />
reg [2*n-1:0] Z;<br />
reg [2:0] CNT;<br />
reg MQq;<br />
initial begin: init<br />
AC=-7;RD=-5;MQ=0;MQq=0;CNT=n-1;<br />
$display("timp RD AC MQ MQq CNT");
$monitor("%0d %b %b %b %b %b",$time,RD,AC,MQ,MQq,CNT);<br />
wait (CNT==0)<br />
end<br />
begin<br />
$monitor("Produs= %b",{AC[n-1],AC,MQ[n-1:1]});<br />
#1 $stop;<br />
end<br />
always<br />
begin<br />
#1; MQ=AC;<br />
#1; AC=0;<br />
while(CNT>0)<br />
begin<br />
case({MQ[0],MQq})<br />
2'b00:begin<br />
#1;{AC,MQ,MQq}={AC[n-1],AC,MQ};<br />
end<br />
2'b01:<br />
begin<br />
#1;AC=AC+RD;<br />
#1;{AC,MQ,MQq}={AC[n-1],AC,MQ};<br />
end<br />
2'b10:<br />
begin<br />
#1;AC=AC-RD;<br />
#1;{AC,MQ,MQq}={AC[n-1],AC,MQ};<br />
end<br />
2'b11:<br />
begin<br />
#1;{AC,MQ,MQq}={AC[n-1],AC,MQ};<br />
end<br />
endcase
#1;CNT=CNT-1;<br />
end<br />
end<br />
endmodule<br />
Veriwell -k C:\Program Files\VeriWell\exe\VeriWell.key -l C:\Program<br />
Files\VeriWell\exe\VeriWell.log inmultitorb.V<br />
VeriWell for Win32 HDL Tue Dec 19 16:26:21 2000<br />
This is a free version of the VeriWell for Win32 Simulator<br />
Distribute this freely; call 1-800-VERIWELL for ordering information<br />
See the file "!readme.1st" for more information.<br />
Copyright (c) 1993-96 Wellspring Solutions, Inc.<br />
All rights reserved<br />
Memory Available: 0<br />
Entering Phase I...<br />
Compiling source file : inmultitorb.V<br />
The size of this model is [3%, 2%] of the capacity of the free version<br />
Entering Phase II...<br />
Entering Phase III...<br />
No errors in compilation<br />
Top-level modules:<br />
inmultitorb<br />
//Cazul: RD = 5; AC = 7;<br />
timp RD AC MQ MQq CNT<br />
0 000101 00000111 00000000 0 111<br />
1 00000101 00000111 00000111 0 111<br />
2 00000101 00000000 00000111 0 111<br />
3 00000101 11111011 00000111 0 111<br />
4 00000101 11111101 10000011 1 111<br />
5 00000101 11111101 10000011 1 110<br />
6 00000101 11111110 11000001 1 110<br />
7 00000101 11111110 11000001 1 101<br />
8 00000101 11111111 01100000 1 101<br />
9 00000101 11111111 01100000 1 100<br />
10 00000101 00000100 01100000 1 100<br />
11 00000101 00000010 00110000 0 100<br />
12 00000101 00000010 00110000 0 011<br />
13 00000101 00000001 00011000 0 011<br />
14 00000101 00000001 00011000 0 010<br />
15 00000101 00000000 10001100 0 010
16 00000101 00000000 10001100 0 001<br />
17 00000101 00000000 01000110 0 001<br />
Produs= 0000000000100011<br />
Stop at simulation time 19<br />
C1> $finish;<br />
Top-level modules:<br />
inmultitorb<br />
// Cazul: RD = 5; AC = -7;<br />
timp RD AC MQ MQq CNT<br />
0 00000101 11111001 00000000 0 111<br />
1 00000101 11111001 11111001 0 111<br />
2 00000101 00000000 11111001 0 111<br />
3 00000101 11111011 11111001 0 111<br />
4 00000101 11111101 11111100 1 111<br />
5 00000101 11111101 11111100 1 110<br />
6 00000101 00000010 11111100 1 110<br />
7 00000101 00000001 01111110 0 110<br />
8 00000101 00000001 01111110 0 101<br />
9 00000101 00000000 10111111 0 101<br />
10 00000101 00000000 10111111 0 100<br />
11 00000101 11111011 10111111 0 100<br />
12 00000101 11111101 11011111 1 100<br />
13 00000101 11111101 11011111 1 011<br />
14 00000101 11111110 11101111 1 011<br />
15 00000101 11111110 11101111 1 010<br />
16 00000101 11111111 01110111 1 010<br />
17 00000101 11111111 01110111 1 001<br />
18 00000101 11111111 10111011 1 001<br />
Produs= 1111111111011101<br />
Stop at simulation time 20<br />
C1> $finish;<br />
// Cazul: RD = -5; AC = -7;<br />
timp RD AC MQ MQq CNT<br />
0 11111011 11111001 00000000 0 111<br />
1 11111011 11111001 11111001 0 111<br />
2 11111011 00000000 11111001 0 111<br />
3 11111011 00000101 11111001 0 111<br />
4 11111011 00000010 11111100 1 111<br />
5 11111011 00000010 11111100 1 110<br />
6 11111011 11111101 11111100 1 110<br />
7 11111011 11111110 11111110 0 110<br />
8 11111011 11111110 11111110 0 101<br />
9 11111011 11111111 01111111 0 101
10 11111011 11111111 01111111 0 100<br />
11 11111011 00000100 01111111 0 100<br />
12 11111011 00000010 00111111 1 100<br />
13 11111011 00000010 00111111 1 011<br />
14 11111011 00000001 00011111 1 011<br />
15 11111011 00000001 00011111 1 010<br />
16 11111011 00000000 10001111 1 010<br />
17 11111011 00000000 10001111 1 001<br />
18 11111011 00000000 01000111 1 001<br />
Produs= 0000000000100011<br />
Stop at simulation time 20<br />
C1><br />
2.3.Impartirea.<br />
Ca regula generala, impartirea numerelor se realizeaza prin scaderea repetata a impartitorului,<br />
deplasat spre dreapta cu un rang, din restul de la scaderea precedenta, pana la obtinerea unui rest<br />
egal cu zero sau mai mic decat impartitorul; ca prim rest se considera deimpartitul.<br />
In general se practica doua metode:<br />
- metoda bazata pe refacerea ultimului rest pozitiv (metoda cu restaurare) si<br />
- metoda in care nu se reface ultimul rest pozitiv (metoda fara restaurare).<br />
Pentru prima metoda se prezinta exemplul urmator, in care deimpartitul este 22, iar impartitorul<br />
este 9:<br />
22 : 9 = q0, q-1q-2<br />
22 40 40<br />
- 9 - 9 - 9<br />
13 31 31<br />
- 9 - 9 - 9<br />
4 22 22<br />
- 9 - 9 - 9<br />
- 5 13 13<br />
q0 = 2 - 9 - 9<br />
22 : 9 = 2,44…<br />
4 4<br />
- 9 - 9<br />
- 5 - 5<br />
q-1 = 4 q-2 = 4
Cea de-a doua metoda pleaca de la ideea ca, in loc de a scadea impartitorul deplasat la dreapta<br />
cu un rang, din ultimul rest pozitiv, se va aduna impartitorul deplasat la dreapt, la la ultimul rest<br />
negativ. Metoda se va ilustra prin exemplul de mai jos:<br />
22 : 9 = q0, q-1q-2<br />
22 -50 40<br />
- 9 + 9 - 9<br />
13 - 41 31<br />
- 9 + 9 - 9<br />
4 - 32 22<br />
- 9 + 9 - 9<br />
- 5 - 23 13<br />
q0 = 3 + 9 - 9<br />
- 14 4<br />
+ 9 - 9<br />
- 5 - 5<br />
+ 9<br />
4<br />
q-1 = 6 q-2 =<br />
Catul va avea forma: 3, 6 5 6 5 6… … , in care termenii cu bara sunt negativi [3, (-6)5(-6)5(-6)],<br />
ceea ce va impune efectuarea unei corectii care va aduce rezultatul la forma:<br />
22 : 9 = 2,44444…<br />
Multima metoda necesita un numar mai mare de pasi, astfel incat, in continuare se va examina<br />
implementarea metodei bazata pe restaurarea ultimului rest pozitiv.<br />
Algoritmul impartirii numerelor reprezentate in complementul fata de doi, cu restaurarea<br />
ultimului rest pozitiv.<br />
Pentru ilustrarea algoritmului se vor considera urmatoarele resurse hardware:<br />
- AC – acumulator;<br />
- RD – registrul de date al memoriei;<br />
- MQ – registrul de extensie a acumulatorului;
- CNT – registru incrementator, contor de cicluri.<br />
Impartitorul Y va fi incarcat in RD, iar deimpartitul X in AC. In MQ se va acumula catul.<br />
n-1| RD |0 n-1| AC |0 n-1| MQ |0 CNT<br />
Descrierea algoritmului:<br />
1. Se deplaseaza continutul lui RD cu p ranguri spre stanga, in conditiile in care 2 p este prima<br />
incercare de multiplu binar al impartitorului.<br />
Se verifica daca RD = 0, in caz afirmativ operatia se termina cu semnalizarea unei erori.<br />
Daca RD ≠ 0, se incarca CNT cu vectorul binar avand valoarea p .<br />
2. Daca deimpartitul si impartitorul au semne identice/diferite se scade/se aduna impartitorul<br />
din/la deimpartit, pentru a obtine restul.<br />
3. a) Daca restul si deimpartitul au semne identice sau restul este egal cu zero, se introduce o<br />
unitate in bitul cel mai putin semnificativ a lui MQ, iar restul va lua locul deimpartitului.<br />
b) Daca restul si deimpartitul au semne diferite si restul curent nu este zero, se introduce un<br />
zero in bitul cel mai putin semnificativ al lui MQ, fara a mai modifica deimpartitul.<br />
4. Se deplaseaza continutul registrului imparitorului cu un rang spre dreapta, extinzand rangul<br />
de semn.<br />
Se decrementeaza CNT.<br />
Se deplaseaza MQ spre stanga cu un bit.<br />
5. Se repeta pasii 2- 4 pana cand continutul lui CNT devine egal cu zero.<br />
6. Daca deimpartitul si impartitorul au avut semne identice rezultatul se afal in registrul MQ. In<br />
cazul in care semnele celor doi operanzi au fost diferite, rezultatul se obtine prin<br />
complementarea continutului registrului MQ.<br />
Realizarea practica a algoritmului impune introducerea unor resurse hardware suplimentare,<br />
fata de AC, RD, MQ, CNT si anume:<br />
- R[n] – registrul in care se obtine restul curent;<br />
- z[1] – bistabil in care se stocheaza informatia (1/0) referitoare la semnele identice/diferite<br />
ale celor doi operanzi;<br />
- e[1] – bistabil care semnalizeaza conditia de eroare/non-eroare (1/0);<br />
- S – unitate logica combinationala, care genereaza semnalul de sfarsit al operatiilor de<br />
deplasare spre stanga in registrul RD;
S = RDn-1 .RDn-2 . RDn-3 ∪ RDn-1 .RDn-2<br />
- F- unitate logica combinationala, care calculeaza identitatea/neidentitatea semnelor<br />
operanzilor;<br />
F = ACn-1 ⊕ RDn-1<br />
- V – unitate logica combinationala, care verifica semnele operanzilor din acumulator<br />
(deimpartit) si din registrul restului curent R;<br />
V = ACn-1 ⊕ Rn-1<br />
- U – unitate logica combinationala, care verifica existenta unui rest curent egal cu zero;<br />
U = ∪ ⁄ R.<br />
Structura generala, la nivel de schema bloc, a dispozitivului de impartire:<br />
n-1| AC |0 n-1| n-2| n-3| RD |0<br />
z<br />
n-1| ADD |0<br />
n-1| R |0 CNT<br />
V U<br />
n-1| MQ |0<br />
F<br />
e<br />
Deplasare stanga<br />
RD RD<br />
MUX<br />
S<br />
S
Programul AHPL pentru dispozitivul de impartire.<br />
MODULE: Dispozitiv_de_impartire<br />
MEMORY: RD[n]; AC[n]; MQ[n]; R[n]; CNT[ ⎡log2n⎤ ]; z[1]; e[1]<br />
INPUTS: X[n]; Y[n]<br />
OUTPUTS: Z[n]<br />
// se considera operanzii X si Y adusi in AC si RD.<br />
1. MQ ← n T 0; CNT ← ⎡log2n⎤ T 0; Z ← 0; e ← 0<br />
→ ( ∪/RD)/(12) // eroare<br />
2. → (S)/(4)<br />
3. RD ← RDn-2:0, 0; CNT←INC(CNT)<br />
→ (2)<br />
4. z ← F<br />
5. R ← (ADD(AC,RD) ! SUB(AC,RD)) * ( F, F )<br />
6. → ( V ∪ U )/(8)<br />
7. MQ ← MQn-2:0, 0<br />
→ (9)<br />
8. MQ ← MQn-2:0, 1<br />
9. → ( ∪/CNT)/(11)<br />
10. RD ← RDn-1,RDn-1:1 ; CNT←DCR(CNT)<br />
→ (5)<br />
11. MQ← (MQ ! ADD(MQ,1)) * ( z, z )<br />
12. e ← ( 0 ! 1) * (∪/RD, ∪/RD)<br />
ENDSEQ<br />
END<br />
Z = MQ
3. Operatii aritmetice in virgula mobila.<br />
Operatiile aritmetice in virgula mobila vor fi examinate la nivelurile schemei bloc, pentru<br />
unitatea aritmetica, si organigramelor pentru adunare/scadere si inmultire. In analiza care<br />
urmeaza se considera operanzii de intrare X ,Y si rezultatul Z, care vor avea urmatoarele<br />
formate:<br />
X ← xs, XE, XF ; Y ← ys, YE, YF; Z ← zs, ZE, ZF<br />
3.1. Schema bloc a unitatii aritmetice in virgula mobila.<br />
Schema bloc a unitatii aritmetice in virgula mobila, in cazul de fata, se bazeaza pe structura<br />
schemei unitatii aritmetice in virgula fixa, la care s-au mai adaugat o serie de resurse, pentru<br />
manipularea exponentilor (registre si unitate aritmetica).<br />
Prelucrari mantise/fractii<br />
RE2 RE1<br />
…<br />
Conditii<br />
… ..<br />
Conditii<br />
UALE<br />
Partea care prelucreaza exponentii contine urmatoarele resurse:<br />
ees Prelucrare<br />
RD AC MQ<br />
es<br />
DEP. LOGICA DEP. LOGICA<br />
UAL<br />
exponenti
- E1 si RE2 - registre pentru exponenti;<br />
- ees- bistabil de extensie a registrului exponentului la stanga;<br />
- UALE- Unitate Aritmetica Logica pentru Exponenti.<br />
In partea care prelucreaza mantisele/fractiile, fata de resursele hardware pentru prelucrarea in<br />
virgula fixa au mai aparut doua circuite de deplasare logica si un bistabil de extensie a<br />
acumulatorului la stanga es.<br />
Cele doua unitati aritmetice logice sunt prevazute cu circuite logice pentru generarea<br />
indicatorilor de conditii si de eroare.<br />
Operanzii de prelucrat se afla initial in registrele AC si RD. Din acestea se extrag exponentii<br />
(operatia de despachetare), care sunt incarcati in RE1 si RE2. Fractiile sunt deplasate spre stanga<br />
in AC si RD, pentru a beneficia de o precizie maxima.<br />
Dupa terminarea operatiilor asupra exponentilor si fractiilor, are loc o insertie (operatia de<br />
impachetare) a exponentului rezultatului in registrul AC, prin deplasarea fractiei din AC spre<br />
dreapta.
3.2 Organigrama adunarii/scaderii in virgula mobila.<br />
> <<br />
=<br />
Da Da<br />
Dif exp> dim F<br />
Dif exp> dim F<br />
Nu Nu<br />
Iesire Iesire<br />
Iesire<br />
Z←X<br />
Da Da<br />
Exponent<br />
maxim?<br />
Pozitioneaza<br />
eof<br />
Deplaseaza YE<br />
Pozitioneaza semn, deplaseaza<br />
fractia, incrementeaza<br />
exponent<br />
Da<br />
Pozitioneaza<br />
zero curat<br />
⊥ZE←⊥XE-⊥YE<br />
Nu<br />
Da<br />
⊥ZE: 0<br />
Nu<br />
Nu<br />
Exponent<br />
minim?<br />
Da<br />
ZE←⊥XE-⊥YE<br />
Deplaseaza XE<br />
ZE←XE ZE←YE<br />
Aduna<br />
fractiile<br />
Depasire<br />
superioara?<br />
Suma zero?<br />
Normalizat?<br />
Iesire Iesire<br />
Nu<br />
Z←Y<br />
Deplaseaza fractia,<br />
decrementeaza exponent<br />
Pozitioneaza<br />
euf
3.3. Organigrama inmultirii in virgula mobila.<br />
Pozitioneaza<br />
zero curat<br />
Da<br />
Da<br />
Nu iesire cu<br />
Da<br />
Nu<br />
Iesire<br />
Operand<br />
zero?<br />
Aduna exponentii<br />
Exp eof?<br />
Exp euf?<br />
Restaureaza exponentul<br />
deplasat<br />
Valoarea absoluta<br />
a fractieilor<br />
Inmulteste fractiile<br />
Pozitioneaza<br />
semnul produsului<br />
Da eroare<br />
Da<br />
Pozitioneaza eof<br />
Pozitioneaza euf<br />
Prod
Intarzierile in circuitele numerice.<br />
• Tehnologia CMOS - tehnologia de baza.<br />
• CMOS: Semiconductor Metal Oxid Complementar.<br />
- Tranzistor NMOS (Semiconductor Metal Oxid de tip N)<br />
- Tranzistor PMOS (Semiconductor Metal Oxid de tip P)<br />
• Tranzistorul NMOS<br />
- Tranzistorul conduce daca la poarta lui se aplica<br />
un potential electric ridicat (Vdd)<br />
- Tranzistorul este blocat daca la poarta lui se aplica<br />
un potential electric coborat (GND)<br />
• Tranzistorul PMOS<br />
- Tranzistorul este blocat daca la poarta lui se aplica<br />
un potential electric ridicat (Vdd)<br />
- Tranzistorul conduce daca la poarta lui se aplica<br />
un potential electric coborat (GND)<br />
• Componentele de baza: Inversorul CMOS
• Componentele de baza: Portile logice<br />
• Porti logice: comparatie.<br />
a) Daca tranzistoarele PMOS sunt rapide:<br />
- Se recomanda conectarea lor in serie<br />
- Se prefera poarta NOR<br />
- Se prefera, de asemenea, NOR daca tranzitia H→L este mai critica<br />
decat tranzitia L→H.<br />
b) Daca tranzistoarele NMOS sunt rapide:<br />
- Se recomanda conectarea lor in serie<br />
- Se prefera poarta NAND<br />
- Se prefera, de asemenea, NAND daca tranzitia L→H este mai critica<br />
decat tranzitia H→L.<br />
• Comportarile ideala si reala.<br />
a) Cand intrarea 0 → 1, iesirea 1 → 0, dar NU instantaneu.<br />
- Iesirea efectueaza tranzitia 1 → 0 : tensiunea de iesire tranziteaza de<br />
la Vdd (5V) la 0V.<br />
b) Cand intrarea 1 → 0, iesirea 0 → 1 dar NU instantaneu.<br />
- Iesirea efectueaza tranzitia 0 → 1 : tensiunea de iesire tranziteaza de<br />
la 0V la Vdd (5V).<br />
c) Tensiunea nu se modifica instantaneu.
• Analogia temporala cu fluidul.<br />
- Apa ↔ Sarcina Electrica; Capacitatea Rezervorului ↔ Capacitatea (C).<br />
- Nivelul Apei ↔Tensiunea; Debitul Apei ↔ Curentul (Sarcina/Timp).<br />
- Dimensiunea Conductelor; Conductanta Tranzistoarelor (G).<br />
- Timpul de umplere a rezervorului este proportional cu C/G.<br />
• Conectarea in serie a portilor.<br />
- Intarzierea Totala de propagare =<br />
Suma Intarzierilor Individuale = d1 + d2<br />
- Capacitatea C1 are doua componente:<br />
� Capacitatea firelor care leaga cele doua porti<br />
� Capacitatea de intrare a celui de-al doilea inversor.
• Calculul intarzierilor.<br />
- Suma intarzierior pe caile seriale<br />
- Intarzierea (Vin → V2) ≠ Intarzierea (Vin → V3)<br />
� Intarzierea (Vin → V2) = Intarzierea (Vin → V1) + Intarzierea (V1 → V2)<br />
� Intarzierea (Vin → V3) = Intarzierea (Vin → V1) + Intarzierea (V1 → V3)<br />
- Drumul Critic = Calea cea mai lunga dintre cele N cai paralele<br />
- C1 = Capacitatea C a firelor + Cin a portii G2 + Cin a portii G3<br />
• Modelul general al intarzierii in circuitele combinationale.<br />
- O Celula Logica Combinationala (simbol) este complet specificata prin:<br />
� Comportarea functionala (intrare →iesire):<br />
Tabele de adevar, ecuatii logice, VHDL, Verilog etc.<br />
� Factorul de incarcare pentru fiecare intrare.<br />
� Intarziere critica in propagarea de la fiecare intrare la fiecare iesire, pentru<br />
fiecare tranzitie:<br />
THL (A,O) = Intarzierea interna fixa + Intarzierea dependenta de sarcina × sarcina<br />
- Modelul liniar
• Caracterizarea unei porti.<br />
- Capacitatea de intrare pentru fiecare intrare.<br />
- Pentru fiecare cale intrare-iesire se considera,<br />
� pentru fiecare tip de tranzitie: H → L, L → H, H → Z, L → Z …etc:<br />
o Intarzierea interna (ns)<br />
o Intarzierea dependenta de sarcina (ns/fF)<br />
- Exemplu: Poarta NAND cu 2 Intrari<br />
• Exemplu: Multiplexor 2:1.<br />
- Sarcina capacitiva de Intrare (1 S.I.):<br />
� A,B: S.I. (NAND) = 61 fF<br />
� S: S.I. (INV) + S.I. (NAND) = 50 fF + 61 fF = 111 fF<br />
- Intarzierea Dependenta de Sarcina (I.D.S.): identica cu cea a portii G3:<br />
� TAYlhf = 0,0021 ns/fF TAYhlf = 0,0020 ns/fF<br />
� TBYlhf = 0,0021 ns/fF TBYhlf = 0,0020 ns/fF<br />
� TSYlhf = 0,0021 ns/fF TSYhlf = 0,0020 ns/fF<br />
- Intarzierea Interna (I.I.):<br />
� A la Y: I.I.G1 + (C.Fir1 + S.I.G3)*I.D.S.G1 + I.I.G3<br />
� B la Y: I.I.G2 + (C.Fir2 + S.I.G3)*I.D.S.G2 + I.I.G3<br />
� S la Y (cazul cel mai defavorabil): I.I.Inv + (C.Fir0 +<br />
S.I.G1)*I.D.S.Inv + I.I.A la Y<br />
- Efectul “C.Fir1” se poate aproxima prin:<br />
� presupunerea ca Fir1 are o capacitate egala cu capacitatile C ale<br />
portilor conectate la el<br />
- Exemplu de calcul al I.I.:<br />
� TAYlh = TPhl G1 +(2.0*61 fF) * TPhlf G1 + TPlh G3<br />
= 0.1ns + 122 fF*0,0020 ns/fF + 0,5 ns = 0,844 ns
• Abstractie: Multiplexor 2:1.<br />
- Sarcina de Intrare: A = 61 fF, B = 61 fF, S = 111 fF<br />
- Intarzierea dependenta de sarcina:<br />
� TAYlhf = 0,0021 ns/fF TAYhlf = 0,0020 ns/fF<br />
� TBYlhf = 0,0021 ns/fF TBYhlf = 0,0020 ns/fF<br />
� TSYlhf = 0,0021 ns/fF TSYhlf = 0,0020 ns/fF<br />
- Intarzierea Interna:<br />
� TAYlh = TPhl G1 +(2.0*61 fF) * TPhlf G1 + TPlh G3<br />
= 0.1ns + 122 fF*0,0020 ns/fF + 0,5 ns = 0,844 ns<br />
- Exercitii: Sa se calculeze: TAYhl, TBYlh, TSYlh, TAYhl.<br />
• Elemente logice utilizate in cadrul cursului.<br />
- NAND2, NAND3, NAND4<br />
- NOR2, NOR3, NOR4<br />
- INV1 (inversor normal)<br />
- INV4 (inversor cu capacitate mare de comanda)<br />
- XOR2<br />
- XNOR2<br />
- MUX (Multiplexoare rapide)<br />
- Sursa de alimentare (Sursa pentru unitati)<br />
- GND (Sursa de zerouri)<br />
- Bistabile de tip D comandate pe front negativ de ceas<br />
• Modelul de Sincronizare (Timing) pentru elementele cu memorie.<br />
- Setup Time (Timp de Stabilire): Intrarea trebuie sa fie stabila inaintea<br />
frontului negativ al semnalului de ceas ceas.<br />
- Hold Time (Timp de Mentinere): Intrarea trebuie sa ramana stabila dupa<br />
frontul negativ al semnalului de ceas.
- Clock-to-Q Time (Timpul Ceas-la-Q):<br />
� Iesirea nu se poate modifica instantaneu la frontul semnalului de ceas<br />
� Ca si la portile logice exista doua componente ale intarzierii:<br />
o Intarzierea Interna Clk-to-Q<br />
o Intarzierea dependenta de sarcina Clk-to-Q.<br />
� Pentru exemplificare se considera Setup = 1ns, Hold = 0,5ns.<br />
• Metodologia de Sincronizare (Clocking).<br />
- Toate elementele de memorare sunt sincronizate cu acelasi semnal de ceas.<br />
- In ceea ce priveste blocurile logice combinationale:<br />
� Toate intrarile sunt actualizate la fiecare semnal de ceas<br />
� Toate iesirile trebuie sa fie stabile inaintea sosirii urmatorului semnal<br />
de ceas.<br />
• Drumul Critic si Perioada/Ciclul Ceasului.<br />
- Drumul Critic: Calea cea mai lenta intre doua elemente de memorare.<br />
- Perioada/Ciclul Ceasului este o functie de drumul critic si trebuie sa fie<br />
mai mare decat:<br />
Clk-to-Q + Intarzierea corespunzatoare Drumului Critic prin<br />
Circuitul Combinational + Setup
• Efectul Alunecarii (Skew) Ceasului asupra Ciclului.<br />
- Scenariul cel mai defavorabil pentru Ciclu:<br />
� Registrul de intrare foloseste CLK1<br />
� Registrul de iesire foloseste CLK2<br />
- Ciclul – Alunecarea Ceasului ≥ Clk-to-Q + Intarzierea cea mai mare +<br />
+ Setup<br />
⇒ Ciclul ≥ Clk-to-Q + Intarzierea cea mai mare + Setup +<br />
+ Alunecarea Ceasului<br />
• Metode pentru reducerea Ciclului.<br />
- Reducerea numarului de niveluri logice:<br />
- Folosirea metodelor dinamice de sincronizare.<br />
- Examinarea Incarcarii:<br />
� O poarta nu trebuie sa comande mai multe porti.<br />
� Trebuie evitata comanda unui fir lung de catre o poarta de mici<br />
dimensiuni<br />
- Folosirea mai multor etaje pentru comanda sarcinilor capacitive mari.
• Evitarea violarii timpului Hold.<br />
- Cerinta pentru Timpul Hold:<br />
� Intrarea registrului nu trebuie sa se schimbeimediat dupa modificarea<br />
ceasului.<br />
- Aceasta se poate realiza usor in schemele de sincronizare pe fronturi de<br />
ceas.<br />
- Timpul Hold, pentru cele mai multe bistabile, este ≤ 0 ns.<br />
- CLK-to-Q + Intarzierea pe Calea cea mai scurta > Timpul Hold.<br />
• Efectul Alunecarii Ceasului asupra Timpului Hold.<br />
- Scenariul cel mai defavorabil pentru Timpul Hold:<br />
� Registrul de Intrare (FF1) este sincronizat cu CLK2<br />
� Registrul de Iesire(FF2) este sincronizat cu CLK1<br />
� Iesirea lui FF2 rapid nu trebuie sa modifice intrarea lui FF1, pe<br />
aceeasi tranzitie a ceasului.<br />
- (CLK-to-Q + Intarzierea pe calea cea mai scurta – Alunecarea<br />
Ceasului) > Timpul Hold
1. Procesorul Aritmetic.<br />
OPERATIILE ARITMETICE<br />
Un procesor aritmetic reprezinta un dispozitiv capabil sa efectueze operatii simple sau complexe<br />
asupra unor operanzi furnizati in formate corespunzatoare. Ca exemple se pot da:<br />
- Unitatea Aritmetica simpla;<br />
- Incrementatorul;<br />
- Dispozitivul pentru Transformata Fourier Rapida etc.<br />
Procesorul Aritmetic poate fi examinat atat din punctul de vedere al utilizatorului, cat si al<br />
proiectantului.<br />
1. Din punctul de vedere al utilizatorului, procesorul aritmetic reprezinta o cutie neagra, cu un<br />
numar de intrari si iesiri, capabila sa efectueze o serie de operatii asupra unor operanzi cu<br />
formate specificate. Rezultatele se obtin intr-un timp care depinde de tipul operatiei si de<br />
formatul operanzilor si sunt insotite de indicatorii de conditii.<br />
Operanzi: X, Y Rezultat: Z<br />
Operatia: * Procesor Aritmetic Conditii: Ci<br />
Formate: φ Singularitai: Si<br />
Timp: T(*,φ)<br />
Intrari:<br />
- una sau mai multe marimi numerice: X, Y;<br />
- un simbol al operatiei, operatorul: *;<br />
- un simbol de format: φ.<br />
Operanzii de la intrare sunt caracterizati prin trei proprieteti:<br />
- apartin unei multimi finite M de marimi numerice, caracterizate printr-o gama:<br />
Xmin ≤ X ≤ Xmax<br />
- sunt cunoscute cu o precizie data:<br />
X - Δ Xl ≤ X ≤ X + Δ Xh
- sunt reprezentate cu ajutorul unor simboluri/cifre, in cadrul unui sistem de numeratie, sub<br />
forma unor n-tupluri:<br />
xn-1 xn-2…………………. x1 x0,<br />
care sunt interpretate ca marimi/valori numerice, pe baza unor reguli date.<br />
Operatorii sunt codificati cu ajutorul unor simboluri *, care corespund unui set redus sau extins<br />
de operatii aritmetice:<br />
∗ ∈ {+, -, ×, : }<br />
Formatul. Atunci cand sunt posibile mai multe formate, pentru reprezentarea operanzilor, acest<br />
lucru poate fi specificat la intrarea format, printr-un simbol dat φ.<br />
Iesiri:<br />
- una sau mai multe marimi numerice Z, care reprezinta rezultatul;<br />
- unul sau mai multe simboluri Ci, reprezentand conditiile in care apare rezultatul;<br />
- unul sau mai multe simboluri Si, reprezentand singularitati.<br />
Iesirile numerice poseda aceleasi proprietati ca si operanzii de la intrare: gama, precizie si<br />
reprezentare.<br />
Conditiile specifica caracteristici ale rezultatului: < 0, = 0, > 0 etc.<br />
Singularitatile sunt asociate cu situatiile in care rezultatul obtinut este invalid:<br />
- depasire: rezultatul depaseste posibilitatile hardware de reprezentare a numerelor, in<br />
sistemul numeric dat;<br />
- pierderea excesiva de precizie, la operatiile in virgula mobila;<br />
- erori datorate hardware-lui.<br />
In aceste situatii apare un pseudo-rezultat Z(Si), impreuna cu singularitatea Si, care sunt tratate<br />
atat prin hardware, cat si cu ajutorul unor rutine specifice ale sistemului de operare.<br />
Timpul de operare T(*) este dat pentru fiecare operatie (*), efectuata de catre procesor. Timpul<br />
de operare, in unele cazuri, poate fi variabil:<br />
Observatii:<br />
T(*)min ≤ T(*) ≤ T(*)max<br />
- definitia data procesorului aritmetic cuprinde un spectru larg de “cutii negre”, de la un<br />
contor simplu (ADD-ONE), pana la un generator de functii trigonometrice sau un procesor<br />
FFT.
- structura interna este specificata in termenii timpului asociat cu executia diferitelor operatii,<br />
cat si cu formatul de reprezentare a datelor.<br />
2. Din punctul de vedere al proiectantului intereseaza specificarea detaliata a structurii interne.<br />
Aceasta specificare trebuie sa considere:<br />
- algoritmii aritmetici (proiectarea aritmetica),<br />
- structura logica a procesorului (proiectarea logica).<br />
Proiectarea aritmetica pleaca de la specificatiile date de catre utilizator si le transforma in<br />
specificatii de operatii aritmetice detaliate la nivel de ranguri individuale/bit, in cadrul<br />
reprezentarii concrete a datelor. Aceste specificatii, la nivel de rang individual, reprezinta, in<br />
continuare, datele initiale (tabele de adevar, diagrame etc) pentru proiectarea logica.<br />
Proiectarea logica pleaca de la specificatiile furnizate de catre proiectarea aritmetica si, in<br />
cadrul unei tehnologii date, selecteaza tipurile de circuite logice, pe care le interconecteaza, in<br />
mod corespunzator, in vederea implementarii operatiilor aritmetice impuse de catre algoritmii<br />
aritmetici. In cazul in care algoritmii aritmetici nu se pot executa intr-un singur pas, se<br />
proiecteaza secvente, constand in pasi aritmetici elementari, efectuati sub controlul unor<br />
semnale de comanda. Astfel, proiectantul logic trebuie sa elaboreze atat proiectul unitatii de<br />
executie, cat si proiectul unitatii de comanda.<br />
Specificatiile de tip “black box”, pentru proiectarea unui procesor aritmetic, se obtin prin<br />
transformarea specificatiilor date de catre utilizator, astfel incat, ele sa corespunda posibilitatilor<br />
de implementare. In acest context trebuie sa se aibe in vedere ca:<br />
- datele se reprezinta sub forma unor vectori binari;<br />
- la baza circuitelor, care efectueaza operatiile aritmetice, se afla circuite logice, ce opereaza<br />
cu semnale binare.<br />
Avand in vedere cele de mai sus:<br />
- intrarile X si Y vor deveni:<br />
X ≡ xn-1 xn-2…………………. x1 x0,<br />
Y ≡ yn-1 yn-2…………………. y1 y0,<br />
- operatorul (*) va fi codificat printr-un cod de operatie:<br />
Ω ≡ ωn-1 ωn-2………………..ω1 ω0,<br />
care va indica atat operatia, cat si formatul.<br />
- iesirile reprezinta vectori numerici:
Z ≡ zn-1 zn-2…………………. z1 z0, rezultatul;<br />
C ≡ cp-1 cp-2…………………. c1 c0, indicatorii de conditii<br />
S ≡ sq-1 sq-2…………………. s1 s0, indicatorii de pseudorezultat.<br />
In continuare se vor examina operatiile aritmetice in virgula fixa si in virgula mobila.<br />
2. Operatiile aritmetice in virgula fixa.<br />
2.1. Adunarea si scaderea.<br />
Operatiile de adunare si scadere ale numerelor in virgula fixa se implementeaza, in majoritatea<br />
covarsitoare a cazurilor, cu numere reprezentate in complementul fata de doi. Astfel, operatiile<br />
de adunare si scadere se reduc la operatia de adunare a codurilor complementare ale celor doi<br />
operanzi. Adunarea se efectueaza rang cu rang, incepand cu rangurile mai putin semnificative,<br />
inclusiv rangurile de semn. Transportul, care apare la stanga rangului de semn, se neglijeaza.<br />
Fie operanzii:<br />
in conditiile :<br />
x = +/- xn-2…………………. x1 x0,<br />
y = +/- yn-1 yn-2…………… y1 y0,<br />
-2 n-1 ≤ x ≤ 2 n-1 -1<br />
-2 n-1 ≤ y ≤ 2 n-1 -1<br />
La adunarea/scaderea celor doi operanzi, de mai sus, apar urmatoarele situatii:<br />
a) x > 0, y > 0, dar x + y ≤ 2 n-1 –1<br />
[x]c + [y]c = |x| + |y| = [x + y]c<br />
Exemplu:<br />
[+3]c + [+2]c = |0011| + |0010| = |0101| = [0101]c<br />
b) x 0, dar 0 < x + y ≤ 2 n-1 –1<br />
[x]c + [y]c = 2 n - |x| + |y| = [x + y]c<br />
transport,<br />
se neglijeaza > 0<br />
Exemplu:<br />
[-6]c + [+7]c = 2 4 - |0110| + |0111| =<br />
transport, se neglijeaza<br />
10000 - |0110| + |0111| =<br />
1010 + 0111 = 1 0001 = 0001
c) x 0, dar x + y < 0<br />
[x]c + [y]c = 2 n - |x| + |y| = [x + y]c<br />
Exemplu:<br />
< 0<br />
[-7]c + [+6]c = 2 4 - |0111| + |0110| =<br />
10000 - |0111| + |0110| =<br />
1001+ 0110 = [1111]c<br />
d) x
Pozitionarea indicatorilor de conditii.<br />
Indicatorii de conditii specifica o serie de proprietati ale rezultatului, care apare in registrul<br />
acumulator al rezultatului AC. De regula, ei sunt stocati in bistabile notate cu mnemonice, care<br />
formeaza un registru, incorporat in cuvantul de stare al programului/procesului. Indicatorii de<br />
conditii specifica diverse situatii:<br />
- rezultat = 0 - mnemonica Z, ( Z ← ∪ / AC );<br />
- semnul rezultatului > 0 sau < 0 - mnemonica S, ( S ← ACn-1);<br />
- aparitia transportului, la stanga rangului de semn, mnemonica C, (Cn ← 1);<br />
- rezultatul verificarii paritatii - mnemonica P, ( P ← ⊕ / AC ).<br />
Pozitionarea indicatorilor de pseudo-rezultat.<br />
Printre situatiile care conduc la un pseudo-rezultat, in cazul operarii in virgula fixa, este si aceea<br />
cand apare o depasire. Depasirea se manifesta in conditiile in care cei doi operanzi care se aduna<br />
au acelasi semn. Daca rezultatul obtinut are un semn diferit de semnul comun, al celor doi<br />
operanzi, s-a inregistrat o depasire. Depasirea poate constitui o cauza de intrerupere/suspendare<br />
a programului in cadrul careia a aprut. Aceasta situatie este semnalizata sistemului de operare, in<br />
vederea luarii unei decizii corespunzatoare.<br />
Situatia de depasire se semnaleaza prin generarea unui semnal D egal cu suma modulo doi intre<br />
transportul in rangul de semn si transportul in afara rangului de semn, in cadrul registrului<br />
acumulator, al rezultataului:<br />
Implementari.<br />
D ← Cn ⊕ Cn-1<br />
Operatia de adunare pe un singur rang se realizeaza prin generarea sumei si a transportului,<br />
folosind circuitele logice necesare realizarii fizice a expresiilor logice de mai jos:<br />
Couti = (xi . Cini) ∪ (yi . Cini) ∪ (xi . yi)<br />
Sumi = (xi . yi . Cini) ∪ (xi . yi . Cini) ∪ (xi . yi . Cini) ∪ (xi . yi . Cini),<br />
se concretizeaza intr-un circuit de tip “schema bloc”, denumit SUM, prezentat in continuare:
Ciin<br />
Xi<br />
Yi<br />
CI<br />
A0<br />
B0<br />
Cu ajutorul sumatorului la nivel de bit se poate realiza un sumator pe n biti:<br />
Sumatorul la nivel de bit poate fi extins si cu operatiile logice SI/AND, SAU/OR, ca in figura de<br />
mai jos, in cadrul careia iesiriele sumatorului, circuitului AND si circuitului OR sunt aplicate la<br />
intrarile unui multiplexor MUX. Codul de operatie, pentru selectarea operatorului, se forteaza la<br />
intrarea Sel, a multiplexorului.<br />
1<br />
2<br />
3<br />
Cin 1<br />
X0<br />
Y0<br />
X1<br />
Y1<br />
Xn-1<br />
Yn-1<br />
2<br />
3<br />
1<br />
2<br />
3<br />
1<br />
2<br />
3<br />
CI<br />
A0<br />
B0<br />
CI<br />
A0<br />
B0<br />
CI<br />
A0<br />
B0<br />
SUM<br />
Z0<br />
CO<br />
Z0<br />
CO<br />
Z0<br />
CO<br />
Z0<br />
CO<br />
4<br />
5<br />
4<br />
5<br />
4<br />
5<br />
4<br />
Rezi<br />
Ciout<br />
Rez0<br />
Rez1<br />
Rez(n-1)<br />
5 Cout
Xi<br />
Yi<br />
CI<br />
A0<br />
B0<br />
CO<br />
In conditiile in care se doreste si implementarea operatiei de scadere, este necesar sa se creeze<br />
posibilitatea inversarii intrarii yi, dupa cum se prezinta in continuare:<br />
Xi<br />
Yi<br />
Ciin<br />
InvY<br />
Z0<br />
Inversarea lui y se realizeaza sub controlul semnalului de selectie InvY, aplicat la intrarea de<br />
selectie a celui de-al doilea multiplexor<br />
1<br />
2<br />
3<br />
1 2<br />
Ciout<br />
SUM<br />
1<br />
2<br />
3<br />
CI<br />
A0<br />
B0<br />
4<br />
5<br />
Sel<br />
Z0<br />
CO<br />
MUX<br />
Ciin Sel<br />
MUX2<br />
SUM<br />
Less 4<br />
Ciout<br />
4<br />
5<br />
1<br />
2<br />
3<br />
Rez<br />
MUX1<br />
Rez
Operatiile ADD, SUB, AND si OR se regasesc in Unitatile Aritmetice Logice ale oricarui<br />
procesor. Exista unele procesoare care au implementata instructiunea “set-on-less-than”,<br />
ce se traduce prin “forteaza in (1), bitul cel mai putin semnificativ al rezultatului, daca<br />
operandul x este mai mic decat operandul y”, in conditiile in care toti ceilalti biti ai rezultatului<br />
vor fi 0. Astfel, in figura de mai sus a aparut o noua intrare la multiplexor “less”.<br />
Structura poate fi completata cu detalierea schemei UAL, pentru bitul cel mai semnificativ, in<br />
care se pune in evidenta depasirea aritmetica.<br />
Implementarea operatiei “set-on-less-than” presupune efectuarea scaderii lui y din x.<br />
Daca x < y, se va pozitiona in unu semnul rezultatului, la iesirea sumatorului, adica Sum(n-1) .<br />
Acest lucru trebuie sa se reflecte insa in fortarea in unu a bitului cel mai semnificativ al<br />
rezultatului Rez0 si in zero a bitilor Rez(n-1)….. Rez1. Aceasta solutie este ilustrata in urmatoarea<br />
schema bloc.<br />
Xi<br />
Yi<br />
InvY<br />
1 2<br />
Ciin Sel<br />
1<br />
2<br />
3<br />
CI<br />
A0<br />
B0<br />
Z0<br />
CO<br />
Less 4<br />
InvY<br />
MUX2<br />
SUM<br />
Detectie Depasire<br />
4<br />
5<br />
1<br />
2<br />
3<br />
Ciout<br />
MUX1<br />
Rez<br />
Set<br />
Depasire
In figura de mai sus a fost implementa si pozitionarea in “1” , an indicatorului de conditii, care<br />
specifica aparitia unui rezultat egal cu “0”, la iesirea unitatii arimetice logice. Bistabilul Z se<br />
pozitioneaza in “1”.<br />
Sumatoare performante.<br />
Sumatorul cu transport succesiv.<br />
Tipul cel mai simplu de sumator paralel este sumatorul cu transport succesiv, obtinut prin<br />
interconectarea unor sumatoare complete. Ecuatiile pentru transport si suma, la nivelul unui<br />
etaj, sunt date mai jos:<br />
InvY Cin0 Operatia<br />
X0<br />
Y0<br />
X1<br />
Y1<br />
0<br />
X(n-1)<br />
Y(n-1)<br />
0<br />
LESS<br />
LESS<br />
Cout0<br />
Cout1<br />
LESS<br />
Cout(n-1)<br />
Couti = (xi . Cini) ∪ (yi . Cini) ∪ (xi . yi)<br />
Rez(n-1)<br />
Depasire<br />
Sumi = (xi . yi . Cini) ∪ (xi . yi . Cini) ∪ (xi . yi . Cini) ∪ (xi . yi . Cini),<br />
Set<br />
Rez0<br />
Rez1<br />
Se poate observa ca cele doua functii combinationale se implementeaza pe doua niveluri logice.<br />
In conditiile in care intarzierea pe un nivel logic este Δt, rezulta ca intarzierea minima pe rang va<br />
1<br />
2<br />
3<br />
4<br />
5<br />
Zero
fi 2.Δt. Intrucat, in cazul cel mai defavorabil, transportul se propaga de la rangul cel mai putin<br />
semnificativ pana la iesirea celui mai semnificativ rang, rezulta o intarziere egala cu 2.n.Δt, unde<br />
n este numarul de ranguri. Este evident ca o asemenea solutie nu este acceptabila.<br />
Sumatorul cu intarziere minima.<br />
Considerand ecuatia sumei , Sum0 , de la iesirea celui mai putin semnificativ rang, se incearca<br />
stabilirea unei expresii a acesteia ca functie de intrarile pentru rangul curent (n-1), cat si de<br />
intrarile pentru rangurile mai putin semnificative (n-2),…,1,0. In acest mod se va obtine o<br />
expresie logica implementabila in doua trepte.<br />
Sum0 = [x0. y0 . Cin0] ∪ [x0 . y0 . Cin0] ∪<br />
[x0 . y0 . Cin0] ∪ [x0 . y0 . Cin0]<br />
Pentru iesirea, care reprezinta transportul, din rangul 0 s-a inlocuit Cout0 cu Cin1, pentru a<br />
simplifica relatiile, care urmeaza a se obtine.<br />
Cin1= [x0 . Cin0] ∪ [y0 . Cin0] ∪ [x0 . y0]<br />
Pentru rangul urmator 1, se obtine urmatoarea expresie a sumei:<br />
Sum1 = [x1. y1 . Cin1] ∪ [x1 . y1 . Cin1] ∪<br />
[x1 . y1 . Cin1] ∪ [x1 . y1 . Cin1]<br />
In expresia lui Sum1 se va inlocui Cin1 cu componentele care-l alcatuiesc, conform formulei<br />
precedente. Calculul lui Cin1 conduce la urmatoarea expresie:<br />
Cin1= [x0 . Cin0] ∪ [y0 . Cin0] ∪ [x0 . y0],<br />
Astfel, pentru Sum1 se va obtine o expresie formata prin adunarea logica a 12 produse logice de<br />
cate 4 variabile fiecare.Aceasta presupune utilizarea unei porti OR cu 12 intrari si a 12 porti<br />
AND, cu cate 4 intrari. Extinzand procedeul la urmatoarele ranguri se vor obtine expresii cu<br />
numerosi termeni de tip produs, care, la randul lor, vor avea multe componente. Un calcul<br />
simplu arata ca, in cazul unui sumator pe 64 de biti, vor fi necesare circa 10 12 porti, practic de<br />
nerealizat in prezent.<br />
Principiul anticiparii transportului.<br />
Intrucat sumatorul cu transport succesiv este lent, iar sumatorul cu intarziere minima este<br />
imposibil de realizat, se cauta o solutie intermediara. Aceasta grupeaza relatiile obtinute la<br />
sumatorul cu intarziere minima, astfel incat sa se obtina dimensiuni rezonabile.
Ideea de baza este aceea de a caracteriza comportarea unui rang al sumatorului din punctul de<br />
vedere al generarii/propagarii unui transport. Astfel, rangul j al unui sumator genereaza, Gj ,<br />
transport daca are loc relatia:<br />
Gj = xj . yj<br />
De asemenea, rangul j al unui sumator propaga, Pj , transport in situatia de mai jos:<br />
Pj = xj ⊕ yj = (xj . yj) ∪ (xj . yj).<br />
In aceste conditii se pot elabora noi expresii pentru transportul C(j+1) si pentru suma Sumj , la<br />
nivelul fiecarui rang al sumatorului:.<br />
C(j+1) = Gj ∪ (Pj . Cj)<br />
Sumj = (Pj . Cj) ∪ (Pj . Cj)<br />
Astfel, un sumator complet va consta in doua parti: partea P/G si partea Sum<br />
/Xj<br />
/Yj<br />
Xj<br />
Yj<br />
Relatiile de mai sus se pot structura la nivelul a 4 sectiuni ale unui sumator, bazat pe ideea<br />
mentionata anterior. Incepand cu rangul cel mai putin semnificativ se obtin:<br />
- pentru sume:<br />
Sum0 = (P0 . C0) ∪ (P0 . C0)<br />
Sum1 = (P1 . C1) ∪ (P1 . C1)<br />
Sum2 = (P2 . C2) ∪ (P2 . C2)<br />
Sum3 = (P3 . C3) ∪ (P3 . C3),<br />
si:<br />
Partea P/G Partea Sum<br />
1 2<br />
Gj Pj<br />
Cj<br />
1 2<br />
Sumj
- pentru transporturi:<br />
C1 = G0 ∪ (P0 . C0)<br />
C2 = G1 ∪ (P1 . C1) = G1 ∪ (P1 . G0 ) ∪ (P1 . P0 . C0)<br />
C3 = G2 ∪ (P2 . C2) = G2 ∪ (P2 . G1) ∪ (P2 . P1 . G0 ) ∪ (P2 . P1 . P0 . C0)<br />
C4 = G3 ∪ (P3 . C3) = G3 ∪ (P3 . G2) ∪ (P3 . P2 . G1) ∪<br />
∪ (P3 . P2 . P1 . G0 ) ∪ (P3 . P2 . P1 . P0 . C0)<br />
Aceste relatii sunt implementate in unitatea de anticipare a transportului UAT.<br />
Pentru o sectiune de 4 biti, sumatorul cu transport anticipat arata astfel:<br />
Sum3 x3 y3 Sum2 x2 y2 Sum1 x1 y1 Sum0 x0 y0<br />
GP C3 P3 G3 C2 P2 G2 C1 P1 G1 C0 P0 G0<br />
GG<br />
Sum3 P/G 3 Sum2 P/G 2 Sum1 P/G 1 Sum0 P/G 0<br />
Efectuand un calcul al intarzierii, se obtine, pe 4 biti de sumator, o intarziere de 6.Δt, in<br />
comparatie cu intarzierea de 8.Δt, pentru sumatorul cu transport succesiv. Din schema bloc, de<br />
mai sus, rezulta ca Logica de Anticipare a Transportului mai genereaza doua semnale la nivel<br />
de grup. Grupul consta intr-un ansamblu de patru ranguri de sumator. Astfel, grupul poate<br />
genera transport (GG =1) sau poate propaga transport (GP = 1).<br />
Ideea anticiparii transportului se poate fi extinsa atat la nivel de grup, cat si la nivel de sectiune<br />
(ansamblu de patru grupuri), realizand o structura piramidala de UAT-uri.<br />
Unitatile de anticipare la nivel de grup si la nivel de sectiune sunt identice cu logica de<br />
anticipare a transportului la nivelul sumatorului cu patru biti.<br />
Analiza performantelor arata ca in cazul unui sumator pe 16 biti, cu transport de grup, se<br />
inregistreaza o intarziere de 8.Δt, fata de intarzierea de 32.Δt, pentru sumatorul cu transport<br />
succesiv. In cazul unui sumator pe 64 de biti, in situatia anticiparii transportului pe sectiuni, se<br />
obtine o intarziere maxima de 14.Δt, comparativ cu intarzierea de 128.Δt, pentru sumatorul cu<br />
transport succesiv.<br />
Logica de Anticipare a Transportului<br />
C0
Se poate aprecia ca numarul de terminale de intrare si iesire ale portilor poate reprezenta un<br />
criteriu de cost, intr-o implementare data. Comparatia cost/performanta pentru cele doua<br />
implementari, de mai sus, arata ca in cazul unui sumator pe 64 de biti, la o crestere a numarului<br />
de terminale cu 50%, pentru solutia cu transport anticipat, se obtine o viteza de 9 ori mai mare,<br />
decat in cazul transportului succesiv.<br />
Sumatorul cu salvare a transportului.<br />
In cazul adunarii mai multor vectori binari simultan se poate recurge la o schema mai rapida,<br />
constand in utilizarea mai multor sumatoare in cascada.<br />
Fie cazul adunarii a patru numere de cate 4 biti, notate cu a, b, e, f. Rangurile numerelor b, e, f<br />
se vor aduna intr-un sumator cu salvare a transportului, care va avea iesiri pentru suma si<br />
transport. Acestea, la randul lor, se vor aduna cu rangurile numarului a, intr-un alt sumator cu<br />
salvare a transportului. Iesirile reprezentand rangurile sumei si rangurile transportului se vor<br />
aduna intr-un sumator obisnuit.<br />
a b e f<br />
Sumator cu salvare a<br />
transportului<br />
Sumator cu salvare a<br />
transportului<br />
C’ S’<br />
Sumator obisnuit<br />
Sum<br />
Detaliile de implementare sunt lasate pe seama cititorului.<br />
Comparatie intre cateva tipuri de sumatoare, pe n biti, in privinta intarzierii si a ariei ocupate:<br />
Tip sumator Intarziere Aria ocupata<br />
Transport succesiv 2.n.Δt 9.n<br />
Intarziere minima 2.Δt 2 (2n+1) /(2n+1)<br />
Transport anticipat 2.(log2n + 1).Δt 7.n + 22.log2n
Secvente de microinstructiuni pentru controlul operatiilor in Unitatea de Executie AMD2901<br />
23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0<br />
M I8 I7 I6 M I2 I1 I0 Cn I5 I4 I3 A3 A2 A1 A0 B3 B2 B1 B0 D3 D2 D1 D0<br />
U Selectie U Selectie Operatie Adresa “A” Adresa “B” Data “D”<br />
X destinatie X sursa UAL<br />
1 2<br />
0 1 1 1 1 1 0 1 1 0 0 0 0 0 0 1 0 LOAD R0, 02H<br />
0 0 1 0 1 1 0 1 1 0 0 0 0 READ R0<br />
0 1 1 1 1 1 0 1 1 0 0 0 1 0 1 0 0 LOAD R1, 04H<br />
0 1 1 1 1 0 1 1 0 1 1 0 0 0 1 ROTUP R1<br />
0 1 0 1 1 0 1 1 0 1 1 0 0 0 1 ROTDWN R1<br />
0 0 0 0 1 0 1 0 0 CLR Q<br />
1 1 1 0 0 0 1 1 0 1 1 0 0 0 1 DBLROTUP R1,Q<br />
1 1 0 0 0 0 1 1 0 1 1 0 0 0 1 DBLROTDWN R1,Q<br />
0 0 1 0 1 1 0 1 1 NOP<br />
0 1 1 0 1 1 1 0 0 0 0 0 1 CLR R1<br />
0 1 1 0 1 1 1 0 0 0 0 0 0 1 INCR R1<br />
0 1 1 0 1 1 0 0 0 1 0 0 0 1 DCR R1<br />
0 1 1 1 1 1 0 1 1 0 0 1 1 0 1 0 1 LOAD R3, 05H<br />
0 1 1 0 0 1 0 0 0 0 0 0 1 1 0 0 0 1 ADD R1, R3<br />
Observatii<br />
Descrierea microinstructiunilor<br />
individuale la nivel de mnemonice
Secvente de microinstructiuni pentru controlul operatiilor in Microsecventiatorul AMD2909<br />
Adresa de<br />
memorie, in<br />
memoria de<br />
control<br />
31 30 29 28 27 26 25 24<br />
R3 R2 R1 R0 P3 P2 P1 P0<br />
Adresa de Obtinerea μI<br />
salt urmatoare<br />
0 1 0 0 1 0 0 0 1 JR 09H<br />
. . . . . . . . . ……….<br />
3 0 0 0 0 0 0 0 1 JR 00H<br />
. . . . . . . . . ……….<br />
6 1 0 1 0 0 0 0 1 JR 0AH<br />
. . . . . . . . . ……….<br />
9 0 1 1 0 0 0 0 1 JR 06H<br />
A 0 0 1 0 CONT<br />
B 0 0 1 0 CONT<br />
C 0 0 1 0 CONT<br />
D 0 0 1 0 CONT<br />
E 0 0 1 0 CONT<br />
F 0 0 1 1 0 0 0 1 JR 03H<br />
Secventa: 0, 9, 6, A, B, C, D, E, F, 3, 0, 9, 6,….etc.<br />
Observatii<br />
Descrierea microinstructiunilor<br />
individuale la nivel de mnemonice
Secvente de microinstructiuni pentru controlul operatiilor in Microsecventiatorul AMD2909<br />
Adresa de<br />
memorie, in<br />
memoria de<br />
control<br />
31 30 29 28 27 26 25 24<br />
R3 R2 R1 R0 P3 P2 P1 P0<br />
Adresa de Obtinerea μI<br />
salt urmatoare<br />
0 0 0 1 0 CONT<br />
1 0 0 1 0 CONT<br />
2 1 0 0 1 PUCONT<br />
3 0 0 1 0 CONT<br />
4 0 0 1 0 CONT<br />
5 0 0 1 0 CONT<br />
6 0 0 1 0 CONT<br />
7 0 0 1 0 CONT<br />
8 0 0 1 0 CONT<br />
9 0 0 1 0 CONT<br />
C 0 0 1 0 CONT<br />
D 0 0 1 0 CONT<br />
E 0 1 1 0 JSTV<br />
Ciclare in microprogram. Secventa: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, 3, 4, 5,….etc.<br />
Observatii<br />
Descrierea microinstructiunilor<br />
individuale la nivel de mnemonice
Secvente de microinstructiuni pentru controlul operatiilor in Microsecventiatorul AMD2909<br />
Adresa de<br />
memorie, in<br />
memoria de<br />
control<br />
31 30 29 28 27 26 25 24<br />
R3 R2 R1 R0 P3 P2 P1 P0<br />
Adresa de Obtinerea μI<br />
salt urmatoare<br />
0 0 0 1 0 CONT<br />
1 0 0 1 0 CONT<br />
2 0 0 1 0 CONT<br />
3 1 1 0 0 0 1 0 1 JSR 0CH<br />
4 0 0 1 0 CONT<br />
5 0 0 1 0 CONT<br />
6 0 0 0 0 0 0 0 1 JR 00H<br />
7 . . . . . . . . ……….<br />
8 . . . . . . . . ……….<br />
9 . . . . . . . . ……….<br />
C 0 0 1 0 CONT<br />
D 0 0 1 0 CONT<br />
E 0 1 1 0 RS<br />
Salt la subrutina Secventa: 0, 1, 2, 3, C, D, E, 4, 5, 6, 0, 1, 2, 3, C, D,….etc.<br />
Observatii<br />
Descrierea microinstructiunilor<br />
individuale la nivel de mnemonice
Microsubrutine imbricate<br />
μP Principal μSUB 0 μSUB 3<br />
D CONT 0 JSR 0CH 3 JSR 0CH<br />
E JSR 00H 1 JSR 06H 4 JSR 09H<br />
F JR 0DH 2 RS 5 RS<br />
μSUB 6 μSUB 9 μSUB C<br />
6 JSR 0CH 9 JSR 0CH C RS<br />
7 JSR 03H A RS<br />
8 RS<br />
Spatiul de adresare in memoria de comanda este urmatorul:<br />
D, E, 0, 1, 6, D, 7, 3, D, 4, 9, A, 5, 8, 2, F, D etc<br />
Microprogramul corespunzator este dat mai jos
Secvente de microinstructiuni pentru controlul operatiilor in Microsecventiatorul AMD2909<br />
Adresa de<br />
memorie, in<br />
memoria de<br />
control<br />
31 30 29 28 27 26 25 24<br />
R3 R2 R1 R0 P3 P2 P1 P0<br />
Adresa de Obtinerea μI<br />
salt urmatoare<br />
0 1 1 0 0 0 1 0 1 JSR 0CH<br />
1 0 1 1 0 0 1 0 1 JSR 06H<br />
2 0 1 1 0 RS<br />
3 1 1 0 0 0 1 0 1 JSR 0CH<br />
4 1 0 0 1 0 1 0 1 JSR 09H<br />
5 0 1 1 0 RS<br />
6 1 1 0 0 0 1 0 1 JSR 0CH<br />
7 0 0 1 1 0 1 0 1 JSR 03H<br />
8 0 1 1 0 RS<br />
9 0 0 1 0 CONT<br />
A 0 1 1 0 RS<br />
C 0 1 1 0 RS<br />
D 0 0 1 0 CONT<br />
E 0 0 0 0 0 1 0 1 JSR 00H<br />
F 1 1 0 1 0 1 0 1 JSR 0DH<br />
Observatii<br />
Descrierea microinstructiunilor<br />
individuale la nivel de mnemonice<br />
Microsubrutine imbricate. Secventierea adreselor de microinstructiuni: D, E, 0, 1, 6, D, 7, 3, D, 4, 9, A, 5, 8, 2, F, D etc
Adr<br />
31302928 27 26 25 24 23 22 2120 19 18 1716 15 1413 12 11 10 9 8 7 65 4 3 2 1 0<br />
Observatii<br />
μI<br />
R3:0 P3:0 M I8:6 M I2:0 Cn I5:3 “A” “B” “D”<br />
1 0<br />
Descrierea microinstructiunilor<br />
0 2 3 3 1 0 0 CONT INC R0<br />
1 15 15 1 JRC 15 NOP<br />
2 0 1 1 JR 0 NOP<br />
15 2 1 CONT NOP<br />
(INCREMENT & TEST)<br />
0 2 3 7 3 0 0 CONT LOAD R0, 0<br />
1 14 1 3 7 3 15 15 JR 14 LOAD R15,15<br />
14 2 3 3 3 0 CONT READ R0<br />
15 14 1 3 3 3 15 JR 14 READ R15<br />
(INCARCARE & CITIRE/AFISARE)
Calculul numarului de unitati continute in cuvintele V0, V1, V2 stocate in trei registre R0, R1, R2, din RAM:<br />
0 LOAD R0, V0<br />
1 LOAD R1, V1<br />
2 LOAD R2, V2<br />
3 LOAD R4, V4 /V4 contine o valoare corespunzatoare numarului de biti explorati la nivel de cuvant<br />
4 CLEAR R3<br />
5 R0 ∩ D; D=0001<br />
6 R0 ← R0/2; JSRNZF 14<br />
7 R1 ∩ D; D=0001<br />
8 R1 ← R1/2; JSRNZF 14<br />
9 R2 ∩ D; D=0001<br />
10 R2 ← R2/2; JSRNZF 14<br />
11 DCR R4<br />
12 JRZF 5<br />
13 NOP; JR 15<br />
14 RS; INC R3<br />
15 READ R3; JR 15
Adr<br />
31302928 27 26 25 24 23 22 2120 19 18 1716 15 1413 12 11 10 9 8 7 65 4 3 2 1 0<br />
Observatii<br />
μI<br />
R3:0 P3:0 M I8:6 M I2:0 Cn I5:3 “A” “B” “D”<br />
1 0<br />
Descrierea microinstructiunilor<br />
0 2 3 7 3 0 V0 CONT LOAD R0, V0<br />
1 2 3 7 3 1 V1 CONT LOAD R1, V1<br />
2 2 3 7 3 2 V2 CONT LOAD R2, V2<br />
3 2 3 7 3 4 4 CONT LOAD R4, 4<br />
4 2 3 3 4 3 CONT LOAD R4, 0<br />
5 2 1 5 4 0 0 1 CONT R0 ∩ MSK (0001)<br />
6 14 4 5 3 3 0 JSNZF 14 R0← R0/2<br />
7 2 1 5 4 1 1 1 CONT R0 ∩ MSK (0001)<br />
8 14 4 5 3 3 1 JSNZF 14 R1← R1/2<br />
9 2 1 5 4 2 2 1 CONT R2 ∩ MSK (0001)<br />
10 14 4 5 3 3 2 JSNZF 14 R2← R2/2<br />
11 2 3 3 0 1 4 CONT DCR R4<br />
12 5 0 1 JRNZF 5 NOP<br />
13 15 1 1 JR 15 NOP<br />
14 6 3 3 1 0 RS INC R3<br />
15 15 1 1 3 3 JR 15 READ R15
Implementarea unui contor pe 16 biti.<br />
Contorul este realizat prin concatenarea registrelor de cate 4 biti: R3, R2, R1, R0. Se presupune ca microprogramul incepe de la<br />
adresa 7:<br />
7 R0← R0 + 1 12 JRNZF 7<br />
8 JRNZF 7 13 R3← R3 + 1<br />
9 R1← R1 + 1 14 JRNZF 7<br />
10 JRNZF 7 15 JR 7<br />
11 R2← R2 + 1<br />
Adr 31302928 27 26 25 24 23 22 2120 19 18 1716 15 1413 12 11 10 9 8 7 65 4 3 2 1 0<br />
Observatii<br />
μI<br />
R3:0 P3:0 M I8:6 M I2:0 Cn I5:3 “A” “B” “D”<br />
1 0<br />
Descrierea microinstructiunilor<br />
7 2 3 3 1 0 CONT R0← R0 + 1<br />
8 7 0 1 JRNZF 7 NOP<br />
9 2 3 3 1 1 CONT R1← R1+ 1<br />
10 7 0 1 JRNZF 7 NOP<br />
11 2 3 3 1 2 CONT R2← R2 + 1<br />
12 7 0 1 JRNZF 7 NOP<br />
13 2 3 3 1 3 CONT R3← R3 + 1<br />
14 7 0 1 JR 7 NOP
Evaluarea perioadei ceasului.<br />
Conditii<br />
6 7<br />
M<br />
U<br />
X<br />
Ceas (CK)<br />
8<br />
μ Secv.<br />
AMD2910<br />
Memorie<br />
de<br />
control<br />
1 2 6, 4<br />
R<br />
μI<br />
MUX<br />
LSB /G, /P<br />
A,B,I,Cn<br />
2901 B<br />
CK Y<br />
3<br />
/G<br />
Cn AMD 2902 Cn+z /P<br />
5<br />
CK Registru dr Date<br />
MUX<br />
MSB<br />
Cn+4<br />
OVR<br />
2901 B F3<br />
Cn YCK F=0<br />
5<br />
R<br />
C<br />
o<br />
n<br />
d<br />
Conditii
Evaluarea intarzierilor in propagarea semnalelor:<br />
Unitatea de executie<br />
1. RμI Cesa → Iesire 15 ns<br />
2. 2901 B A,B → /G0, /P0 50 ns<br />
3. 2902 /G0, /P0 → Cn+z 10 ns<br />
4. 2901 B Cn → Cn+4, OVR,Y 29 ns<br />
5. RCond,MUX Intr→ Ies 21 ns<br />
6. 2901B RAM3 setup 16 ns<br />
Unitatea de Comanda.<br />
Total: 141 ns<br />
1. RμI Cesa → Iesire 15 ns<br />
6. MUX Selectie → Iesire 20 ns<br />
7. 2910 Conditii → Iesire 45 ns<br />
8. PROM Timpul de Acces 55 ns<br />
1. RμI Setup 5 ns<br />
Ceas (CK)<br />
140 ns<br />
Total: 140 ns
Unitati de executie integrate<br />
Unitatile de executie se prezinta sub forma unor circuite integrate pe scara medie/larga. De<br />
regula ele sunt structurate transe de biti astfel incat, prin concatenare si prin utilizarea unor<br />
circuite aditionale, se pot construi sisteme de prelucrare pentru date organizate pe 4, 8, 16, 24,<br />
32, 48 sau 64 de biti.<br />
Din punct de vedere structural unitatile de executie sunt constituite dintr-o unitate aritmetica-<br />
logica, logica de generare a indicatorilor de conditii, un ansamblu de registre generale, unul<br />
sau mai multe circuite de selectie, unn circuit de deplasare si din porturi de acces pentru<br />
intrarea/iesirrea datelor.<br />
Semnalele de comanda se aplica la intrarile special prevazute, fie codificate pe campuri, fie<br />
complet decodificate.<br />
Sistemul functioneaza sincron cu un ceas a carui frecventa de tact este conditionata de<br />
intarzierile semnalelor in unitatea de executie ( propagarea transportului, timpul de basculare a<br />
bistabilelor dintr-o stare in alta etc).<br />
Unitatile de executie integrate s-au comercializat in asociatie cu unitatile de comanda<br />
corespunzatoare si cu o serie de circuite aditionale, formand ceea ce se chiama microprocesoare<br />
pe transe de biti, microprocesoare "bit-slice", microprocesoare "multi-chip" etc.<br />
Printre celemai raspindite familii de microprocesoare"bit-slice"<br />
s-au aflat si cele produse de compania Advanced Micro Devices, sub numele de AMD 2900.<br />
In cele ce urmeaza va fi prezentata unitatea de executie AMD 2901 sub aspect structural-<br />
functional. De asemenea, se vor prezenta modalitatile de realizare a unor unitati de executie<br />
pentru prelucrarea datelor pe 16 biti, unitatile de comanda corespunzatoare, cat si elemente<br />
<strong>privind</strong> microprogramarea acestora.<br />
Unitatea de executie AMD 2901.<br />
Unitatea de executie AMD 2901 este organizata pe transe de 4 biti/circuit si este prevazuta cu<br />
elementele necesare cuplarii in cascada.<br />
Semnalele de comanda se aplica sub forma unor vectori binari la terminalele circuitului, fiind, de<br />
regula, preluate sub controlul unui circuit micro-secventiator integrat ( AMD 2909, 2911 ) de la<br />
o memorie cu continut permanent. Aceasta solutie se foloseste in cazul unitatilor de comanda<br />
microprogramate. Uneori, pentru a mari viteza de operare, in locul unitatii de comanda<br />
microprogramate se utilizeaza automate conventionale cu porti, bistabile si registre.
Unitatea de executie AMD 2901 dispune de urmatoarele resurse:<br />
- un ansamblu de 16 registre generale de cite 4 biti, organizate sub forma unei memorii<br />
(RAM) biport, cu doua intrari de adrese, o intrare de date si doua iesiri de date;<br />
- o unitate aritmetica-logica, cu transport anticipat, capabila sa efectueze 3 operatii aritmetice<br />
binare si 5 operatii logice si sa genereze, atit indicatorii de conditii: depasire, zero, semn,<br />
transport (Cn+4), cat si conditiile de propagare (P) si generare(G) ale transportului, la<br />
nivelul intregului circuit;<br />
- un selector de date (selector surse UAL) pentru cele doua intrari ale unitatii aritmetice-<br />
logice, care pot reprezenta combinatii intre iesirile memoriei biport (A,B), o intrare externa<br />
de date (D), constanta "zero" si iesirea unui registru su plimentar-extensie (Q);<br />
- un selector de iesire din circuit, care furnizeaza prin intermediul unor tampoane TS fie<br />
datele de la iesirea A, a memoriei biport, fie datele de la iesirea UAL;<br />
- un registru auxiliar-extensie (Q), care poate fi incarcat fie cu datele de la iesirea UAL, fie cu<br />
propriul sau continut deplasat stanga/dreapta prin intermediul unei retele logice de<br />
deplasare-multiplexor QSHIFT;<br />
- o retea de deplasare-multiplexor RAMSHIFT, plasata pe intrarea B a memoriei biport<br />
RAM.<br />
Indicatorii de conditii trebuie stocati intr-un registru dupa fiecare operatie efectuata de UAL.<br />
Circuitul afost realizat in diverse variante tehnologice: AMD 2901, 2901A, 2901B, 2901C, cu<br />
sporuri de viteza de 25%, 50% si - respectiv 75%, fata de 2901.<br />
In figura se prezinta schema bloc a circuitului AMD 2901.<br />
Continuturile celor 16 cuvinte din RAM pot fi citite la iesirile A si B, pe baza adreselor A si B,<br />
fiind stocate in doua circuite tampon/latch. Stocarea are loc pe frontul crescator al semnalului de<br />
ceas. Dupa tranzitia negativa a semnalului de ceas, in RAM, in locatia specificata de adresa B, se<br />
poate inscrie o noua valoare.<br />
Astfel, in cadrul unei perioade de ceas se efectueaza o operatie de citire si o operatie de scriere<br />
in RAM. Datele fortate in RAM sunt preluate direct sau deplasate dreapta/stinga, prin<br />
intermediul multiplexorului RAMSHIFT, de la iesirea F a UAL.<br />
Unitatea aritmetica-logica poate efectua, sub controlul semnalelor I3:5, trei operatii aritmetice<br />
binare si cinci operatii logice, asupra operanzilor aplicati la intrarile R si S.
4<br />
RAM0 RAM3 Q0 Q3<br />
0 RAMSHIFT 3<br />
0 QSHIFT 3<br />
Ceas<br />
Adrersa “A”<br />
4 4 CP I6:8<br />
Adresa “B” WE 4<br />
4 4<br />
Data D 4<br />
I0:2<br />
4 4 0<br />
D A B 0 Q<br />
Selector sursa<br />
R S<br />
4 4<br />
Cn G, P<br />
Cn R S<br />
UAL<br />
I3:5 (Cn+4, OVR, F=0, F3)<br />
4 4<br />
OE<br />
I6:8<br />
“B” DATAIN<br />
Citire<br />
RAM 16 × 4<br />
Citire/Scriere<br />
DATA OUT<br />
“A” “B”<br />
A F<br />
Selector Iesire<br />
Y<br />
Intrarile R si S ale UAL sunt preluate de la iesirile unui circuit selector (Selector sursa UAL),<br />
care sub controlul semnalelor I0:2, din intrarile D (Date externe), A, B, 0 si Q, poate furniza<br />
combinatiile AB;AD; AQ; A0; DQ; D0; Q0; BD; BQ; B0. In tabelul de mai jos se prezinta<br />
selectia surselor de operanzi pentru UAL.<br />
F QREG Q
Mnemonica Microcod Codul Sursa<br />
octal<br />
I2 I1 I0 R S<br />
AQ 0 0 0 0 A Q<br />
AB 0 0 1 1 A B<br />
ZQ 0 1 0 2 0 Q<br />
ZB 0 1 1 3 0 B<br />
ZA 1 0 0 4 0 A<br />
DA 1 0 1 5 D A<br />
DQ 1 1 0 6 D Q<br />
DZ 1 1 1 7 D Z<br />
Tab.1.<br />
Intrarea directa D este folosita pentru a introduce date in circuit, in RAM si in registrul Q.<br />
Registrul Q este utilizatin operatiilede inmultire si impartire, ca extensie sau ca<br />
acumulator/registru in unele aplicatii.<br />
Microcodul: I8:0 ( Structura vectorului de comanda ).<br />
9biti<br />
Operatiile efectuate de UAL sint prezentate in tabelul de mai<br />
jos:<br />
I8:6 I5:3 I2:0<br />
Destinatie UAL Functie UAL Sursa UAL<br />
8 7 6 5 4 3 2 1 0
Mnemonica Microcod Cod Functia Simbol<br />
octal UAL<br />
I5 I4 I3<br />
ADD 0 0 0 0 R Plus S R+S<br />
SUBR 0 0 1 1 S Minus R S-R<br />
SUBS 0 1 0 2 R Minus S R-S<br />
OR 0 1 1 3 R OR S R∪S<br />
AND 1 0 0 4 R AND S R∩S<br />
NOTRS 1 0 1 5 R AND S R & S<br />
EXOR 1 1 0 6 R EXOR S R⊕S<br />
EXNOR 1 1 1 7 R EXNOR S R≡S<br />
Tab. 2.<br />
Pe baza informatiilor din tabelele 1 si 2 se pot genera functiile aritmetice si logice realizate de<br />
unitatea de executie AMD 2901:<br />
AMD 2901 Functiile aritmetice. Tab.3.<br />
Microcod octal Cn=0 (Low) Cn=1(High)<br />
I5:3,I2:0 Grup Functie Grup Functie<br />
0 0 ADD A+Q ADD Plus1 A+Q+1<br />
0 1 A+B A+B+1<br />
0 5 D+A D+A+1<br />
0 6 D+Q D+Q+1<br />
0 2 Pass Q Increment Q+1<br />
0 3 B B+1<br />
0 4 A A+1<br />
0 7 D D+1<br />
1 2 Decrement Q-1 Pass Q
1 3 B-1 B<br />
1 4 A-1 A<br />
2 7 D-1 D<br />
2 2 Comple- -Q-1 Comple- -Q<br />
2 3 mentul -B-1 mentul -B<br />
2 4 fata de 1 -A-1 fata de 2 -A<br />
1 7 -D-1 -D<br />
1 0 Scadere Q-A-1 Scadere Q-A<br />
1 1 in com- B-A-1 in com- B-A<br />
1 5 plementul A-D-1 plemnetul A-D<br />
1 6 ata de 1 Q-D-1 fata de 2 Q-D<br />
2 0 A-Q-1 A-Q<br />
2 1 A-B-1 A-B<br />
2 5 D-A-1 D-A<br />
2 6 D-A-1 D-Q<br />
AMD 2901 Functii logice. Tab.4.<br />
Microcod octal Grup Functie<br />
I5:3,I2:0<br />
4 0 AND A ∩ Q<br />
4 1 A ∩ B<br />
4 5 D ∩ A<br />
4 6 D ∩ Q<br />
3 0 OR A ∪ Q<br />
3 1 A ∪ B<br />
3 5 D ∪ A<br />
3 6 D ∪ Q<br />
6 0 EXOR A ⊕ Q
6 1 A ⊕ B<br />
6 5 D ⊕ A<br />
6 6 D ⊕ Q<br />
7 0 EXNOR A ≡ Q<br />
7 1 A ≡ B<br />
7 5 D ≡ A<br />
7 6 D ≡ Q<br />
7 2 INVERT Q<br />
7 3 B<br />
7 4 A<br />
7 7 D<br />
6 2 PASS Q<br />
6 3 B<br />
6 4 A<br />
6 7 D<br />
3 2 PASS Q<br />
3 3 B<br />
3 4 A<br />
3 7 D<br />
4 2 "ZERO" 0<br />
4 3 0<br />
4 4 0<br />
4 7 0<br />
5 0 MASK A ∩ Q<br />
5 1 A ∩ B<br />
5 5 D ∩ A<br />
5 6 D ∩ Q<br />
Campul "Destinatie UAL" (I8:6) din vectorul de comanda I8:0 are o semnificatie complexa prin<br />
faptul ca specifica:
- operarea RAM (deplasare/incarcare/inactiv);<br />
- operarea registrului Q (deplasare/incarcare/inactiv);<br />
- conexiunile la RAMSHIFT (RAM0 si RAM3);<br />
- conexiunile la QSHIFT (Q0 si Q3);<br />
- iesirea Y.<br />
Terminalele RAM0/RAM3 si Q0/Q3, din punct de vedere electric, sunt terminale de<br />
intrare/iesire, controlul lor fiind asigurat de campul I8:6, din microcod.<br />
In tabelul de mai jos se prezinta semnificatiile campului I8:6, in conditiile in care:<br />
- B reprezinta locatia din RAM adresata pe baza adresei B;<br />
- UP inseamna deplasarea catre MSB;<br />
- DOWN specifica deplasarea catre LSB.<br />
Comanda destinatiei UAL Tab.5.<br />
Mnemo- M.cod Cod Functia RAM Functia Q Ies RAMSHIFT QSHIFT<br />
nica oct<br />
I8I7I6 Depl Incarc. Depl Incarc. Y RAM0 RAM3 Q0 Q3<br />
QREG 0 0 0 0 * Nu * Q←F F * * * *<br />
NOP 0 0 1 1 * Nu * Nu F * * * *<br />
RAMA 0 1 0 2 Nu B←F * Nu A * * * *<br />
RAMF 0 1 1 3 Nu B←F * Nu F * * * *<br />
RAMQD 1 0 0 4 DOWN B←F/2 DOWN Q←Q/2 F F0 IN3 Q0 IN3<br />
RAMD 1 0 1 5 DOWN B←F/2 * Nu F F0 IN3 Q0 *<br />
RAMQU 1 1 0 6 UP B←2F UP Q←2Q F IN0 F3 IN0 Q3<br />
RAMU 1 1 1 7 UP B←2F * Nu F IN0 F3 * Q3<br />
*)Din punct de vedere electric terminalul asigura o intrare TTL, conectata intern cu o iesire TS<br />
aflata in starea de mare impedanta.<br />
Intrarea B in RAM este furnizata de un multiplexor RAMSHIFT. Acesta, sub controlul<br />
microcodului I8:6, selecteaza intrarea directa sau deplasata stanga/dreapta, cu insertia unor date
speciice prin terminalele RAM3/RAM0. Dupa cum se va vedea ulterior (Fig. ), datele pentru<br />
terminalele RAM3/RAM0 sunt selectate cu ajutorul altor biti (MUX1, MUX0 ) din microcodul de<br />
comanda si cu un hardware aditional,constituit din doua multiplexoare AMD 25LS-253, cu cate<br />
8 intrari si 2 iesiri.<br />
Multiplexoarele AMD 25LS253, amintite mai sus, solutioneaza si problemele circuitului<br />
QSHIFT, care asigura una din intrarile registrului Q.<br />
Iesirea Y este realizata cu un circuit TS. Sub controlul semnalului OE, iesirea Y se conecteaza<br />
la o magistrala de date.<br />
Intrarea de ceas in circuitul AMD 2901 controleaza resursele RAM, Q si tampoanele-latch A si<br />
B, plasate pe iesirile RAM. Cand semnalul de ceas este pe nivel ridicat tampoanele A si B sunt<br />
activate, preluand datele din locatiile citite din RAM, pentru a le furniza la iesire, ca surse UAL.<br />
Pe durata nivelului coborat al semnalului de ceas tampoanele A si Bstocheaza datele incarcate<br />
anterior. In cazul in care se activeaza semnalul WE, pe nivelul coborat al semnalului de ceas se<br />
poate stoca in RAM noua data plasata la intrarea B, prin intermediul circuitului RAMSHIFT.<br />
I7 I7<br />
MUX0 MUX1 MUX0 MUX1<br />
1G A B 2G LSB MSB 1G A B 2G<br />
1C0<br />
1C0<br />
H 1C1<br />
1C1 H<br />
Q0 Q1<br />
1C2 1Y<br />
1Y 1C2<br />
1C3 25LS-253<br />
2C0<br />
AMD 2901<br />
25LS-253 1C3<br />
2C0<br />
H 2C1 2Y RAM1RAM3 2Y 2C1 H<br />
2C2<br />
2C2<br />
2C3<br />
2C3<br />
MSB-Fn
In continuare se va perzenta schema bloc partiala a unei unitati de executie pe 16 biti, constituita<br />
din patru circuite AMD 2901 si un circuit cu transport anticipat AMD 2902<br />
D0:3 D12:15<br />
Q0I/O Q15I/O<br />
Q0 Q3<br />
Q0 Q3<br />
RAM0I/O RAM15I/O<br />
Cin<br />
Observatie:<br />
F=0(2) F=0(3) 470Ω<br />
Pentru marcarea unor semnale active pe nivel coborat, in cazul de fata, numele semnalului a fost<br />
precedat de simbolul “/”.<br />
Unitatea de executie poate utiliza si multiplexoare 4:1 obisnuite, in locul celor produse de catre<br />
AMD, 25LS-253. In schema de mai jos se arata modul in care sunt interconectate logic cele 4<br />
multiplexoare.<br />
Plecand de la elementele prezentate anterior se poate construi formatul cuvantului de comanda,<br />
al microinstructiunii, pentru controlul unitatii de executie.<br />
In scop didactic se va considera data de prelucrat continuta in microinstructiune, intr-un camp<br />
D. In cazul unei unitati de prelucrare pe 4 biti, campul D va avea, de asemenea, 4 biti. Pe masura<br />
+5V<br />
ce creste lungimea cuvantului prelucrat, va creste si dimensiunea campului D, din<br />
microinstructiune.<br />
RAM0 RAM3<br />
/G<br />
/P<br />
AMD 2901(1)<br />
Cn+4<br />
OVR<br />
F3<br />
Cn F=0<br />
RAM0 RAM3<br />
/G<br />
/P<br />
AMD 2901(4)<br />
Cn+4<br />
OVR<br />
F3<br />
Cn F=0<br />
/P0 /G0 /P1 /G1 /P2 /G2 /P3 /G3<br />
Cn AMD 2902 /G<br />
Cn+x Cn+y Cn+z /P
“0”<br />
MUX1,MUX0<br />
MUX MUX MUX MUX<br />
RAM SHIFT QSHIFT<br />
0 3 0 3 F3<br />
In conditiile plasarii unor multiplexoare pe intrarile de deplasare ale circuitelor RAMSHIFT si<br />
QSHIFT registrele R si Q se pot concatena in vederea efectuarii unor deplasari sau rotiri duble,<br />
conform tabelului de mai jos (originea de indexare este la stanga):<br />
MUX1MUX0 TIP DREAPTA (JOS) STANGA (SUS)<br />
0 0 ZERO RAM3 ← 0; RAM0 ← 0;<br />
Q3 ← 0 Q0 ← 0<br />
0 1 ROTIRE RAM3 ← RAM0 ; RAM0 ← RAM3;<br />
Q3 ← Q0 Q0 ← Q3<br />
1 0 ROTIRE CU RAM3 ← Q0; RAM0 ← Q3;<br />
LUNGIME DUBLA Q3 ← RAM0 Q0 ← RAM3<br />
1 1 DEPLASARE RAM3 ← F3 ; RAM0 ← Q3;<br />
DUBLA Q3 ← RAM0 Q0 ← 0<br />
ARITMETICA
Cuvantul (microinstructiunea) de comanda al unitatii de executie va avea structura urmatoare:<br />
23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0<br />
M I8 I7 I6 M I2 I1 I0 Cn I5 I4 I3 A3 A2 A1 A0 B3 B2 B1 B0 D3 D2 D1 D0<br />
U Selectie U Selectie Operatie Adresa “A” Adresa “B” Data “D”<br />
X destinatie X sursa UAL<br />
1 2<br />
Se poate observa ca, microinstructiunea care controleaza unitatea de executie poseda 24 de biti.<br />
Bitii 0,..,3 au aparut ca urmare a inglobarii datei in microinstructiune (microinstructiune cu<br />
operand imediat). Campul D se va extinde in incrementi de 4 biti odata cu extinderea lungimii<br />
cuvantului prelucrat de catre unitatea de executie. Campul Cn este asociat cu transportul in<br />
rangul cel mai putin semnificativ al unitatii de executie, fiind la latitudinea celui care scrie<br />
microprogramul.
Unitati de comanda integrate. Secventiatorul de microprogram AMD 2909.<br />
Secventiatorul de microprogram AMD 2909 face parte din familia de circuite AMD2900 si<br />
constituie elementul de baza in jurul caruia este organmizata unitatea de comanda<br />
microprogramata.<br />
Dupa cum s-a aratat in paragraful anterior, atat unitatea de executie AMD 2901, cat si circuitele<br />
asociate acesteia sunt controlate cu ajutorul unui vector de comanda constituit din campuri de<br />
biti, cu functii bie precizate. Un asemenea vector controleaza operatii aritmetice elementare,<br />
care se pot efectua pe durata unei perioade de ceas. Vectorul semnalelor de comanda poate fi<br />
generat cu ajutorul unui circuit secvential, in cazul unitatilor de comanda conventionale, sau<br />
extras dintr-o memorie cu continut permanent, in cazul unitatilor de comanda microprogramate.<br />
Operatiile cu caracter complex, printre care se numara si instructiunile calculatoarelor<br />
conventionale, se implementeaza sub forma unor secvente de vectori de comanda. In sistemele<br />
microprogramate aceste secvente sunt stocate intr-o memorie de control sau memorie de<br />
microprograme.<br />
Un cuvant al memoriei de control reprezinta un vector de comanda sau o microinstructiune.<br />
Secventiatorul de microprogram, structurat pe transe de cate 4 biti, este destinat generarii<br />
adreselor de microinstructiuni si asigurarii inlantuirii acestora.<br />
Secventiatorul, prezentat mai jos, are ca resurse hardware:<br />
- Contorul de MicroProgram (CMP);<br />
- Registrul de Ramificare (RR);<br />
- Indicatorul de Stiva (IS);<br />
- STiVa (STV) cu capacitate de 4 cuvinte × 4 biti;<br />
- INCrementatorul (INC);<br />
- MultipleXorul (MUX) 4 × (4 : 1);<br />
- Tampon cu trei Stari (TS) si alte circuite logice combinationale auxiliare.<br />
Schema bloc a unitatii de comanda va contine, pe langa microsecventiator, si elementele<br />
necesare realizarii unei unitati de comanda:<br />
- Memoria de Microprogram (MM);<br />
- Registrul MicroInstrucriunii (RMI);<br />
- un Comutator de Adrese (CA);<br />
- o memorie de tip PROM.
RE<br />
D3:0<br />
S0<br />
S1<br />
ORi<br />
ZERO<br />
OE Y[4]<br />
R[3:0] FE PUP(PUSH/POP)<br />
Cn<br />
Cn+4<br />
Ceas<br />
Prin conectarea in cascada a trei asemenea circuite se asigura o adresa de microinstructiune de<br />
12 biti, ceea ce permite accesul la o memorie de comanda cu capacitatea de 4096 cuvinte.<br />
Secventiatorul furnizeaza o adresa Y[4] de microinstructiune, care reprezinta iesirea X[4] a<br />
multiplexorului prelucrata logic. Multiplexorul are ca intrari selectabile cu ajutorul semnalelor<br />
S1,S0:<br />
- adresa externa D;<br />
- continutul Registrului de Ramificare (RR);<br />
- continutul varfului stivei (STV)<br />
- continutul Contorului de MicroProgram.<br />
Iesirea Y este furnizata prin intermediul unui circuit tampon TS, controlat de semnalul OE.<br />
Din punct de vedere logic, Y[4] se exprima astfel:<br />
Y[4] = ZERO ∩ (Y[4] ∪ OR[4])<br />
RR[4] IS<br />
D RR STV CMP<br />
MUX<br />
X[4]<br />
SAU-NU<br />
SI<br />
TS<br />
STV<br />
4 cuv.× 4 biti<br />
CMP[4]<br />
unde OR[4] este un vector logic aplicat din exterior, adesea avand toti bitii egali cu 1. ZERO<br />
INC
este, de asemena, un vector logic, care paote face ca Y[4]a aibe toate rangurile egale cu 0. In<br />
acest mod se pot forta valori particulare pentru adresa microinstructiunii urmatoare sau se pot<br />
efectua transferuri relative la adresa curenta.<br />
Secventierea microinstructiunilor este realizata prin controlul circuitului 2909 cu ajutorul<br />
semnalelor preluate din campurile de control ale microinstructiunii si de la conditiile externe.<br />
Operarea microsecventiatorului este descrisa cu ajutorul urmatoarelor tabele:<br />
Selectie MUX: Controlul Iesirii:<br />
S1 S0 IESIRE ORi ZERO OE Yi<br />
0 0 CMP * * 1 Z (TS)<br />
0 1 RR * 0 0 0<br />
1 0 STV 1 1 0 1<br />
1 1 D 0 1 0 IES MUX<br />
Operarea Stivei:<br />
FE PUP OPERATIE<br />
1 * inactiva<br />
0 1 IS ← INC(IS); PUSH(CMP)<br />
0 0 POP(STV); DCR(IS)<br />
In functie de semnalele de control si de conditiile externe, microsecventiatorul poate realiza<br />
urmatoarele operatii de control, la nivelul microprogramului:<br />
- transfer neconditionat la adresa X – mnemonica J X;<br />
- chemare de micro subrutina – mnemonica CALL X;<br />
- revenire din microsubrutina – mnemonica RETURN;<br />
- trecerea la microinstructiunea urmatoare din secventa – mnemonica CONTINUE.<br />
Transferul neconditionat la adresa X se realizeaza prin aplicarea vectorului binar X la intrarea D<br />
a multiplexorului si a urmatorului vector binar la intrarile de control ale microsecventiatorului:<br />
S1 S2, FE, PUP, OR[4], ZERO = 1 1, 1, *, 0000, 1<br />
Chemarea unei microsubrutine, de la adresa X, este asigurata prin fortarea adresei X in registrul<br />
RR si prin aplicarea urmatorului vector binar la intrarile de control ale microsecventiatorului:
S1 S2, FE, PUP, OR[4], ZERO = 0 1, 0, 1, 0000, 1<br />
Revenirea dintr-o microsubrutina este implementata folosind un vector de control al<br />
microsecventiatorului cu urmatoarea structura:<br />
S1 S2, FE, PUP, OR[4], ZERO = 1 0, 0, 0, 0000, 1<br />
Trecerea la urmatoarea microinstructiune din secventa impune ca adresa Y sa corespunda<br />
continutului Contorului de Microprogram, ceea ce se realizeaza cu ajytorul urmatorului vector<br />
de comanda:<br />
S1 S2, FE, PUP, OR[4], ZERO = 0 0, 1, *, 0000, 1<br />
Conform celor aratate mai sus, microsecventiatorul efectueaza urmatoarele operatii privitoare la<br />
generarea adresei Y a microinstructiunii urmatoare si la modificarea continuturilor Contorului<br />
de MicroProgram si Stivei:<br />
Y = (((CMP ! RR ! STV ! D) * DCD0:3(S1,S0) ∪ OR0:3) ! 4 0)* (ZERO, ZERO)<br />
CMP ← ((INC(CMP ! RR ! STV ! D) * DCD0:3(S1,S0) ∪ OR0:3) ! 4 0)* (ZERO, ZERO)<br />
STV ← ((STV1:3 ! STV0) ! (CMP ! CMP ! STV0:2) ! STV ! STV) * DCD0:3(FE, PUP)<br />
Conectarea in cascada a circuitelor microsecventiatorului pemite explorarea unui spatiu mai<br />
mare in memoria de microprogram. Mai jos se prezinta interconectarea in cascada a trei<br />
microsecventioatoare AMD 2909.<br />
S0:1<br />
OR0:3<br />
altele<br />
4<br />
R D<br />
S0:1<br />
AMD2909<br />
OR0:3<br />
Cn Cn+4<br />
altele<br />
Y0:3<br />
R D<br />
4 12 12 4<br />
R D<br />
S0:1<br />
AMD2909<br />
OR0:3<br />
Cn Cn+4<br />
altele<br />
Y0:3<br />
Y0:11<br />
4<br />
R D<br />
S0:1<br />
AMD2909<br />
OR0:3<br />
Cn Cn+4<br />
altele<br />
Y0:3
Dupa cum s-a mai aratat, pentru realizarea unei unitati de comanda, microsecventiatorul trebuie<br />
prevazut cu o serie de circuite auxiliare, care sunt prezentate in figura de mai jos:<br />
AMD29751<br />
A4:1<br />
CA<br />
A0<br />
PROM<br />
CS P3:0 AMD2909 Y[4]<br />
RR[4] IS<br />
D RR STV CMP<br />
MUX<br />
X[4]<br />
MM<br />
RMI<br />
AMD2918<br />
STV<br />
4 cuv.× 4 biti<br />
MUX0,MUX1<br />
ADRESA “A”<br />
CMP[4]<br />
INC<br />
ADRESA “B”<br />
DATA “D”<br />
Cn<br />
SELECTIE SURSA (I2:0)<br />
OPERATIE UAL (I5:3)<br />
SELECTIE DESTINATIE (I8:6)<br />
SELECTIE COD CONDITIE (P3:0)<br />
CODUL CONDITIEI SELECTATE<br />
Cn+4
Intre acestea un rol deosebit il joaca memoria PROM 29751, care furnizeaza semnalele de<br />
comanda pentru microsecventiator. Continutul acestei memorii PROM este citit pe baza unei<br />
adrese obtinute dintr-un camp P0:3, al registrului microinstructiunii RMI. Bitii P0:3 ai<br />
microinstructiunii se transforma in bitii de adresa A1:4, ai memoriei PROM, in timp ce bitul A0<br />
este furnizat de iesirea unui multiplexor la intrarile caruia se aplica indicatorii de conditii, cat si<br />
alte semnale. Intrarile de date ale multiplexorului au fost stabilite pe durata executiei<br />
microinstructiunii precedente. Intrarile de selectie ale multiplexorului sunt asigurate tot de bitii<br />
P0:3, furnizati de microinstructiunea curenta. In figura de mai jos se prezinta o schema bloc a<br />
unitatii de comanda, cu indicarea elementelor discutate anterior.<br />
MUX<br />
Magistrala pentru date si instructiuni<br />
Registrul Instructiunii RI<br />
Cod operatie adresa, etc.<br />
PROM mapare adresa<br />
O5<br />
PROM<br />
29751 O4<br />
O3<br />
A0 O2<br />
O1<br />
O0<br />
A4A3A2A1<br />
D[4] R[4]<br />
OR[4]<br />
ZERO<br />
PUP AMD 2909<br />
FE<br />
S1 Cn+4<br />
S0 Cn<br />
Yout<br />
Adresa<br />
Memoria de<br />
4 4 microprogram<br />
R3:0<br />
RMI<br />
Semnale de<br />
P3:0 comanda
Operarea unitatii de comnada microprogramata este stabilita prin continutul memoriei PROM,<br />
care furnizeaza la iesire semnalele O5:0, care reprezinta vectorul de comanda al<br />
microsecventiatorului: OR[4], ZERO, PUP, FE, S1, S0. In locatiile memoriei PROM, adresate cu<br />
ajutorul campului P3:0, sunt stocati vectori de comanda, care impun unitatii de comanda<br />
microprogramate efectuarea operatiilor prezentate in tabelul de mai jos:<br />
P3:0 Operatie Mnemonica<br />
cod hexa<br />
0 Ramificare la adresa R daca F ≠ 0 JRNZF<br />
1 Ramificare neconditionata la adresa R JR<br />
2 CONTINUA CONT<br />
3 Ramificare la adresa D JD<br />
4 Ramificare la subrutina cu adresa R daca F ≠ 0 JSRNZF<br />
5 Ramificare la subrutina cu adresa R JSR<br />
6 Revenire din subrutina RS<br />
7 Ramificare la adresa continuta in varful stivei (fara POP) JSTV<br />
8 Terminare de ciclu si POP daca F = 0 TCPOZF<br />
9 PUSH si CONTINUA PUCONT<br />
A POP si CONTINUA POCONT<br />
B Terminare de ciclu si POP daca Cn+4 = 1 TCPOC<br />
C Ramificare la adresa R daca F = 0 JRZF<br />
D Ramificare la adresa R daca F3 = 1 JRF3<br />
E Ramificare la adresa R daca OVR = 1 JROVR<br />
F Ramificare la adresa R daca Cn+4 = 1 JRC<br />
Se poate observa, in ultima schema bloc, faptul ca intrarea R a microsecventiatorului este<br />
preluata direct de la iesirea memoriei de comanda, fara a mai fi stocat in prealabil in registrul<br />
microinstructiunii RMI. In acest mod adresa de ramificare se incarca direct in registrul R al<br />
microsecventiatorului.<br />
Din cele prezentate rezulta ca operarea microsecventiatorului este controlata de doua campuri<br />
ale microinstructiunii stocate in Memoria de comanda. Este vorba de campul P3:0, care
stabileste operatia, conform tabelului de mai sus, si de campul R3:0, al adresei de ramificare.<br />
Prin concatenarea mai multor microsecventiatoare campul P ramane constant ca lungime, in<br />
timp ce campul R se modifica, in incrementi de cate 4 biti, pentru a furniza spatii de adresare<br />
mai mari in memoria de microprogram.<br />
Structura unui cuvant – microinstructiune, destinat controlului unui microsecventiator AMD<br />
2909, este formata din doua campuri de cate patru biti:<br />
- campul P, care specifica modul de obtinere a microinstructiunii urmatoare, si<br />
- campul R, care defineste adresa de salt, daca este cazul.<br />
31 30 29 28 27 26 25 24<br />
R3 R2 R1 R0 P3 P2 P1 P0<br />
Adresa de Obtinerea μI<br />
salt urmatoare<br />
Microprogramarea unui procesor “bit-slice”, constituit cu ajutorul circuitelor AMD 2901<br />
si AMD 2909, in vederea prelucrarii datelor pe 4 biti.<br />
(Urmeaza mai multe exemple de microprograme)
Sinteza circuitelor combinationale<br />
Minimizarea folosind diagrama Karnaugh. (D-K)<br />
1. Copiaza tabela de adevar in (D-K)<br />
2. Identifica subcuburile: selecteaza la fiecare pas pe cel mai mare subcub, chiar<br />
daca se suprapune cu alte cuburi selectate anterior, pana la acoperirea tuturor<br />
unitatilor (Incearca: 4×4, 2×4 si 4×2, 1×4 si 4×1, 2×1 si 1×2, in final 1×1) .<br />
3. Genereaza realizarea minimala ca Suma de Produse (SP).<br />
Termenii incercuiti poarta numele de implicanti. Un implicant care nu estcontinut<br />
complet intr-un alt implicant poarta numele de implicant prim.<br />
Cazul SP nonminimale
Structuri utile de porti.
Logica pentru Sumatorul Complet (SC)<br />
Ecuatia transportului C0 poate fi simplificata destul de usor:<br />
C0 = BC + AB+ AC<br />
In schimb, suma, S, nu are o realizare simpla de SP, chiar daca ea poate fi<br />
implementata cu doua porti XOR, cu cate doua intrari.<br />
Sinteza logica folosind multiplexoare (MUX-uri)
Implementarea sistematica a logicii combinationale.<br />
Optimizari in cazul logicii cu MUX-uri<br />
Sinteza bazata pe Tabele de Cautare (Lookup Tables)<br />
Teoretic, se poate construi oricare bloc logic combinational, cu o iesire, folosind<br />
multiplexoare. Pentru o functie de N variabile este necesar un multiplexor cu 2 N<br />
intrari.
Structura unui Multiplexor<br />
Multiplexoarele pot fi partitionate in doua sectiuni cu functiile de decodificare si<br />
selectare. Decodificatorul identifica intrarea dorita, iar Selectorul transfera la iesire<br />
acea intrare.<br />
Prin partajarea sectiunii de decodificare, multiplexoarele pot fi utilizate la<br />
implementarea tabelelor de cautare cu un numar oarecare de iesiri.<br />
Decodificatorul<br />
Decodificatorul dispune de k intrari, denumite intrari de selectie si N=2 k iesiri de date.<br />
Se poate construi un tablou bidimensional format din decodificatoare si selectoare,<br />
dupa cum se arata in continuare.<br />
Partajarea logicii de decodificare.<br />
Astfel, se poate realiza un dispozitiv universal de tip tabela de cautare, denumit<br />
Memorie cu Continut Permanent (ROM – Read Only Memory), cu ajutorul careia se<br />
poate implementa oricare tabela de adevar si, astfel, oricare dispozitiv logic<br />
combinational.
ROM - detalii de implementare<br />
Logica SI cablata, logica SAU programabila<br />
Avantaje:<br />
- proiect cu o structura regulata<br />
- proiectarea poate fi complet automatizata<br />
Dezavantaje:<br />
- Tranzistoarele “trage sus” sunt active, ceea ce implica cosum static de putere<br />
- Trasee lungi de metal, cu capacitati mari<br />
- Viteza de lucru relativ mica.<br />
Terminologie:<br />
- Intrarille circuitului ROM: adrese<br />
- Iesirile decodificatorului: linii de cuvint<br />
- Iesirile selectorului: linii de bit<br />
Cresterea vitezei in cazul ROM<br />
Cresterea vitezei in cazul ROM se poate realiza prin reducerea capacitatiilor<br />
traseelor lungi de metal, care strabat structura.
Cea mai buna metoda consta in realizarea unei structuri patrate.<br />
Intrebari:<br />
- De ce sau folosit circuite NOR?<br />
- Nu se puteau elimina unele inversoare in cazul folosirii circuitelor NAND?<br />
Observatii <strong>privind</strong> utilizarea circuitelor ROM<br />
pentru implementarea logicii combinationale<br />
- ROM nu tine seama de structura functiilor combinationale<br />
- Dimensiunea, planul (layout) si proiectul sunt independente de functie<br />
- Oricare tabela de adevar poate fi implementata/”programata” prin reconfigurari<br />
minore:<br />
- stratul de metal (ROM cu masca)<br />
- fuzibile (PROM –Field programmable ROM)<br />
- sarcini pe portile flotante (EPROM – Erasable PROM) etc<br />
Model: valorile functiei in tabela de cautare se iau din tabela de adevar.<br />
Intrari: “ADRESE” corespunzatoare celor N intrari<br />
Dimensiunea ROM ≈ 2 N × Nr.iesiri.<br />
Intrebari:<br />
- De ce dimensiunile ROM cresc cu un factor egal cu 4?<br />
- La iesirea unui circuit ROM se pot observa “glitch-uri”? Explicatie.<br />
Exemplu: Zar cu 7 fatete.<br />
Intrucat mecanic nu se poate realiza un zar cu 7 fatete, se va incerca o implementare<br />
electronica, pornind de la fatetele de zar de mai jos:<br />
Cu ajutorul unui tablou de LED-uri, marcate ca mai jos, se pot afisa fatetele zarului:<br />
Proiectare bazata pe ROM<br />
Proiectul consta in scrierea tabelei de adevar<br />
Optimizari: eliminarea iesirilor redundante si examinarea adresarii.
O implementare ROM simpla<br />
PLA (Programmable Logic Array -Tablou Logic Programabil)<br />
In cazul in care termenii AND ai decodificatorului din ROM ar putea fi<br />
programabili, ca si termenii SAU, s-ar putea folosi o serie de metode de minimizare<br />
in scopul reducerii dimensiunilor tabloului ROM. Se obtine un dispozitiv universal.<br />
Implementarea PLA a Zarului cu 7 fatete<br />
Ca si in cazul ROM, PLA asigura sinteza functiilor logice arbtrare utilizand<br />
implementari bazate pe SP.
Avantaje:<br />
- implementari minimizate si rapide<br />
- structuri regulate:<br />
- generare automata<br />
- proiectare facila<br />
- mai lenta decat implementarea optimala cu porti.<br />
Impachetarea PLA<br />
Adesea aceeasi linie de bit poate fi partajata de doua iesiri. I mod similar, este<br />
posibil, sa se aduca intrarile pe ambele laturi ale tabloului, ceea ce face ca desenul sa<br />
arate ca o pereche de PLAuri in oglinda.<br />
PAL (Programmable Array Logic – Tablouri ProgramabileLogice)<br />
O alta abordare a proiectarii logice structurate o constituie PAL-urile. Aceste<br />
dispozitive au fost in voga in anii 80 intrucat au inlocuit cu succes portile TTL si au<br />
contribuit la lansarea microprocesoarelor. Actualmente sunt depasite..<br />
PAL-urile au un decodificator programabil (planul AND) si o logica de slectie fixa.<br />
Aceste dispozitive au fost utile pentru implementarea expresiilor logice sub forma de<br />
SP, asigurand in acelasi timp, si posibilitati de comanda a sarcinilor mari. Ele se
procurau sub forma neprogramata. Programarea se putea face de catre utilizator cu<br />
echipamente ieftine.<br />
Concluzii:<br />
Multiplexoarele:<br />
- Un multiplexor cu N intrari poate implementa tabele de adevar cu N intrari si o<br />
iesire<br />
ROM-urile<br />
- Logica de decodificare partajata<br />
- Genereaza toate produsele<br />
- Pot implementa tabele de adevar cu un numar oarecare de iesiri<br />
- Usor de specificat<br />
- Plan (layout) regulat<br />
- Utilizare ineficienta a spatiului/timpului<br />
PLA-urile<br />
- Asigura realizari minimizate pentru SP<br />
- Genereaza numai produsele necesare<br />
- Pentru proiecte compacte este necesara minimizarea<br />
- Plan (layout) regulat<br />
PAL-urile<br />
- Usor de prefabricat si de impachetat<br />
Metode moderne: Celule Standard<br />
Se creaza, mai intai, o biblioteca de celule logice: porti, registre, multiplexoare,<br />
sumatoare, ploturi de I/E etc. O foaie de catalog, pentru fiecare celula, descrie functia,<br />
aria ocupata, puterea consumata, timpul de propagare, timpii de crestere si de cadere<br />
ca functii de sarcina etc<br />
Exemplu de celula standard<br />
Ca si in cazul proiectarii plachetelor la nivel de componente, cu doua decade in urma,<br />
uneltele CAD plaseaza si interconecteaza celulele, urmarindu-se:<br />
- minimizarea ariei ocupate<br />
- satisfacerea restrictiilor de timp.
Arii/Tablouri de Porti: <strong>Scurt</strong>area timpului de realizare a proiectului<br />
Tablourile de porti utilizeaza tablouri fixe de tranzistoare, care sunt “personalizate” in<br />
etapa finala de procesare in care se adauga fire/trasee metalice si contacte.<br />
Cea mai populara arhitectura este “Marea de Porti” (Sea of Gates), in care nucleul<br />
circuitului integrat este un tablou continuu de tranzistoare MOS. Trasarea straturilor<br />
de metal se efectueaza peste partea superioara a tranzistoarelor nefolosite.<br />
Avantaje:<br />
- pot fi prefabricate<br />
- sunt personalizate numai ultimele masti.
Tablou de porti: Exemplu.