Sunteți pe pagina 1din 33

Sisteme Digitale

Reprezentarea Informației prin Simboluri Discrete (Digits)

Definiție: Un sistem digital este orice sistem de calcul ce reprezintă informația sub forma unui set finit de
simboluri. Fiecare din aceste simboluri este un digit. Sistemele digitale realizează calcule și alte procesări asupra
informației exprimate sub formă digitală. Spre deosebire de sistemele digitale, cele analogice reprezintă
informația sub forma unui set continuu și infinit de valori.

Exemple de seturi de simboluri digitale:


 Alfabetul latin
 Cifrele de la 0 la 9 (simbolurile zecimale)
 Cifrele 0 și 1 (simbolurile binare)

Aceste seturi de simboluri pot fi folosite pentru a reprezenta valori numerice.

Sisteme Digitale
Reprezentarea Digitală a Valorilor Numerice
În orice sistem digital, valorile numerice sunt reprezentate printr-o secvență de N simboluri digitale de
forma aN-1aN-2aN-3aN-4...a5a4a3a2a1a0. Numărul de simboluri din setul folosit reprezintă baza de numerație. De
exemplu, în cazul setului de simboluri zecimal, baza de numerație este 10, iar în cazul setului de simboluri binar,
baza de numerație este 2.

Valoarea numerică (reprezentată zecimal) V a unei secvențe de simboluri într-o bază de numerație B este dată
de ecuația:

𝑉=∑𝑁−1𝑖=0(𝑎𝑖𝐵𝑖)V=∑i=0N−1(aiBi)

Exemple:
 Secvența de simboluri 1101 în baza 2 are valoarea zecimală 13
 Aceeași secvență de simboluri are în baza 3 valoarea 37

Folosind ecuația de mai sus se poate determina valoarea maximă pe care o poate avea o secvență
de N simboluri într-o bază de numerație B.

𝑉𝑁,𝐵𝑀𝐴𝑋=𝐵𝑁−1VMAXN,B=BN−1

Transformarea inversă, a valorii V din zecimal într-o bază de numerație B, se realizează identificând cea mai
mare putere a lui B care este mai mică decât V, scăzând această valoare din V, și repetând iterativ până
când V devine zero, atribuind în același timp valori simbolurilor ai.

Exemplu: să se transforme valoarea 56 din zecimal în binar


1. identificăm 25=32 ca fiind cea mai mare putere a lui 2 care este mai mică sau egală cu 56
2. scădem 32 din 56 și obținem 24
3. notăm a5=1
4. identificăm 24=16 ca fiind cea mai mare putere a lui 2 care este mai mică sau egală cu 24
5. scădem 16 din 24 și obținem 8
6. notăm a4=1
7. identificăm 23=8 ca fiind cea mai mare putere a lui 2 care este mai mică sau egală cu 8
8. scădem 8 din 8 și obținem 0
9. notăm a3=1
10. pentr că am redus valoarea inițială la zero, notăm a2=0, a1=0, a0=0,
11. secvența binară obținută este 111000
Se poate observa din ecuațile de mai sus că bazele de numerație mai mari pot reprezenta valori mai mari
folosind un număr dat de simboluri. Altfel formulat, pentru reprezentarea unei valori V este de regulă nevoie de
cu atât mai multe simboluri cu cât baza de numerație este mai mică. Prin urmare baza 2 (reprezentarea binară)
este cea mai ineficientă din acest punct de vedere, necesitând numărul cel mai mare de simboluri pentru
reprezentarea oricărei valori numerice. Este oare justificată folosirea reprezentării binare în calculatoarele
numerice? Am putea obține rezultate mai bune folosind de exemplu reprezentare ternară (baza 3)?

Semnificația Electrică a Simbolurilor Digitale. Avantajele Reprezentării Binare


Deoarece scopul acestui curs este de a implementa circuite electronice care realizează manipulări ale
simbolurilor digitale, trebuie să luăm în considerare reprezentarea electrică a acestor simboluri. Pornim de la
următoarele condiții:
 Circuitul nostru este alimentat la o tensiune VCC și are conexiune la masă (GND, 0 Volt)
 Prin urmare, diferența maximă de tensiune în circuit este VCC
 Circuitul este afectat de zgomot alb aditiv de amplitudine maximă VZ
 Dorim să reprezentăm electric în acest circuit B simboluri ce vor fi recunoscute atunci când se manifestă
la bornele circuitului
 Dorim să maximizăm fiabilitatea circuitului, astfel încât probabilitatea unei confuzii între două simboluri
să fie minimă.

Evident, soluția naturală de reprezentare este să asociem fiecare din cele B simboluri unei valori particulare de
tensiune între 0V și VCC. Circuitul va interpreta orice valoare VS a tensiunii de la bornele sale ca fiind un simbol.
Mai precis, circuitul va interpreta valoarea de tensiune VIN = VS+VZ fiind posibil ca, din cauza adăugării tensiunii
de zgomot peste tensiunea de la borne, să se realizeze greșit interpretarea simbolului de la bornele circuitului.
Condiția de maximizare a fiabilității circuitului ne duce la soluția unde cele B simboluri sunt maximal spațiate în
gama 0-VCC astfel încât diferența de tensiune între două simboluri este de minim VCC/(B-1) și tensiunile
corespunzătoare simbolurilor sunt:

𝑉𝑖=𝑖𝑉𝐶𝐶𝐵−1,∀𝑖∈[0,𝐵)Vi=iVCCB−1,∀i∈[0,B)

Avem astfel o soluție optimă pentru orice bază de numerație B. Totuși, rămâne de evaluat dacă există diferențe
din punctul de vedere al fiabilității între diferite baze de numerație, în contextul dat. Pentru fiecare bază de
numerație, valoarea maximă a zgomotului tolerat este egală cu diferența de tensiune între simboluri, ce este
invers proporționață cu numărul de simboluri. Rezultă astfel că baza de numerație 2 (reprezentarea binară)
tolerează zgomotul de valoare maximă, oferind astfel fiabilitate optimă circuitului.

Conversia Analogic-Digital
Majoritatea semnalelor întâlnite în lumea înconjurătoare sunt analogice:
 temperatura
 sunetul
 intensitatea luminoasă
Prin urmare, procesarea digitală a acestor semnale necesită mai întâi o transpunere a semnalului din domeniul
analogic în domeniul digital (Analog-to-Digital Conversion, sau ADC). Acest proces se face în doi pași:
1. eșantionarea semnalului analogic la momente discrete de timp
2. cuantizarea valorii analogice, prin atribuirea unui simbol digital sau secvență de simboluri, din setul de
valori suportate de sistemul digital
Acest proces e ilustrat în figura de mai jos:
De asemenea, efectul unei procesări în domeniul digital este de multe ori necesar a se manifesta în mod
analogic: aprinderea unui LED cu intensitate variabilă, producerea unui semnal vocal, etc. Din acest motiv
sistemele digitale se interfațează de cele mai multe ori cu lumea analogică prin convertoare digital-analogice.
Un sistem complet este ilustrat în figura de mai jos și realizează digitizarea unui semnal analogic, procesarea sa
în domeniul digital, apoi conversia rezultatelor în semnale analogice.

Logică Booleană
Axiomele Algebrei Boolene
Algebra Booleană definește operații matematice pe valori binare. Folosind algebra Booleană putem implementa
procesări matematice asupra unor valori exprimate binar, și putem de asemenea realiza optimizări asupra
funcțiilor logice și matematice pentru ale reduce complexitatea.

Algebra Booleană este definită prin următoarele axiome:


1. Se definesc operatorii + (SAU logic) și • (ȘI logic) care au proprietatea de închidere în spațiul numerelor
binare, ceea ce înseamnă că orice rezultat al operațiilor ȘI, respectiv SAU este tot un număr binar.
1. 𝑥+𝑦=1x+y=1 doar dacă minim unul din operanzi este 1
2. 𝑥⋅𝑦=1x⋅y=1 doar dacă ambii operanzi sunt 1
2. Numărul 0 este elementul neutru al operatorului SAU
3. Numărul 1 este elementul neutru al operatorului ȘI
4. Operatorii ȘI, respectiv SAU sunt comutativi:
1. 𝑥+𝑦=𝑦+𝑥x+y=y+x
2. 𝑥⋅𝑦=𝑦⋅𝑥x⋅y=y⋅x
5. Operatorii ȘI, respectiv SAU sunt distributivi:
1. 𝑥⋅(𝑦+𝑧)=𝑥⋅𝑦+𝑥⋅𝑧x⋅(y+z)=x⋅y+x⋅z
2. 𝑥+(𝑦⋅𝑧)=(𝑥+𝑦)⋅(𝑥+𝑧)x+(y⋅z)=(x+y)⋅(x+z)
6. Operatorii ȘI, respectiv SAU sunt asociativi:
1. 𝑥+(𝑦+𝑧)=(𝑥+𝑦)+𝑧x+(y+z)=(x+y)+z
2. 𝑥⋅(𝑦⋅𝑧)=(𝑥⋅𝑦)⋅𝑧x⋅(y⋅z)=(x⋅y)⋅z
7. Se definește complementul unui număr 𝑥x, notat 𝑥′x′, astfel încât:
1. 𝑥⋅𝑥′=0x⋅x′=0
2. 𝑥+𝑥′=1x+x′=1

Precedența operatorilor este următoarea (de la cel mai prioritar către cel mai puțin prioritar):
1. Parantezele
2. Operatorul de complementare
3. Operatorul ȘI
4. Operatorul SAU

Folosind aceste axiome poate fi analizată corectitudinea oricărei ecuații (teoreme) în spațiul numerelor binare.

Teoreme Importante
Următoarele teoreme sunt utile pentru simplificarea funcțiilor logice și pot fi demonstrate folosind axiomele
logicii Boolene sau prin verificarea ecuației pentru toate valorile posibile ale x și y:

1. 𝑥+𝑥=𝑥x+x=x Demonstrație: 𝑥+𝑥=𝑥⋅1+𝑥⋅1=𝑥⋅(1+1)=𝑥⋅1=𝑥x+x=x⋅1+x⋅1=x⋅(1+1)=x⋅1=x


2. 𝑥⋅𝑥=𝑥x⋅x=x Demonstrație: 𝑥⋅𝑥=𝑥⋅𝑥+0=𝑥⋅𝑥+𝑥⋅𝑥′=𝑥⋅(𝑥+𝑥′)=𝑥⋅1=𝑥x⋅x=x⋅x+0=x⋅x+x⋅x′=x⋅(x+x′)=x⋅1=x
3. 𝑥+1=1x+1=1 Demonstrație: 𝑥+1=1⋅(𝑥+1)=(𝑥+𝑥′)⋅(𝑥+1)=𝑥+𝑥′⋅1=𝑥+𝑥′=1x+1=1⋅(x+1)=(x+x′)⋅(x+1)=x+x
′⋅1=x+x′=1
4. 𝑥⋅0=0x⋅0=0 prin simetrie cu Teorema 3
5. (𝑥′)′=𝑥(x′)′=x
6. 𝑥+𝑥⋅𝑦=𝑥x+x⋅y=x
7. 𝑥⋅(𝑥+𝑦)=𝑥x⋅(x+y)=x prin simetrie cu Teorema 6
8. (𝑥+𝑦)′=𝑥′⋅𝑦′(x+y)′=x′⋅y′
9. (𝑥⋅𝑦)′=𝑥′+𝑦′(x⋅y)′=x′+y′

Teoremele 8 și 9 sunt denumite teoreme DeMorgan și permit transformarea unei funcții logice bazate pe
operații ȘI în una bazată pe SAU, sau invers, adăugând operații de complementare.

Reprezentarea Grafică a Funcțiilor Logice


Reprezentarea funcțiilor logice folosind notarea descrisă anterior pentru algebra Booleană este clară dar nu
oferă o vizualizare imediată a valorilor funcției pentru fiecare combinație a valorilor operanzilor, și nici nu poate
servi pentru reprezentarea grafică a unui circuit care implementează funcția respectivă. Pentru aceste motive,
introducem două forme de reprezentare a funcțiilor logice: Tabelele de adevăr și reprezentarea pictografică.

Tabele de Adevăr
Tabelele de adevăr reprezintă o explicitare grafică a valorilor unei funcții logice pentru toate combinațiile de
valori ale operanzilor săi, și poate înlocui expresia analitică (matematică) a funcției.
Funcție Tabel de adevăr Funcție
Tabel de adevăr
A B A ȘI B A B A SAU B
000 000
ȘI 010 SAU 011
100 101
111 111
A B A ȘI-NU B
COMPLEMENT
A 001
A
COMPLEMENT ȘI-NU 011
01
101
10
110
A B A SAU-NU B A B A XOR B
001 SAU 000
SAU-NU 010 EXCLUSIV 0 1 1
100 (XOR) 101
110 110

Reprezentarea Pictografică
Funcțiile logice elementare pot fi reprezentate și sub formă de desen, fiecare având asociată o pictogramă.
Aceste pictograme sunt următoarele:

La fel cum orice funcție logică, indiferent de complexitate, se poate asambla din funcții logice elementare, se
poate construi o reprezentare grafică a oricărei funcții asamblând și conectând pictograme ce reprezintă
funcțiile logice elementare. De exemplu, funcția logică 𝑄(𝐴,𝐵,𝐶)=(𝐴⋅𝐵)+((𝐵+𝐶)⋅(𝐵⋅𝐶))Q(A,B,C)=(A⋅B)+
((B+C)⋅(B⋅C)) este reprezentată grafic în modul următor:
Circuite Logice Combinaționale
Descrierea circuitelor logice combinaționale (CLC).

Circuite Logice Combinaționale (CLC)


Definiție: circuitele logice combinaționale (CLC) sunt acele circuite ale căror valori de ieșire depind exclusiv de
valorile intrărilor, la orice moment de timp; CLC nu pot conține bucle de reacție sau elemente de memorie.

Un CLC poate avea, în general, orice număr N de semnale de intrare de 1 bit, denumite generic 𝐼𝑗Ij și orice
număr M de semnale de ieșire de 1 bit, denumite generic 𝑄𝑖Qi.

Valoarea fiecărui semnal de ieșire este generată de o funcție logică ce are ca operanzi valorile semnalelor de
intrare:

𝑄𝑖=𝐹𝑖(𝐼0,𝐼1,...,𝐼𝑁−1),∀𝑖∈[0,𝑀−1]Qi=Fi(I0,I1,...,IN−1),∀i∈[0,M−1]

Dat fiind această relație între valorile intrărilor și ieșirilor, se poate spune că 𝐹𝑖Fi definește funcționalitatea
circuitului combinațional. CLC pot fi clasificate ca fiind neregulate atunci când funcția logică e diferită pentru
fiecare ieșire, sau regulate atunci când aceeași funcție logică caracterizează mai multe din ieșirile circuitului.

În ceea ce privește circuitele combinaționale, ne vor preocupa următoarele:


 Analiza CLC deja proiectate, din punct de vedere funcțional și al performanței, definind și criterii de
performanță.
 Proiectarea CLC
 Optimizarea CLC

Analiza Funcțională a CLC


Deseori este necesară înțelegerea funcționalității unui circuit digital prezentat sub formă de schemă logică
pentru a extrage funcția acestuia și a identifica de exemplu greșeli de proiectare. În acest scenariu, pornim de la
un desen al circuitului, format din porți logice interconectate, cum ar fi următorul exemplu:

Se cere identificarea tabelului de adevăr al funcției logice corespunzătoare circuitului. Primul pas constă în
denumirea tuturor semnalelor din schemă, altele decât cele de intrare sau ieșire. În acest exemplu, există doar
două astfel de semnale, conectate la ieșirile porții ȘI, respectiv SAU, semnale ce vor fi denumite W1, respectiv
W2.
Urmează construirea tabelului de adevăr al ieșirii Q a circuitului în funcție de intrările A, B, C. Mai ușor este să
construim tabelul de adevăr al Q în funcție de valorile 𝑊1W1 și 𝑊2W2, care la rândul lor pot fi exprimate direct
în funcție de A, B, C. Iată un exemplu:

𝑊1=𝐴⋅𝐵W1=A⋅
ABC 𝑊2=𝐵+𝐶W2=B+C 𝑄=(𝑊1⋅𝑊2)′Q=(W1⋅W2)′
B
0 000 0 1
0 010 1 1
0 100 1 1
0 110 1 1
1 000 0 1
1 010 1 1
1 101 1 0
1 111 1 0

Tabelul se completează cu semnalele din schemă începând cu intrările, apoi semnalele intermediare,
parcurgând schema dinspre intrări către ieșiri, iar ultima coloană reprezintă ieșirea Q.

Criterii de performanță a CLC


Vom folosi următoarele criterii de performanță pentru a caracteriza circuitele combinaționale:
 Adâncimea circuitului – numărul maxim de porți traversate de semnal, pe oricare cale de la intrare către
ieșire; este de dorit ca circuitul să aibă o adâncime cât mai mică
 Timpul de propagare prin circuit – durata de timp necesară pentru ca o schimbare a valorilor de intrare
să producă efecte la ieșire; timpul de propagare este strâns legat de adâncimea circuitului, datorită
faptului că fiecare poartă introduce o întârziere proprie de propagare.
o Calea critică – calea de semnal, intre intrarea și ieșirea circuitului, care are timpul de propagare
cel mai mare; dorim să cunoaștem calea critică pentru a încerca să minimizăm întârzierea pe
această cale
 Aproximare bună: calea care traverseaza numărul maxim de porți
 Dimensiunea circuitului – aria de siliciu ocupată de circuit
o Aproximare bună: numărul de porți elementare sau numărul de tranzistoare
o Afectează costul unui circuit; costul implementării circuitului pe siliciu este aproximativ direct
proporțional cu aria ocupată de circuit pe siliciu.
 Puterea consumată
o Afectează costul și performanța unui circuit
 Un circuit care disipă multă putere necesită folosirea de materiale speciale (și scumpe)
care conduc mai bine căldura către exterior.

În continuarea acestei lecții vom descrie implementarea fizică a porților logice pentru a putea explica natura
timpului de propagare și relația între funcția logică a unei porți și numărul de tranzistoare necesare pentru
implementarea acesteia.
Implementarea CMOS a Porților Logice
Implementarea tuturor circuitelor digitale se face folosind exclusiv tranzistoare de tip MOS. Acestea sunt de tip
P (PMOS) și N (NMOS). Atunci când ambele tipuri de tranzistor MOS sunt folosite într-un circuit, spunem că
respectivul circuit este implementat în tehnologie MOS complementară (Complementary MOS - CMOS).

Circuitele digitale folosesc tranzistoarele MOS ca întrerupătoare controlabile. Astfel, vom începe discuția
stabilind ce tip de întrerupător poate fi implementat de fiecare din cele două tipuri de tranzistor MOS.
Diagrama de mai jos indică în mod grafic felul în care poate fi folosit fiecare tip de tranzistor în rolul de
întrerupător.

Tranzistorul NMOS conduce curent atunci când tensiunea poartă-sursă 𝑉𝐺𝑆VGS trece de pragul de
tensiune 𝑉𝑇𝑛=0.7𝑉VTn=0.7V, iar cel PMOS conduce curent atunci când tensiunea sursă-poartă 𝑉𝑆𝐺VSG trece
de pragul de tensiune 𝑉𝑇𝑝=0.7𝑉VTp=0.7V. Astfel, se desprind 4 situații posibile:

 Tranzistorul PMOS se comportă ca un întrerupător deschis (nu conduce curent) atunci


când 𝑉𝐺=𝑉𝐷𝐷VG=VDD
 Tranzistorul PMOS se comportă ca un întrerupător închis (conduce curent) atunci când 𝑉𝐺=0𝑉VG=0V
 Tranzistorul NMOS se comportă ca un întrerupător deschis (nu conduce curent) atunci
când 𝑉𝐺=0𝑉VG=0V
 Tranzistorul NMOS se comportă ca un întrerupător închis (conduce curent) atunci
când 𝑉𝐺=𝑉𝐷𝐷VG=VDD

Combinând proprietățile tranzistoarelor PMOS și NMOS, se poate implementa un inversor CMOS în modul
descris mai jos:

Circuitul inversor funcționează în modul următor:


 Atunci când 𝑉𝑋=0𝑉VX=0V (prin urmare reprezintă '0' logic)
avem 𝑉𝑁𝑀𝑂𝑆𝐺𝑆<𝑉𝑇𝑛VGSNMOS<VTn și 𝑉𝑃𝑀𝑂𝑆𝑆𝐺>𝑉𝑇𝑝VSGPMOS>VTp deci tranzistorul NMOS este
blocat, tranzistorul PMOS conduce, iar ieșirea circuitului este 𝑉𝑋′=𝑉𝐷𝐷VX′=VDD (prin urmare reprezintă
'1' logic)
 Atunci când 𝑉𝑋=𝑉𝐷𝐷VX=VDD (prin urmare reprezintă '1' logic)
avem 𝑉𝑁𝑀𝑂𝑆𝐺𝑆>𝑉𝑇𝑛VGSNMOS>VTn și 𝑉𝑃𝑀𝑂𝑆𝑆𝐺<𝑉𝑇𝑝VSGPMOS<VTp deci tranzistorul NMOS
conduce, tranzistorul PMOS este blocat, iar ieșirea circuitului este 𝑉𝑋′=0𝑉VX′=0V (prin urmare
reprezintă '0' logic)
Putem astfel observa că circuitul produce la ieșire valoarea logică opusă celei prezenta la intrare, deci
îndeplinește funcția de inversor.

Asamblând 4 tranzistoare se pot implementa funcții logice mai complexe. În următoarea figură este prezentată
implementarea porții logice SAU-NU (NOR). Ieșirea circuitului este conectată la 𝑉𝐷𝐷VDD (deci are valoarea
logică '1') doar dacă ambele tranzistoare PMOS conduc, prin urmare 𝑉𝐴=𝑉𝐵=0𝑉VA=VB=0V deci ambele intrări
sunt '0' logic. În schimb, ieșirea circuitului este conectată la masă (deci are valoarea logică '0') dacă oricare din
tranzistoarele NMOS conduc, prin urmare 𝑉𝐴=𝑉𝐷𝐷VA=VDD sau 𝑉𝐵=𝑉𝐷𝐷VB=VDD deci dacă oricare din intrări
sunt '1' logic. Veți recunoaște în acest comportament funcția SAU-NU.

În mod similar, următoarea figură prezintă implementarea porții logice ȘI-NU (NAND). Ieșirea circuitului este
conectată la 𝑉𝐷𝐷VDD (deci are valoarea logică '1') dacă oricare din tranzistoarele PMOS conduc, prin
urmare 𝑉𝐴=0𝑉VA=0V sau 𝑉𝐵=0𝑉VB=0V deci dacă oricare din intrări sunt '0' logic. În schimb, ieșirea circuitului
este conectată la masă (deci are valoarea logică '0') doar dacă ambele tranzistoare NMOS conduc, prin
urmare 𝑉𝐴=𝑉𝐵=𝑉𝐷𝐷VA=VB=VDD deci ambele intrări sunt '1' logic.Veți recunoaște în acest comportament
funcția ȘI-NU.

Este de notat faptul că nu se pot implementa direct porțile ȘI, respectiv SAU folosind un montaj CMOS
serie/paralel similar celor de mai sus. Porțile SAU se implementează folosind porți SAU-NU urmate de
inversoare. Porțile ȘI se implementează folosind porți ȘI-NU urmate de inversoare. Prin urmare, porțile ȘI/SAU
folosesc 6 tranzistoare în timp ce porțile ȘI-NU/SAU-NU folosesc doar 4 tranzistoare.

Folosind 6 sau mai multe tranzistoare se pot de asemenea implementa diverse alte funcții logice, cu 2 sau mai
multe intrări. Iată un exemplu de poartă ȘI-NU cu 3 intrări, implementată folosind 6 tranzistoare:
Optimizarea Circuitelor Combinaționale
O sarcină importantă a oricărui inginer proiectant de circuite digitale este să optimizeze parametrii unui circuit,
în funcție de criteriile de performanță enumerate anterior. În această secțiune vom discuta tehnici de
optimizare a timpului de propagare, și a ariei unui circuit, estimată prin numărul de tranzistoare. Vom discuta
două tehnici de optimizare:
 Minimizarea funcțiilor logice prin diagrame Karnaugh, care pornește de la o expresie dată prin tabelul de
adevăr a unei funcții logice F și urmărește găsirea unei expresii analitice a funcției F cu număr minim de
operatori (porți) ȘI/SAU/NU.
 Conversia la logică NAND sau NOR, care urmărește înlocuirea porților ȘI și SAU cu porți NAND sau NOR.

Minimizarea Funcțiilor Logice


Orice funcție logică 𝐹(𝑥,𝑦,𝑧)F(x,y,z) poate fi exprimată în una din formele următoare:
 Sumă de produse, de exemplu 𝐹=𝑥⋅𝑦+𝑦⋅𝑧+𝑥⋅𝑧F=x⋅y+y⋅z+x⋅z
 Produs de sume, de exemplu 𝐹=(𝑥+𝑦)⋅(𝑦+𝑧)⋅(𝑥+𝑧)F=(x+y)⋅(y+z)⋅(x+z)

Metoda diagramelor Karnaugh (diagramă K, iar în engleză K-map) exprimă tabelul de adevăr al unei funcții în
mod grafic astfel încât fiecare locație în tabel reprezintă un produs (denumit minterm) între unul sau mai multe
din intrări, sau valorile negate ale intrărilor, iar sume între produse adiacente în diagramă se simplifică. Pentru a
ilustra acest concept, vom incepe cu prezentarea unei diagrame K pentru minimizarea funcțiilor cu 2 intrări:

După cum se observă în figură, fiecare spațiu în diagramă, notat 𝑚𝑖mi, reprezintă un produs (minterm). Astfel,
 𝑚0=𝑥′⋅𝑦′m0=x′⋅y′ și este 1 dacă 𝑥=0x=0 și 𝑦=0y=0
 𝑚1=𝑥′⋅𝑦m1=x′⋅y și este 1 dacă 𝑥=0x=0 și 𝑦=1y=1
 𝑚2=𝑥⋅𝑦′m2=x⋅y′ și este 1 dacă 𝑥=1x=1 și 𝑦=0y=0
 𝑚3=𝑥⋅𝑦m3=x⋅y și este 1 dacă 𝑥=1x=1 și 𝑦=1y=1
Observăm că fiecare produs devine '1' logic pentru o combinație particulară a valorilor variabilelor de intrare x
și y, prin urmare fiecare produs corespunde acelei combinații de valori. Produsele sunt astfel aranjate în
diagramă astfel încât suma produselor pe orice linie sau coloană să se reducă prin aplicarea teoremelor algebrei
Boolene:
 Pe linia 1, 𝑚0+𝑚1=𝑥′⋅𝑦′+𝑥′⋅𝑦=𝑥′⋅(𝑦′+𝑦)=𝑥′m0+m1=x′⋅y′+x′⋅y=x′⋅(y′+y)=x′
 Pe linia 2, 𝑚2+𝑚3=𝑥⋅𝑦′+𝑥⋅𝑦=𝑥⋅(𝑦′+𝑦)=𝑥m2+m3=x⋅y′+x⋅y=x⋅(y′+y)=x
 Pe coloana 1, 𝑚0+𝑚2=𝑥′⋅𝑦′+𝑥⋅𝑦′=𝑦′⋅(𝑥′+𝑥)=𝑦′m0+m2=x′⋅y′+x⋅y′=y′⋅(x′+x)=y′
 Pe coloana 2, 𝑚1+𝑚3=𝑥′⋅𝑦+𝑥⋅𝑦=𝑦⋅(𝑥′+𝑥)=𝑦m1+m3=x′⋅y+x⋅y=y⋅(x′+x)=y
Observăm că liniile se reduc la 𝑥x sau 𝑥′x′ în vreme ce coloanele se reduc la 𝑦y sau 𝑦′y′. În dreptul fiecărei linii
sau coloane este valoarea variabilei care face ca suma de produse corespunzătoare liniei sau coloanei
respective să aibă valoarea '1' logic.

În cele ce urmează vom folosi diagrama K pentru a minimiza o funcție F oarecare. Pornim de la tabelul de
adevăr al funcției F:

XYF
001
011
100
111

Vom scrie un '1' în diagrama K în căsuțele corespunzătoare fiecărui produs doar dacă F este 1 pentru
combinația de valori ale x și y corespunzătoare produsului respectiv. Astfel:

 𝐹=1F=1 pentru 𝑥=0x=0 și 𝑦=0y=0, care corespund 𝑚0m0, deci scriem '1' în diagramă în căsuța lui 𝑚0m0
 𝐹=1F=1 pentru 𝑥=0x=0 și 𝑦=1y=1, care corespund 𝑚1m1, deci scriem '1' în diagramă în căsuța lui 𝑚1m1
 𝐹=1F=1 pentru 𝑥=1x=1 și 𝑦=1y=1, care corespund 𝑚3m3, deci scriem '1' în diagramă în căsuța lui 𝑚3m3

După ce am terminat acest pas de completare a diagramei K, putem acum exprima F ca suma tuturor
produselor 𝑚𝑖mi care au '1' în dreptul lor în diagramă. Astfel,
𝐹=𝑚0+𝑚1+𝑚3=𝑥′𝑦′+𝑥′𝑦+𝑥𝑦F=m0+m1+m3=x′y′+x′y+xy
Dar ținând cont de faptul că sumele de produse se reduc pe linii și coloane (exprimat grafic pe diagramă
încercuind liniile și coloanele respective), și că putem duplica în suma de produse orice produs dat fiind
că 𝑚𝑖+𝑚𝑖=𝑚𝑖mi+mi=mi (exprimat grafic prin faptul că 𝑚1m1 se află în două zone încercuite), atunci putem
reduce avantajos suma de produse:
𝐹=𝑚0+𝑚1+𝑚1+𝑚3=(𝑚0+𝑚1)+(𝑚1+𝑚3)=𝑥′+𝑦F=m0+m1+m1+m3=(m0+m1)+(m1+m3)=x′+y
Aceasta este forma analitică minimală a funcției F, a cărei implementare necesită un inversor și o poartă SAU.

Funcțiile logice cu 3, respectiv 4 intrări se pot minimiza folosind diagrame K mai complexe:
Conversia la logică NAND/NOR
Din discuțiile anterioare legate de implementarea CMOS a porților logice, am aflat că porțile ȘI-NU/SAU-NU
sunt implementate folosind 4 tranzistoare în timp ce porțile ȘI/SAU folosesc 6 tranzistoare. Din acest motiv
putem optimiza un circuit digital transformându-l astfel încât se folosesc doar porți de tip ȘI-NU/SAU-NU.

Pentru a transforma porțile ȘI/SAU în porți ȘI-NU/SAU-NU vom folosi proprietățile algebrei Boolene:
 𝑥+𝑦=((𝑥+𝑦)′)′x+y=((x+y)′)′ (transformare din SAU în SAU-NU)
 𝑥+𝑦=(𝑥′⋅𝑦′)′x+y=(x′⋅y′)′ (transformare din SAU în ȘI-NU cu teorema DeMorgan)
 𝑥⋅𝑦=((𝑥⋅𝑦)′)′x⋅y=((x⋅y)′)′ (transformare din ȘI în ȘI-NU)
 𝑥⋅𝑦=(𝑥′+𝑦′)′x⋅y=(x′+y′)′ (transformare din ȘI în SAU-NU cu teorema DeMorgan)
 (𝑥′)′=𝑥(x′)′=x (anularea inversoarelor consecutive)

În formă grafică:

Comparatorul
Comparatorul este circuitul care determină egalitatea între două semnale A și B, fiecare din acestea fiind
formate din N biți. Ieșirea comparatorului este un semnal de un singur bit, a cărui valoare este 1 logic dacă A
este egal cu B, și zero logic dacă A este diferit de B.
Există multiple metode de a implementa comparatorul, dar toate se bazează pe același concept: două numere
multi-bit A, respectiv B sunt egale dacă fiecare bit din A este egal cu bitul cu același index din B. Astfel, circuitul
trebuie să determine relația de egalitate sau ne-egalitate între biții cu același index din A și B; apoi să realizeze
agregarea rezultatelor comparațiilor bit cu bit folosind un arbore de porți. Avem mai jos două exemple:

În primul exemplu, porțile XNOR produc toate 1 logic pe ieșire dacă există egalitate între fiecare pereche de biți
cu același index din A, respectiv B. Arborele de porți AND produce 1 logic pe ieșire dacă toate ieșirile porților
XNOR au fost 1, altfel spus dacă egalitatea există între toate perechile de biți cu același index, prin urmare dacă
A este egal cu B.
Un rezultat identic obținem prin structura de mai jos. În acest caz, porțile XOR produc 1 logic pe ieșire atunci
când există o diferență între biții comparați. Arborele de porți SAU, încheiat cu SAU-NU, produce 1 logic pe
ieșire dacă toate intrările sunt 0 logic, deci dacă nu există diferențe între niciuna din perechile de biți cu același
index din A, respectiv B.
Multiplexorul Elementar

Multiplexorul este circuitul fundamental de selecție între două sau mai multe semnale. Multiplexorul
elementar (EMUX) realizează selecția între două semnale de un singur bit A, B, în funcție de un semnal de
selecție S care are el însuși un bit. Funcția multiplexorului elementar poate fi precizată mai bine prin tabelul său
de adevăr:

SABQ
00 0 0
00 1 1
01 0 0
01 1 1
10 0 0
10 1 0
11 0 1
11 1 1

Astfel, ieșirea Q a multiplexorului este egală cu intrarea B atunci când intrarea S este '0' logic, și egală cu
intrarea A atunci când intrarea S este '1' logic. Această funcție este implementată de circuitul de mai jos în
logică NU/ȘI/SAU:

Implementarea de mai sus a multiplexorului implică 20 de tranzistoare. În logică NAND, aceeași funcție poate fi
implementată cu 14 tranzistoare conform schemei de mai jos:
Pentru o reprezentare grafică mai ușoară, vom folosi următoarea pictogramă pentru multiplexorul elementar:

Multiplexorul cu Intrări Multiple


Selecția între N semnale de un bit se realizează printr-un arbore de multiplexoare elementare, organizate în
straturi. Iată structura de selecție între 3 semnale de intrare (MUX3):

Se poate observa că selecția se face mai întâi între 𝐼0I0 și 𝐼1I1 prin un multiplexor elementar cu intrarea de
selecție 𝑆0S0, apoi rezultatul aceste selecții inițiale trece printr-un al doilea multiplexor elementar, cu intrarea
de selecție 𝑆1S1. Se observă că, dacă interpretăm semnalele 𝑆1S1 și 𝑆0S0 ca fiind biții cel mai semnificativ,
respectiv cel mai puțin semnificativ, ai unui semnal multi-bit 𝑆S, atunci valoarea zecimală a lui 𝑆S ne spune care
din intrări este selectată, conform tabelului:

S
S (zecimal) Q
(binar)
00 0 𝐼0I0
01 1 𝐼1I1
10 2 𝐼2I2
11 3 𝐼2I2

Acest concept se poate extinde la orice număr de intrări. Figura următoare ilustrează un multiplexor cu 4 intrări
(MUX4):
Se observă din exemplele anterioare că multiplexorul de 3 intrări utilizează 2 multiplexoare elementare,
organizate în două straturi, iar multiplexorul cu 4 intrări utilizează 3 multiplexoare elementare organizate în 2
straturi.
Dorim să analizăm multiplexorul generic cu N intrări de 1 bit pentru a determina numărul minim de
multiplexoare elementare din care este constituit, cât și numărul de straturi de multiplexare. Aceste două
caracteristici ne permit să evaluăm dimensiunea și adâncimea multiplexorului cu N intrări.

Folosind conceptul de multiplexare arborescentă, pornim analiza determinând câte multiplexoare elementare
trebuie să adăugăm pentru a dubla numărul de intrări, de la 4 la 8. Pentru a multiplexa cele 8 intrări, vom folosi
două MUX4, ale căror ieșiri vor fi multiplexate folosind un EMUX. Rezultă structura de mai jos a unui MUX8:

Astfel, numărul de multiplexoare elementare a crescut de mai mult de două ori (s-a dublat prin folosirea a doua
MUX4, plus adăugarea unui EMUX suplimentar) ajungând la 7 EMUX. Numărul de straturi a crescut cu 1, prin
adăugarea unui EMUX ce selectează între ieșirile MUX4.
Putem cu ușurință să folosim aceeași metodologie pentru a construi un MUX16 din două MUX8 și un EMUX, sau
un MUX2N din MUXN, oricare ar fi N, și putem deriva în acest mod următoarele relații pentru numărul de
EMUX folosite de MUXN (notat E), și adâncimea MUXN ca număr de straturi de EMUX (notată D):

𝐸=𝑁−1E=N−1, prin urmare dimensiunea multiplexorului este în clasa de complexitate 𝑂(𝑁)O(N)


𝐷=𝑙𝑜𝑔2(2[𝑙𝑜𝑔2𝑁]+1)D=log2(2[log2N]+1), prin urmare adâncimea multiplexorului este în clasa de
complexitate 𝑂(𝑙𝑜𝑔2𝑁)O(log2N)

Se observă faptul că adâncimea MUXN depinde de următoarea putere a lui 2 mai mare decât N. Astfel,
adâncimea este identică pentru
 MUX3 si MUX4
 MUX5, MUX6, MUX7 și MUX8
 etc

Cunoscând dimensiunea EMUX (14 tranzistoare) și adâncimea acestuia (3 porți între selecție și ieșire, respectiv
2 porți între intrări și ieșire) se poate calcula dimensiunea și adâncimea cu precizie pentru un MUXN:
 numărul de tranzistoare 𝑇=14⋅𝐸T=14⋅E
 adâncimea 𝐴=2⋅𝐷+1
Multiplexorul cu Intrări Multi-Bit
Se pune problema selecției între semnale multi-bit. Această situație este de exemplu întâlnită atunci când, în
structura unui procesor x86, se selectează între diverse semnale interne de 32 de biți în cadrul circuitelor
artimetico-logice.
O selecție între două semnale de intrare A, B, de M biți fiecare, astfel încât ieșirea Q are de asemenea M biți, se
realizează prin M multiplexoare elementare. Fiecare din aceste multiplexoare elementare generează un bit i al
ieșirii Q, notat 𝑄𝑖Qi, selectând între bitul i al A și bitul i al B, notate 𝐴𝑖Ai respectiv 𝐵𝑖Bi. Schema de circuit pentru
un multiplexor cu semnale de intrare de 4 biți fiecare este următoarea:

Dorim să analizăm dimensiunea E și adâncimea D ale multiplexorului (ca număr de multiplexoare elementare,
respectiv număr de straturi de multiplexoare elementare) în funcție de numărul de biți M al intrărilor și ieșirii.
Folosim observația că atunci când M se dublează, trebuie să dublăm de asemenea numărul de EMUX, dar
acestea sunt așezate pe un singur strat. Prin urmare:

𝐸=𝑀E=M, prin urmare clasa de complexitate a multiplexorului cu 2 intrări de M biți este 𝑂(𝑀)O(M)
𝐷=1D=1 indiferent de M, prin urmare clasa de complexitate a adâncimii multiplexorului cu 2 intrări de M biți
este 𝑂(1)O(1)

Dacă analizăm cazul general al unui multiplexor cu N intrări de M biți fiecare, folosind analiza de mai sus și cea
legată de multiplexorul cu intrări multiple, putem obține clasele de complexitate pentru dimensiunea și
adâncimea circuitului pentru orice N și M:
 clasa de complexitate a dimensiunii multiplexorului este 𝑂(𝑁⋅𝑀)O(N⋅M)
 clasa de complexitate a adâncimii multiplexorului este 𝑂(𝑙𝑜𝑔2𝑁)O(log2N)

Semi-Sumatorul
Semi-sumatorul (Half-Adder) este circuitul care realizează suma între două numere de un bit. Ieșirea semi-
sumatorului este un număr de 2 biți care semnalează câte dintre intrările semi-sumatorului au valoarea '1' logic.
Tabelul de adevăr al funcției semi-sumatorului este următorul:

A B 𝑄1Q1 𝑄0Q0
000 0
010 1
A B 𝑄1Q1 𝑄0Q0
100 1
111 0

Analizând separat fiecare din cei doi biți ai ieșirii semi-sumatorului, putem imediat deduce faptul că:
 𝑄0=𝐴⊕𝐵Q0=A⊕B (A sau-exclusiv B)
 𝑄1=𝐴⋅𝐵Q1=A⋅B (A și B)

În mod canonic, cei doi biți ai ieșirii Q sunt denumiți în felul următor:
 𝑄0Q0 este denumit S și indică suma parțială de 1 bit a celor două intrări
 𝑄1Q1 este denumit C și este semnalul de deplasare (carry) care indică acele situații când valoarea sumei
este prea mare pentru a fi reprezentată corect folosind doar semnalul S

Schema de circuit a semi-sumatorului este următoarea:

Sumatorul Elementar
Deși semi-sumatorul ne permite sumarea a două numere de 1 bit, acesta nu ne permite sumarea numerelor de
mai mulți biți pentru că nu permite propagarea unui semnal de deplasare. Semi-sumatorul generează semnal
de deplasare (Carry) dar nu accepta semnal de deplasare pe intrare.
Sumatorul elementar (Full-Adder) este un circuit care accepta semnal de deplasare pe intrare și realizează suma
între două semnale de un bit și semnalul de deplasare.

Pentru a deduce structura de circuit a sumatorului elementar, pornim de la funcția realizată


 S este suma pe 1 bit a celor 3 numere de la intrare, echivalentă cu un sau exclusiv între cele 3 intrări
 𝐶𝑂CO este '1' atunci când A și B sunt '1', sau dacă nu este cazul, atunci când unul dintre A sau B este '1'
(deci suma între A și B este '1') și 𝐶𝐼CI este '1'

Prin urmare, structura de circuit a sumatorului elementar este bazată pe două semi-sumatoare în modul
următor:

Sumatorul Multi-Bit
În majoritatea cazurilor de utilizare a unui sumator, operanzii sunt numere multi-bit (de exemplu sumarea a doi
operanzi de 32 sau 64 de biți într-un procesor de tip x86). Se poate implementa un sumator multi-bit prin
înlănțuirea mai multor sumatoare elementare, astfel încât fiecare sumator elementar sumează câte un bit din
fiecare operand (biții cu același index) și semnalul de deplasare generat de lanțul de sumatoare elementare
conectate la biții cu index inferior. Iată schema de circuit corespunzătoare unui sumator de 4 biți:

Se poate observa cum semnalele de deplasare (carry) se propagă de la un sumator elementar la următorul, în
cascadă. Această structură este denumită 'ripple-carry adder' datorită acestei propagări cascadate. Carry se
propagă de la sumatorul elementar aferent bitului cel mai puțin semnificativ (bitul 0) către cel aferent bitului
celui mai semnificativ (3 în acest caz).

Rezultatul sumei a două numere de N biți este întotdeauna un număr Q de 𝑁+1N+1 biți, care în cazul
sumatorului este format concatenând semnalele S și semnalul de deplasare generat de sumatorul elementar
aferent biților celor mai semnificativi. În cazul exemplului de mai sus, avem:
𝑄={𝐶4,𝑆3,𝑆2,𝑆1,𝑆0}Q={C4,S3,S2,S1,S0}

În structura de mai sus, avem de asemenea figurată intrarea de carry 𝐶0C0 a sumatorului elementar aferent
biților celor mai nesemnificativi. Putem trata această intrare în două feluri:
 o conectăm la '0' logic, caz in care 𝑄=𝐴+𝐵Q=A+B
 o conectăm la '1' logic,, caz in care 𝑄=𝐴+𝐵+1Q=A+B+1
 o conectăm la un semnal oarecare, caz în care 𝑄=𝐴+𝐵+𝐶0Q=A+B+C0

Dorim în cele ce urmează să analizăm dimensiunea și adâncimea sumatorului, în funcție de numărul N de biți al
semnalelor de intrare (operanzii sumei). Legat de dimensiune, pornim de la observația că numărul de
sumatoare elementare este întotdeauna egal cu numărul de biți al semnalelor de intrare. Prin urmare, număril
E de sumatoare elementare este
 𝐸=𝑁E=N, prin urmare clasa de complexitate a dimensiunii sumatorului este 𝑂(𝑁)O(N)

Adâncimea circuitului de sumare poate fi determinată observând propagarea semnalului de deplasare. Astfel,
acesta este generat inițial de sumatorul elementar corespunzător biților celor mai puțini semnificativi, apoi
continuă parcurgând toate celelalte sumatoare elementare. Astfel, adâncimea D ca număr de sumatoare
elementare este
 𝐷=𝑁D=N, prin urmare clasa de complexitate a dimensiunii sumatorului este tot 𝑂(𝑁)O(N)

Putem atfel observa că atât dimensiunea cât si adâncimea, deci timpul de propagare prin sumator, cresc direct
proporțional cu numărul de biți al operanzilor.

Scăzătorul
Operația complementară sumării este scăderea. În aritmetica binară, scăderea B din A reprezintă sumarea lui A
cu complementul față de 2 a lui B. Complementul este format inversând B bit cu bit și sumând apoi cu 1. Prin
urmare, funcția de scădere poate fi exprimată în felul următor:
 𝐴−𝐵=𝐴+𝐵′+1A−B=A+B′+1 unde 𝐵′B′ este inversul bit cu bit al lui B

Această funcție poate fi implementată de următorul circuit:


Dacă M este 1, atunci porțile sau-exclusiv funcționează ca inversoare pentru biții lui B, și 𝐶0C0 este 1, prin
urmare funcția realizată este cea dorită, anume 𝐴+𝐵′+1A+B′+1. Dacă M este 1, porțile sau-exclusiv nu modifică
valorile biților lui B, și 𝐶0C0 este 0, prin urmare funcția realizată este 𝐴+𝐵A+B. Putem astfel spune că acest
circuit este un scăzător dacă M este 1 și sumator dacă M este 0.
Funcția Decodorului
Decodorul este acel circuit care transformă un număr binar multi-bit într-o reprezentare de tip One-Hot. Iată un
exemplu de transformare a numerelor de 3 biți.

Se observă faptul că pentru a reprezenta numerele de la 0 la N-1 (în total N valori) avem nevoie în reprezentare
One-Hot de N biți, spre deosebire de reprezentare binară obișnuită unde avem nevoie de 𝑙𝑜𝑔2𝑁log2N biți. Prin
urmare un decodor cu N biți de intrare are întotdeauna 2𝑁2N biți de ieșire.

De asemenea, se observă că dacă interpretăm binar secvența de


biți 𝑄=𝐷7,𝐷6,𝐷5,𝐷4,𝐷3,𝐷2,𝐷1,𝐷0Q=D7,D6,D5,D4,D3,D2,D1,D0 de la ieșirea decodorului, valorile zecimale ale
Q satisfac următoarea relație cu numărul I de la intrare:
𝑄=2𝐼Q=2I

Prin urmare, decodorul este în același timp un circuit de transformare între reprezentare binară și
reprezentare One-Hot, și un circuit aritmetic de exponențiere.

Decodorul Elementar
Începem discuția legată de implementarea decodorului tratând cea mai simplă formă de decodor, cel cu 1 bit
de intrare. Numim acest circuit decodorul elementar (EDCD). Conform relației între numărul de biți ai intrării și
ieșirii, decodorul elementar are 21=221=2 biți de ieșire. Tabelul de adevăr asociat este:

I 𝑄1Q1 𝑄0Q0
00 1
11 0
Separând biții ieșirii, putem calcula funcțiile care transformă intrare în fiecare din biții ieșirii, anume 𝑄0=𝐼′Q0=I
′ și 𝑄1=𝐼Q1=I, ceea ce corespunde următoarelor posibile structuri de circuit a EDCD:

Ambele structuri realizează funcția logică dorită. Structura din dreapta are avantajul de a nu oferi o cale directă
(care nu trece prin nicio poartă) între intrare și ieșire. Această proprietate este de dorit datorită unor
considerente de integritate a semnalului în circuit.

Decodorul Multi-Bit
Pentru a realiza o implementare a decodorului cu mai mult de 1 bit la intrare, analizăm tabelul de adevăr al
acestuia și observăm următoarea proprietate: fiecare din biții de la ieșire corespunde unui produs (minterm) al
biților de la intrare. Astfel, pentru exemplul de decodor cu 3 biți de intrare (x, y și z), avem următoarele relații
între biții de ieșire si cei de intrare:

𝑦0=𝑥′0⋅𝑥′1⋅𝑥′2y0=x0′⋅x1′⋅x2′
𝑦1=𝑥0⋅𝑥′1⋅𝑥′2y1=x0⋅x1′⋅x2′
𝑦2=𝑥′0⋅𝑥1⋅𝑥′2y2=x0′⋅x1⋅x2′
𝑦3=𝑥0⋅𝑥1⋅𝑥′2y3=x0⋅x1⋅x2′
𝑦4=𝑥′0⋅𝑥′1⋅𝑥2y4=x0′⋅x1′⋅x2
𝑦5=𝑥0⋅𝑥′1⋅𝑥2y5=x0⋅x1′⋅x2
𝑦6=𝑥′0⋅𝑥1⋅𝑥2y6=x0′⋅x1⋅x2
𝑦7=𝑥0⋅𝑥1⋅𝑥2y7=x0⋅x1⋅x2

Astfel, dacă avem la dispoziție 𝑥0,𝑥1,𝑥2,𝑥′0,𝑥′1,𝑥′2x0,x1,x2,x0′,x1′,x2′ putem implementa fiecare din ieșirile
decodorului printr-o poartă ȘI cu 3 intrări. În mod echivalent, putem implementa ieșirile decodorului cu oricâți
biți de intrare:

Observație: porțile ȘI cu mai mult de 3 intrări vor fi intotdeauna înlocuite cu arbori de porți ȘI cu 2 intrări.

Dorim în continuare să analizăm aria și adâncimea decodorului ca funcție a numărului N de biți de intrare.
Începem cu aria, observând faptul că în structura decodorului avem câte un decodor elementar conectat la
fiecare bit de intrare, prin urmare vom avea N circuite EDCD în structura unui decodor multi-bit, deci 2N
inversoare. De asemenea, pentru a genera fiecare bit de ieșire, avem o poartă ȘI cu N intrări, care poate fi
implementată folosind un arbore de porți ȘI cu 2 intrări, ce utilizează N-1 porți. Dat fiind că avem 2𝑁2N biți de
ieșire, rezultă că aria decodorului este în clasa de complexitate 𝑂(𝑁⋅2𝑁)O(N⋅2N).
Adâncimea circuitului este dată majoritar de arborele de porți ȘI de la intrare, a cărui adâncime
este 𝑙𝑜𝑔2𝑁log2N, prin urmare adâncimea este în clasa de complexitate 𝑂(𝑙𝑜𝑔2𝑁)O(log2N). Se observă astfel că
în cazul decodorului, creșterea numărului de intrări, respectiv ieșiri ne afectează în principal din punctul de
vedere al ariei, care crește mult mai rapid decât adâncimea circuitului atunci când N crește.

Aplicație: Unitate Artimetico-Logică


ALU

Folosind circuitele combinaționale discutate anterior se poate construi


unitatea aritmetico-logică (ALU), blocul central de procesare de date din
structura unui CPU. Avem mai jos ilustrat un ALU:

ALU este construi în felul următor: pentru fiecare operație implementată


există un circuit dedicat. Aceste operații sunt în exemplul nostru SAU
logic pe biți, SAU exclusiv pe biți, comparație de egalitate, și sumă fără
carry.

Fiecare din aceste circuite procesează valorile semnalelor A și B


(operanzii) și produce un rezultat. Rezultatul final este obținut prin
selecția din rezultatele parțiale, folosind semnalul de 2 biți OP_SEL.

NOTĂ: în acest exemplu și forma de undă asociată am ignorat timpii de


propagare prin blocurile ce implementează cele 4 operații.

Circuitul Latch
Stabilitatea Buclelor de Reacție

Circuitele combinaționale, conform definițiilor date, nu conțin bucle de reacție, iar valorile ieșirilor sunt
întotdeauna generate din valorile intrărilor la orice moment de timp. Conform acestei definiții, CLC nu au
memorie, deci nu pot stoca o valoare logică oarecare pe ieșiri după ce valorile intrărilor s-au schimbat.

Ce se întâmplă totuși atunci când introducem o buclă de reacție într-un circuit digital? Vom analiza cel mai
simplu caz, anume o buclă de reacție între ieșirea și intrarea unui circuit format doar din inversoare:

Avem aici două situații:


 circuitul este format dintr-un număr impar de inversoare, caz în care bucla de reacție duce la oscilație
(instabilitate)
 circuitul este format dintr-un număr par de inversoare, caz în care bucla de reacție produce stabilizarea
valorii logice în toate punctele circuitului

Prin urmare o buclă de reacție închisă peste un număr par de inversoare produce o formă primitivă de
memorare, întrucât circuitul își menține starea un timp nedefinit. Intuim o posibilitate de a folosi această buclă
pentru implementarea unui circuit practic de memorare, dar avem următoarele probleme:
 valoarea logică a fiecărui punct din circuit nu poate fi determinată a priori, stabilizarea pe 0 sau 1 logic
este dată de efecte fizice în circuit (deplasări de sarcină, câmp electromagnetic, efecte cuantice)
 nu putem impune modificarea stării circuitului astfel încât să determinăm ce valoare se memorează

Prin urmare o buclă de reacție este necesară, dar nu suficientă pentru realizarea unui circuit practic de
memorare.

Latch RS
Pornind de la ideea de a folosi o buclă de reacție peste două inversoare, extindem circuitul pentru a permite
controlarea valorii logice a fiecărui punct din structura acestuia. Astfel, primul pas este de a încerca forțarea
valorii ieșirii Q din circuitul de mai jos prin controlarea (on/off) a unui comutator S0 conectat între Q' și masă.

Atunci când S0 este închis, 𝑄′=0Q′=0 și 𝑄=1Q=1, deci putem aduce forțat Q la valoarea 1 logic închizând S0.
Când S0 este deschis, circuitul va memora valoarea forțată anterior. Totuși, această soluție funcționează doar
pe jumătate, întrucât nu putem aduce Q la valoarea 0 logic. Pentru o soluție completă, adăugăm încă un
comutator, S1, circuitului:
Cu această schemă de circuit, Q este forțat la 1 logic când S0 este închis, la 0 logic când S1 este închis, și
menține valoarea lui Q atunci când S0 și S1 sunt ambele deschise. O situație invalidă ce duce la destabilizarea
circuitului este atunci când S0 și S1 sunt închise simultan, forțând valori logice pe Q și Q' incompatibile cu
structura logică a circuitului.

Pentru a avea un circuit practic de memorare, rămâne să implementăm cele două comutatoare folosind logică
digitală. Folosim câte o poartă ȘI pentru a implementa fiecare din cele două comutatoare:

Astfel, S0 și S1 devin intrări de comandă în cele două porți ȘI. Funcția îndeplinită de circuit este ilustrată de
tabelul de adevăr:

S0 S1 Q' Q
0 0 1 1
0 1 0 1
1 0 1 0
1 1 Q' Q

Comportamentul în timp al circuitului poate fi observat din forma sa de undă:

Se observă că Q și Q' reacționează cu întârziere la acțiunea semnalelor S0 și S1, datorită timpului de propagare a
semnalului prin porțile circuitului. Se observă de asemenea că aplicarea unui 0 logic pe S1 duce la stabilizarea
lui Q pe valoarea 0 logic, în timp ce aplicarea unui 0 logic pe S0 duce la stabilizarea lui Q pe valoarea 1 logic.
Datorită acestui comportament, redenumim S0 și S1 în S (Set), respectiv R (Reset).

Prin combinarea porților ȘI cu inversoarele rezultă următoarea schemă echivalentă cu porți ȘI-NU:
Circuitul Bistabil
Bistabilul
Deși putem memora folosind circuitul latch D sau RS, acestea două sunt circuite transparente, ceea ce înseamnă
că în anumite situații se comportă ca circuitele combinaționale, producând valorile logice ale ieșirilor direct din
valorile logice ale intrărilor. Această proprietate este uneori nedezirabilă, pentru că permite propagarea
necontrolată a anumitor valori logice prin circuit.

Vom încerca să producem un circuit netransparent folosind circuite latch D. Acestea sunt transparente atunci
când semnalul de intrare En este 1 logic. Prin urmare, următorul circuit este netransparent:

În acest montaj, atunci când Clock este 1, primul latch (denumit Master) este transparent, dar al doilea
(denumit Slave) nu este. Atunci când Clock este 0, situația este inversată. Pentru ambele valori ale lui Clock,
schema nu este transparentă complet. Pentru ca valoarea lui D să fie memorată la ieșirea Q, este necesar ca
Clock să fie 1 (pentru propagare prin Master) și apoi Clock să devină 0 (pentru propagare prin Slave), deci este
necesar un front negativ al semnalului Clock. Acest circuit este denumit bistabil (Flip-Flop în engleză).

O colecție de bistabile ce stochează biții unui semnal multi-bit este denumit registru. Vom denumi circuit
secvențial orice circuit care include bistabile și, opțional, circuite combinaționale.

Parametri de Propagare
Pentru funcționarea corectă a bistabilului este nevoie ca anumite relații în timp să fie respectate de semnalele
de date și control ale circuitului. Aceste relații sunt necesare datorită structurii circuitului, și sunt următoarele:

Timpul de set-up 𝑇𝑆𝑈TSU – perioada de timp, înainte de frontul activ al ceasului, când valoarea lui D trebuie să
rămână constantă. 𝑇𝑆𝑈TSU este egal cu timpul de propagare prin latch-ul Master și este necesar pentru ca
datele prezentate la intrare bistabilului să aibă timp să ajungă la intrarea circuitului latch Slave înainte de
schimbarea valorii semnalului de ceas. Este întotdeauna pozitiv.

Timpul de hold 𝑇𝐻TH – perioada de timp, după frontul activ al ceasului, când valoarea intrării D trebuie să
rămână constantă. 𝑇𝐻TH poate fi pozitiv sau negativ, și este cauzat de propagarea ceasului către cele două
circuite latch. În particular, este cauzat de faptul că semnalul de ceas ajunge mai devreme la unul din circuitele
latch decât la celălalt, fiind astfel posibil ca modificarea valorii lui D să se propage mai rapid decât frontul
ceasului până la intrarea Slave, cauzând un comportament nedorit.

Cei doi timpi sunt ilustrați de următoarea diagramă:

Timpul clock-to-out 𝑇𝐶𝑂TCO – perioada de timp necesară pentru ca valoarea Q să se actualizeze după frontul
activ al ceasului. Întotdeauna pozitiv și egal cu timpul de propagare prin latch-ul slave:
Semnale de control și Tipuri de bistabil
Bistabilul poate avea semnale suplimentare de control:
 Enable - dacă acest semnal este prezent în structura bistabilului și este activ, bistabilul memorează
valoarea intrării D la fiecare front activ al ceasului. Dacă semnalul Enable este inactiv, bistabilul ignoră
orice modificări ale semnalului D, păstrând valoarea ieșirii Q.
 Set - activarea acestui semnal forțează ieșirea Q a bistabilului la valoarea 1 logic. Dacă semnalul Set este
sincron, atunci el are efect la următorul front activ al ceasului după activarea Set. Dacă semnalul Set este
asincron, efectul este imediat.
 Reset - similar cu Set, dar efectul este de forțare a ieșirii bistabilului în 0 logic.

Denumim astfel diversele tipuri de bistabil, în funcție de semnalele de control disponibile:

Funcționarea bistabilului

Mai jos avem forme de undă ce prezintă funcționarea unui bistabil de tip
D sensibil pe frontul pozitiv al ceasului și a unui bistabil de tip D sensibil
pe frontul negativ al ceasului.

Observăm că valoarea intrării D este memorată la fiecare front activ al


ceasului. Valoarea logică a lui Q se actualizează la 𝑇𝐶𝑂TCO după frontul
activ al ceasului.
Functionarea FDE

În această figură putem observa funcționarea unui bistabil cu Enable


(semnalul E), sensibil la frontul pozitiv al ceasului. Semnalul E este activ
atunci când are valoarea 1 logic. Se poate observa că bistabilul
memorează valoarea lui D la frontul pozitiv al ceasului dar doar atunci
când E este activ (1 logic).

Functionarea FD(A)R

Bistabilul cu Reset funcționează conform formei de unde de mai jos, in


cele două cazuri: Reset sincron, respectiv asincron. Semnalul Reset e
activ în 1 logic în ambele cazuri.

Se observă că în ambele cazuri, activarea semnalului de Reset duce la


memorarea valorii zero logic în bistabil, diferența fiind că efectul este
imediat în cazul bistabilului cu Reset asincron, și la următorul front de
ceas, în cazul bistabilului cu Reset sincron.

Analiza Temporală
Parametri de Propagare
Un circuit secvențial este orice circuit care include în structura sa minim un bistabil. Putem reprezenta in mod
generic structura unui circuit secvențial ca în figura de mai jos.

Din constrângerile impuse de bistabil ( 𝑇𝑆𝑈TSU, 𝑇𝐶𝑂TCO ) și timpii de propagare prin circuitele combinaționale,
putem calcula proprietăți importante ale circuitelor secvențiale, cum ar fi frecvența maximă a semnalului de
ceas.
Să analizăm următorul circuit secvențial, reprezentat prin schema sa croncretă:

În acest circuit avem un registru format din N bistabile, și o buclă de semnal de la ieșirea bistabilelor la intrarea
lor, printr-un circuit combinațional. În acest exemplu, circuitul combinațional realizează incrementare și timpul
de propagare prin acesta este 𝑇𝐶𝐿𝐶TCLC. Perioada minimă de operare a acestui circuit este dată de relația:

𝑇𝑚𝑖𝑛𝐶𝐿𝐾=𝑇𝐶𝑂+𝑇𝐶𝐿𝐶+𝑇𝑆𝑈TCLKmin=TCO+TCLC+TSU

iar frecvența maximă este 𝐹𝑚𝑎𝑥𝐶𝐿𝐾=1/𝑇𝑚𝑖𝑛𝐶𝐿𝐾FCLKmax=1/TCLKmin

Dacă semnalul de ceas are o frecvență mai mare de atât, nu este suficient timp între două fronturi consecutive
de ceas pentru propagarea semnalului de la ieșirea bistabilului, prin incrementator, înapoi la intrarea
bistabilului, și stabilizarea acestui semnal de la intrare inainte de fereastra definită de timpul de set-up. Prin
urmare la frecvențe mai mari condiția de set-up a bistabilului va fi incălcată iar circuitul nu va funcționa corect.
Aplicație: Setul de Registre
Definitie si structura setului de registre

Setul de registre este un circuit secvențial și o componentă a majorității procesoarelor moderne. Acesta reprezintă
o colecție de registre ce pot stoca variabile locale de program. Din setul de registre se pot citi uzual minim două
valori simultan (cei 2 operanzi ai unei instrucțiuni) iar în același timp poate fi scris un rezultat. Parametrii
importanți din punct de vedere funcțional sunt:

 R - numărul de registre din setul de registre (pentru majoritatea procesoarelor moderne RISC, R este 32
sau 64)
 L - numărul de biți ai fiecărui registru (procesoarele moderne folosesc registre de 64 de biți)
 P - numărul de porturi de citire (câte din registre pot fi citite simultan)

Structura internă a unui set de registre este ilustrată în figura următoare. Se observă folosirea unui decodor
împreună cu o porțile ȘI pentru a genera un semnal enable pentru fiecare registru. Astfel, semnalul enable al
fiecărui registru este 1 logic doar dacă enable de scriere global este 1 logic și adresa de scriere este egală cu
indexul registrului.

Citirea se face prin atâtea multiplexoare câte porturi avem. Multiplexoarele selectează registrul dorit, în funcție
de adresa de citire a portului respectiv.

Bistabilul Toggle
Bistabilul Toggle
Bistabilul Toggle este un circuit care schimbă valoarea logică a ieșirii sale
la fiecare front activ de ceas, dacă valoarea intrării T este 1 logic:

Bistabilul cu Enable conectat la intrarea T va memora valoarea intrării


(semnalul D) la frontul pozitiv, dacă T este 1 logic. Deoarece D este
produs prin inversarea Q, bistabilul va memora opusul propriei valori de
ieșire. Astfel, de fiecare dată când T este 1 logic, ieșirea Q își schimbă
valoarea logică.

Numărătorul
Numărătorul
Numărătorul este circuitul care produce o secvență crescătoare de valori pe ieșirea sa. Valorile se
incrementează la fiecare front activ al casului. Structura internă a numărătorului de 4 biți este ilustrată mai jos:

Ieșirea Q de 4 biți este trecută printr-un circuit de incrementare și rezultatul este plasat la intrarea registrului,
care va memora valoarea incrementată la următorul front activ de ceas. Putem realiza într-un mod similar
numărătoare de orice număr N de biți. Valorea ieșirii Q se va incrementa la fiecare front activ de ceas.

Numărătorul cu Enable
În anumite aplicații este de dorit ca numărarea să poată fi oprită o perioadă de timp. În astfel de situații este util
numărătorul cu Enable, care este construit din bistabile cu Enable (FDE) conform figurii de mai jos:
Atunci când INC_EN este 1 logic, la fiecare front activ de ceas bistabilele memorează valoarea prezentă pe
intrările lor, iar valoarea ieșirii Q se va incrementa. Dacă INC_EN este 0 logic, atunci bistabilele nu memorează
valoarea intrării ci păstrează nemodificată valoarea anterioară de ieșire, astfel încât Q rămâne stabil, până când
INC_EN redevine 1 logic.
Numărătorul cu Preload
În multe aplicații dorim să putem inițializa numărătorul la o valoare oarecare, apoi să numărăm pornind de la
acea valoare. În aceste cazuri putem folosi structura numărătorului cu preload, ilustrată în figura de mai jos:

Observăm elementele unui numărător obisnuit, registrul și incrementatorul de N biți. În plus, apare un
multiplexor care dă semnalului D valoarea PRELOAD_VALUE atunci când PRELOAD_EN este 1 logic. Atunci când
PRELOAD_EN este 0 logic, semnalul D ia valoarea semnalului Q_INC, adică valoarea ieșirii, plus 1.

Aplicație: Divizorul de Frecvență


Divizorul de Frecvență cu Numărărător
În multe aplicații ale circuitelor digitale este nevoie să folosim un semnal de ceas cu o frecvență anume. De
exemplu, în cazul unui calculator, avem nevoie de un semnal de ceas cu perioada de o secunda pentru a
menține timpul, incrementând contorul de timp, dar avem nevoie și de semnale de ceas cu altă frecvență, cum
ar fi pentru generarea de semnale de sincronizare pentru VGA, unde e nevoie de semnal de ceas de 50 MHz.
Continuând cu exemplul de mai sus, dorim să evităm montarea a două oscilatoare separate pentru fiecare
semnal de ceas, și să generăm ambele semnale de ceas dintr-o singură sursă de semnal de ceas provenită de la
un oscilator de 100 MHz. Astfel, economisim costul celui de-al doilea oscilator și puterea disipată de acesta.

Prima soluție propusă pentru obținerea unui semnal de ceas cu frecvență mică din unul cu frecvență mare este
să folosim proprietatea observată în figura de mai jos:

Fiecare din biții din ieșirea numărătorului este un semnal periodic dreptunghiular și are o perioadă de 2 ori mai
are decât bitul cu indexul imediat mai mic. Bitul 0 are o perioadă de 2 ori mai are decât semnalul de ceas. Astfel,
perioada bitului cu indexul N din ieșirea numărătorului este dată de relația:
𝑇𝑁=2𝑁+1⋅𝑇𝐶𝐿𝐾TN=2N+1⋅TCLK
Prin urmare, putem, dacă aplicăm un semnal de 100 MHz la intrarea de ceas a numărătorului, vom obține un
semnal de 50 MHz pe bitul 0 al ieșirii, 25 MHz pe bitul 1, etc. Observăm astfel că putem genera semnalul de
ceas VGA de 50 MHz dar nu putem genera semnalul de ceas de 1 Hz folosind exclusiv un numărător pentru că
nu există o valoarea întreagă pentru N care să producă rezultatul dorit în ecuația de mai sus, pornind de la un
ceas de intrare de 100 MHz.

Divizorul de frecvență cu factor variabil


Circuitul prezentat în figura de mai jos produce un semnal de ceas la ieșire, cu perioada controlată de intrarea F,
de N biți.

Structura divizorului este formată din circuite prezentate anterior. Formele de undă din dreapta prezintă
comportamentul diverselor semnale interne atunci când F este egal cu 2, respectiv 1. Se observă că perioada
ceasului de ieșire este de 6 ori mai mare decât a ceasului de intrare atunci când F este 2, și de 4 ori mai mare
atunci când F este 1. Relația generală între frecvențele semnalelor de ceas de intrare, respectiv ieșire, pentru
acest circuit, este:
𝑇𝐶𝐿𝐾_𝑂𝑈𝑇=2(𝑁+1)𝑇𝐶𝐿𝐾_𝐼𝑁TCLK_OUT=2(N+1)TCLK_IN
𝐹𝐶𝐿𝐾_𝑂𝑈𝑇=12(𝑁+1)𝐹𝐶𝐿𝐾_𝐼𝑁FCLK_OUT=12(N+1)FCLK_IN
Conform acestor relații, dacă dorm să obținem un semnal de ceas cu frecvența de 1 Hz din unul cu frecvența de
100 MHz, valoarea lui F trebuie să fie 49.999.999, ceea ce impune folosirea unui numărător de 26 de biți.
Nucleu de Procesor
Un procesor foarte simplu poate fi alcătuit din circuitele deja discutate: circuite combinaționale pentru
implementarea ALU, bistabilul și multiplexorul / decodorul pentru implementarea setului de
registre, numărătorul pentru implementarea PC. Vom construi în această lecție un nucleu simplu de procesor
RISC (Reduced Instruction Set Computer), de tip Harvard (magistrale separate pentru program și date), capabil
să execute 8 instrucțiuni simple pe operanzi de 8 biți:
 ADD Rd, Ra, Rb - suma Ra + Rb, rezultatul fiind plasat în registrul Rd
 SUB Rd, Ra, Rb - diferența Ra - Rb, rezultatul fiind plasat în registrul Rd
 AND Rd, Ra, Rb - ȘI logic pe biți între Ra și Rb, cu rezultatul în Rd
 OR Rd, Ra, Rb - SAU logic pe biți între Ra și Rb, cu rezultatul în Rd
 JMPZ Rb, Ra - salt condiționat de valoarea zero a registrului Rb; saltul se face la adresa conținută în Ra
 MOV Rd, Ra - copierea valorii din Ra în Rd
 LOAD Rd, Ra - copiere din memorie de la adresa conținută de Ra în registrul Rd
 SAVE Rb, Ra - copiere din registrul Rb în memorie la adresa conținută de Ra
Instrucțiunile operează pe 4 registre de 8 biți, și sunt cuvinte de 9 biți formate din:
 3 biți codul instrucțiunii
 2 biți adresa registrului Rd
 2 biți adresa registrului Ra
 2 biți adresa registrului Rb
Folosind aceste instrucțiuni puteți implementa orice program, deși viteza de execuție a sa va fi evident mult mai
mică decât a unui procesor x86 dar fiind setul foarte mic de instrucțiuni. Altfel spus, acest procesor este Turing-
complet.
Pentru a putea realiza funcția definită de noi, procesorul va avea următoarele interfețe cu exteriorul, definite ca
funcționalitate, număr de biți, și direcție relativ la procesor (intrare în procesor sau ieșire din procesor):
 Interfață de citire din memoria de program
o semnal de adresă - 8 biți, ieșire
o semnal de date citite - 9 biți, intrare
 Interfață de scriere/citire în/din memoria de date
o semnal de adresă - 8 biți, ieșire
o semnal de selecție scriere sau citire - 1 bit, ieșire
o semnal de date pentru scriere - 8 biți, ieșire
o semnal de date citite - 8 biți, intrare
Vom vedea în cele ce urmează cum arată structura internă a acestuia și cum funcționează aceasta, în detaliu.

Structura bloc a procesorului


În figura de mai jos avem diagrama bloc a procesorului:
Se disting in terfețele cu memoria de program
(INSN_ADDR și INSN) și cu memoria de date. De asemenea, se pot identifica componentele obisnuite ale unui
procesor: ALU, set de registre, numărător PC, decodor de instrucțiuni. În această schemă este utilizat un
multiplexor pentru a selecta între rezultatul ALU sau, în cazul execuției instrucțiunii LOAD, datele citite din
memorie. Se folosește de asemenea un comparator pentru a determina când valoarea conținută în registrul Rb
este zero, necesar pentru execuția instrucțiunii JMPZ. Poarta ȘI permite preîncărcarea PC doar dacă JMP_EN
este 1 logic.

https://wiki.dcae.pub.ro/index.php/CID_Aplicatii_1

https://wiki.dcae.pub.ro/index.php/CID_Aplicatii_2

https://wiki.dcae.pub.ro/index.php/CID_Aplicatii_3

https://curs.upb.ro/mod/url/view.php?id=200583

https://curs.upb.ro/mod/url/view.php?id=200585

https://curs.upb.ro/mod/url/view.php?id=200591

https://curs.upb.ro/mod/url/view.php?id=200607

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