Sunteți pe pagina 1din 150

MINISTERUL EDUCAŢIEI ŞI CERCETĂRII

UNIVERSITATEA DIN BACĂU


FACULTATEA DE INGINERIE

ANALIZA şi
10111011010101000100100101110110110
11111000111010101001110101
10100100011110000000110101011
10101001110001010010101
010010001010000101000101010001001010010
101101001001010001001010010001010
10010010101001010001
10001001010010101000101001010
SINTEZA

DISPOZITIVELOR
NUMERICE
EDITURA ALMA MATER
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
3

CUPRINS
pagina
CAPITOLUL 0 (zero)
Elemente de algebră binară (algebră logică)

0.1. Introducere 5
0.2. Axiomele şi teoremele algebrei binare 6
0.3. Funcţii binare 8
0.4. Formele canonice ale funcţiilor logice 12

CAPITOLUL 1
Analiza şi sinteza circuitelor logice combinaţionale
1.1. Introducere 17
1.2. Elemente de analiză a circuitelor logice combinaţionale 18
1.3. Sinteza circuitelor logice combinaţionale 27
1.4. Minimizarea funcţiilor logice combinaţionale 29
1.4.1. Metoda minimizarii pe baza axiomelor si teoremelor algebrei
booleene 29
1.4.2. Metoda diagramelor Karnaugh 29
1.4.3. Metoda Quine-Mc Cluskey 37
1.4.4. Minimizarea funcţiilor logice combinaţionale incomplet definite 42
1.4.5. Minimizarea sistemelor de funcţii booleene 43
1.5. Apariţia hazardului 51
1.5.1. Eliminarea hazardului cu ajutorul diagramelor Karnaugh 53
1.6. Analiza circuitelor logice combinaţionale cu ajutorul pachetului de
programe OrCAD 55
1.6.1. Proiectarea schemei electronice cu ajutorul programului OrCAD
CAPTURE 55
1.6.1.1. Începerea unui proiect nou 55
1.6.1.2. Plasarea componentelor în schema electronică 57
1.6.1.3. Conectarea componentelor schemei electronice 59
1.6.1.4. Verificarea corectitudinii realizării schemei electrice 60
1.6.1.5. Plasarea punctelor de test pe schema electronică 61
1.6.1.6. Stabilirea profilului de simulare 61
1.6.1.7. Simularea circuitului 62
1.7. Analiza circuitelor logice combinaţionale cu ajutorul limbajelor
pentru descrierea structurii hardware (HDL) 62
1.7.1. Introducere 62
1.7.2. Limbajul Verilog HDL 67
1.7.2.1. Structura unui program Verilog HDL 67
1.7.2.2. Testarea programelor Verilog HDL 87
1.7.3. Limbajul VHDL 100
1.7.3.1. Structura unui program VHDL 100
1.7.3.2. Testarea programelor VHDL 103
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
4

CAPITOLUL 2
Analiza şi sinteza circuitelor logice secvenţiale
2.1. Introducere 108
2.2. Tabelul tranziţiilor şi al ieşirilor 111
2.3. Graful tranziţiilor 117
2.4. Alte modele ale circuitelor secvenţiale 118
2.5. Analiza circuitelor logice secvenţiale 121
2.6. Sinteza circuitelor logice secvenţiale 123
2.7. Circuite basculante bistabile folosite ca elemente de memorie
pentru circuitele secvenţiale 123
2.7.1. Introducere 123
2.7.2. Tabelele caracteristice, tabelele excitaţiilor şi ecuaţiile intrărilor 124
2.8. Exemplificarea sintezei unui circuit logic secvenţial 133
2.9. Analiza circuitelor logice secvenţiale asistată de calculator 140
2.9.1. Simularea circuitelor logice secvenţiale cu ajutorul aplicaţiei
OrCAD 140
2.9.2. Simularea circuitelor logice secvenţiale cu ajutorul Verilog HDL 142
2.9.3. Simularea circuitelor logice secvenţiale cu ajutorul VHDL 143

Seminar
Seminar 1 145
Seminar 2 147
Seminar 3
Seminar 4
Seminar 5
Seminar 6
Seminar 7

Laborator
Laborator 1
Laborator 2
Laborator 3
Laborator 4
Laborator 5
Laborator 6
Laborator 7
Laborator 8
Laborator 9
Laborator 10
Laborator 11
Laborator 12
Laborator 13
Laborator 14

Bibliografie
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
5

CAPITOLUL 0 (zero)

Elemente de algebră binară (algebră logică)

0.1. Introducere
Primul capitol al acestui curs este capitolul zero şi nu capitolul unu aşa cum se
obişnuieşte. Numărul zero a fost folosit din mai multe motive: în primul rând pentru ca
informaţia din acest capitol reprezintă o recapitulare a cunoştiinţelor dobândite la alte
cursuri şi el reaminteşte doar noţiuni ce vor fi folosite şi aici. Cele câteva elemente ale
algebrei binare prezentate, au doar scopul să limpezească noţiunile ce apar în capitolele
următoare. În al doilea rând, folosirea cifrei zero pentru numerotarea capitolului este
justificată şi de faptul că această cifră reprezintă primul simbol din orice baza de
numeraţie. Ultimul motiv, şi cel mai important, este determinat de faptul că în tehnica
numerică primul indice are valoarea zero şi deci este momentul să ne obişnuim cu
numerotarea: 0, 1, 2, … .
Algebra logică numită şi calcul propoziţional, operează cu propoziţii, despre care
are sens să afirmăm că sunt adevărate sau false. Din însăşi definirea propoziţiilor rezultă că
o propoziţie poate fi adevărată sau falsă. Propoziţiile pot fi simple sau copmuse. Cele
compuse se obţin ca rezultat al legăturii propoziţiilor simple, prin intermediul unor
conective logice. Adevărul sau falsitatea unei propoziţii compuse este în funcţie de
valoarea propoziţiilor simple din care se compune şi de tipul legăturii logice.
În logica simbolică se poate face abstracţie de sensul propoziţiilor, operând cu
relaţiile de valoare. Convenim ca unei propoziţii adevărate să-i atribuim valoarea binară
unu (1), iar falsitatea acesteia să o notăm cu valoarea binară zero (0).
Propoziţia compusă a cărei valoare depinde de valorile propoziţiilor simple, putând
avea două valori, se numeşte funcţie logică sau binară.
Funcţia compusă este complet definită cu ajutorul unui tabel finit în care se trec
valorile funcţiei în corespondenţă cu valorile propoziţiilor simple considerate
independente. O astfel de exprimare a funcţiei compuse este cunoscută sub numele de tabel
de adevăr.
Calculul propoziţiilor poate fi extrapolat în tehnică la sistemele automate care
utilizează elemente de comutaţie cu două stări. Acestora le putem atribui relaţii de valoare
(1 sau 0) binară corespunzătoare adevărului (1) sau falsităţii (0) propoziţiilor.
Algebra Boole operează pe mulţimea binară:
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
6

B = {x / x = 0,1} (0.1)

Pe această mulţime sunt definite trei legi de compoziţie:


o complementarea (negaţia), variabila negată “x” o vom nota cu x ;
o disjuncţia, pe care o vom nota cu +;
o conjuncţia, pe care o vom nota cu *;

Tabelele de adevăr pentru aceste trei legi de compoziţie sunt (TABELUL 0.1):

x x y x x+y y x x+y
0 1 0 0 0 0 0 0
1 0 0 1 1 0 1 0
1 0 1 1 0 0
Complementarea 1 1 1 1 1 1
(negaţia) Disjuncţia Conjuncţia
Din tabelele de adevăr prezentate mai sus se constată că operaţia de disjuncţie este similară
operaţiei de adunare iar cea de conjuncţie cu cea de înmulţire.
O altă observaţie care trebuie făcută este faptul că toate relaţiile definite pe
mulţimea B sunt duale în sensul că se obţin relaţii echivalente dacă schimbăm operaţia de
disjuncţie cu cea de conjuncţie şi “1” în “0” (variabilele directe cu cele negate iar cele
negate cu variabilele directe).

0.2. Axiomele şi teoremele algebrei binare


În algebra binară sunt valabile 6 axiome şi 5 teoreme de bază. Datorită proprietăţii
de dualitate, atât axiomele cât şi teoremele au două forme de exprimare aşa cum se va arăta
mai departe.
Axiome:
1. Mulţimea B este închisă în raport cu operatorii + şi *.
daca x ∈ B, y ∈ B atunci x * y ∈ B, x + y ∈ B (0.2)
2. Asociativitatea.
daca x ∈ B, y ∈ B, z ∈ B
atunci x * ( y * z) = ( x * y) * z, x + ( y + z) = ( x + y) + z (0.3)
3. Comutativitatea.
daca x ∈ B, y ∈ B atunci x * y = y * x, x + y = y + x (0.4)
4. Distributivitatea.
daca x ∈ B, y ∈ B, z ∈ B
atunci x * ( y + z) = x * y + x * z, x + y * z = ( x + y) * ( x + z) (0.5)
5. Existenţa elementului neutru.
daca x ∈ B atunci x *1 = 1* x = x, x + 0 = 0 + x = x (0.6)
6. Existenţa complementului.
daca x ∈ B atunci x * x = 0, x + x = 1 (0.7)
Teoreme:
1. Idempotenţa sau tautologia.

daca x ∈ B atunci x * x = x , x + x = x (0.8)


2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
7

2. Legile lui unu şi zero.


daca x ∈ B atunci x * 0 = 0, x + 1 = 1 (0.9)
3. Dubla negaţie sau involuţia.
daca x ∈ B atunci x = 0 (0.10)
4. Absorbţia.
daca x ∈ B, y ∈ B atunci x * ( x + y) = x, x + x * y = x (0.11)
5. Teorema De Morgan.
daca x ∈ B, y ∈ B atunci x * y = x + y, x + y = x * y (0.12)
Verificarea afirmaţiilor făcute poate fi realizată prin utilizarea tabelelor de adevăr.
De exemplu vom arăta în continuare faptul că cele două relaţii (0.5) sunt echivalente.
Pentru aceasta vom construi un tabel în care se trec toate valorile posibile pentru
variabilele funcţiei, eventual termenii intermediari care să permită determinarea mai uşoară
a rezultatului final şi funcţia de determinat.
Tabelul de adevăr pentru funcţia x(y+z) (TABELUL 0.2):
z y x (y+z) x*(y+z)
0 0 0 0 0
0 0 1 0 0
0 1 0 1 0
0 1 1 1 1
1 0 0 1 0
1 0 1 1 1
1 1 0 1 0
1 1 1 1 1
Tabelul de adevăr pentru funcţia x*y+x*z (TABELUL 0.3):
z y x x*y x*z x*y+x*z
0 0 0 0 0 0
0 0 1 0 0 0
0 1 0 0 0 0
0 1 1 1 0 1
1 0 0 0 0 0
1 0 1 0 1 1
1 1 0 0 0 0
1 1 1 1 1 1
Din studiul tabelelor 0.2 şi 0.3 se constată echivalenţa celor două funcţii ceea ce
justifică prima egalitate din ecuaţia (0.5).
Tabelul de adevăr pentru funcţia x+y*z (TABELUL 0.4):
z y X y*z x+y*z
0 0 0 0 0
0 0 1 0 1
0 1 0 0 0
0 1 1 0 1
1 0 0 0 0
1 0 1 0 1
1 1 0 1 1
1 1 1 1 1
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
8

Tabelul de adevăr pentru funcţia (x+y)*(x+z) (TABELUL 0.5):


z y x (x+y) (x+z) (x+y)*(x+z)
0 0 0 0 0 0
0 0 1 1 1 1
0 1 0 1 0 0
0 1 1 1 1 1
1 0 0 0 1 0
1 0 1 1 1 1
1 1 0 1 1 1
1 1 1 1 1 1
Din studiul tabelelor 0.4 şi 0.5 se constată echivalenţa celor două funcţii ceea ce
justifică a doua egalitate din ecuaţia (0.5).
De asemenea, dacă într-unul din tabelele 0.2 sau 0.3 se înlocuieşte valoarea “0” cu
“1” şi valoarea “1” cu “0” se obţine aceeaşi funcţie cu cea reprezentată în tabelele 0.4 şi
0.5, şi reciproc ceea ce arată proprietatea de dualitate enunţată mai sus.
O mulţime B dotată cu legile de compoziţie "*", respectiv "+" care satisface
axiomele 1-6, se numeşte latice distributivă. Laticea distributivă care admite teoremele 1-5
se numeşte algebră booleană.

0.3. Funcţii binare


Aşa cum s-a arătat în paragraful anterior, variabilele independente pot avea numai
două valori: “0” şi “1”.
O funcţie binară poate avea un singur termen, mai mulţi termeni aparţinând
mulţimii termenilor ce se pot obţine cu n variabile sau nici un termen.
Cu n variabile se obţin 2n=m termeni, de exemplu pentru n=2 se obţin 22=4
termeni: 00, 01, 10, 11.
În general numărul de funcţii NF în cazul a m termeni se calculează astfel:
m
m!
N F = C 0m + C1m + ... + C mm = ∑
n
= 2m = 22 (0.13)
j= 0 j!( m − j)!

În lipsa variabilei independente (n=0) se obţin două funcţii: F=1 şi F=0 – funcţiile
constante.
Pentru n=1 se obţin 4 funcţii : F=1, F=0, F=x şi F= x , unde x este variabila
independentă iar pentru n=2 se obţin 16 funcţii.
Prezentăm în continuare funcţiile logice combinaţionale cu două variabile şi acolo
unde este cazul, porţile logice care le implementează.

1. Conjuncţia F1 = x*y (x şi y, produs logic)

Tabelul de adevăr Simbolul


y x F1 x
F1
0 0 0 y

0 1 0
1 0 0 Denumirea circuitului logic:
1 1 1 ŞI (AND)
2ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
9

2. Disjuncţia F2 = x+y (x sau y, suma logică)

Tabelul de adevăr Simbolul


y x F2 x F2

0 0 0 y

0 1 1
Denumirea circuitului logic:
1 0 1
SAU (OR)
1 1 1

3. şi 4. Negaţia F3 = x (non x )
F4 = y (non y )

Tabelul de adevăr Simbolul


x F3 y F4 x
F3

0 1 0 1
1 0 1 0 Denumirea circuitului logic:
INVERSOR (INVERTER)

5. Implicaţia directă F5 = x → y = x + y (x implică y)

Tabelul de adevăr
y x F5
0 0 1
0 1 0
Circuitul logic nu are o denumire
1 0 1
consacrată
1 1 1

6. Implicaţia inversă F6 = y → x = x + y (y implică x)

Tabelul de adevăr
y x F6
0 0 1
0 1 1 Circuitul logic nu are o denumire
1 0 0 consacrată
1 1 1

F7 = x ~ y
F7 = ( x → y) * ( y → x )
7. Echivalenţa
F7 = (x + y )* (x + y )
F7 = x ⊕ y
2ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
10

Tabelul de adevăr Simbolul


y x F7 x
y
F7

0 0 1
0 1 0
1 0 0 Denumirea circuitului logic:
1 1 1 COINCIDENŢĂ, COMPARATOR

F8 = x → y
8. Negarea implicaţiei directe F8 = x * y (x nu imlică y)
F8 = x + y

Tabelul de adevăr
y x F8
0 0 0
0 1 1 Denumirea circuitului logic:
1 0 0 INTERDICŢIE, INHIBARE
1 1 0

F9 = y → x
9. Negaţia imlicaţiei inverse F9 = x * y (y nu implică x)
F9 = x + y

Tabelul de adevăr
y x F9
0 0 0
0 1 0 Denumirea circuitului logic:
1 0 1 INTERDICŢIE, INHIBARE
1 1 0

F10 = x ~ y
F10 = ( x → y) * ( y → x )
10. Negarea echivalenţei (x nu este echivalent cu y)
F10 = (x + y )* (x + y )
F10 = x ⊕ y
(suma modulo 2)
2ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
11

Tabelul de adevăr Simbolul


y X F10 x
y F10
0 0 0
0 1 1
Denumirea circuitului logic:
1 0 1
SAU EXCLUSIV, SUMA
1 1 0 MODULO DOI

F11 = x + y
11. Negarea disjuncţiei (x sau y negat)
F11 = x * y

Tabelul de adevăr Simbol


y x F11 x
F11

0 0 1 y

0 1 0
1 0 0 Denumirea circuitului logic:
1 1 1 0 SAU-NU (NOR)

F12 = x * y
12. Negarea conjuncţiei (x şi y negat)
F12 = x + y

Tabelul de adevăr Simbol


y x F12 x
F12

0 0 1 y
0 1 1
1 0 1 Denumirea circuitului logic:
1 1 0 ŞI-NU (NAND)

13. Identitate F13 = x (funcţia ce nu depinde de y)

Tabelul de adevăr Simbol


y x F13 F13
x
0 0 0
0 1 1
1 0 0
Denumirea circuitului logic:
1 1 1 IDENTITATE
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
12

14. Identitate F14 = y (funcţia ce nu depinde de x)

Tabelul de adevăr Simbol


y x F14 F14

0 0 0
y

0 1 0
1 0 1 Denumirea circuitului logic:
1 1 1 IDENTITATE

15. Funcţie nulară F15=0 (circuit deschis)

16. Funcţie unară F16=1 (circuit închis)

Materializarea funcţiilor definite mai sus conduce la circuite logice, unele cu


denumiri consacrate.
Din tabelul funcţiilor de două variabile prezentat anterior, o importanţă deosebită o
prezintă următoarele şase funcţii: INHIBAREA, SAU EXCLUSIV, SAU-NU (NICI),
COINCIDENŢA, ŞI-NU şi IMPLICARE.
Algebra logicii se dezvoltă plecând de la o grupare de operaţii fundamentale prin
combinarea cărora se obţin alte operaţii logice. Până acum s-au considerat drept operaţii
logice fundamentale operaţiile logice SAU, ŞI şi NU.
Se pot alege ca operaţii logice fundamentale una sau mai multe din operaţiile
simple prezentate anterior.
Există 6 posibilităţi şi anume: operaţiile SAU-EXCLUSIV şi ŞI; operaţiile
COINCIDENŢĂ şi ŞI; operaţia SAU-NU; operaţia ŞI-NU; operaţia INHIBARE; operaţia
IMPLICARE.
Se observă că în cazul în care se aleg operaţiile SAU-NU, ŞI-NU, INHIBARE şi
IMPLICARE, este necesară o singură operaţie logică elementară sau operaţie logică de
bază. Din acest motiv aceste operaţii se numesc operaţii universale. Datorită faptului că
operaţiile SAU-NU (circuite ECL, MOS) şi ŞI-NU (circuite TTL) necesită, din punct de
vedere al realizării lor practice, mai puţine circuite decât operaţia de INHIBARE sau
IMPLICARE, primele două sunt preferate ultimelor.
Alegerea operaţiilor de bază în algebra booleană nu este unică.
În această alegere trebuie să se ţină în primul rând cont de posibilitatea de realizare
a unor circuite electronice economice şi cu siguranţă mare în funcţionare. Circuitele ŞI,
SAU, NU, SAU-NU, ŞI-NU, sunt frecvent folosite, deoarece pot fi uşor realizate fizic.

0.4. Formele canonice ale funcţiilor logice


O funcţie logică de n variabile va avea 2n valori de ieşire corespunzătoare celor
n
2 combinaţii posibile ale variabilelor de intrare. Acest lucru poate fi reprezentat, aşa
cum s-a arătat, cu ajutorul tabelului de adevăr. Se poate arăta insă că există o expresie
analitică unic determinată cu ajutorul căruia se poate exprima o funcţie logică. Această
funcţie ce conţine cel mult 2n termeni, corespunzător tuturor combinaţiilor posibile
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
13

pentru variabilele de intrare, poate avea două moduri de exprimare, conform


principiului dualităţii. Acestea reprezintă formele canonice ale funcţiilor logice numite
forma normală disjunctivă (FND) şi respectiv, forma normală conjunctivă (FNC).

TABELUL 0.6. Fiind dată o relaţie funcţională logică, numim formă normală
x y z f(x,y,z) disjunctivă a ei o relaţie echivalentă, care este o sumă de produse
elementare construite cu aceleaşi variabile ca şi relaţia dată iniţial,
0 0 0 0
fiecare produs conţinând toate variabilele posibile (ele sau
0 0 1 0
complementarele lor) iar formă normală conjunctivă, o relaţie
0 1 0 1 echivalentă care este un produs de sume elementare, construite
0 1 1 1 deasemenea cu aceleaşi variabile ca şi relaţia dată iniţial, fiecare
1 0 0 1 sumă conţinând toate variabilele posibile (ele sau complementarele
1 0 1 0 lor).
1 1 0 1 Exemplu : considerăm o funcţie logică de trei variabile : x, y şi z, a
1 1 1 0 cărui tabel de adevăr este TABELUL 0.6.
În tabel, valorile funcţiei f(x,y,z) sunt puse la întâmplare, deoarece exemplul se
referă la o funcţie oarecare. În această situaţie putem scrie forma normală disjunctivă a
funcţiei :

f ( x, y, z ) = x y z + x yz + x y z + xy z (0.14)

unde termenii funcţiei reprezintă acele combinaţii ale variabilelor de intrare pentru care
funcţia ia valoarea unu (pentru zero se scrie variabila negată iar pentru unu variabila
nenegată: x y z reprezintă combinaţia 010 iar f(010)=1). Termenii formei normale
disjunctive se mai numesc şi mintermi (o expresie minterm este o sumă de produse în care
fiecare produs conine toate variabilele în formă adevărată sau negată).
Pentru a obţine forma normală conjunctivă a funcţiei, bazându-ne pe principiul
dualităţii vom scrie forma normală disjunctivă pentru f ( xyz ) :

f ( xyz ) = x y z + x yz + x yz + xyz (0.15)

sau aplicând teorema dublei negaţii se obţine:

f ( xyz ) = f ( x, y, z ) = x y z + x yz + x yz + xyz (0.16)

aplicând teorema De Morgan (relaţia 0.12) extinsă la n variabile, rezultă :

( )( )( )(
f ( xyz ) = x + y + z x + y + z x + y + z x + y + z ) (0.17)

Relaţia 0.17 reprezintă forma normală conjunctivă a funcţiei care se poate obţine
direct din tabelul de adevăr prin considerarea combinaţiilor variabilelor de intrare pentru
care funcţia ia valoarea zero, ca un produs de sume, fiecare sumă conţinând variabila
negată dacă aceasta are valoarea unu sau valoarea nenegată dacă aceasta are valoarea zero
în combinaţia respectivă. Termenii formei normală conjunctive se mai numesc şi
maxtermi (o expresie maxterm este o expresie produs de sume în care fiecare sumă
conţine toate variabilele sub formă adevărată sau negată).
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
14

Forma normală conjunctivă s-a obţinut din forma normală disjunctivă prin
aplicarea principiului dualităţii şi deci cele două forme de exprimare a funcţiilor logice
sunt echivalente.
Se observă că, FND conţine toţi termenii pentru care funcţia ia valoarea logică 1 iar
FNC conţine toţi termenii pentru care funcţia ia valoarea logică 0.
Există şi forma prescurtată de scriere a funcţiilor logice, forme numite : formă canonică
normală disjunctivă şi respectiv formă canonică normală conjunctivă.
Pentru exemplul prezentat mai sus forma canonică normală disjunctivă se scrie :

f 3 = P2 + P3 + P4 + P6 (0.18)

unde indicii termenilor P exprimă echivalentul zecimal al combinaţiilor cifrelor binare


corespunzător variabilelor pentru care funcţia are valoarea logică unu iar indicele
termenului f reprezintă numărul variabilelor funcţiei.
Pentru cea de-a doua formă de exprimare a unei funcţii logice, forma canonică
normală conjunctivă, tot pentru exemplul de mai sus, se poate scrie:

f 3 = S0 S1S5 S 7 (0.19)

unde indicii termenilor S exprimă echivalentul zecimal al combinaţiilor cifrelor binare


corespunzător variabilelor pentru care funcţia are valoarea logică zero iar indicele
termenului f reprezintă numărul variabilelor funcţiei.
După modul în care au fost definiţi termenii P, respectiv S, reiese clar că:

Pi = Si şi Si = Pi (0.20)

În continuare vor fi prezentate câteva din teoremele aplicate funcţiilor logice scrise
sub forma canonică P, respectiv S, teoreme utile în analiza şi sinteza dispozitivelor
numerice.

Teorema 1. Produsul logic a doi P oarecare este nul, adică:

Pi ⋅ Pj = 0, pentru i ≠ j (0.21)

Teorema 2. Suma logică a doi termeni S oarecare este întotdeauna egală cu unitatea, adică:

Si + S j = 1, pentru i ≠ j (0.22)

Se observă, fără dificultate, că fiecare termen P sau S din cei posibili ai unei funcţii logice
diferă de un alt termen prin existenţa a cel puţin a complementului unei variabile, şi cum
x ⋅ x = 0 , respectiv x + x = 1 (existenţa complementului, axioma 6, relaţia 0.7), rezultă
direct cele două teoreme enunţate anterior.

Teorema 3. O funcţie logică de n variabile poate fi reprezentată printr-o sumă logică unică
a termenilor P :
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
15

2 n −1
fn = ∑a P
i =0
i i (0.23)

Teorema 4. O funcţie logică de n variabile poate fi reprezentată printr-un produs logic unic
a termenilor S :

2 n −1
f n = ∏ (ai + Si ) (0.24)
i =0

În ultimile două relaţii coeficienţii ai se numesc numere caracteristice ale unei funcţii
logice şi reprezintă valoarea funcţiei logice respective pentru combinaţia i a variabilelor de
intrare. Pentru exemplul de mai sus, numerele caracteristice ale funcţiei logice sunt : a0 = 0,
a1 = 0, a2 = 1, a3 = 1, a4 = 1, a5 = 0, a6 = 1, a7 = 0.

Teorema 5. Complementul unei funcţii logice de n variabile poate fi reprezentat printr-o


sumă logică unică a termenilor P :

2 n −1
fn= ∑a P
i =0
i i (0.25)

Teorema 6. Complementul unei funcţii logice de n variabile poate fi reprezentat printr-un


produs logic unic a termenilor S :

( )
2 n −1
f n = ∏ a i + Si (0.26)
i =0

Pentru a demonstra ultimile două teoreme se face apel la teorema lui De Morgan extinsă la
n variabile. De exemplu pentru a justifica relaţia 0.25 se scrie relaţia 0.24 sub forma :

2 n −1 2 n −1
f n = ∏ (ai + Si ) = ∑a S i i (0.27)
i =0 i =0

sau, în baza relaţiei 0.20 :

2 n −1
fn= ∑a P
i =0
i i (0.28)

Teorema 7. Suma logică a 2n termeni distincţi a unei funcţii logice de n variabile este egală
cu unu :

2 n −1

∑P =1
i =0
i (0.29)
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
16

Teorema 8. Produsul logic al 2n termeni distincţi a unei funcţii logice de n variabile este
egală cu zero :

2 n −1

∏S
i =0
i =0 (0.30)

În baza teoremelor 3 şi 5 se poate scrie :

2 n −1 2 n −1 2 n −1
1 = fn + fn = ∑a P + ∑a P = ∑P
i =0
i i
i =0
i i
i =0
i (0.31)

deoarece ai + ai = 1 . În acelaşi mod, conform teoremelor 4 şi 6, se poate scrie :

( )
2 n −1 2 n −1 2 n −1
0 = f n ⋅ f n = ∏ (ai + Si ) ⋅ ∏ a i + Si = ∏ Si (0.32)
i =0 i =0 i =0

deoarece ai ⋅ a i = 0 .
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
17

CAPITOLUL 1

Analiza şi sinteza circuitelor logice combinaţionale

1.1. Introducere
Circuitele logice combinaţionale numite şi circuite de comutare combinaţionale,
reprezintă circuitele logice cele mai simple, circuite logice de bază, denumite şi circuite
logice de ordinul zero care stau la baza tuturor celorlalte tipuri de ciruite logice.
Reprezentarea schematică a unui circuit logic combinaţional cu n+1 intrări şi m+1
ieşiri este reprezentat în figura 1.1.
Un circuit logic
I I combinaţional se
N x0 y0 E
T x1 y1 Ş
caracterizează prin aceea că
CIRCUIT LOGIC
R
… I starea ieşirilor, la un moment
Ă … COMBINAŢIONAL
R xn ym I R dat, depinde numai de starea
I intrărilor la acel moment de
timp. Acest lucru este descris
Fig. 1.1. Schema bloc a unui circuit logic combinaţional de relaţiile 1.1 în care starea
ieşirilor y0, y1, … ,ym
reprezintă m+1 funcţii de variabilele de intrare x0, x1, … , xn. Funcţiile care descriu astfel
de circuite reprezintă funcţii binare conform celor prezentate in capitolul 1.

y0 = f0(x0, x1, … , xn),


y1 = f1(x0, x1, … , xn),
(1.1)

ym = fm(x0, x1, … , xn).

Circuitele logice combinaţionale pot fi construite cu relee sau cu elemente de


comutere asemănătoare releelor, respectiv cu elemente de comutare având comportarea
unor porţi logice similare celor prezentate in capitolul 2.
O situaţie particulară importantă este reprezentată de către automatele
programabile care permit modelarea prin program a circuitelor logice secvenţiale şi
combinaţionale şi care reprezintă o soluţie convenabilă în cazul circuitelor numerice
destinate automatizărilor complexe.
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
18

In cele ce urmează vor fi studiate numai circuitele logice combinaţionale realizate


cu porţi logice care primesc la intrare semnale numerice în logică pozitivă sau logică
negativă şi furnizează la ieşire de asemenea semnale numerice într-un anumit tip de logică.
Semnalele numerice în logică pozitivă sunt semnalele numerice la care se asociază
un nivel ridicat de tensiune cifrei “1” (sau valorii de adevăr ADEVĂRAT) şi un nivel
coborăt de tensiune cifrei “0” (sau valorii de adevăr FALS). În logica negativă, nivelele de
tensiune se inversează, se asociază un nivel coborât de tensiune – de obicei o tensiune
negativă cifrei “1” – (sau valorii de adevăr ADEVĂRAT) şi un nivel ridicat de tensiune –
de obicei o valoare apropiată de zero volţi – cifrei “0” (sau valorii de adevăr FALS).

1.2. Elemente de analiză a circuitelor logice combinaţionale


Circuitele logice combinaţionale sunt, de regulă, reprezentate grafic, cu ajutorul
schemelor logice combinaţionale cu porţi logice similare cu cea prezentată în figura 1.2. O
astfel de schemă este utilă în analiza funcţionării circuitului dar, un astfel de circuit poate fi
reprezentat în scheme mai complexe cu ajutorul schemei bloc echivalente din figura 1.1,
atunci când funcţionarea circuitului este cunoscută.
În general un circuit logic combinaţional are n+1 intrări notate cu x0, x1, … , xn şi
m+1 ieşiri y0, y1, … ,ym. Intrările x0, x1, … , xn se aplică unor elemente logice ale căror
ieşiri pot fi ieşiri ale reşelei sau intrări pentru alte elemente logice din reţea.
În figura 1.2. se prezintă un circuit logic cu nouă intrări şi trei ieşiri.

X0
U1A
U5A 1 U2A U8A
3 1
1 2 2 3 1 2
X1 Y0
2
SN74S00/SO
SN74S04 SN74S00/SO SN74S04
X2
U6A U9A
1
1 2 3
Y1
U10A 2
1
X3
3 SN74S04 U3A SN74S86/SO
2 1
X4
U7A 3
SN74S86/SO 2
Y2
1 2
X5
SN74S00/SO

SN74S04

U4A
1 U11A
X6
3 1
2 3
X7
2
SN74S00/SO
SN74S86/SO
X8

Fig. 1.2. Circuit realizat cu porţi logice

Fiecare element logic din reţea corespunde unei porţi logice din circuitul de
comutare modelat. În reţelele logice nu se admite legarea ieşirilor elementelor logice decât
prin intermediul altor elemente logice. Atunci când circuitul de comutare modelat conţine
porţi care au proprietatea funcţiilor logice cablate, se reprezintă simbolic în reţea elementul
logic prin care sunt legate din punct de vedere funcţional ieşirile porţilor respective.
Semnalele aplicate la intrarile unui circuit logic, parcurg, în general, mai multe
porţi până se obţin semnalele de ieşire. Acest lucru se reflectă în reţea prin numărul
elementelor logice interpuse între intrările şi ieşirile reţelei. Maximumul numarului de
elemenete logice aflate între intrările şi ieşirile unei reţele logice dă numărul de niveluri
logice al reţelei. Numerotarea nivelurilor se face, în mod convenţional, de la ieşire spre
intrare (figura 1.3). În reţelele de comutare combinaţionale sunt admise legături inverse,
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
19

adică legarea ieşirii unui element logic la intrările elementelor logice precedente
acestuia (fig. 1.4), cu condiţia să fie respectată definiţia 1.1. Trebuie menţionat însă că
orice reţea cu elemente logice fară legături inverse este combinaţională, în schimb
numai anumite reţele cu legături inverse satisfac această condiţie. Reţelele cu elemente
logice fară legatură inversă se mai numesc grafuri booleene.
Analiza unui circuit trebuie să înceapă cu stabilirea tipului acestuia. Aşa cum s-a
arătat mai sus, dacă circuitul nu are legături inverse atunci el este un circuit logic
combinaţional. În cazul în care circuitul are legături inverse (figura 1.4.), atunci, pentru a
putea spune că acesta este un circuit logic combinaţional, va trebui să analizăm dependenţa
semnalelor de ieşire de cele de intrare şi să arătăm că ecuaţia 1.1. este respectată. Nu
intotdeauna este foarte uşor să detectăm existenţa unei legături inverse într-un circuit mai
ales dacă acesta este complicat. Din acest motiv se va prezenta în continuare o regulă prin
care se poate determina existenţa legăturilor inverse la scheme oricât de complicate.

X0
U12A U7A i
1
1 2
c 3
3 2
9
U1A a
2 74LS04/SO 74LS08
X1
1
3
1
X2
U5A d g
74LS02 1 U3A U4A
3 2 2
m
2
4 1 1
X3
3
7 3
11 Y0
74LS08
74LS02 74LS02

U2A b U10A e U11A h


2
X4
1 1 2 1 2 U8A
3
2 5 8 1
n
X5
3
74LS02 74LS04/SO 74LS04/SO 2
12 Y1

U9A k 74LS08
U6A 1
1
f 3
3 2
10
2
6
X6
74LS08
74LS08

4 3 2 1 0 NIVELUL
Figura 1.3. Reţea de comutare fără legătură inversă

Existenţa unei legături inverse într-o reţea de comutare cu elemente logice se


poate determina folosind următoarea regulă de numerotare a elementelor.

Regula 1.1.

a. Elementele reţelei ale căror intrări fac toate parte din mulţimea intrărilor reţelei,
X={x1 x2,...,xn}, se numerotează, într-o ordine arbitrară, cu numerele 1 pina la k,
unde k este numărul elementelor ce îndeplinesc această condiţie.

b. Elementele reţelei ale căror intrări sunt fie intrări din mulţimea X, fie ieşiri ale
elementelor numerotate, la punctul a respectiv b, se numerotează în continuare
cu numerele k + 1 pâna la m, unde m - k este numărul elementelor ce
îndeplinesc această condiţie.
c. Dacă procedând în acest fel s-au putut numerota toate elementele reţelei, adică
m este numărul de elemente logice din reţea, rezultă că reţeaua nu are legături
inverse. În caz contrar în reţea există cel puţin o legatură inversă.

Prin procedura de mai sus se face de fapt o ordonare parţială a elementelor


logice din reţea. Această ordonare nu este posibilă decât atunci când un anumit element
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
20

nu mai poate primi număr de ordine, deoarece unele din intrările sale provin de la
elemente nenumerotate care succed elementul dat, ceea ce înseamnă că există o legatură
inversă.
Referindu-ne la schema din figura 1.3, regula de ordonare se aplică astfel :
porţile 1 şi 2 se numerotează primele deoarece intrările acestor porţi fac parte din
mulţimea intrărilor circuitului x1şi x2 respectiv x4 şi x5. Urmează apoi elementul care se
numerotează cu 3 deoarece acesta are intrarea conectată la un element care a fost deja
numerotat (poarta numerotată cu 1), similar acestei situaţii este cea a elementului care a
fost numerotat cu 5, iar elementele numerotate cu 4, 6 şi 9 sunt conectate la elemente
deja numerotate şi intrări ale circuitului (poarta 1 şi intrarea x3, poarta 2 şi intrarea x6 şi,
respectiv poarta 7 şi intrarea x0). Elementele numerotate cu 7, 8, 10, 11 şi respectiv 12
pot şi ele numerotate succesiv, în această ordine, deoarece intrările acestor elemente
sunt conectate la elemente deja numerotate.
Pentru acest exemplu m = 12, toate elementele circuitului au putut fi numerotate
şi deci nu există nici o legătură inversă iar circuitul este combinaţional, adică starea
ieşirilor la un moment dat nu depinde decât de starea intrărilor la acel moment (relaţia
1.1).
Aplicind regula 1.1, definită mai sus, pentru reţeaua din figura 1.4 se constată că
nu este posibilă o ordonare parţială a tuturor elementelor reţelei şi prin urmare reţeaua
are o legatură inversă.
Pentru reţelele la care se poate face o ordonare parţială a elementelor, deci care
nu au legaturi inverse, se poate scrie expresia ieşirii fiecarui element logic, în ordinea
numerotării acestora, ca o funcţie de comutare de variabilele de intrare ale reţelei, de
unde rezultă că şi în expresia ieşirii intră numai variabilele de intrare ale reţelei. Funcţia
de comutare a unei asemenea reţele depinde deci numai de variabilele de intrare, prin
urmare reţeaua este combinaţională. Pentru reţeaua logică din figura 1.3 se obtine :

a = x1 + x2 (1.2)
b = x4 + x5 (1.3)
c = a = x1 + x2 (1.4)
d = a ⋅ x3 = ( x1 + x2 ) ⋅ x3 (1.5)
e = b = x4 + x5 (1.6)
(
f = c ⋅ x6 = x1 + x2 ⋅ x6 ) (1.7)

g = d + e = ( x1 + x2 ) ⋅ x3 + x4 + x5 = x1 ⋅ x3 + x2 ⋅ x3 + x4 + x5 (1.8)

h = e = x4 + x5 (1.9)

(
i = x0 ⋅ g = x0 ⋅ x1 ⋅ x3 + x2 ⋅ x3 + x4 + x5 ) (1.10)

( )
k = h ⋅ f = ( x4 + x5 ) ⋅ x1 + x2 ⋅ x6 (1.11)

( )
m = y0 = i + g = g ⋅ ( x0 + 1) = x1 ⋅ x3 + x2 ⋅ x3 + x4 + x5 ⋅ ( x0 + 1)
(1.12)
( ) ( )
n = y1 = g ⋅ k = x1 ⋅ x3 + x2 ⋅ x3 + x4 + x5 ⋅ ( x4 + x5 ) ⋅ x1 + x2 ⋅ x6
(1.13)
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
21

Din relaţia (1.12) rezultă că y0 iar din relaţia (1.13) rezultă că y1 depind numai de
variabilele de intrare ale reţelei şi deci reteaua din figura 1.3 este o reţea
combinaţională.
La reţelele care au legături inverse, expresia ieşirii se poate scrie numai dacă se
introduc variabile de intrare secundare datorate legăturilor inverse.
Pentru ca o astfel de reţea să fie combinaţională trebuie ca funcţiile de ieşire a
reţelei să depindă numai de variabilele de intrare principale adică să fie respectată
ecuaţia 1.1. şi deci variabilele de intrare secundare sunt neesenţiale. Demonstrarea
adestui lucru se poate face prin construirea tabelului de adevăr a funcţiei date, în care se
trec toate combinaţiile posibile ale variabilelor de intrare principale cât şi a celor
secundare. Dacă din acest tabel rezultă faptul că valorile funcţiei de ieşire a circuitului
depind numai de valorile variabilelor principale iar valoile variabilelor secundare nu au
nici o influenţă asupra ieşirii, atunci funcţia analizată este combinaţională.
Din cele arătate rezultă că oricarei reţele de comutare combinaţională cu legaturi
inverse îi corespunde cel puţin o reţea de comutare combinaţională fară legătură inversă.

U1A A U5D D
1 12
X0
3 11
2
1 13
4 Y0
X1
74LS08/SO 74LS08/SO

U2B 1 U6A
4
B 2
6 3 5
5
2 12
? Y1
X2
13
74LS08/SO 74LS260/SO

U3C C U4A E
9 1
8 3
10
3 2
?
74LS08/SO 74LS08/SO
Xa

Fig. 1.4. Circuit logic cu conexiune inversă

Să considerăm circuitul din figura 1.4. Vom încerca să realizăm o ordonare


parţială a elementelor acestui circuit conform regulii 1.1. Se constată faptul că
numerotarea tuturor elementelor circuitului eşuează şi deci există cel puţin o legătură
inversă. În această situaţie, pentru a vedea dacă circuitul este combinaţional, se
construiesc tabelele de adevăr a funcţiilor de ieşire.
Funcţia logică a ieşirii y0 este combinaţională pentru că toate elementele aferente
acestei ieşiri au putut fi numerotate. Funcţia de ieşire y0 rezultă imediat :

y0 = x0 ⋅ x1 ⋅ x2 (1.14)

Pentru ieşirea y1 se construieşte tabelul de adevăr 1.1. în care s-au introdus


variabilele principale x0, x1, x2 şi variabila secundară Xa. După realizarea tabelului, prin
inspectarea acestuia, ne putem da seama de modul în care o variabilă influenţează
ieşirea. Pentru a putea observa mai uşor influenţa variabilei secundare Xa asupra ieşirii
y1, se aşază alăturat valorile de ieşire pentru situaţia când variabila Xa ia valoarea zero
şi valorile de ieşire pentru variabila secundară egală cu unu. Dacă variabila secundară
nu influenţează ieşirea, atunci cele două coloane trebuie să fie identice.
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
22

TABELUL 1.1.
x2 x1 x0 Xa A=x0x1 B=x1x2 C=x0x2 D=x0x1x2 E=x1x2Xa y1
0 0 0 0 0 0 0 0 0 1
0 0 1 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0 0 1
0 1 1 0 1 0 0 0 0 0
1 0 0 0 0 0 0 0 0 1
1 0 1 0 0 0 0 0 0 1
1 1 0 0 0 1 1 0 0 0
1 1 1 0 1 1 1 1 0 0
x2 x1 x0 Xa A=x0x1 B=x1x2 C=x0x2 D=x0x1x2 E=x1x2Xa y1
0 0 0 1 0 0 0 0 0 1
0 0 1 1 0 0 0 0 0 1
0 1 0 1 0 0 0 0 0 1
0 1 1 1 1 0 0 0 0 0
1 0 0 1 0 0 0 0 0 1
1 0 1 1 0 0 0 0 0 1
1 1 0 1 0 1 1 0 1 0
1 1 1 1 1 1 1 1 1 0

Se observă că în tabelul 1.1 coloana y1 rămâne neschimbată atunci când variabila


Xa ia valoarea zero sau valoarea unu şi deci această variabilă secundară este neesenţială.
Putem să scriem acum şi funcţia combinaţională de ieşire y1:

y1 = x0 x1 + x1 x2 + x0 x2 + x0 x1 x2 = x0 x1 (1 + x2 ) + x1 x2 + x0 x2 =
(1.15)
= x0 x1 + x1 x2 + x0 x2

Având în vedere faptul că reţelele de comutare cu elemente logice, fară legatură


inversă sunt reprezentative pentru reţelele combinaţionale cu elemente logice, în cele ce
urmează se trateaza numai acestea.
Reţelele de comutare combinaţionale cu elemente logice cu o singură ieşire, la
care fiecare dintre intrările reţelei se aplică la un singur element logic, iar ieşirea unui
element logic poate fi aplicată ca intrare la un singur element logic, se numeşte arbore
boolean. Arborele boolean este un caz particular al grafului boolean. Un exemplu de
arbore boolean este dat in figura 1.5
U3A
a
1
x0 3
2
x1 U4A
7432 1
3
2 y0
U2A
b
1 7408
x2 3
2

7432
U1A
1
x3 3 c
2
x4
7408

Figura 1.5. Reţea combinaţională sub formă de arbore boolean


2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
23

Pentru analiza unui arbore boolean se poate folosi o metodă formală care constă
în găsirea unei acoperiri a mulţimii n-uplelor funcţiei logice pentru care aceasta ia
valoarea unu.
Se va exemplifica această metodă pe circuitul din figura 1.5. construindu-se
tabelul 1.2. Tabelul construit va conţine toate variabilele principale ale funcţiei (x0, x1,
x2, x3, x4,), variabilele secundare (a, b, c) şi ieşirea circuitului (y0).

TABELUL 1.2.
x4 x3 x2 x1 x0 a b c y0 Observaţii
1 1
2 1 1 y0 = a b
x 1 1
3 a = x0 + x1
1 x 1
1 x 1 x
x x 1 1
4 b = x2 + c
1 1 x x
x 1 x 1
x x 1 x 1
1 1 x x 1
5 c = x3 x4
x x 1 1 x
1 1 x 1 x

Tabelul 1.2 se completează astfel: pe rândul unu se trece cifra unu pe coloana y0
simbolizându-se asfel faptul că se vor determina combinaţiile variabilelor de intrare
pentru care funcţia ia valoarea unu. Pe rândul doi se trec valorile variabilelor de pe
nivelul zero care determină valoarea unu la ieşire. Acestea vor fi: unu pentru variabila
secundară a şi unu pentru varibila secundară b. Deoarece numai această combinaţie a
variabilelor a şi b conduc la valoarea unu a funcţiei de ieşire y0, se trece la rândul trei
unde se vor determina combinaţiile variabilelor principale pentru care variabila
secundară a ia valoarea unu. Aşa cum se vede, sunt posibile 2 combinaţii pentru
variabilele principale x0 şi x1: variabila x0 ia valoarea unu şi atunci x1 poate avea orice
valoare (se notează cu x – indiferent) sau, cind x1 ia valoarea unu şi atunci x0 poate avea
orice valoare (x – indiferent). Se trece acum la rândul patru care determină combinaţile
variabilelor care duc la variabila b egala cu unu. Sunt doua posibilităţi: x2 egal cu unu şi
variabila c poate avea în acest caz orice valoare sau c egal cu unu şi atunci x2 poate avea
orice valoare. Aceste două posibilităţi se aplică celor două combinaţii determinate la
rândul trei şi rezultă patru combinaţii posibile.
La rândul cinci se explicitează variabila c pentru care nu există decât doua
posibilităţi: variabila c poate lua orice valoare şi atunci şi x3 şi x4 pot lua orice valoare
sau variabila c ia valoarea unu li atunci x3 = x4 = 1.
În momentul in care au fost explicitate toate variabilele secundare, completarea
tabelului a fost terminată şi sa găsit o acoperire a funcţiei pentru care aceasta ia valoarea
unu. Funcţia poate fi scrisă ca o sumă de produse a combinaţiilor găsite, din care se
elimină variabilele principale notate cu x (care pot avea orice valoare) şi se notează cu
variabila directă variabila principală egală cu unu şi cu variabila negată cea egală cu
zero în tabel. Pentru exemplul dat se obţine (forma normală disjunctivă):
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
24

y0 = x2 x0 + x4 x3 x0 + x2 x1 + x4 x3 x1 (1.16)

Printr-o metodă similară – căutându-se combinaţiile variabilelor principale


pentru care funcţia este egală cu zero – se poate determina funcţia de ieşire sub forma
unui produs de sume.
Pentru a exemplifica acest lucru vom considera schema din figura 1.6. Vom
căuta de data aceasta o acoperire a n-uplelor funcţiei logice pentru care aceasta ia
valoarea zero. Se construieşte tabelul 1.2 similar tabelului 1.1. în care se trec variabilele
principale şi cele secundare pe coloane iar pe rânduri combinaţiile acestora pentru care
funcţia ia valoarea zero.
U3A
1
X0
3
a
2
X1
14081 U6A
1
d
3 U8A
2 1
3
Y0
U5A 14071 2
1
X2
3 14011
2
X3
14081
b

U7A
1
X4
3
c
2
X5
14093

Figura 1.6. Arbore boolean

TABELUL 1.3.
x5 x4 x3 x2 x1 x0 a b c d y0 Observaţii
1 0
2 1 1 y0 = cd
0 x 1
3 c = x4 x5
x 0 1
0 x 1 x
x 0 1 x
4 d =a+b
0 x x 1
x 0 x 1
0 x x x 1
x 0 x x 1 b = x3 x2
5
0 x 1 1 x
x 0 1 1 x
0 x x x 1 1
x 0 x x 1 1 a = x0 x1
6
0 x 1 1 x x
x 0 1 1 x x

În rândul 6 completarea tabelului se încheie deoarece combinaţiile tuturor


variabilelor principale au fost precizate. În acest moment putem scrie ecuaţia funcţiei de
ieşire ca un produs de sume în care variabilele de intrare care iau valoarea zero sunt
scrise direct iar cele care iau valoarea unu sunt scrise negat (ecuaţia 1.18, forma normală
conjunctivă):
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
25

( )( )( )(
y0 = x5 + x1 + x0 x4 + x1 + x0 x5 + x3 + x2 x4 + x3 + x2 ) (1.18)

Verificarea corectitudinii rezultatului se poate face prin intermediul unui


program care să genereze toate combinaţiile posibile ale variabilelor principale, să
calculeze valorile ecuaţiei (1.18) şi să le compare cu valorile obţinute pentru funcţia de
ieşire a circuitului din figura 1.6 a cărui ecuaţie poate fi scrisă imediat conform porţilor
logice şi conexiunilor arătate în figură:

y0 = ( x0 x1 + x2 x3 )x4 x5 (1.19)

În continuare se prezintă un program scris în limbaj de programare PASCAL


pentru compararea ecuaţiei (1.18) cu ecuaţia (1.19). S-a ales limbjul PASCAL datorită
faptului că este foarte asemănător cu limbajul pseudocod şi programele pot fi foarte uşor
înţelese chiar şi fără cunoaşterea limbajului.

PROGRAMUL 1.1.
Program logic1;
{se verifica daca ecuatia determinata pentru arbore boolean este corecta}

var
y1,y2,x0,x1,x2,x3,x4,x5:boolean;

begin
for x5:= false to true do
for x4:= false to true do
for x3:= false to true do
for x2:= false to true do
for x1:= false to true do
for x0:= false to true do
begin
{ecuatia 1.19}
y1:=not (((x0 and x1) or (x2 and x3)) and ( not (x4 and x5)));
{ecuatia 1.18}
y2:=(x5 or not x1 or not x0) and (x4 or not x1 or not x0) and (x5 or not x3 or not x2) and (x4 or not
x3 or not x2);
if y1<>y2 then
begin
writeln('Cele doua ecuatii nu sunt egale! Apasati ENTER');
readln;
halt(1);
end;
end;
writeln('Cele doua ecuatii sunt egale. Apasati ENTER');
readln;
end.

În cazul general al reţelelor sub formă de graf boolean se aplică aceeaşi


procedură cu singura deosebire că intrările, respectiv ieşirile elementelor logice care se
aplică la mai multe elemente logice se consideră de mai multe ori (notate cu indici sau
cu prim, secund, terţ ş.a.m.d.), iar apoi se impune condiţia ca valorile obţinute să fie
egale, respectiv se elimină subcuburile corespunzătoare liniilor pentru care variabilele
cu acelaşi nume nu au aceeaşi valoare.
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
26

Vom exemplifica acest lucru pentru graful boolean din figura 1.7. care va fi
analizat în tabelul 1.4.
U3A
1
X0
3
b
a' 2

U2A
U1A 2
2 1
X1
1
a 3
Y0
x2'
3
X2

a'' U4A
1
x2'' 2 12
c
13
X3

Figura 1.7. Reţea de comutare sub formă de graf boolean

În tabelul 1.4, datorită faptului că variabila principală x2 se aplică la intrarea a


două elemente logice, vom considera suplimentar variabilele x2’ şi x2’’ şi, similar,
pentru variabila secundară a care la rândul ei se aplică la intările altor două elemente
logice, vom considera, de asemenea variabilele secundare a’ şi a”.

TABELUL 1.4.
x3 x2 x'2 x"2 x1 x0 a a' a" b c y0 Observaţii
1 1
1 x
2 y0 = b + c
x 1
x x x 1
3 c = a” x2” x3
1 1 1 x
x x 1 1 x
4 b = x0 a’
1 1 x x 1
x x 1 1
5 a = a’ = a”
1 1 x 1
x x x 1 1
x 1 x x 1
6 a = x1 + x2’
1 x 1 1 x
1 1 1 x x
x x 1 1
x 1 x 1 x2 = x2’ =
7
1 1 1 x x2”
1 1 x x

Până la rândul cinci completarea tabelului se face în modul discutat deja mai sus.
În rândul cinci trebuie alese valorile pentru care a = a’ = a”. Sunt două situaţii: când a’ =
1 şi a” = x şi când a’ = x şi a” = 1 adică sunt posibile urmatoarele cazuri a’ = 1şi a” = 0
sau a’ = 1 şi a” = 1, respectiv a’ = 0 şi a” = 1 şi a’ = 1 şi a” = 1 (deoarece simbolul x
semnifică „orice valoare” adică zero sau unu). Evident, singura soluţie posibila este a =
a’ = a” = 1. Acelaşi raţionament este făcut pe rândul şapte când pentru x2’ = x şi x2” = x
rezultă x2 = x în celelalte situaţii, ca şi pe rândul cinci, soluţia este x2 = x2’ = x2” = 0.
Putem acum să scriem acum forma normală disjunctivă a funcţiei de ieşire:
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
27

y0 = x1 x0 + x2 x0 + x3 x2 x1 + x3 x2 = x1 x0 + x2 x0 + x3 x2 ( x1 + 1) =
= x1 x0 + x2 x0 + x3 x2 (1.20)

1.3. Sinteza circuitelor logice combinaţionale


Problema sintezei circuitelor logice combinaţionale constă în realizarea fizică a
unei funcţii logice combinaţionale dată sub forma unui tabel de adevăr sau a unei funcţii
canonice.
Datorită faptului că există mai multe expresii echivalente pentru o funcţie logică,
problema sintezei circuitelor logice va avea şi ea mai multe soluţii. În practică
interesează în general acea soluţie care corespunde circuitului realizabil cu cost cât mai
mic, dar pot exista şi alte criterii cum ar fi cele de protecţie a informaţiei, siguranţă în
funcţionare etc.
Din acest punct de vedere sunt importante procedeele de minimizare a funcţiilor
logice combinaţionale care duc la găsirea celei mai avantajoase expresii pentru funcţia
combinaţională dată.
TABELUL 1.5. De multe ori poate interesa realizarea funcţiei logice
combinaţionale cu ajutorul unui singur tip de poartă logică. Aşa
x2 x1 x0 y0
cum se ştie, există operaţii universale cu ajutorul cărora pot fi
0 0 0 0 0
scrise in totalitate funcţiile logice. În continuarea se va arăta
1 0 0 1 0
modul de realizare al unei funcţii logice al cărui tabel de adevăr
2 0 1 0 1
este dat în tabelul 1.5. cu ajutorul porţii logice ŞI-NU (NAND) a
3 0 1 1 1 cărei funcţie este o operaţie universală.
4 1 0 0 0 Pentru funcţia logică a cărei tabel de adevăr este dat în tabelul
5 1 0 1 1 1.5. putem scrie forma canonică normală disjunctivă:
6 1 1 0 0
7 1 1 1 1
f 3 = P2 + P3 + P5 + P7 = x 2 x1 x 0 + x 2 x1 x0 + x2 x1 x0 + x2 x1 x0 (1.21)

sau forma canonică formal conjunctivă:

f 3 = S0 S1S 4 S6 =
( )( )(
= ( x2 + x1 + x0 ) x2 + x1 + x 0 x 2 + x1 + x0 x 2 + x1 + x0 ) (1.22)

Plecând de la forma normală disjunctivă realizarea fizică a circuitului este cea


din figura 1.8.
Pentru a realiza funcţia a cărei ecuaţie este dată de relaţia (1.21) numai cu porţi
ŞI-NU, facem apel la teorema lui De Morgan extinsă la n variabile şi ecuaţia (1.21)
devine :

(1.23)
y0 = x 2 x1 x 0 ⋅ x 2 x1 x0 ⋅ x2 x1 x0 ⋅ x2 x1 x0
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
28

x2 x1 x0 x2 x1 x0

1 2

1 2

1 2
x2
x2 x1 x0
x1 1
2 9
x0 8
P2

x2 x1 x0
1
2 9 2
8
P3 3
1
f3 = y0
4
5
x2 x1 x0
1
2 9
8
P5

x2 x1 x0
1
2 9
8
P7

Figura 1.8. Realizarea fizică a funcţiei (3.21) cu ajutorul porţilor logice.

Ecuaţie, care, aşa cum se vede, poate fi realizată fizic numai cu porţi ŞI-NU.
Pentru ca întreaga realizare fizică să conţină numai porţi logice ŞI-NU, inversoarele
folosite în figura 1.8. pentru obţinerea variabilelor de intrare negate, se vor înlocui cu
porţi ŞI-NU cu intrările scurtcircuitate. Conform tabelului de adevăr al acestei funcţii,
dacă pe toate intrările porţii se aplică aceeaşi valoare atunci se obţine un circuit
inversor.
Rezultatul acestor transformări este prezentat în figura 1.9.
Aşa cum rezultă din figura 1.9. pentru implementarea fizică a unei funcţii logice
combinaţionale, pe baza funcţiilor canonice, este necesar un număr relativ ridicat de
elemente logice. Din acest motiv este important să se găsească procedee de simplificare
a ecuaţiilor ce descriu funcţiile de ieşire ale circuitelor logice combinaţionale în vederea
reducerii numărului de porţi logice.

x2 x1 x0 x2 x1 x0
2
4
3

2
4
3

2
4
3
x2
x2 x1 x0
x1 1
2 12
x0 13
P2

x2 x1 x0
1
2 12 1
13
P3 2
6
f3 = y0
4
5
x2 x1 x0
1
2 12
13
P5

x2 x1 x0
1
2 12
13
P7

Figura 1.9. Funcţie logică combinaţională realizată numai cu porţi ŞI-NU


2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
29

1.4. Minimizarea funcţiilor logice combinaţionale


Se vor prezenta în continuare principalele metode de minimizare a funcţiilor logice
combinaţionale care, pe baza formelor canonice normale disjunctive sau normale
conjunctive, permit obţinerea unor forme mai simple a funcţiei, realizabile la un cost mai
scăzut (cu un număr mai mic de porţi logice mai simple).

1.4.1. Metoda minimizarii pe baza axiomelor si teoremelor algebrei booleene

Folosind axiomele şi teoremele algebrei booleene (paragraful 1.2), o funcţie


booleană dată sub forma canonică disjunctivă sau sub forma canonică conjunctivă poate
fi scrisă în cazul general sub o altă formă cu număr mai mic de termeni, respectiv factori
elementari căreia îi corespunde o reţea cu cost mai redus. Această metodă de
minimizare a funcţiei de comutare necesită din partea proiectantului multă îndemânare,
ingeniozitate şi experienţă, motiv pentru care nu poate fi aplicată cu succes decât după o
practică îndelungată în proiectarea circuitelor de comutare. Unul dintre principalele
dezavantaje ale metodei îl constituie faptul că obţinându-se prin calcule o anumita
formă a funcţiei nu se poate stabili cu uşurinţă dacă este forma minimă sau se mai poate
simplifica.
Pentru exemplificare vom considera un exemplu foarte simplu:

y0 = x2 x0 ( x0 + x1 ) + x 2 x1 x0 + x 2 x1 x0 (1.24)

aplicând teorema absorbţiei se obţine:

y0 = x2 x0 + x 2 x1 x0 + x 2 x1 x0 (1.25)

grupăm acum ultimii doi termeni:

(
y0 = x2 x0 + x 2 x0 x1 + x1 ) (1.26)

şi aplicăm axioma existenţei complementului:

( )
y0 = x2 x0 + x 2 x0 = x0 x2 + x 2 = x 0 (1.27)

Acest exemplu simplu indică faptul că prelucrarea unei funcţii poate duce la
simplificarea considerabilă a acesteia. În activitatea de simplificare a funcţiei logice unii
termeni pot fi multiplicaţi, bazându-ne pe teorema idempotenţei, în scopul grupării
convenabile a acestora şi reducerea unor variabile.

1.4.2. Metoda diagramelor Karnaugh

Folosirea unei forme speciale a diagramelor Venn, în scopul simplificarii cu


ajutorul acestora a funcţiilor logice combinaţionale a fost sugerată pentru prima oară de
către E. W. Veitch. La scurt timp M. Karnaugh propune de asemenea o formă
modificată a diagramelor Venn cu acelaşi scop. Astfel au rezultat diagramele denumite
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
30

diagrame Karnaugh. Diagramele Karnaugh sunt folosite curent pentru reprezentarea


funcţiilor booleene cu numar relativ mic de variabile.
Aceste diagrame sunt utile pentru minimizarea funcţiilor booleene deoarece
permit evidenţierea cu uşurinţă a unor identităţi de forma:

x + xy = x
xy + x y = x (1.28)
x + xy = x + y

În general, o diagramă Karnaugh pentru o funcţie booleana de n variabile se


desenează sub forma unui pătrat sau dreptunghi, împărţit în 2n compartimente, fiecare
compartiment fiind rezervat unui termen canonic al funcţiei, respectiv unuia dintre cele
2n n-uple ale funcţiei sau vârfuri ale cubului n-dimensional din reprezentarea geometrică
a funcţiei.
În acest fel, o diagramă Karnaugh va fi reprezentată printr-un tabel cu m linii şi
p coloane care îndeplinesc condiţia m x p = 2n iar m + p = n. Capetele de tabel vor
conţine combinaţiile posibile pentru variabilele funcţiei scrise în cod Gray. Aşezarea
variabilelor pe linii şi coloane poate fi făcută în mai multe feluri, singura condiţie de
care trebuie să se ţină seama este completarea corectă a tabelului. De asemenea la
minimizarea funcţiei va trebui să se ţină seama de faptul că o diagramă Karnaugh este o
suprafaţă închisă şi deci marginea de sus şi marginea de jos a tabelului precum şi
marginea din stânga şi marginea din dreapta ale acestuia sunt adiacente (sunt lipite).
În continuare vom exemplifica modul de realizare a diagramei Karnaugh pentru
o funcţie de patru variabile.
Vom considera tabelul de adevăr al funcţiei tabelul 1.6 (în acest tabel valorile
funcţiei sunt alese la întâmplare).

TABELUL 1.6.
x3 x2 x1 x0 y0 x3 x2 x1 x0 y0 x3 x2 x1 x0 y0 x3 x2 x1 x0 y0
0 0 0 0 0 f(0)=0 4 0 1 0 0 f(4)=1 8 1 0 0 0 f(8)=0 12 1 1 0 0 f(12)=1
1 0 0 0 1 f(1)=1 5 0 1 0 1 f(5)=0 9 1 0 0 1 f(9)=0 13 1 1 0 1 f(13)=0
2 0 0 1 0 f(2)=1 6 0 1 1 0 f(6)=1 10 1 0 1 0 f(10)=1 14 1 1 1 0 f(14)=1
3 0 0 1 1 f(3)=0 7 0 1 1 1 f(7)=0 11 1 0 1 1 f(11)=1 15 1 1 1 1 f(15)=0

Conform acestui, tabel forma normală disjunctivă a funcţiei este:

f4 = P1 + P2 + P4 + P6 + P10 + P11 + P12 + P14 (1.29)

Tabelele Karnaugh posibil de construit pentru funcţia (1.29) sunt prezentete în


figura 1.10.
Este evident faptul că există şi alte posibilităţi de aşezare a variabilelor pe liniile
şi coloanele tabelului în afară de cele arătate în figura 1.10.
Tabelul se completează cu valorile funcţiei (zero sau unu) corespunzătoare
combinatiei variabilelor de intrare de pe linia şi coloana respectivă (figura 1.10 d.).
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
31

x1

x1x0
00 01 11 10
x3x2
00 f(0) f(1) f(3) f(2) x0
01 f(4) f(5) f(7) f(6) x2 0 1
x3 11 f(12) f(13) f(15) f(14)
10 f(8) f(9) f(11) f(10) x3x2x1
000 f(0) f(1)
x0
a. 001 f(2) f(3)
011 f(6) f(7)
x3x2 010 f(4) f(5)
00 01 11 10
x1x0 110 f(12) f(13)
00 f(0) f(4) f(12) f(8) 111 f(14) f(15)
01 f(1) f(5) f(13) f(9) 101 f(10) f(11)
11 f(3) f(7) f(15) f(11) 100 f(8) f(9)
10 f(2) f(6) f(14) f(10) c.
b.
x1x0
00 01 11 10
x3x2
00 0 0 1 1 3 0 2 1
01 4 1 5 0 7 0 6 1
11 121 130 150 141
10 8 0 9 0 111 101
d.
Figura 1.10. a. b. c. Posibilităţi de realizare a tabelului Karnaugh pentru o
funcţie de patru variabile.
d. Tabelul Karnaugh pentru funcţia descrisă de ecuaţia (1.29).

Codul Gray (codul binar reflectat), cod ce poartă numele celui care l-a imaginat,
a fost construit pe principiul ca două secvenţe vecine să difere într-o singură poziţie
binară. Secvenţele codului Gray pot fi deduse din cele ale codului binar pe baza
următoarelor relaţii:

g0 = b0 ⊕ b1,
g1 = b1 ⊕ b2,
(1.30)
g2 = b2 ⊕ b3,
g3 = b3 ,

unde g0, g1, g2, g3, sunt poziţiile unei secvenţe Gray scrise de la dreapta spre stânga, iar
b0, b1, b2, b3, sunt poziţiile codului binar scrise în ordinea ponderilor.
Pentru exemplificare să considerăm cifra 6 scrisă în cod binar:

b3 b2 b1 b0
0 1 1 0
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
32

Pe baza relaţiilor (1.30) vom deduce succesiv valorile cifrelor binare din
secvenţa de cod Gray:

g0 = b0 ⊕ b1 = 0 ⊕ 1 = 1,
g1 = b1 ⊕ b2 = 1 ⊕ 1 = 0,
g2 = b2 ⊕ b3 = 1 ⊕ 0 = 1,
g3 = b3 = 0.

Prin urmare, secvenţa Gray corespunzătoare cifrei 6 va fi:

g3 g2 g1 g0
0 1 0 1

Putem deduce de asemenea şi relaţiile de transformare din cod Gray în cod


binar. Acestea sunt:

b0 = g0 ⊕ g1 ⊕ g2 ⊕ g3,
b1 = g1 ⊕ g2 ⊕ g3,
(1.31)
b2 = g2 ⊕ g3,
b3 = g3,

Valorile cifrelor binare sunt uşor de calculat dacă facem observaţia că 1 ⊕ 1 = 0.


Rezultă că este suficient să numărăm cifrele binare de unu din relaţia de calcul. Dacă
acestea sunt în număr par, atunci rezultatul este zero, iar daca sunt în număr impar
rezultatul este unu.
Pentru exemplificare vom considera numărul în cod Gray corespunzător cifrei 6
verificând dacă se obţine acelaşi rezultat:

g1 g2 g1 g0
0 1 0 1

Folosind relaţiile de mai sus se obţine:

b0 = g0 ⊕ g1 ⊕ g2 ⊕ g3 = 1 ⊕ 0 ⊕ 1 ⊕ 0 = 0,
b1 = g1 ⊕ g2 ⊕ g3 = 0 ⊕ 1 ⊕ 0 = 1,
b2 = g2 ⊕ g3 = 1 ⊕ 0 = 1,
b3 = g3 = 0.

Deci numărul binar obţinut este:

b3 b2 b1 b0
0 1 1 0

adică cifra 6 de la care am pornit.


0 diagramă Karnaugh este astfel organizată încât două compartimente vecine, pe
o linie sau pe o coloana, corespund la doi termeni canonici care diferă numai printr-o
singură variabilă, care apare într-unul dintre ei negată, iar în celalălt directă, respectiv la
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
33

două n-uple adiacente. Se consideră vecine şi compartimentele aflate la capetele opuse


ale unei linii, respectiv coloane (marginile diagramei).
Pentru a putea reprezenta uşor funcţii date în mod convenţional prin indicii
termenilor canonici, se poate nota fiecare compartiment cu indicele termenului canonic
corespondent, ţinând cont de o anumită ordine a variabilelor.
De obicei, diagramele pentru mai mult de patru variabile se construiesc din
diagrame de patru variabile, considerate diagrame elementare. Se pot construi însă
diagrame Karnaugh pentru numar mai mare de variabile şi considerând ca diagrame
elementare diagramele de trei variabile. În cazul diagramelor pentru mai mult de patru
variabile, două compartimente se consideră vecine şi atunci când ocupă aceeaşi poziţie
în două diagrame elementare vecine, adică în două diagrame elementare alăturate sau
aflate la extremitaţi pe o aceeaşi linie sau coloană.
Diagramele Karnaugh pentru mai multe variabile se pot construi şi sub forma unei
singure diagrame elementare dacă se foloseşte pentru notarea rândurilor şi coloanelor
codul Gray (figura 1.11). În acest fel se asigură că oricare două compartimente alăturate
sau aflate la extremităţile unei linii sau coloane să fie adiacente.
x0x1x2
000 001 011 010 110 111 101 100
x3x4
00 f(0) f(4) f(6) f(2) f(3) f(7) f(5) f(1)
01 f(16) f(20) f(22) f(18) f(19) f(23) f(21) f(17)
11 f(24) f(28) f(30) f(26) f(27) f(31) f(29) f(25)
10 f(8) f(12) f(14) f(10) f(11) f(15) f(13) f(9)
a.
x0x1x2
000 001 011 010 110 111 101 100
x3x4x5
000 f(0) f(4) f(6) f(2) f(3) f(7) f(5) f(1)
001 f(32) f(36) f(38) f(34) f(35) f(39) f(37) f(33)
011 f(48) f(52) f(54) f(50) f(51) f(55) f(53) f(49)
010 f(16) f(20) f(22) f(18) f(19) f(23) f(21) f(17)
110 f(24) f(28) f(30) f(26) f(27) f(31) f(29) f(25)
111 f(86) f(90) f(92) f(88) f(89) f(93) f(91) f(87)
101 f(40) f(44) f(46) f(42) f(43) f(47) f(45) f(41)
100 f(8) f(12) f(14) f(10) f(11) f(15) f(13) f(9)
b.
Figura 1.11. Tabelele Karnaugh pentru a. funcţii cu 5 variabile
b. funcţii cu 6 variabile.

După ce tabelul a fost completat, prin scrierea valorii unu în celulele


corespunzătoare termenilor canonici ai funcţiei, dată sub forma normală disjunctivă, se
poate trece la minimizarea funcţiei.
Doi termeni canonici care diferă numai prin aceea că într-unul din aceştia una din
variabile apare negată, iar în celălalt nenegată, apar în tabelul Karnaugh în celule vecine,
deci se recunoaşte uşor că sunt adiacenţi. Aceşti doi termeni se pot înlocui cu un termen
normal în care variabila, prin care cei doi termeni canonici diferă, lipseşte.
Să considerăm exemplul prezentat mai sus (figura 1.10 d). Dacă luăm termenii
canonici corespunzători celulelor numerotate cu 4 şi 12 (care sunt P4 şi P12), putem scrie:

( )
x3 x2 x1 x 0 + x3 x2 x1 x 0 = x 3 + x3 x2 x1 x 0 = x2 x1 x 0 (1.32)
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
34

În reprezentarea geometrică a unei funcţii booleene, doi termeni canonici care


indeplinesc condiţia de mai sus corespund la două noduri adiacente, deci definesc o latura
a cubului n-dimensional. Din acest motiv se spune că două compartimente vecine sau
adiacente pe diagrama Karnaugh reprezintă un subcub 1-dimensional. Un grup de patru
compartimente dintre care fiecare este vecin cu alte două compartimente din acelaşi grup,
formează un subcub 2-dimensional. În acest caz cei patru termeni canonici corespunzători
acestor compartimente au o parte comună formată din doua variabile. În baza axiomei
existenţei elementului neutru, acesti patru termeni pot fi inlocuiţi cu partea lor comună. De
exemplu în figura 1.10. d. termenii canonici P2, P6, P14, şi P10 se grupează aşa cum se arată
în ecuaţia următoare:

x 3 x 2 x1 x 0 + x 3 x2 x1 x 0 + x3 x2 x1 x 0 + x3 x 2 x1 x 0 =
( )
= x 3 x 2 + x 3 x2 + x3 x2 + x3 x 2 x1 x 0 = (1.33)
= [x (x
3 2 ) ( )]
+ x2 + x3 x 2 + x2 x1 x 0 = x1 x 0

În cazul general, termenii canonici care formează un subcub bidimensional se pot


înlocui cu un termen normal având cu doua variabile mai puţin decit termenii canonici. Pe
o diagramă de patru variabile se pot forma şi subcuburi tridimensionale care cuprind opt
compartimente astfel grupate încât fiecare din ele este vecin cu alte trei din acelasi grup.
În figura 1.12. sunt date câteva exemple de formare a subcuburilor.

x1 x1 x1 x1
1 1
1 x2
x2 x2 x2
1 1 1 1
x3 x3 x3
x3 1
x0 x0 x0 x0
Figura 1.12. a.
x1 x1 x1 x1
1 1 1 1 1 1 1
1 1 1
x2 x x2 x2 x2
3 1
x3 x3 x3 1
1 1 1 1
x0 x0 x0 x0
Figura 1.12. b.
x1 x1 x1
1 1 1 1 1 1
1 1 x2
x2 x2
1 1 1 1 1 1
x3 x3 1 1 1 1 x3 1 1 1 1
1 1
x0 x0 x0
Figura 1.12. c.
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
35

x1 x1 x1 x1
1 1 1
1 1 1 1 x2 1 1 1
x2 x2 x2
1 1 1 1
x3 x3 x3 1
x3 1
x0 x0 x0 x0
Figura 1.12. d.

Figura 1.12. Reprezentarea pe diagrame Karnaugh a subcuburilor


a. unidimensionale
b. bidimensionale
c. tridimensionale
d. eronate

Determinarea termenului echivalent unui subcub se poate face în felul următor:


ne deplasăm de-a lungul suprafeţei subcubului şi observăm care sunt variabilele care-şi
schimbă valoarea în interiorul suprafeţei subcubului iar acele variabile se elimină din
termenul final. Termenul final, echivalent subcubului, va conţine toate variabilele care
nu-şi schimbă valoarea în interiorul suprafeţei acelui subcub. Un subcub 1-dimensional
permite eliminarea unei variabile, un subcub 2-dimensional va permite eliminarea a
două variabile şi aşa mai departe. Pentru o funcţie cu n variabile subcubul de
dimensiune maximă este (n-1)-dimensional, cu excepţia cazului când este vorba de
funcţia unară (f ≡ 1) şi avem un subcub n-dimensional.
Pe o diagramă care reprezintă o anumită funcţie booleană se pot forma în modul
arătat mai sus subcuburi de diverse dimensiuni. Un subcub care nu este inclus într-un
subcub de dimensiune mai mare se numeste implicant prim al funcţiei date. Formând
suma booleana a tuturor implicanţilor primi ai unei funcţii date se obţine o formă
disjunctivă a acesteia, care în cazul general este mult mai simplă decât forma canonică
disjunctivă a aceleiaşi funcţii. Pentru a găsi implicanţii primi ai unei funcţii reprezentată
pe diagrama Karnaugh, compartimentele marcate cu unu trebuie astfel grupate încât să
se obţină subcuburi cu dimensiunea cea mai mare posibilă. Astfel, pe o diagramă de
patru variabile se va căuta să se formeze în primul rând subcuburi tridimensionale, apoi
în ordine, subcuburi bidimensionale şi unidimensionale.
Pentru exemplificare vom considera funcţia dată de ecuaţia 1.29 pentru care
diagrama Karnaugh este cea prezentată în figura 1.10. d. Subcuburile ce pot fi formate
pe această diagramă sunt arătate în figura 1.13.

x 3 x 2 x1 x0

x1x0
00 01 11 10 x1 x 0
x3x2
x2 x1 x 0 00 0 1 0 1*
01 1* 0 0 1
11 1 0 0 1
10 0 0 1* 1
x3 x 2 x1
Figura 1.13. Diagrama Karnaugh pentru funcţia dată de ecuaţia 1.28
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
36

Nu toţi implicanţii primi ai unei funcţii sunt necesari pentru definirea acesteia.
Unii dintre implicanţii primi pot fi termeni redundanţi la care se poate renunţa, obţinând
astfel o formă mai simplă a funcţiei. Prin urmare, se pune problema alegerii unui număr
minim de implicanţi primi din mulţimea implicanţilor primi ai unei funcţii booleene
care să includă însă toţi termenii canonici ai funcţiei. Problema alegerii acestui set de
implicanţi este o problemă de acoperire cu cost minim. Expresia unei funcţii booleene în
care intră un număr minim din implicanţii săi primi se numeşte forma minimă
disjunctivă a funcţiei. Dacă un termen canonic al funcţiei este inclus într-un singur
implicant prim, din mulţimea de implicanţi primi ai funcţiei, acela devine implicant
prim esenţial şi trebuie să apară obligatoriu în forma minimă disjunctiva a funcţiei.
Pentru găsirea formei minime disjunctive trebuie deci determinant în primul rând
implicanţii primi esentiali. Pentru aceasta se marchează pe diagramă într-un mod
special, de exemplu cu asterisc, acele celule notate cu unu care sunt incluse într-un
singur implicant prim (figura 1.13). Trebuie menţionat însă faptul că în figura 1.13. nu
au fost marcaţi toţi implicanţii primi ai funcţiei, dar pentru claritate s-a renunţat la
marcarea unei părţi ai acestora. Implicanţii primi care conţin compartimente marcate cu
asterisc devin esenţiali. Compartimentele însemnate cu unu, rămase neacoperite de către
implicanţii primi esenţiali, se cauta să se acopere folosind un număr cât mai mic din
implicanţii funcţiei care au mai rămas. Din cele prezentate mai sus rezultă că forma
minimă disjunctivă a funcţiei dată de relaţia (1.29) este:

f 4 = x1 x 0 + x2 x1 x 0 + x3 x 2 x1 + x 3 x 2 x1 x0 (1.34)

Pentru a vedea care din formele: normală disjunctivă sau normală conjunctivă
oferă forma de cost minim, trebuie să găsim şi forma minimizată normală conjunctivă.
0 metodă simplă de determinare a formei minime conjunctive este aceea a
căutarii formei minime disjunctive pentru negata funcţiei date şi negarea acesteia.
Pentru exemplificare se ia tot funcţia dată prin diagrama Karnaugh din figura 1.13.
Negata acestei funcţii este dată prin compartimentele marcate cu zero. Aplicând metoda
de minimizare prezentată, pentru functia f 4 , unde f 4 este dată de relaţia (1.29), se
obţine pentru această formă, relaţia (1.35), determinată cu ajutorul diagramei din figura
1.14.

x 2 x1 x1

x1x0 x 3 x1 x0
00 01 11 10
x3x2
00 *0 1 1 *0

01 1 *0
0 1
11 1 0 0 1
10 0 *0 1 1
x2 x0
x3 x1 x0
Figura 1.14. Determinarea formei minime normal conjunctive

f 4 = x 2 x1 x 0 + x 3 x1 x0 + x3 x1 x0 + x2 x0 (1.35)
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
37

de unde rezultă forma normală conjunctivă a formei cu ecuaţia (1.29):

( )( )(
f 4 = f 4 = ( x2 + x1 + x0 ) x3 + x1 + x 0 x 3 + x1 + x 0 x 2 + x 0 ) (1.36)

Concluzie. Folosind metoda diagrameolor Karnaugh se poate obţine forma


minimă disjunctivă sau conjunctivă astfel:

1) se construieşte diagrama ;
2) se caută implicanţii primi ;
3) se determină implicanţii primi esenţiali ;
4) termenii canonici care nu sunt incluşi în implicanţii primi esenţiali se
acoperă cu un număr cât mai mic de implicanţi primi ;
5) forma minimă normală disjunctivă sau conjunctivă va conţine toţi
implicanţii primi esenţiali şi implicanţii primi neesenţiali ce conţin
termeni canonici ce nu sunt incluşi în implicanţii primi esenţiali.

Aşa cum s-a arătat, metoda diagramelor Karnaugh, deşi este o metodă foarte
simplă şi eficientă de minimizare a funcţiilor logice, ea nu poate fi aplicată decât
funcţiilor cu un număr redus de variabile (cel mult şapte-opt).
Pentru minimizarea funcţiilor cu un număr mai mare de variabile se recurge la
alte metode, algebrice sau tabelare, una dintre acestea fiind descrisă în paragraful
următor.

1.4.3. Metoda Quine-Mc Cluskey

Metoda Quine-Mc Cluskey este o metodă algebrică de minimizare a funcţiilor


booleene cu un număr mare de variabile, pentru care metoda diagramelor Karnaugh sunt
greu de utilizat.
Această metodă, care se bazează pe acelaşi principii ca şi metoda diagramelor
Karnaugh, este mai uşor de aplicat funcţiilor cu număr mare de variabile deoarece
metoda presupune construcţia succesivă a unor tabele pâna la determinarea formei
minime a funcţiei. Algoritmul care stă la baza metodei Quine-Mc Cluskey poate fi
foarte uşor programat ceea ce permite minimizarea automată a funcţiilor de mari
dimensiuni.
Metoda se aplică în doi paşi:

1. în primul pas se determină implicanţii primi ai funcţiei ;


2. în pasul al doilea se determină implicanţii primi esenţiali care să dea o
acoperire de cost minim a funcţiei.

Prezentăm în continuare algoritmul de determinare a implicanţilor primi a unei


funcţii logice combinaţionale dată sub forma normală disjunctivă.

Algoritmul 1.1.

a) Se porneşte de la forma canonică disjunctivă a funcţiei în care termenii


canonici sunt daţi fie sub forma unui produs de variabile fie prin notaţia simbolică.
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
38

Fiecare termen canonic este reprezentat apoi sub forma unui număr binar, prin
n uplul de zerouri şi unităţi corespondente termenului respectiv.
b) Termenii canonici astfel înscrişi se împart în grupe, în funcţie de ponderea
acestora, adică de numărul cifrelor unu cuprinse în upul respectiv.
c) Grupele de termeni canonici sunt aranjate pe o coloană, în ordinea crescătoare
a ponderilor.
d) Se compară fiecare termen al unei grupe cu toţi termenii grupei de pondere
mai mare cu o unitate. Dacă numerele binare respective sunt adiacente, cei doi termeni
se pot asocia formând un cub 1 dimensional, notat printr un număr binar care are pe
poziţia prin care cei doi termeni componenţi diferă, un simbol « x », ceea ce semnfică
faptul că variabila corespondentă acelei poziţii lipşeşte; cei doi termeni care au format
subcubul rezultat se înscrie pe o nouă coloană. Toţi termenii normali (subcuburile 1
dimenionale) rezultaţi în urma comparării a două grupe din coloana temenilor canonici
formează o grupă în coloana subcuburilor 1 dimensionale. Prin urmare, coloana
cuburilor 1 dimensionale va conţine în cazul general cu o grupă mai puţin decât
coloana termenilor canonici (a cuburilor 0 dimensionale).
e) Se ia n=1. Se compară fiecare termen a unei grupe din coloana sucuburilor 1
dimensionale cu toţi termenii grupei cu pondere mai mare cu o unitate. Pentru ca doi
asemenea termeni să se poată asocia formând un subcub (n+1) dimensional trebuie ca
în ambii termenii simbolurile « x » să fie pe aceleaşi poziţii. Doi termeni care
îndeplinesc această condiţie şi sunt adiacenţi se asociază formând un subcub
(n+1) dimensional care se notează cu un nuămăr binar în care apare încă un « x » pe
poziţia prin care cei doi termeni diferă. Termenii care formează acest subcub se bifează,
iar subcubul (n+1) dimensional se înscrie pe o nouă coloană, coloana subcuburilor
(n+1) dimensional, care în cazul general are o grupă ai puţin decât cloana subcuburilor
n dimensionale. Dacă se obţine de mai multe ori un anumit termen acesta se consideră
o singură dată.
f) Se măreşte n cu o unitate şi se repetă punctul e) până când subcuburile ultimei
coloane nu se mai pot asocia în scoul formării unui subcub de dimensiune superioară.
Termenii rămaşi nebifaţi în coloanele rezultate formează grupul implicanţiilor
primi ai funcţiei considerate.
Pentru exemplificare vom considera funcţia logică combinaţională a cărei
ecuaţie sub forma canonică normală disjunctivă este prezentată în (1.37) :

f 5 = P0 + P1 + P2 + P4 + P6 + P7 + P8 + P9 + P11 + P13 + P15 +


(1.37)
+ P17 + P18 + P19 + P22 + P24 + P26 + P27 + P28 + P30 + P31

Pentru claritatea exemplului s-a ales o funcţie de complexitate relativ redusă


care ar putea fi minimizată şi cu ajutorul giagramei Karnaugh.
Se întocmeşte tabelul subcuburilor 0-dimensionale (tabelul 1.7) pe baza formei
normale disjunctive a funcţiei sau pe baza tabelului de adevăr a acesteia şi cel al
subcuburilor 1-dimensionale (tabelul 1.8) pe baza tabelului 1.7.
După cum se poate observa, în tabelul 1.7 toţi termenii sunt bifaţi, ceea ce
înseamnă că fiecare termen a putut fi grupat cu cel puţin un alt termen şi deci nici un
termen din acest tabel nu va apare în forma minimă a funcţiei.
Pe baza tebelului 1.8 se construieşte tabelul 1.9., tabelul subcuburilor 2-
dimensionale, grupând termenii care au simbolul « x » pe aceeaşi poziţie şi care diferă
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
39

numai printr-o cifră binară. În acest tabel s-au notat între paranteze termenii care se
repetă.

TABELUL 1.7 TABELUL 1.8 TABELUL 1.9


Subcuburi 0-dimensionale Subcuburi 1-dimensionale Subcuburi 2-dimensionale
Grupa Indici x4x3x2x1x0 Grupa Indici x4x3x2x1x0 Grupa Indici x4x3x2x1x0
0 0 000009 0,1 0000x9 0,1
0x00x
1 000019 0,2 000x09 8,9
0
2 000109 0,4 00x009 0,2
1 00xx0
4 001009 0,8 0x0009 4,6
0
8 010009 1,9 0x0019 0,4
(0 0 x x 0)
6 001109 1,17 x 0 0 0 1 2,6
9 010019 2,6 00x109 0,8
1 2,18 x 0 0 1 0 9 (0 x 0 0 x)
2 17 1 0 0 0 1 9 1,9
18 1 0 0 1 0 9 4,6 001x09 2,6
24 1 1 0 0 0 9 8,9 0100x9 x0x10
18,22
8,24 x 1 0 0 0 1
7 001119 2,18
6,7 0011x (x 0 x 1 0)
11 0 1 0 1 1 9 6,22
13 0 1 1 0 1 9 6,22 x 0 1 1 0 9 9,11
9,11 0 1 0 x 1 9 01xx1
3 19 1 0 0 1 1 9 13,15
22 1 0 1 1 0 9 9,13 0 1 x 0 1 9 9,13
26 1 1 0 1 0 9 17,19 1 0 0 x 1 (0 1 x x 1)
2 11,15
28 1 1 1 0 0 9 18,19 1 0 0 1 x 9 18,22
18,22 1 0 x 1 0 9 1xx10
15 0 1 1 1 1 9 26,30
18,26 1 x 0 1 0 9 2
4 27 1 1 0 1 1 9 18,26
24,26 1 1 0 x 0 9 1x01x
30 1 1 1 1 0 9 19,27
5 31 1 1 1 1 1 9 24,28 1 1 x 0 0 9 24,26
7,15 0 x 1 1 1 11xx0
28,30
11,15 0 1 x 1 1 9 24,28
11,27 x 1 0 1 1 9 (1 1 x x 0)
După completarea 26,30
13,15 0 1 1 x 1 9 11,15
tabelului 1.9., algoritmul 19,27 1 x 0 1 1 9 x1x11
de căutare a implicanţilor 3 27,31
22,30 1 x 1 1 0 9 11,27
primi se incheie deoarece 26,27 1 1 0 1 x 9 15,31
(x 1 x 1 1)
nici un termen din acest 26,30 1 1 x 1 0 9
26,27
28,27 1 1 1 0 x 9 3 11x1x
tabel nu mai poate fi 30,31
28,30 1 1 1 x 0 9
grupat. 15,31 x 1 1 1 1 9
26,30
(1 1 x 1 x)
Observaţie: doi 27,31
4 27,31 1 1 x 1 1 9
28,27
termeni canonici din 30,31 1 1 1 1 x 9 111xx
30,31
coloana subcuburilor
zero dimensionali se pot
asocia dacă diferenţa între indicele termenului din grupa cu ponderea i 1 este un număr
întreg, pozitiv şi egal cu putere a lui doi. Puterea lui 2 indică poziţia din numărul binar
pe care apare simbolul « x ».
În cazul cloanelor subcuburilor de dimensiune mai mare ca zero, pentru ca două
subcubri făcând parte din grupa a căror pondere diferă cu o unitate să se poată asocia,
treabuie ca diferenţa între indicii termenilor canonici incluşi în subcubul din grupa
superioară şi indicii termenilor canonici corespondenţi ai subcuburilor din grupa
inferioară să fie o aceaşi putere a lui doi. De exemplu, pentru subcubul de pe primul
rând din grupa a doua avem : 11 – 9 = 2 şi 15 – 13 = 2.
Expresia ce poate fi scrisă în acest moment pentru funcţia dată (ecuaţia 1.37), cu
ajutorul implicanţilor primi găsiţi, se obţine înlocuind, în termenii rămaşi nebifaţi în
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
40

tabel, zerourile cu variabila corespunzătoare poziţiei respective negată, unităţile cu


variabila corespunzătoare poziţiei respective nenegată şi omiţând variabilele
corespunzătoare poziţiilor pe care se află simbolul « x » (ecuaţia 1.38).

f 5 = x 3 x 2 x1 x0 + x3 x 2 x1 x 0 + x 4 x 3 x2 x1 + x4 x 3 x 2 x0 + x 4 x2 x1 x0 +
+ x 4 x 2 x1 + x 4 x 3 x 0 + x 3 x1 x 0 + x 4 x3 x0 + x4 x1 x 0 + x4 x 2 x1 + (1.38)
x4 x3 x 0 + x3 x1 x0 + x4 x3 x1 + x4 x3 x2

Pentru a găsi forma minimă disjunctivă a unei funcţii trebuie aleşi numai acei
împlicanţii primi care includ toţi termenii canonici ai funcţiei şi conduc la o formă a
funcţiei realizată cu cost minim. Implicanţii primi care respectă această condiţie
formează acoperirea cu cost minim. Pentru găsirea acoperirii cu cost minim trebuie
căutate toate acoperirile posibile pentru funcţia dată din care se alege acoperirea care
îndeplineşte condiţia de cost minim faţă de un anumit criteriu de cost.
De obicei, acoperirea minimală, adică acoperirea cu număr minim de elemente,
satisface condiţia de cost.
Algoritmul de obţinere a acopperiri cu cost minim, plecând de la mulţimea
implicanţilor primi, obţinuţi în etapa anterioară, este următorul:

Algoritmul 1.2.

a) Se construieşte un tabel al implicanţilor primi, având drept cap de linie


implicanţii primi ai funcţiei şi cap de coloană termenii canonici ai funcţiei. La
intersecţia unei linii cu coloană se pune un semn, de exemplu asterisc, dacă implicantul
prim de pe linia respectivă include termenul canonic de pe coloana respectivă. Pentru
exemplul considerat mai sus (ecuaţia 1.37) se obţine tabelul 1.10.
b) Se inspectează tabelul construit la punctul a). Dacă pe o anumită coloană
există un singur semn, ceea ce înseamnă că termenul canonic de pe acea coloană este
inclus într un singur implicant prim, atunci implicantul prim de pe linia însemnată
devine implicant prim esenţial şi intră obligatoriu în forma minimă a funcţiei. Se
construieşte un nou tabel, al implicanţilor primi neesenţiali care rezultă eliminând din
tabelul implicanţilor primi liniile cu implicanţi primi esenţiali şi coloanele cu termenii
canonici incluşi în aceştia. Pentru a găsi mai uşor aceste coloane se încercuiesc toate
semnele de pe linia unui implicant prim esenţial şi se elimină apoi toate coloanele cu
semne încercuite. De asemenea, se elimină liniile pe care nu au mai rămas semne şi
coloanele care au semne pe acelaşi rânduri ca şi o altă coloană din tabelul implicanţilor
primi neesenţiali, adică, dacă mai mulţi termeni canonici sunt incluşi în exact aceeaşi
implicanţi primi neesenţiali, se reţine un singur reprezentant al acestora, deoarece orice
implicant care îl include pe acesta va include automat şi pe cei omişi (tabelul 1.11.)
c) Se inspecteză tabelul implicanţiilor primi neesenţiali în scopul găsirii unei
acoperiri cu cost minim, pentru toţi termenii canonici rămaşi în acest tabel. În unele
cazuri se pot găsi mai multe acoperiri care satisfac această condiţie, fiecare având
acelaşi cost. În astfel de situaţii funcţia are mai multe forme minime disjunctive.
d)Făcând suma booleană a implicanţilor primi esenţiali găsiţi la punctul b) şi a
celor neesenţiali găsiţi la punctul c) se obţine forma minimă disjunctivă a funcţiei date.
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
41

TABELUL 1.10.
Implicanţi Termeni canonici
primi Indici Observaţii
0 1 2 4 6 7 8 9 11 13 15 17 18 19 22 24 26 27 28 30 31
x4x3x2x1x0
x0001 1,17 * *
x1000 8,24 * *
0011x 6,7 **
100x1 17,19 * *
0x111 7,15 * *
0 x 0 0 x 0,1,8,9 * * **
0 0 x x 0 0,2,4,6 * * * * E
x 0 x 1 0 2,6,18,22 * * * *
0 1 x x 1 9,11,13,15 * * * * E
1 x x 1 0 18,22,26,30 * * * *
1 x 0 1 x 18,26,19,27 * * * *
1 1 x x 0 24,26,28,30 * * * *
x 1 x 1 1 11,15,27,31 * * * *
1 1 x 1 x 26,27,30,31 * * * *
1 1 1 x x 28,27,30,31 * * * *

Conform tabelului 1.10., pentru funcţia a cărei ecuaţie este dată relaţia (1.27)
există doi implicanţi primi esenţiali. Aceşti termeni vor trebui să apară obligatoriu în
expresia minimă normală disjunctivă a funcţiei.
Căutăm acum o acoperire minimă a celorlalţi termeni canonici ai funcţiei şi
construim tabelul 1.11. conform regulii prezentate la punctul b al algoritmului 1.2.

TABELUL 1.11.
Implicanţi Termeni canonici Observaţii
primi Indici
1 7 8 17 18 19 22 24 26 27 28 30 31
x4x3x2x1x0
x0001 1,17 * * A
x1000 8,24 * * A
0011x 6,7 * A
100x1 17,19 * *
0x111 7,15 *
0 x 0 0 x 0,1,8,9 * *
x 0 x 1 0 2,6,18,22 * * A
1 x x 1 0 18,22,26,30 * * * *
1 x 0 1 x 18,26,19,27 * * * * A
1 1 x x 0 24,26,28,30 * * * *
x 1 x 1 1 11,15,27,31 * *
1 1 x 1 x 26,27,30,31 * * * *
1 1 1 x x 28,27,30,31 * * * * A

Dacă din tabelul 1.11. se iau implicanţii primi de pe rândurile notate cu A se


obţine o acoperire a funcţiei. Aceasă acoperire nu este singura, existând posibilitatea de
a selecta alţi implicanţi primi pentru a obţine o acoperire a funcţiei. Se va alege acea
acoperire a funcţiei, care, în funcţie de criteriul ales, dă acoperirea de cost minim.
Pentru exemplu considerat, considerănd acoperirea din tabelul 1.11., rezultă :

f 5 = x 4 x 3 x 0 + x 4 x3 x0 + x 3 x 2 x1 x0 + x3 x 2 x1 x 0 + x 4 x 3 x2 x1 +
(1.39)
+ x 3 x1 x 0 + x4 x 2 x1 + x4 x3 x2
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
42

1.4.4. Minimizarea funcţiilor logice combinaţionale incomplet definite

Se consideră că o funcţie logică combinaţională este incomplet definită dacă


pentru anumite combinaţii a variabilelor de intrare valoarea funcţiei poate fi oricare (nu
interesează dacă pentru anumite combinaţii ale variabilelor de intrare, valoarea funcţiei
este zero sau unu). Aceste valori se notează în tabelul de adevăr a funcţiei respective cu
un anumit simbol (de exemplu litera „u”).
Prezentăm în continuare un astfel de exemplu a unei funcţii logice
combinaţionale de patru variabile (tabelul 1.12).

TABELUL 1.12
nr. nr. nr. nr.
x x x x y x x x x y x x x x y x x x x y
crt. 3 2 1 0 0 crt. 3 2 1 0 0 crt. 3 2 1 0 0 crt. 3 2 1 0 0
0 0 0 0 0 1 4 0 1 0 0 1 8 1 0 0 0 u 12 1 1 0 0 1
1 0 0 0 1 1 5 0 1 0 1 u 9 1 0 0 1 u 13 1 1 0 1 0
2 0 0 1 0 1 6 0 1 1 0 1 10 1 0 1 0 1 14 1 1 1 0 1
3 0 0 1 1 u 7 0 1 1 1 u 11 1 0 1 1 1 15 1 1 1 1 0

Această funcţie este descrisă de relaţiile (1.40).

f 4 = x 3 x 2 x1 x 0 + x 3 x 2 x1 x0 + x 3 x 2 x1 x 0 + x 3 x2 x1 x 0 + x 3 x2 x1 x 0 +
(1.40a)
+ x3 x 2 x1 x 0 + x 3 x 2 x1 x 0 + x3 x2 x1 x 0 + x3 x2 x1 x 0
x 3 x 2 x1 x0 = x 3 x2 x1 x0 = x 3 x2 x1 x0 = x3 x 2 x1 x 0 = x3 x 2 x1 x0 = u (1.40b)

unde relaţia (1.40a) reprezintă forma normală disjunctivă a părţii definite din funcţie, iar
relaţia (1.40b) precizează că restul combinaţiilor de valori ale variabulelor de intrare,
corespunzătoare părţii nedefinite din funcţie, nu apar în funcţionare, prin urmare pot fi
considerate combinaţii indiferente.
Pentru minimizarea acestei funcţii se întocmeşte tabelul din figura 1.15.

x1x0 x3
00 01 11 10
x3x2
x1 x 0 00 1 1 u 1
01 1 u u 1 x1 x 0
11 1 0 0 1
10 u u 1 1

x3 x 2
Figura 1.15. Diagrama Karnaugh pentru funcţia (1.40).

Forma normală disjunctivă minimă a funcţiei incomplet definite (1.40) este dată
în ecuaţia (1.41).

f 4 = x 3 + x1 x 0 + x1 x 0 + x3 x 2 (1.41)
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
43

Având în vedere faptul că funcţia este incomplet definită se poate găsi şi o altă
acoperire a funcţiei (figura 1.16).

x1x0
00 01 11 10 x1 x 0
x3x2
00 1 1 u 1
x 3 x1 01 1 u u 1
11 1 0 0 1
10 u u 1 1
x2 x1 x 0 x3 x 2 x1
Figura 1.16. Diagrama Karnaugh pentru funcţia (1.40).

Funcţia obţinută, în acest caz, este (ecuaţia 1.42):

f 4 = x1 x 0 + x 3 x1 + x2 x1 x 0 + x3 x 2 x1 (1.42)

Este important de reţinut faptul că pentru combinaţiile notate cu « u » nu trbuie


asicurată o acoperire deoarece aceste valori sunt indiferente (pot fi zero sau unu). Din
acest motiv se pot găsi mai multe acoperiri ale funcţiei. Se va considera expresia
minimizată a funcţiei, acea expresie care va corespunde unui anumit criteriu adoptat.
În cazul când minimizarea funcţiei combinaţionale parţial definită se face
folosind metoda Quine-Mc Cluskey, trebuie să considerăm unele modificări şi anume se
adaugă subcuburilor 0-dimensionale şi termenii canonici corespunzători combinaţiilor
indiferente. Nu se vor considera însă subcuburile 1-dimensionale care ar rezulta prin
combinarea între ei a termenilor indiferenţi ci numai cele care rezultă prin combinarea
acestora cu alte subcuburi 0-dimensionale. De asemenea nu se va ţine cont de aceşti
termeni canonici în tabelul implicanţilor primi, deoarece nu trebuie acoperiţi.

1.4.5. Minimizarea sistemelor de funcţii booleene

Circuitele logice combinaţionale cu n intrări (x0, x1, … , xn) şi m ieşiri (y0, y1, …
,ym) pot fi sintetizate considerând fiecare ieşire separat, ca o funcţie independentă de n
variabile (graf boolean). Pe baza formei canonice, sau a tabelului de adevăr, aplicînd una
dintre metodele de sinteză, se obţine câte o realizarea fizică pentru fiecare ieşire, în final
acestea fiind puse împreună. Acest lucru se face de obicei atunci când metoda de sinteză
nu impune minimizarea funcţiilor. Astfel de metode vor fi discutate aici în capitolele
următoare.
În cazul în care sinteza se face cu ajutorul porţilor logice, este necesar să se obţină
forma minimă a unui sistem de funcţii booleene de forma (1.1).
Formele minime pentru un sistem de funcţii booleene sunt acele expresii
booleene disjunctive sau conjuctive în care apar un numar minim de termeni, respectiv
factori normali diferiţi, având un numar minim de literale (variabile de intrare). Pentru
obţinerea formelor minime ale unui sistem de funcţii booleene dat, se procedează la
minimizarea corelată a funcţiilor acestuia, adică la determinarea setului minim de
implicanţi primi care acoperă toţi termenii canonici ai tuturor funcţiilor sistemului.
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
44

Una dintre metodele de minimizare corelată a mai multor funcţii booleene, f1, f2,
… fn se bazează pe determinarea implicanţilor primi ai funcţiilor f1, f2, … fn şi ai
funcţiilor produs f1f2, f1f3, …, fn-1fn, f1f2f3, f1f3f4, fn-2fn-1fn, …, f1f2f3·…· fn. Având acest
set de implicanţi primi, se calculează acoperirile posibile pentru fiecare dintre funcţii iar
apoi se alege cea mai avantajoasă combinaţie de acoperiri din punct de vedere al
costului, care reprezintă acoperirea minimala a sistemului.
Pentru obţinerea acoperirii minimale după această metodă se parcurg
urmatoarele etape:

Regula 1.2.

a) Se calculează funcţiile produs. De exemplu, se cere minimizarea sistemului de


funcţii:

f 30 = ∑ (1,5,6,7 )
f 31 = ∑ (1,4,5,6) (1.43)
f 32 = ∑ (0,2,5,6,7 )
unde sub semnul sumei booleene s-au dat indicii termenilor canonici prezenţi în
forma canonică disjunctivă a funcţiei.
În prima etapă se calculează funcţiile produs:

f 30 ⋅ f 31 = ∑ (1,5,6 )
f 30 ⋅ f 32 = ∑ (5,6,7 )
(1.44)
f 31 ⋅ f 32 = ∑ (5,6)
f 30 ⋅ f 31 ⋅ f 32 = ∑ (5,6)

Functiile (1.44) conţin termenii canonici comuni pentru cele două, respectiv trei
funcţii inmulţite logic.

x1x0 00 01 1110 x1x0 00011110 x1x0 0001 1110


x2 x2 x2
0 0 1 0 0 0 0 1 0 0 0 1 0 0 1
1 0 1 1 1 1 1 1 0 1 1 0 1 1 1

f 30 f 31 f 32

x1x0 00 01 1110 x1x0 00011110 x1x0 0001 1110


x2 x2 x2
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
1 0 1 0 1 1 0 1 1 1 1 0 1 0 1

f 30 ⋅ f 31 f 30 ⋅ f 32 f 31 ⋅ f 32 =
= f 30 ⋅ f 31 ⋅ f 32

Figura 1.17. Minimizarea sistemelor de funcţii booleene


2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
45

b) Se determină implicanţii primi ai fiecăreia dintre funcţiile boleene (1.43) şi


(1.44).

În cazul exemplului considerat, pentru determinarea implicanţilor primi ai


acestor funcţii se folosesc diagramele Karnaugh din figura 1.17. Din această
figură se obţin, pentru funcţiile considerate, implicanţii primi din tabelul 1.13. În
acest tabel sunt trecute funcţiile booleene şi produsele dintre acestea, acoperirea
obţinută prin selectarea acelor subcuburi care conţin termenii formei normal
disjunctive şi care nu mai sunt conţinuţi în alte subcuburi şi termenii rămaşi
negrupaţi. De asemenea în tabel se trec indicii termenilor canonici ce formează
fiecare subcub, expresia termenului nou obţinut şi notaţia adoptată pentru aceşti
termeni (vezi punctul c.).

TABELUL 1.13.
Implicanţi primi Implicanţi primi
Funcţia Funcţia
Indici Expresie Notaţie Indici Expresie Notaţie
1 2 3 4 1 2 3 4
1,5 x1 x0 - 1,5 x1 x0 e
0
f 30 ⋅ f 31
f 3 5,7 x2 x0 - 6 x2 x1 x 0 -
7,6 x2 x1 - 5,7 x2 x0 d
f 30 ⋅ f32
1,5 x1 x0 i 7,6 x2 x1 c
f 31
4,6 x2 x 0 h 5 x2 x1 x0 b
5,7 x2 x0 - f ⋅f =
3
1
3
2

f 3
2
2,6 x1 x 0 g f 30 ⋅ f 31 ⋅ f 32 6 x2 x1 x 0 a
0,2 x2 x0 f

c) Se notează simbolic implicanţii primi ai sistemului, pe coloana 4 a tabelului


1.13, începând cu ultimul implicant prim al ultimei funcţii produs. Implicanţii
primi care apar de mai multe ori se notează o singură dată.

d) Se intocmeşte un tabel al acoperirilor funcţiilor sistemului, în care se înscriu pe


linii toţi implicanţii primi găsiţi la punctul b), iar pe coloane termenii canonici ai
fiecareia dintre funcţiile sistemului, luate în ordine. Tabelul 1.14 reprezintă tabelul
acoperirilor sistemului de funcţii (1.43).

e) Se completează tabelul acoperirilor, marcând, de exemplu cu un asterisc,


coloana termenilor canonici ai funcţiilor sistemului, în dreptul liniei
implicantului prim în care aceştia sunt incluşi. Trebuie menţionat că acest lucru
este posibil numai dacă implicantul prim respectiv este implicant prim al funcţiei
considerate sau al unei funcţii produs al acesteia. Pentru a respecta această
condiţie s-a prevazut in tabelul 1.14 o coloană în care se specifică funcţiile în
acoperirile cărora poate intra fiecare implicant prim.
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
46

TABELUL 1.14.
Implicanţi primi Termeni canonici
1
Funcţia f
3 Funcţia f 32 Funcţia f 33
Notaţie Indici Funcţii
1 5 6 7 1 4 5 6 0 2 5 6 7
a 6 f 30 , f 31 , f 32 * * *
b 5 f 30 , f 31 , f 32 * * *
c 7,6 f ,f3
0
3
2
* * * *
d 5,7 f 30 , f 32 * * * *
e 1,5 f 30 , f 31 * * * *
f 0,2 f 32 * *
g 2,6 f 3
2
* *
h 4,6 f 3
1
* *
i 1,5 f 3
1
* *

f) Pe baza tabelului 1.14 se determină acoperirile fiecărei funcţii, conform celor


aratate în paragraful 1.4.3. Pentru exemplul considerat, acoperirea functiei f 31
( )
notata A f 31 , este :

( )
A f 30 = ec + eda = A1 + A2 (1.45)

De asemenea:

( )
A f 31 = hi + eh = B1 + B2 (1.46)

iar:

( )
A f 32 = dfg + cbf + adf + abcf = C1 + C2 + C3 + C4 (1.47)

Prin urmare, pentru funcţia f 30 s-au găsit două acoperiri, pentru f 31 de asemenea
două acoperiri, iar pentru f 32 patru acoperiri. Pentru a forma o acoperire a
sistemului se ia câte una din acoperirile fiecarei funcţii. Pentru a găsi acoperirea
minimală a sistemului se continuă cu punctul urmator.

g) Se scriu toate acoperirile posibile ale sistemului de funcţii şi se alege dintre


acestea acoperirea cu număr minim de elemente. Numarul acoperirilor posibile
este dat de produsul numerelor acoperirilor fiecăreia dintre funcţii.
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
47

TABELUL 1.15.
Elementele Numărul Variabile de
Nr. crt. Acoperire
acoperirii elementelor intrare
1 A1B1C1 echidfg 7 14
2 A1B1C2 echicbf 7 15
3 A1B1C3 echiadf 7 15
4 A1B1C4 echiabcf 8 18
5 A1B2C1 echdfg 6 12
6 A1B2C2 echcbf 6 13
7 A1B2C3 echadf 6 13
8 A1B2C4 echabf 6 14
9 A2B1C1 edahifg 7 15
10 A2B1C2 edahicbf 8 18
11 A2B1C3 edahif 6 13
12 A2B1C4 edahibcf 8 18
13 A2B2C1 edahfg 6 13
14 A2B2C2 edahcbf 7 16
15 A2B2C3 edahf 5 11
16 A2B2C4 edahbcf 7 16

Pentru exemplul luat există 2x2x4 = 16 acoperiri (enumerate in tabelul 1.15).


Numărul elementelor unei acoperiri a sistemului este egal cu numarul implicanţilor
primi distincţi care intră în acoperirile tuturor funcţiilor din sistem. Din tabelul 1.15
rezultă că pentru sistemul de funcţii considerat, poate fi luată ca acoperire minimală
poziţia a cincisprezecea, cu cinci elemente, ce conţin unsprezece variabile de intrare.
Numărul de variabile de intrare a termenilor conţinuţi de forma normal disjunctivă a
unei funcţii indică numărul de intrări ai porţii logice ce implementează termenul
respectiv. Pe baza acoperirii minimale gasită la punctul g) se scriu expresiile minime ale
sistemului de funcţii.
Pentru exemplul tratat, corespunzator acoperirii se obtin expresiile (1.48).

f 30 = y0 = x1 x0 + x2 x0 + x2 x1 x 0
f 31 = y1 = x1 x0 + x2 x 0 (1.48)
f = y2 = x2 x0 + x 2 x 0 + x2 x1 x 0
3
2

Realizarea fizică a sistemului de ecuaţii (1.48) este prezentată în figura 1.18.


Verificarea soluţiei obţinute poate fi făcută cu ajutorul unui program în limbaj
PASCAL în care se compară valorile funcţiilor canonice cu cele minimizate. Dacă
pentru fiecare combinaţie posibilă a variabilelor de intrare cele două velori
corespunzătoare aceleiaşi funcţii în forma canonică şi în forma inimizată sunt egale,
atunci putem spune că s-a obţinut o soluţie corectă. Acest mod de verificare reprezintă
de fapt construirea automată a tabelelor de adevăr ale funcţiilor date şi compararea
acestora.

PROGRAMUL 1.2.
Program logic2;
{se verifica daca forma minima a
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
48

unui sistem de ecuatii de functii logice este corect}


U4A
1
2 12
13
a
U5A
1 2 7411
7404

U14A
X2 U2A U16A
1
X1
1 3 1
X0
3 2 3
2
d 2
Y0
7432
7408 7432

U6A
1 2 U3A
1
7404
3
2
e
U11A
7408 1
3
Y1
2
U10A
1 7432
3
2
h
7408
U17A
U12A 1
1 3
Y2
3 2
2
f
U13A 7432
1 2 7408
7404

Figura 1.18. Realizarea fizică a sistemului de ecuaţii (1.24).

var
y0_c,y1_c,y2_c,y0_m,y1_m,y2_m,x0,x1,x2:boolean;

begin
for x2:= false to true do
for x1:= false to true do
for x0:= false to true do
begin
{se compara forma canonica a functiei cu cea minimizata}
{forma canonica - ecuatiile (1.43)}
y0_c := ((not x2) and (not x1) and x0) or (x2 and (not x1) and x0) or
(x2 and x1 and (not x0)) or (x2 and x1 and x0);
y1_c := ((not x2) and (not x1) and x0) or (x2 and (not x1) and (not x0)) or
(x2 and (not x1) and x0) or (x2 and x1 and (not x0));
y2_c := ((not x2) and (not x1) and (not x0)) or ((not x2) and x1 and (not x0)) or
(x2 and (not x1) and x0) or (x2 and x1 and (not x0)) or (x2 and x1 and x0);

{forma minima - ecuatiile (1.48)}


y0_m := ((not x1) and x0) or (x2 and x0) or (x2 and x1 and (not x0));
y1_m := ((not x1) and x0) or (x2 and (not x0));
y2_m := (x2 and x0) or ((not x2) and (not x0)) or (x2 and x1 and (not x0));

if (y0_c<>y0_m) or (y1_c<>y1_m) or (y2_c<>y2_m) then


begin
writeln('Ecuatiile nu sunt egale! Apasati ENTER');
readln;
halt(1);
end;
end;
writeln('Ecuatiile sunt egale. Apasati ENTER');
readln;
end.
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
49

O altă posibilitate de verificare a soluţiei obţinute este cea de compararea a


formelor de undă obţinute la ieşirea circuitului logic combinaţional atunci când la
intrarea acestuia combinaţiile posibile ale variabilelor de intrare se scced cu o anumită
frecvenţă. Aşa cum se observă, citind un tabel de adevăr pe verticală, variabila de rang
minim (x0 – variabila cu rangul zero) îşi schimbă valoarea cu frecvenţa cea mai mare.
Vom nota această frecvenţă cu f0. În acest caz variabila de rang maxim îşi schimbă
valoarea cu frecvenţa fn = f0 / 2n, unde n este rangul variabilei.
Pentru exemplificare vom considera tabelul de adevăr a sistemului funcţiilor
logice combinaţionale (tabelul 1.16) dat de ecuaţiile (1.43).
Dacă stabilim o anumită durată de timp
TABELUL 1.16. Δt în care semnalul corespunzător intrării de
Variabile rang minim x0 se schimbă (ia succesiv valoarea
Funcţii de
de zero şi valoarea unu – perioada semnalului),
Nr.crt. ieşire
intrare atunci duratele se vor dubla la fiecare trecere
x2 x1 x0 y2 y1 y0 spre o variabilă de rang superior; de exemplu:
0 000 0 0 1 pentru x1 vom avea 2Δt, pentru x2 vom avea
1 001 1 1 0 4Δt, ş.a.m.d. Astfel, dacă notăm cu f0 frecvenţa
2 010 0 0 1 semnalului x0, atunci frecvenţa semnalului x1
3 011 0 0 0 va fi f1=f0/2, frecvenţa semnalului x2 va fi
4 100 0 1 0 f2=f1/2=f0/4 etc.
5 101 1 1 1 Aplicănd un astfel de set de semnale la
6 110 1 1 1 intrare se vor obţine la ieşire semnale
7 111 1 0 1 corespunzătoare evoluţiei în timp a funcţiei
logice combinaţionale. Asfel de semnale sunt
mult utilizate în analiza circuitelor cu dispozitive digitale şi din acest motiv această
tehnică va fi prezentată în capitolele următoare.
În figura 1.19 sunt prezentate semnalele de intrare x0, x1 şi x2 şi semnalele de
ieşire y0, y1 şi y2 ale sistemului de funcţii (1.43). Datorită timpului finit de propagare a
semnalelor prin porţile logice, modificarea ieşirii se face cu o anumită întârziere faţă de
modificarea semnalelor de intrare în funcţie de caracteristicile definite pentru porţile
logice utilizate. Mai întâi vom considera o variaţie lentă a semnalelor pentru ca
întârzierile să nu se manifeste şi circuitul să se comporte ca unul ideal (figura 1.19).
Comparativ cu figura 1.19, în figura 1.20 se observă că la frecvenţe mari, cu

Figura 1.19. Semnalele circuitului descris de ecuaţiile (1.43) la frecvenţă


scăzută.
ordinul de mărime al perioadei comparativ cu timpul de întârziere al porţilor logice,
apariţia unei deplasări spre dreapta (o întârziere) cu tpHL pe axa timpului a semnalului de
ieşire. De asemenea trebuie semnalat faptul că la ieşire pot apărea comutări ce nu sunt în
tabelul de adevăr al funcţiei (zona notată cu A – apariţia unei valori zero a funcţiei y1 –
în figura 1.20). Acest fenomen numit hazard nu poate fi detectat decât la analiza
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
50

comportării în timp a circuitului. Analiza comportării a circuitelor de comutaţie reale


prezintă o deosebită importanţă practică şi în afară de analiza logică a acestora este
necesară şi o simulare a comportării circuitelor reale în timp. Una dintre soluţiile cele
mai bune în prezent este reprezentată de pachetul de programe OrCAD al firmei
OrCAD Inc. destinat proiectării asistate de calculator a circuitelor electronice analogice,
digitale şi mixte. Analiza circuitelor logice digitale cu ajutorul pachetului de programe
OrCAD va fi prezentată succint în capitolul următor.
Revenind la sistemul funcţiilor logice, analizat mai sus, se va face simularea
tpLH

Figura 1.20. Semnalele circuitului descris de ecuaţiile (1.43) la frecvenţă mare.

circuitului bazat pe ecuaţiile canonice (1.43), simularea circuitului bazat pe ecuaţiile


minimizate (1.48) şi se vor compara formele de undă obţinute.
Schema electrică pentru simularea funcţiilor canonice (1.43) implementate cu
porţi logice este prezentată în figura 1.21.
U5A U6A
1 2 1
2 12
7404
13 1
U5B U6B 7410 1 U7A
3 4 3 2
4 6 6
7404 Y0C
5 1 4 0
5 V
U6C 7410 7420
U5C 9 1
5 6 10 8
11 U8A
X0 7404
1 1
U8B 7410 2 12
3 13
X1
4 6
5 U8C 7410
9 0
X2 U9A
7410 10 8
11 1
3
U10A 7410 1
2
1 90 U7B
2 12 7408 10
13 1 8
Y2C
12 1
1 U10B 7410 13 V
3 7420
4 6
1
5 1

1 U10C U11A 7410


9 1
10 8 2 12
11 13 1
U11B 7410 1 7410
3 1 U12A
4 6 2
5 1 6
Y1C
4 0
U11C 7410 1 5 V
9 7420
10 8
11
U13A 7410 1
1
2 12
13

7410

Figura 1.21. Circuitul realizat cu porţi logice a sistemului funţiilor canonice


disjunctive (1.43)

Schema electrică pentru simularea funcţiilor minimizate (1.48) implementate cu


porţi logice este prezentată în figura 1.22.
Formele de undă obţinute în urma simulării sunt prezentate în figura 1.23.
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
51

U1A
1
2 12
13
a
OFFTIME = 5s C1 U2A
ONTIME = 5s CLK
1 2 7411
DELAY = 0 1 U2B 1
7404
STARTVAL = 0 3 4
0 0
OPPVAL = 1
7404
OFFTIME = 2.5s B1 U2C U3A
ONTIME = 2.5s 5 6 U4A 1 U3B
CLK
DELAY = 0 1 0 1 3 4
7404
STARTVAL = 0 3 2 6
OPPVAL = 1 2
d 1
0 5 0
Y0M
7432 V
OFFTIME = 1.25s A1 U2D 7408 7432
ONTIME = 1.25s CLK 9 8
0
DELAY = 0 1 0
7404 U2E
STARTVAL = 0
OPPVAL = 1 11 10
0 U4B
7404
4 0
1
e 6 U3C
5 9 0
0
X2 X1 VX0 V V
8
Y1M
7408 10 0
U4C
V
9 7432
0
8
10
h
7408
1
U3D
U4D 12
12 11
Y2M
11 13 1
13
f 1
U2F V
7432
13 12 7408
1
7404

Figura 1.22. Circuitul realizat cu porţi logice a sistemului funţiilor logice


disjunctive minimizate (1.24)

Figura 1.23. Rezultatul simulării circuitelor din figura 1.21. şi 1.22.

În figura 1.23. se poate vedea faptul că formele de undă de ieşire y0C, y1C
respectiv y2C corespunzătoare ecuaţiilor canonice (1.43) sunt identice cu formele de
undă y0M, y1M respectiv y2M corespunzătoare ecuaţiilor minimizate. Acest lucru
demonstrează faptul că minimizarea sistemului de funcţii logice (1.43) a fost făcută
corect.
Din analiza în domeniul timp a circuitului obţinut s-a constatat apariţia hazardului la
frecvenţe ridicate pe ieşirea y1. Evitarea apariţiei hazardului va fi discutată în capitolul
următor.

1.5. Apariţia hazardului


Fenomenul apariţiei unor comutări neaşteptate la ieşirea unui circuit logic
combinaţional, datorate modificării stării uneia sau mai multor intrări ale circuitului, se
numeşte hazard.
Hazardul se datorează în general timpului de propagare şi timpului de comutaţie
al porţilor logice reale.
Studiul circuitelor logice se face în regim staţionar când astfel de fenomene nu
pot fi detectate sau în regim tranzitoriu când se pune în evidenţă apariţia hazardului.
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
52

Rezultă imediat că o soluţie de combatere a hazardului este sincronizarea circuitului


combinaţional cu ajutorul unui semnal de tact care să permită modificarea ieşirii
circuitului numai după ce ieşirea acestuia s-a stabilizat (componenta tranzitorie a
semnalului de ieşire a dispărut).
Analiza în regim staţionar se face de regulă în scopul verificării circuitului din
punct de vedere logic, iar analiza în regim tranzitoriu se face în scopul studierii
comportării în timp a circuitului.
La circuitele logice combinaţionale putem întâlni două tipuri de hazard :

a. hazardul static caracterizat prin apariţia unui singur impuls la ieşirea


circuitului logic combinaţional ca rezultat al schimbării stării unei
intrări. Hazardul static este de două feluri:
a.1. hazardul static-1 la care ieşirea circuitului logic
combinaţional trebuie să fie unu dar apare o tranziţie scurtă în
zero ca rezultat al schimbării stării unei intrări; acest tip de hazard
apare în cazul circuitelor construite cu porţi AND şi OR pe baza
funcţiilor canonice disjunctive;
a.2. hazardul static-0 la care ieşirea circuitului logic
combinaţional trebuie să fie zero dar apare o tranziţie scurtă în
unu ca rezultat al schimbării stării unei intrări; acest tip de hazard
apare în cazul circuitelor construite cu porţi OR şi AND pe baza
funcţiilor canonice conjuctive;
b. hazardul dinamic la care ieşirea circuitului comută de mai multe ori la
schimbarea stării unei singure intrări. Acest tip de hazard nu este
posibil în cazul circuitelor construite numai cu porţi AND şi OR.

Hazardul static poate fi detectat şi eliminat cu ajutorul diagramelor Karnaugh.


Pentru exemplificare vom considera circuitul din figura 1.24. Inversoarele U5A,
U6A şi U7A nu fac parte din circuit, ele sunt folosite la simulare împreună
generatoarele de semnal digital x0,x1 şi x2 în aşa fel încât semnalul aplicat circuitului să
înceapă cu starea zero.

CLK
X2
1
U5A
2 1
U1A
x2 x1
1 0 3
7404
V
2
U8A 1
1 2 7408 0 U4A
X1 U6A 1
7404
CLK 1 2 3
Y0
1 2 0
7404
V U2A V
7432

X0 U7A 0
1
3 x1 x0
CLK 1 2 2 0
1 0
7404
V
7408

Figura 1.24. Circuitul pentru explicarea fenomenului de hazard.

Acest circuit construit cu porţi AND şi OR, care evident are la bază o ecuaţie
canonică de tip disjunctiv, prezintă un hazard static 1 atunci când x2=1, x0=1 şi x1
comută din unu în zero.
Să presupunem că toate porţile logice ale circuitului din figura 1.24 au acelaşi
timp de propagare Δt. În această situaţie putem desena un detaliu al diagramei de timp
(figura 1.25) a circuitului din figura 1.24.
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
53

Comutarea semnalului de intrare x1 din unu în zero duce la comutarea din zero
în unu a semnalului x1 după timpul Δt datorită întârzierii prin poarta U8A. Semnalul x1
se aplică împreună cu semnalul x0 porţii U2A care comută în zero după Δt (timpul
necesar trecerii semnalului prin această poartă). Luând ca referinţă momentul comutării
semnalului x1 din unu în zero, comutarea porţii U2A din unu în zero se face după Δt.
Similar, poarta U1A care era în zero datorită semnalului x1 va comuta în unu după un
timp egal cu Δt (timpul de întârziere a porţii
U1A). Dacă ne raportăm la aceeaşi referinţă,
momentul comutării semnalului x1 din unu în
zero, comutarea porţii U1A se va face după
2Δt. Reamintim că semnalele x0 şi x2 au
valoarea unu. Datorită diferentei de timp egală
cu Δt a comutării celor două porţi apare un
impuls la ieşire cu valoarea zero cu durata Δt,
impuls ce nu ar trebui să apară dacă porţile ar
Figura 1.25. Diagrama de timp fi ideale.
explicativă pentru apariţia hazardului În figura 1.26 se prezintă rezultatul
simulării circuitului din figura 1.24.

hazard static-1

hazard static-0

Figura 1.26. Rezultatul simulării circuitului din figura 1.24.

1.5.1. Eliminarea hazardului cu ajutorul diagramelor Karnaugh

Hazardul static-1
Hazardul static-1 apare atunci când o variabilă de intrare directă şi
complementul acesteia sunt conectate la două porţi AND diferite.
Atunci cînd folosim o diagramă Karnaugh, identificarea hazardului se poate face
prin identificarea subcuburilor adiacente ce cuprind termeni canonici diferiţi ai funcţiei.
Pentru exemplificare scriem ecuaţia canonică disjunctivă pentru circuitul din
figura 1.24.

y0 = x2 x1 + x1 x0 (1.49)

Tabelul Karnaugh corespunzător acestei ecuaţii


x1x0 este cel din figura 1.27.a. Din tabelul Karnaugh se
00 01 11 10
x2
observă că tranziţia de la suprafaţa x2 x1 la
0 0 0 1 0
1 1 1 1 0 suprafaţa x1 x0 se face prin tranziţia variabilei x1.
Figura 1.27.a. Tabelul Karnaugh Pentru eliminarea hazardului static-1 se adaugă un
subcub suplimentar (implicant prim) care să
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
54

conecteze cele două suprafeţe, asa cum este arătat în figura 1.27.b.
x1x0
00 01 11 10
x2 Ecuaţia normală disjunctivă pentru cu hazardul
0 0 0 1 0 eliminat este:
1 1 1 1 0
Figura 1.27.b. Tabelul Karnaugh

y0 = x2 x1 + x1 x0 + x2 x0 (1.50)

Circuitul obţinut, corespunzător ecuaţiei (1.27.b) este cel din figura 1.28 iar
rezultatele simulării în figura 1.29.

X2 U5A U1A
CLK
1 2 1
1 0 3
7404
2 0
U8A
1 2 7408
X1 U6A
7404
CLK
1 2
1
7404
U2A U4A
1 1 U9A
U7A 0
X0 0 3 2 12 1 2
Y0
CLK
1 2 2 0 13 1 0
7404
1 0
7404
7408 7427

U3A
1
3
2 0

7408

Figura 1.28. Eliminarea hazardului.

Figura 1.29. Rezultatele simulării circuitului din figura 3.51.

Aşa cum se observă din figura 1.29 hazardul static-1 din semnalul de ieşire y0
este eliminat..
O altă posibilitate de eliminare a hazardului este cea de modificare a întârzierilor
în circuit prin adăugarea sau eliminarea de porţi. De exemplu în figura 1.28. se poate
renunţa la inversorul U8A semnalul x1 putând fi cules direct de la intrarea porţii U6A.
În acest caz se poate renunţa la poarta U3A. Din acest exemplu rezultă importanţa
deosebită a simulării funcţionării circuitelor logice, activitate ce poate scurta
considerabil timpul de proiectare şi punere la punct a unui circuit.

Hazardul static-0
Hazardul static-0 apare la circuitele compuse din porţi logice OR-AND, descrise
de ecuaţii normale conjunctive, atunci când o variabilă de intrare directă şi
complementul acesteia sunt conectate la două porţi OR diferite.
Eliminarea hazardului-0 se face printr-o metodă duală celei de eliminare a
hazardului static-1 cu ajutorul diagramelor Karnaugh. Hazardul static-0 poate fi
identificat acolo unde, în diagrama Karnaugh, apar suprafeţe adiacente, formate din
zerouri, care acoperă sume de termeni diferiţi. Eliminarea hazardului se va face prin
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
55

inserarea unui subcub suplimentar (implicant prim) care reprezintă o sumă de termeni ai
funcţiei şi care acoperă tranziţia variabilei care produce hazardul.
De asemenea se poate utiliza metoda modificării corespunzătoare a întărzierilor
prin adăugarea şi eliminarea de porţi şi simularea circuitului.

1.6. Analiza circuitelor logice combinaţionale cu ajutorul pachetului de


programe OrCAD
Acest capitol nu este destinat învăţării lucrului cu mediul OrCAD. Vor fi date doar
indicaţii succinte privind analiza unui circuit digital începând de la proiectarea schemei şi
încheind cu simularea acesteia. Din acest motiv, pentru învăţarea lucrului în OrCAD vor
trebui consultate manualele dedicate acestui scop.
Produsul OrCAD reprezintă o colecţie de aplicaţii construite conform fluxului
de proiectare ingineresc. OrCAD CIS (Component Information System) reprezintă o
componentă opţională a sistemului OrCAD ce este folosită împreună cu OrCAD
Capture. OrCAD CIS permite managementul proprietăţilor componentelor electronice,
necesare fiecărei etape, pe durata proiectării schemei electrice, până la realizarea
cablajului imprimat. Cu ajutorul acestui sistem proiectele realizate şi cele viitoare sunt
actualizate cu informaţiile existente la producătorii componentelor electronice şi în
bazele de date prin intermediul reţelei Internet.
Principalele componentele ale sistemului OrCAD cu ajutorul cărora se
realizează proiectarea unui circuit electric, începând cu proiectarea schemei electrice şi
terminând cu simularea acesteia şi proiectarea cablajului imprimat sunt:

o OrCAD Capture sau OrCAD Capture CIS – destinat proiectării


schemelor electrice,
o OrCAD Express sau OrCAD Express CIS – destinat proiectării
dispozitivelor logice digitale şi a dispozitivelor logice programabile,
o OrCAD Layout – destinat proiectării cablajelor imprimate,
o OrCAD Pspice – destinat simulării circuitelor electrice analogice,
o OrCAD PSpice A/D – destinat simulării circuitelor electrice
analogice, digitale şi mixte analogice şi digitale.

Pentru simularea unui circuit logic combinaţional realizat cu porţi logice este
necesară mai întâi realizarea circuitului electric cu ajutorul componentei OrCAD
Capture. Se va explica în continuare
modul de realizare şi de simulare a
schemei din figura 1.24 cu ajutorul
pachetului de programe OrCAD ver. 9.1.

1.6.1. Proiectarea schemei electronice


cu ajutorul programului OrCAD
CAPTURE
1.6.1.1.Începerea unui proiect nou

Pentru începerea unui proiect nou,


se porneşte programul OrCAD Capture şi Figura 1.30. Definirea unui proiect nou.
se selectează din meniul principal File,
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
56

apoi New după care se selectează opţiunea Project. Se deschide o fereastră pentru
crearea unui proiect nou, ca în figura 1.30.
În această fereastră trebuie scris numele
proiectului (aici a fost ales numele „test1”), se
alege tipul de proiect „Analog or Mixed Signal
Circuit Wizard” prin selectarea acestei opţiuni
şi apoi directorul unde se va găsi noul proiect
(aici „E:\Proiecte”) după care se apasă pe
butonul Ok.
Apare o nouă fereastră ca cea din figura
1.31 în care se cere includerea bibliotecilor
Figura 1.31. Selectarea bibliotecilor
Pspice care se vor folosi în acest proiect.
proiectului.
Încluderea bibliotecilor suplimentare se poate
face şi pe parcursul elaborării schemei electrice deci în această fază putem să selectăm

Meniul principal

Fereastra pentru
desenarea schemei
Fereastra
pentru
gestionarea
proiectului

Fereastra de mesaje
Figura 1.32. Deschiderea unui proiect în OrCAD Capture.
doar o parte din bibliotecile de componente folosite. Bibliotecile de componente Pspice
(cu extensia .olb) conţin, pe lângă simbolul
componentei folosite şi modelul aesteia (definit
conform regulilor programului SPICE) folosit la
simulare.
Vom selecta biblioteca 7400.olb după care se
apasă butonul Add>> pentru a adăuga această
bibliotecă iar în final se apasă butonul Finish.
Terminarea definirii proiectului nou determină
apariţia mai multor ferestre în spaţiul programului
OrCAD Capture: fereastra pentru gestiunea
proiectului care are numele proiectului, fereastra Figura 1.33. Fereastra pentru
pentru desenarea schemei cu numele / - gestiune a proiectului
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
57

(SCHEMATIC : PAGE1) şi fereastra de mesaje cu numele Session Log (figura 1.32).

1.6.1.2.Plasarea componentelor în schema electronică

Pentru plasarea componentelor în schema electrică se selectează fereastra pentru


desenarea schemei (/ - (SCHEMATIC : PAGE1)). Dacă această fereastră nu este
afişată se face dublu clic pe pictograma acesteia din fereastra de gestiune a proiectului
arătată în figura 1.33. (pentru desfăşurarea structurii proiectului se va face clic pe
simbolul „+”). În continuare, atunci când nu se specifică altfel, prin expresia „se face
(dublu) clic” se înţelege acţionarea butonului din stânga a mausului.
Plasarea componentelor în schema electrică se poate face selectând opţiunea
Place din meniul principal după carese selectează opţiunea Part din meniul desfăşurat
sau se selectează pictograma din bara de unelte (figura 1.34).

Figura 1.34. Bara de unelte.


La selectarea acestei opţiuni este afişată fereastra din figura 1.35. În această
fereastră este posibil să adăugăm biblioteci noi – cu opţiunea Add Library… (dacă
aceastea n-au fost adăugate la definirea proiectului – figura 1.31), să eliminăm o
bibliotecă de componente – cu opţiunea Remove Library, dacă aceasta nu mai este
necesară, sau să căutăm o componentă în biblioteci cu ajutorul opţiunii Part Search…
ce permite o căutare complexă.
Reamintim aici faptul că simularea unei scheme electrice necesită existenţa
modelelor SPICE ale componentelor respective. Din acest motiv o schemă destinată
simulării se va realiza exclusiv cu ajutorul componentelor aflate în bibliotecile cu
extensia „.olb”.

Fereastra componentelor aflate


în bibliotecile selectate
Fereastra bibliotecilor folosite în
proiectul respectiv

Simbolul grafic al
componentei selectate

Figura 1.35. Fereastra de selecţie a componentei ce va fi plasată în schema electrică

Pentru realizarea schemei electrice a circuitului din figura 1.24 se vor plasa pe
desen porţile logice. Din acest motiv se va selecta biblioteca „7400” în fereastra
bibliotecilor folosite în proiectul respectiv iar din fereastra componentelor se vor selecta
succesiv componentele: „7404”, „7408” şi respectiv „7432”.
După selectarea unei componente se apasă butonul OK al ferestrei de selecţiei a
componentei şi simbolul grafic al acesteia apare solidar cu cursorul mausului. Pentru
plasarea componentei se face clic pe butonul din stânga al mausului. Pentru încheierea
operaţiei de plasare a unui tip de componentă se face clic pe butonul din dreapta al
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
58

mausului iar în meniul desfăşurat se selectează End Mode. Tot în acest meniu sunt
opţiuni pentru rotirea componentei, aşezarea în oglindă etc. necesare editării schemei.
Pentru plasarea unei noi componente se selectează din nou opţiunea de plasare a
unei componente iar operaţiunea se repetă.
După aşezarea tuturor porţilor logice conform desenului 1.24 se vor plasa la
intrarea circuitului generatoarele de semnal. Pentru acesta, în fereastra de selecţie a
componentei, în fereastra de selecţie a bibliotecii, se va selecta biblioteca
SOURCE.OLB. Din această bibliotecă se va selecta componenta DigClock.
Componenta DigClock este o sursă de semnal digital care este folosit de obicei
ca semnal de ceas reprezentat de un semnal dreptunghiular periodic. După plasarea
componentei în schema electrică, dacă se face dublu clic pe imaginea acesteia se
deschide fereastra editorului proprietăţilor componentei (Property Editor) în care se
pot preciza: timpul după care apare prima tranziţie a ceasului (parametrul DELAY),
timpul cât durează nivelul ridicat (high), în fiecare perioadă a semnalului de ceas
(parametrul ONTIME), timpul cât durează nivelul scăzut (low), în fiecare perioadă a
semnalului de ceas (parametrul OFFTIME), starea nivelului scăzut a semnalului de
ceas - Low state, implicit aceasta este zero – (parametrul STARTVAL) şi starea
nivelului ridicat a semnalului de ceas - High state, implicit aceasta este unu –
(parametrul OPPVAL), aşa cum este arătat în figura 1.36.

Figura 1.36. Fereastra editorului proprietăţilor.


Cele trei semnale de ceas aplicate la intrarea circuitului trebuie să aibă
frecvenţele în următoarea relaţie:

f x 0 = 2 f x1 = 4 f x 2 (1.51)

în aşa fel încât la intrarea circuitului să fie TABEL 1.17.


generate toate combinaţiile posibile ale Semnal OFFTIME ONTIME
variabilelor de intrare conform celor x0 .125uS .125uS
x1 .25uS .25uS
x2 .5uS .5uS

prezentate în paragraful 1.4.5.


Pentru aceasta se vor face modificările
prezentate în tabelul 1.17, în fereastra editorului
proprietăţilor componentelor.
Pentru modificarea textului asociat unei
componente se face dublu clic pe acesta, fapt ce
determină deschiderea ferestrei de afişare a
proprietăţilor (fereastra Display Properties –
Figura 1.37. Fereastra de afişare a
proprietăţilor textului figura 1.37) sau se face clic dreapta şi din
mesajul afişat se selectează opţiunea Edit
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
59

Properties… . În această fereastră se fac modificările textului, a dimensiunilor acestuia


etc. Pentru exemplul nostru se va modifica textul în: x0, x1 şi respectiv x2 şi se vor
şterge celelalte linii de text. Textul se poate şterge prin selectarea acestuia (clic pe text)
şi apăsarea tastei Del.
Datorită faptului că semnalul de ceas porneşte cu starea unu a semnalului, în
schemă s-au prevăzut inversoarele U5A, U6A şi U6A (figura 1.24) pentru aducerea
semnalului într-o formă convenabilă în corespondenţă cu tabelul de adevăr. Acest lucru
se putea realiza şi direct din editorul proprietăţilor componentei însă, având în vedere
faptul că, în general, într-un circuit logic combinaţional sunt necesare atât semnalele de
intrare directe cât şi cele negate, s-a preferat această soluţie.
În sfârşit, schemei i se mai adaugă un conector de ieşire. Pentru aceasta se
selectează din meniul principal Place opţiunea Hierarchical Port sau se selectează
pictograma din bara de unelte. În fereastra
care se deschide (figura 1.38) se selectează
biblioteca CAPSYM si din această bibliotecă
alegem conectorul PORTLEFT-L. După
plasarea conectorului se face dublu clic pe textul
asociat acestuia care se schimbă în Y0. După
plasarea conectorului, activitatea de plasare a
componentelor conform figurii 1.24 se încheie.
În continuare componentele trebuie conectate
Figura 1.38. Fereastra pentru
între ele prin intermediul legăturilor electrice.
selectarea conectorului

1.6.1.3.Conectarea componentelor schemei electronice

Pentru conectarea componentelor unei scheme electrice în OrCAD CAPTURE


există mai multe posibilităţi. Opţiunile disponibile în meniul Place sunt: Wire pentru
plasarea unui traseu electric, cu pictograma în bara de unelte, Bus pentru plasarea
unei magistrale în schema electronică, pentru care pictograma în bara de unelte este
, Junction pentru conectarea între ele două trasee electrice (Wire) sau magistrale
(Bus), cu pictograma şi în sfârşit, Bus entry pentru conectarea magistralei la
componente cu pictograma .
În exemplul nostru nu vom avea nevoie decât de trasee electrice (Wire).
Conform schemei prezentate în figura 1.24, pentru a realiza o conexiune electrică se
selectează opţiunea Wire din meniul Place sau se selectează pictograma
corespunzătoare din bara de unelte. Se plasează indicatorul mausului în primul punct al
conexiunii şi se face clic. Se deplasează indicatorul mausului în punctul următor al
conexiunii şi se face din nou clic. În acest fel s-a realizat o conexiune între două puncte
şi se poate trece la conexiunea următoare. Pentru a realiza o conexiune corectă aceasta
trebuie să fie făcută în vârful punctului de conectare fără suprapuneri cu terminalul
componentei conectate. Pentru încheierea activităţii de conectare a componentelor, se
face clic dreapta şi se selectează End Wire din meniul desfăşurat.
Pentru plasarea unor etichete traseelor electrice se selectează opţiunea Place din
meniul principal după care se selectează Net Alias… sau se selectează pictograma
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
60

din bara de unelte. Ca rezultat al acestei acţiuni se afişează o fereastră de editare a


etichetei pentru unul din traseele electrice. După apăsarea butonului OK, plasarea
etichetei se face poziţionând cursorul cu eticheta pe unul din traseele electrice şi făcând
clic pe acesta.
Utilizarea etichetelor poate fi folositoare, spre exemplu, pentru identificarea
semnalelor care circulă între anumite puncte ale schemei electrice. Aceste etichete vor
apărea şi pe graficele de semnal construite de simulatorul OrCAD PSPICE.
După conectarea tuturor componentelor se poate face o primă verificare a
corectitudinii realizării schemei electrice.

1.6.1.4.Verificarea corectitudinii realizării schemei electrice

Pentru verificarea corectitudinii realizării unei scheme electrice se va selecta în


fereastra de gestionare a proiectului (figura 1.33) schema electronică aflată în desenul
PAGE1. După acesta, în meniul Tools apărut în meniul principal se selectează opţiunea
Design Rules Check… care determină apariţia ferestrei de stabilire a regulilor de
verificare a schemei electrice. În această fereastră opţiunile implicite sunt suficiente şi
pentru lansarea verificării se va apăsa butonul OK. În fereastra Session Log vor fi
afişate următoarele mesaje:

********************************************************************************
*
* Design Rules Check
*
********************************************************************************

Checking Pins and Pin Connections

--------------------------------------------------
Checking Schematic: SCHEMATIC1
--------------------------------------------------
Checking Electrical Rules

Checking for Unconnected Nets

Checking for Invalid References

Checking for Duplicate References

Aceste mesaje indică faptul că schema electrică este corectă. În situaţia în care
apare o eroare la desenarea schemei, această eroare este semnalată printr-un mesaj şi se
afişează coordonatele punctului în care apare eroarea.
După ce desenarea schemei circuitului electronic a fost încheiată, se poate trece
la simularea funcţionării circuitului în vederea analizei comportării acestuia şi, apoi, la
proiectarea cablajului imprimat.
Pentru simulare se foloseşte componenta pachetului de programe OrCAD
PSPICE. Pregatirea simulării circuitului electronic presupune stabilirea punctelor de test
şi stabilirea profilului simulării.
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
61

1.6.1.5. Plasarea punctelor de test pe schema electronică

Punctele de test sunt punctele din schema electrică unde utilizatorul doreşte să
vizualizeze anumiţi parametri.
Din programul OrCAD CAPTURE se selectează din meniul principal opţiunea
PSpice iar din meniul desfăşurat, opţiunea Markers.
Opţiunea Markers permite alegerea punctelor de test de tip Voltage Level
(nivel de tensiune), Voltage Differential (diferenţă de tensiune), Current Into Pin
(curentul printr-un terminal) şi Advanced care permite o serie de măsurători complexe.
De asemenea, opţiunea Markers permite afişarea tuturor punctelor de măsură pe
schemă (Show All), ascunderea acestora (Hide All), ştergerea (Delete All) şi listarea
acestora (List …). Deoarece în urma simulării dorim să urmărim forma tensiunii
(nivelele logice) în anumite puncte se va selecta Voltage Level. Simbolul sondei de
măsură care apare solidar cu indicatorul mausului se plasează la capătul terminalelor
unde se doreşte afişarea, în simulatorul PSpice, a formelor de undă ale tensiunii.
Conform figurii 1.24, punctele de măsură se vor plasa la terminalele componentelor:
U5A:2, U6A:2, U7A:2 şi U4A:3.

1.6.1.6.Stabilirea profilului de simulare

Pentru realizarea unei simulări trebuie stabilit


acum un profil de simulare. Pentru aceasta se selectează
din meniul principal PSpice după care se selectează din
meniul desfăşurat New Simulation Profile. Apare
fereastra din figura 1.39 prin intermediul căreia ni se
solicită numele profilului de simulare. Vom scrie în
Figura 1.39. Fereastra caseta text Name:, spre exemplu, numele „test1” şi se
pentru stabilirea numelui
apasă butonul Create. În fereastra profilului de simulare
profilului de simulare
„test1” afisată pe ecran se pot stabili caracteristicile unei
simulări conform opţiunilor afişate de fereastră (figura 1.40): General, Analysis,
Include Files, Libraries, Stimulus, Options, Data Collection şi Probe Window. Pentru
exemplul nostru sunt suficiente opţiunile implicite. Totuşi se va verifica dacă în
fereastra afişată pentru opţiunea Analysis sunt stabilite setările afişate în figura 1.40.
Durata simulării se stabileste în
funcţie de perioada semnalelor de intrare
stabilite la configurarea componentei
DigClock (paragraful 1.6.1.2). Semnalul
de intrare cu frecvenţa cea mai scăzută
(perioada cea mai mare) este semnalul x2
care, conform tabelului 1.17, are o
perioadă de 2 x 0,5 μs = 1 μs. Pentru a
avea graficul unei perioade complete a
acestui semnal stabilim timpul de
simulare (Run to time) egal cu perioada
acestuia.
Figura 1.40. Fereastra profilului de simulare
“test1” Pentru o singură schemă electrică
se pot stabili mai multe profile de
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
62

simulare diferite în funcţie de necesităţile utilizatorului stabilind nume diferite pentru


aceste profile.

1.6.1.7. Simularea circuitului

Se poate trece acum la simularea circuitului logic combinaţional. Pentru aceasta


se selectează opţiunea PSpice din meniul principal, după care se selectează comanda
Run. După selectarea acestei comenzi, programul OrCAD PSPICE este lansat în
execuţie şi sunt afişate pe ecran graficele corespunzătoare variaţiilor de tensiune în
punctele de test (figura 1.50).
În urma simulării circuitelor logice combinaţionale se pot realiza observaţii
asupra comportării circuitului în domeniul timp, corespondenţa între formele de undă,
apariţia hazardului, comportarea statică şi dinamică a circuitului, analiza dispersiei
parametrilor componentelor, influenţa temperaturii şi multe altele.
Dacă în urma simulării circuitului rezultatele sunt bune se poate trece la realizarea fizică
a acestuia.

1.7. Analiza circuitelor logice combinaţionale cu ajutorul limbajelor


pentru descrierea structurii hardware (HDL)

1.7.1. Introducere

Realizarea circuitelor digitale simple presupune parcurgerea mai multor etape,


dintre care cele mai importante sunt:

o descrierea informală a funcţionării circuitului;


o transpunerea descrierii circuitului în ecuaţii logice;
o aplicarea metodelor de simplificare şi optimizare a funcţiilor logice;
o sinteza schemei electrice a circuitului cu ajutorul porţilor logice şi a
bistabililor;
o simularea funcţionării circuitului şi corectarea eventualelor erori;
o realizarea fizică a circuitului.

Dacă circuitul digital este de complexitate mai mare, o metodă de realizare des
utilizată presupune descompunerea circuitului în blocuri funcţionale, testarea separată a
acestora şi apoi, după stabilirea relaţiilor ierarhice între acestea, testarea ansamblului
compus din blocuri funcţionale. De regulă o astfel de metodă poate fi aplicată la
circuitele compuse din până la aproximativ şase sute de porţi.
Creşterea complexităţii sistemelor numerice odată cu dezvoltarea tehnologiei
digitale a dus la imposibilitatea folosirii metodelor clasice de proiectare şi realizare a
acestora.
Sistemele numerice actuale sunt extrem de complexe. La nivelul celor mai mici
detalii, ele constau în sute de miloane de elemente de tipul tranzistoarelor sau al porţilor.
De aceea, pentru sistemele numerice mari, proiectarea la nivelul porţilor este practic
imposibilă. Schema devine un paienjenis de conexiuni, care nu mai arata
functionalitatea proiectului.
Incepand cu 1970, inginerii de calculatoare si inginerii electronisti au apelat la
HDL (Hardware Description Language) care reprezintă, aşa cum arată şi numele
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
63

acestora, limbaje de programare destinate descrierii formale a circuitelor electronice.


Aceste limbaje pot descrie funcţionarea, structura, permit simularea, iar în final crearea
structurii fizice a circuitelor electronice.
Structura fizică obţinută se referă la tehnologia de realizare a circuitului integrat
deoarece un astfel de circuit nu mai poate fi realizat cu componente discrete.
Un limbaj care indică modul de conectare a elementelor componente ale unui
circuit electronic şi relaţiile ierarhice care există între diversele blocuri ale circuitului
sunt considerate ca limbaje pentru descrierea reţelelor (netlist). Spre deosebire de
acestea, limbajele destinate descrierii formale a structurilor fizice electronice
(hardware), trebuie să conţină atât expresii pentru redarea comportării în domeniul timp
cât şi expresii destinate redării simultaneităţilor, caracteristici ce reprezintă principalele
atribute ale unei structuri fizice de acest tip.
HDL sunt folosite pentru descrierea diferitelor componente fizice ale unui circuit
electronic cu ajutorul anumitor secvenţe de program. Aceste secvenţe de program pot fi
utilizate prin intermediul unui simulator pentru analiza comportării în timp a circuitului
electronic înainte de realizarea fizică a acestuia. Simulatoarele pot fi utilizate pentru
circuite digitale (circuite la care semnalele au o evoluţie discretă în timp), pentru
circuite analogice (cu evoluţie continuă în timp) sau circuite mixte analogice şi digitale,
pentru fiecare dintre aceste tipuri de circuit existând limbaje descriptive adecvate.
Scrierea secvenţei de program corespunzătoare unui anumit circuit electronic nu
înseamnă că, pe baza acestui cod, se poate genera automat, cu ajutorul unui software de
sinteză, structura fizică a circuitului. Un program de sinteză poate doar realiza
convertirea codului corespunzător descrierii structurii fizice şi efectuarea unor
optimizări locale dar nu poate realiza implementări eficiente pe baza unor descrieri
defectuase sau incomplete. Fără o înţelegere profundă a modului de funcţionare
corespunzător circuitului proiectat limbajele pentru descrierea structurilor fizice pot
conduce la realizări nejustificat de complexe şi, de multe ori, la imposibilitatea
implementării circuitului.
În general, limbajele de programare de uz general precum C, PASCAL, JAVA
etc, nu sunt potrivite utilizării ca HDL datorită faptului că nu există facilităţi pentru
descrierea comportării în timp şi a simultaneităţilor, programarea în astfel de limbaje
presupunând un effort suplimentar din pertea programatorului. Din acest motiv s-au
dezvoltat limbaje specializate, adecvate acestui scop, care permit o descriere simplă a
structurii hardware.
Limbajele destinate descrierii structurilor fizice digitale au apărut din necesitatea
proiectării sistemelor extrem de complexe. Complexitatea sistemelor digitale impune
utilizarea mai mutor tipuri de informaţii în procesul de realizare a circuitului integrat.
Acelaşi sistem digital este descris în diferite moduri şi este examinat din mai multe
perspective. HDL reprezintă un sistem din trei puncte de vedere:

o din punct de vedere comportamental;


o din punct de vedere structural;
o din punct de vedere fizic.

Descrierea comportamentală consideră sistemul ca o cutie neagră la care se


ignoră modul de realizare a structurii interne. În acest caz descrierea se concentrează
asupra relaţiilor între semnalele de intrare şi ieşire, indicându-se răspunsul de ieşire
pentru un anumit set de semnale aplicate la intrare. Există mai mute căi pentru
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
64

descrierea relaţiilor dintre semnalele de intrare şi ieşire şi din acest motiv arareori
descrierea comportamentală este unică.

Descrierea structurală se referă la modul de realizare a structurii interne a


sistemului. Descrierea se face prin specificarea componentelor utilizate şi modul în care
acestea sunt conectate. Această descriere reprezintă mai mult sau mai putin schema
sistemului care furnizează informaţii asupra conexiunilor (netlist).

Descrierea fizică se referă la caracteristicile fizice ale sistemului şi adaugă


informaţii suplimentare la descrierea structurală. Sunt specificate dimensiunile
componentelor, poziţia acestora pe cablajul imprimat sau în structura de siliciu a
circuitului integrat şi poziţia traseelor electrice destinate conexiunilor.
Pe un circuit integrat putem avea sute de milioane de tranzistoare interconectate
între ele în vederea obţinerii sistemului digital. Este imposibil pentru un operator uman
şi chiar unui calculator să prelucreze un volul de date atât de mare. Din acest motiv, în
scopul gestionării corecte a volumului foarte mare de date descrierea sistemului de
realizat se face pe mai multe nivle de abstractizare. O abstractizare semnifică în acest
caz un model simplificat a sistemului. Cele mai multe detalii se întâlnesc la
abstractizările de pe nivelul de jos care sunt cele mai apropiate de structura fizică reală
iar cele mai puţine detalii pe nivelul cel mai înalt.

La sistemele digitale se folosesc următoarele patru nivele de abstractizare:

o nivelul tranzistor;
o nivelul poartă logică;
o nivelul registrului de transfer (Register-transfer-level sau RT-level);
o nivelul procesor.

Împărţirea pe aceste nivele se bazează în primul rând pe elementele bloc de bază


utilizate la realizarea circuitelor numerice: tranzistorul, porţile logice, modulele
funcţionale şi respectiv procesorul.

Abstractizarea la nivel de tranzistor reprezintă abstractizarea pe nivelul cel mai


scăzut. La acest nivel, elementele de bază sunt tranzistoarele, rezistenţele electrice,
capacitâţile şi aşa mai departe. Descrierea comportării se face în mod obişnuit cu
ajutorul unui set de ecuaţii diferenţiale sau cu ajutorul unor diagrame curent-tensiune. În
această situaţie pot fi folosite programe de simulare a sistemelor analogice pentru a
obţine caracteristicile de intrare-ieşire.
La acest nivel, descrierea fizică reprezintă schema detaliată ce conţine
componentele şi conexiunile între acestea.

Abstractizarea la nivel de poartă reprezintă următorul nivel de abstractizare. La


acest nivel elementele constructive ale schemei sunt reprezentate de către circuite
combinaţionale (porţi logice elementare, multiplexoare etc) şi circuite secvenţiale
(circuite de memorare – latch – şi bistabili).
La acest nivel se iau în considerare numai două valori a semnalelor,
corespunzătoare celor două valori logice logice „unu” şi „zero”. Întâlnim deci, pe acest
nivel, o primă abstractizare importantă şi anume conversia unui sistem analogic într-un
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
65

sistem digital. Trebuie reţinut însă faptul că, în realitate, semnalele şi circuitele sunt în
continuare continui. Cu ajutorul acestei abstractizări, descrierea comportării intrare-
ieşire se poate face cu prin intermediul ecuaţiilor algebrei logice (ecuaţii booleene)
renunţându-se la ecuaţiile diferenţiale care sunt cu mult mai complexe şi mai dificil de
folosit.
De asemenea informaţiile în domeniul timp sunt simplificate. Se foloseşte o
singură informaţie şi anume timpul de propagare (paragraful 2.3.3.) sau timpul de
întârziere (delay time – propagation delay) pentru specificarea caracteristicilor în
domeniul timp a porţii.

Abstractizarea la nivelul registrului de transfer (RTL) se bazează pe module


funcţionale construite din elemente logice simple. Aceste module funcţionale sunt
reprezentate de către sumatoare, comparatoare registre, multiplexoare etc. Acest nivel
de abstractizare poate fi considerat un nivel de abstractizare la nivel de modul.
Pentru descrierea comportamentală la acest nivel se folosec expresii generale
pentru precizarea modului de funcţionare şi a fluxului de date. Pentru descrierea unui
sistem proiectat cu ajutorul metodologiei RT se foloseşte maşina cu stări finite extinsă
(extended finite state machine – FSM).
O caracteristică importantă a descrierii la nivelul registrului de transfer o
reprezintă folosirea unui semnal de ceas comun la componentele de memorare. Datorită
existenţei acestui semnal, se realizează sincronizarea semnalelor şi timpul de întârziere
este înlocuit cu un număr de perioade de ceas.

Abstractizarea la nivel de procesor este reprezentată de blocuri funcţionale ce


conţin procesoare, memorie, magistrale şi alte elemente asemănătoare. Descrierea
funcţională a sistemului este similară cu un program scris într-un limbaj de programare
de nivel înalt.
Utilizarea limbajelor descriptive a structurilor fizice (HDL) simplifică numărul
etapelor necesare elaborării unui circuit digital:

o descrierea informală a funcţionării circuitului;


o specificaţii în HDL;
o simularea funcţionării circuitului şi corectarea eventualelor erori;
o realizarea fizică a circuitului.

Limbajele descriptive a structurii fizice sunt folosite în principal la dispozitive


logice programabile (Programmable Logic Devices – PLDs) de diferite complexităţi de
la PLD simple la cele mai complexe (CPLD) şi arii programabile de porţi logice Field
Programmable Gate Arrays (FPGAs).
Descrierea dispozitivelor simple poate fi făcută cu limbaje precum Abel, Palasm
şi Cupl iar a celor complexe cu Verilog (numit şi Verilog HDL) şi VHDL (VHSIC
Hardware Description Language), unde VHSIC reprezintă acronimul de la Very-High-
Speed Integrated Circuit.
Verilog a fost lansat în 1985 de către Gateway System Corporation, care a fost
preluată de către Cadence Design Systems, Inc.’s Systems Division. Pâna în 1990, când a
luat fiinţă Open Verilog International (OVI), Verilog HDL a fost proprietatea companiei
Cadence. Ulterior, Cadence a plasat Verilog în Domeniul Public, cu speranţa deschiderii
unei pieţe de produse software legate de Verilog HDL, în condiţiile în care acesta se va
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
66

bucura de o largă răspândire.


Verilog HDL permite proiectantului de hardware să descrie proiectele, atât la un
înalt nivel de abstractizare, cum ar fi cel al arhitecturii sau comportamental, cât şi la
niveluri mai joase de implementare (nivelurile porţii şi comutatorului), conducând la
măştile/şabloanele pentru circuitele integrate pe scară foarte largă (Very Large Scale
Integration) şi la fabricarea circuitului.
Standardul IEEE, pentru VHDL, a apărut în 1987, în timp ce standardul IEEE,
pentru Verilog, a fost elaborat în 1995. VHDL este asemănător cu limbajul Ada iar
Verilog este asemănător limbajului C, care este foarte răspândit în rândurile inginerilor
electronişti şi de calculatoare.
VHDL a fost solicitat iniţial companiilor furnizoare, de către Departamentul
Apărării al Statelor Unite (US Department of Defense), pentru documentarea circuitelor
integrate destinate aplicaţiilor specifice (ASIC - application-specific integrated circuit). Cu
alte cuvinte, VHDL a fost elaborat ca o alternativă la voluminoasele documentaţii
însoţitoare ce conţineau detalii specifice de implementare. Până la ideea de simulare a
acestor « documentatii » nu a fost decât un pas şi au fost create simulatoare care să poată
citi fişierele VHDL. Următorul pas a fost cel al dezvoltării sintetizatoarelor logice care pe
baza fişierelor VHDL puteau furniza la ieşire specificaţiile pentru realizarea fizică a
circuitului.
Simularea unui circuit electronic reprezintă o etapă în procesul de elaborare a
acestuia în scopul verificării şi optimizării circuitului înainte de realizarea fizică.
Prin intermediul procesului de simulare se verifică, la orice nivel de abstractizare,
caracteristicile funcţionale ale modelului. În acest scop se folosesc simulatoare cum sunt
de exemplu: OrCAD Simulate, ModelSim, VCS, Verilog-XL, Veriwell, Finsim,
iVerilog, VeriDOS etc.
Simulatorul testează dacă sunt îndeplinite, de către codul RTL, cerinţele
funcţionale din specificaţie, verificându-se dacă toate blocurile RTL sunt corecte din
punct de vedere funcţional. Pentru aceasta trebuie scris un fişier de test (testbench) care
generează semnalul de tact (clk), semnalul de reset şi vectorii de test necesari. Cele mai
multe simulatoare afişează formele de undă de ieşire ale circuitului testat în aşa fel încât
să ne putem da seama dacă circuitul funcţionează corect. Dacă circuitul este foarte
complex atunci fişierul de test va vonţine şi semnalele de ieşire aşteptate astfel încât
verificarea să se facă automat.
În figura 1.41. este prezentat modul de testare a unui circuit digital.

reset
m
clock Circuit digital
ieşire
semnale de

n
semnale de
test

Fişier de test Comparator


1 2 3 (testbench) logic

Figura 1.41. Testarea cu ajutorul simulatorului


2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
67

Simularea în domeniul timp (timing simulation) se face după sinteză, după


realizarea traseelor electrice şi plasarea componentelor. La această simulare sunt luate în
considerare întâzierile introduse de porţile logice şi de către traseele electrice şi se verifică
funcţionarea la frecvenţa semnalului de ceas (SDF Simulation – Standard Delay Format
Simulation, Gate Simulation).

1.7.2. Limbajul Verilog HDL

În acest paragraf nu se face o descriere completă a limbajului Verilog. Vor fi


descrise doar acele elemente ale limbajului care vor permite descrierea unui circuit realizat
cu porţi logice, în vederea simulării. Aceste aspecte acoperă doar o parte a limbajului.
Pentru o descriere completă a limbajului Verilog HDL se pot examina lucrările date la
bibliografie, cât şi standardul IEEE.
În acest paragraf se vor prezenta gradat noţiunile de bază ale limbajului şi modul de
pregătire a unei simulări în aşa fel încât să se poată înţelege principiile care stau la baza
simulării circuitelor logice combinaţionale cu ajutorul limbajulul Verilog HDL.

1.7.2.1. Structura unui program Verilog HDL

Elementul de bază al limbajului Verilog este modulul. Un sistem numeric poate


fi descris cu ajutorul unui singur modul sau cu ajutorul a mai multor module în funcţie
de strategia aleasă de către proiectant.
Modulele reprezintă părţi hardware, ce pot descrie o gamă largă de structuri
fizice, începând cu porţi logice simple şi tranzistoare şi terminând cu sisteme complexe
cum ar fi, de exemplu, microprocesoarele.
Fiecare modul este compus dintr-o interfaţă, corpul modulului şi elemente
suplimentare adăugate opţional.
Structura unui modul este următoarea:

module <nume_modul> (<lista de porturi>);


delimitator modul (început modul)
------------------------------------------------------------------------------------
<declararea porturilor> interfaţa
<declararea parametrilor>
------------------------------------------------------------------------------------
<directive include> elemente externe suplimentare
------------------------------------------------------------------------------------
<declararea variabilelor> corpul modulului
<atribuiri>
<instanţe ale module de nivel scăzut>
<blocuri initial şi always>
<sarcini şi funcţii>
-------------------------------------------------------------------------------------
endmodule
delimitator modul (sfârşit modul)

Cuvintele rezervate module şi endmodule delimitează modulul.


2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
68

După cuvântul rezervat module urmează <nume_modul> ce reprezintă un


identificator care, în mod unic, denumeşte modulul.
Identificatorii Verilog (inclusiv numele modulelor) trebuie să respecte
următoarele reguli:

o identificatorul poate fi compus numai din litere, cifre, simboul dollar “ $


“, şi liniuţa de subliniere (underscore) “ _ ";
o identificatorul trebuie să înceapă cu o literă sau cu liniuţa de subliniere;
o nu sunt permise spaţiile în numele unui identificator;
o Verilog face distincţie între caracterele mari şi mici, deci acelaşi nume
scris cu litere mari şi litere mici reprezintă identificatori diferiţi;
o cuvintele rezervate nu pot fi folosite ca identificatori.

După numele modulului urmează lista de porturi, scrisă între paranteze rotunde.
Această listă este în strânsă legătură cu descrierea porturilor în interfaţa modulului. În
acestă listă sunt enumerate porturile modulului, care sunt folosite pentru conectarea cu
alte module, separate prin virgulă. În interfaţa modulului se face declararea acestor
porturi prin specificarea direcţiei acestora : porturi de intrare (input), ieşire (output) sau
intrare/ieşire (inout),
Sectiunea <declararea parametrilor> din interfaţă, specifică obiectele de tip date
ca registre (reg), memorii si fire (wire), cât şi construcţiile procedurale ca function şi
task care vor fi explicate mai târziu.
Elementele externe suplimentare sunt declarate cu ajutorul directivelor include.
Un exemplu genearal al unui modul în care sunt precizate interfaţa şi elementele
externe suplimentare este prezentat în continuare.

module ModulOarecare (…);


input …;
output …;
inout …;
‘include “…”

endmodule

La scrierea unui program, de mare importanţă este adăugarea comentariilor, care


să explice codul scris şi care să nu fie luate în considerare de către compilator. Limbajul
Verilog permite introducerea comentariilor astfel: folosind două simboluri slash (//) se
poate scrie comentariul pe o linie, sfărşitul comentariului fiind marcat de sfârşitul liniei
şi comentariul pe bloc, care poate fi scris pe mai multe linii şi care este delimitat la
început cu /* iar la sfârşit cu */. Regulile de folosire a comentariilor sunt aceleaşi ca şi
pentru limbajele de nivel înalt.
Pentru a exemplifica modul de realizare al interfeţei unui modul, vom considera
unitatea logică şi aritmetică din figura 1.42.
Conform porturilor sistemului reprezentat de unitatea logică şi aritmetică,
interfaţa modulului corespunzător acesteia este arătat în exemplul 1.
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
69

In1 In2 OpSel Mode

COut CIn
UNITATE LOGICĂ ŞI ARITMETICĂ (ULA)

Result Equal

Figura 1.42. Semnalele de intrare şi de ieşire a unei unităţi logice şi aritmetice

EXEMPLUL1

module ALU (Result, Cout, Equal, In1, In2,OpSel, Cin, Mode) ;


output [3:0] Result; // rezultatul operaţiei
output Cout; // ieşire depăşire (Carry out)
output Equal; // când este 1, In1 = In2
input [3:0] In1; // primul operand
input [3:0] In2; // al doilea operand
input [3:0] OpSel; // selectarea operaţiei
input Cin; // intrare depăşire (Carry in)
input Mode; // modul aritmetic/logic, aritmetic când este 0
/* Urmează corpul modulului care va fi descris mai târziu;
acestă parte a modulului poate conţine toate cele cinci
elemente ale corpului modulului sau numai o parte dintre
acestea */
...
endmodule

Corpul modulului conţine descrierea structurii fizice la care se referă modulul.


Cele cinci elemente ale corpului modulului pot fi scrise în orice ordine cu o singură
restricţie: nici un articol nu poate fi folosit înainte de a fi definit. Există trei moduri
diferite prin care un sistem poate fi descris cu ajutorul modulelor : descrierea
comportamentală, descrierea structurală sau cea a fluxului de date.

Descrierea structurală exprimă comportarea unui sistem numeric (modul) ca o conectare


ierarhică de submodule. La baza ierarhiei componentele trebuie să fie primitive sau
module specificate anterior. Primitivele Verilog sunt porţi logice elementare şi
tranzistoare de trecere (comutatoare).

Descrierea prin fluxul de date reprezintă o listă de expresii care arată modul de
prelucrare a semnalelor de ieşire în aşa fel încăt să se obţină la ieşire valorile dorite,
similar cu descrierea cu ajutorul ecuaţiilor logice. Expresiile se pot baza pe o gamă largă
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
70

de operatori cum sunt : operatori logici, prelucrări la nivel de bit, operatori aritmetici,
operatori condiţionali etc.

Descriere comportamentală defineşte comportarea unui sistem numeric (modul)


folosind descrierea algoritmică cu ajutorul construcţiilor similare limbajelor de
programare tradiţionale.
Pentru exemplificarea celor trei moduri de descriere ale unui sistem vom considera
schema din figura 1.43.
Circuitul din figura 1.43 reprezintă un multiplexor cu patru
TABELUL 1.18. intrări (In0, In1, In2 şi In3), o ieşire (Out) şi două intrări de
Sel1 Sel0 Out comandă (Sel0 şi Sel1). Funcţionarea acestui circut este
0 0 In0 similară cu cea a unui comutator comandat: în funcţie de
0 1 In1 valoarea binară aplicată pe intrările de comandă (Sel0 şi Sel1)
1 0 In2 una din intrările de semnal (In0, In1, In2 sau In3) este conectată
1 1 In3 la ieşire (Out). Tabelul de adevăr al multiplexorului cu patru
intrări este tabelul 1.18.
În continuare, se prezintă pe rând, posibilitatea de scriere în limbajul Verilog, a
modulului corespunzător circuitului din figura 1.43 în cele trei stilulri posibile:
structural, a fluxului de date şi respectiv comportamental.
U3A
1 Y0
In0 2 12
U1A 13

1 2 7410
Sel0 NotSel1
7404 U4A
1
In1 2 12 Y1 1 U7A
13 2
U2A 7410 Y2 6
1 2 4 Out
Sel1 NotSel0 5
7404 7420
1 U5A
In2 2 12
13

7410
U6A
1 Y3
In3 2 12
13

7410

Figura 1.43. Circuitul multiplexor cu patru intrări

Descrierea structurală

EXEMPLUL 2

module mux_4_to_1 (Out, In0, In1, In2, In3, Sel1, Sel0);


output Out;
input In0, In1, In2, In3, Sel0, Sel1;
wire NotSel0, NotSel1;
wire Y0, Y1, Y2, Y3;
not (NotSel0, Sel0);
not (NotSel1, Sel1);
nand (Y0, In0, NotSel1, NotSel0);
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
71

nand (Y1, In1, NotSel1, Sel0);


nand (Y2, In2, Sel1, NotSel0);
nand (Y3, In3, Sel1, Sel0);
nand (Out, Y0, Y1, Y2, Y3);
endmodule

Descrierea prin fluxul de date

Analizând fluxul datelor circuitului din figura 1.43 putem construi diagrama de
semnal din figura 1.44. Acestă diagramă indică modul în care sunt prelucrate, din punct de
vedere logic, semnalele de intrare în scopul obţinerii semnalului de ieşire.

In0 “SI-NU”
logic

Sel0 “NU”
logic

In1 “SI-NU”
logic
“SI-NU” Out
Sel1 “NU” logic
logic

In2 “SI-NU”
logic

In3 “SI-NU”
logic

Figura 1.44. Fluxul datelor pentru circuitul din figura 1.43.

EXEMPLUL 3

module mux_4_to_1 (Out, In0, In1, In2, In3, Sel1, Sel0);

output Out;
input In0, In1, In2, In3, Sel0, Sel1;

assign Out = ~[~(~Sel1 & ~Sel0 & In0) & ~(~Sel1 & Sel0 & In1) &
~(Sel1 & ~Sel0 & In2) & ~(Sel1 & Sel0 In3)];

endmodule

Notaţiile operanzilor din linia assign sunt cele corespunzătoare limbajului C.

Descrierea comportamentală

Conform descrierii modului de funcţionare a circuitului făcută mai sus, putem


construi o schemă echivalentă a acestuia ca cea prezentată în figura 1.45. Circuitul este
echivalent cu un comutator cu patru poziţii comandat de semnalele Sel1 şi Sel2.
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
72

In1
In2
Out
In3
In4

Sel1, Sel2

Figura 1.45. Principiul de funcţionare al multiplexorului

Stilul comportamental descrie circuitul în funcţie de comportarea acestuia,


descriind acţiunile pe care circuitul le execută în timpul funcţionării. Acţiunile sunt
specificate în cadrul blocurilor comportamentale initial şi always care sunt compuse
din instrucţiuni secvenţiale şi concurente. De multe ori este suficient să se trenscrie
descrierea comportamentală a circuitului într-un limbaj de nivel înalt în limbajul
specific Verilog respectând regulile de sintaxă ale acestuia.
Forma comportamentală a modulului corespunzător circuitului din figura 1.43
este dată în exemplul 4.

EXEMPLUL 4

module mux_4_to_1 (Out, In0, In1, In2, In3, Sel1, Sel0);

output Out;
input In0, In1, In2, In3, Sel0, Sel1;
reg Out;

always @ (Sel1 or Sel0 or In0 or In1 or In2 or In3)


begin
case ((Sel1, Sel0))
’b00 : Out = In0;
’b01 : Out = In1;
’b10 : Out = In2;
’b11 : Out = In3;
efault : Out = 1’bx;
endcase
end

endmodule

Semantica construcţiei unui module în Verilog este diferită de cea a


subrutinelor, procedurilor şi a funcţiilor din alte limbaje. Un modul nu este chemat
niciodată. Un modul are o instanţă la începutul unui program şi este prezent pe întreaga
durată a programului. O instanţă a unui modul Verilog este utilizată ca model al unui
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
73

circuit hardware la care se presupune că nu se efectuează modificări de cablaj. La


fiecare instanţă a modulului, acesteia i se da un nume.
De exemplu NAND1 şi NAND2 sunt nume de instanţe ale porţii NAND, în
exemplul de mai jos (exemolul 5). În acest exemplu este dată o specificare din punct de
vedere a fluxului de date a unui modul NAND. Ieşirea out este negaţia produsului and
al intrărilor in1 şi in2.

EXEMPLUL 5

// Modelul corespuzator fluxului de date al portii NAND.


module NAND (out, in1, in2);
output out;
input in1, in2;
// instructiune de atribuire continua
assign out = ~(in1 & in2);
endmodule

Porturile in1, in2 şi out sunt etichetele pe fire. Atribuirea continuă assign
urmăreşte în permanenţă eventualele modificări ale variabilelor din membrul drept,
pentru reevaluarea expresiei şi pentru propagarea rezultatului în membrul stâng (out).
Instrucţiunea de atribuire continuă este utilizată pentru a modela circuitele
combinationale la care ieşirile se modifică ca urmare a modificărilor intrărilor.
Specificarea structurală a unui modul AND (exemplul 6), obţinut ca urmare a
conectării ieşirii unei porţi NAND la cele două intrări ale altei porţi NAND (cea de-a
doua poartă folosită ca inversor – vezi şi paragraful 1.3).

EXEMPLUL 6

module AND (out, in1, in2);


// Modelul structural al unei porti AND formata din doua porti NAND
output out;
input in1, in2;
wire w1;
// doua instante ale modulului NAND
NAND NAND1(in1, in2, w1);
NAND NAND2(w1, w1, out);
endmodule

Acest modul are două instanţe ale lui NAND, numite NAND1 şi NAND2,
conectate printr-un fir intern w1.
Forma generală pentru invocarea unei instanţe este următoarea:

<nume_modul > <lista de parametri > <numele instantei> (<lista de porturi>);

unde <lista de parametri> are valorile parametrilor, care sunt transferate către instanţă.
Un exemplu de parametru transferat ar fi intârzierea pe o poartă.
Urmatorul modul (exemplul 7) reprezintă un modul de nivel înalt, care stabileşte
anumite seturi de date şi care asigură monitorizarea variabilelor.
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
74

EXEMPLUL 7

module test_AND;
// Modul de nivel inalt pentru testarea altor doua module.
reg a, b;
wire out1, out2;
initial
begin // Datele de test
a = 0; b = 0;
#1 a = 1;
#1 b = 1;
#1 a = 0;
end
initial
begin // Activarea monitorizarii
$monitor("Time=%0d a=%b b=%b out1=%b out2=%b",
$time, a, b, out1, out2);
end
// Instantele modulelor AND si NAND
AND gate1(a, b, out2);
NAND gate2(a, b, out1);
endmodule

De notat că valorile a şi b trebuie menţinute pe toată durata operării. De aceea


este necesară utilizarea unor registre de câte un bit. Variabilele de tip reg stochează
ultima valoare care le-a fost atribuită procedural. Firul, wire, nu are capacitatea de
memorare. El poate fi comandat în mod continuu, de exemplu, prin instrucţiunea de
atribuire continuă sau prin ieşirea unui modul.
Dacă firele de intrare nu sunt conectate, ele vor lua valoarea x – necunoscută.
Atribuirile continue folosesc cuvantul cheie assign în timp ce atribuirile
procedurale au forma :
<variabila reg > = <expresie> ;
unde <variabila reg> trebuie să fie un registru sau o memorie. Atribuirile procedurale
pot apărea numai în construcţiile initial şi always.
Instrucţiunile din blocul primei construcţii initial vor fi executate secvenţial,
dintre care unele vor fi întârziate de #1 cu o unitate de timp simulat. Construcţia always
se comportă în acelaşi mod ca şi construcţia initial cu excepţia că ea ciclează la infinit
(pană la terminarea simulării).
Construcţiile initial şi always sunt utilizate pentru modelarea logicii secventiale
(automate cu stări finite).
Verilog face o importantă distincţie între atribuirile procedurale şi atribuirea
continuă assign.
Atribuirile procedurale modifică starea unui registru, adică a logicii secventiale,
în timp ce atribuirea continuă este utilizată pentru a modela logica combinaţională.
Atribuirile continue comandă variabile de tip wire şi sunt evaluate şi actualizate atunci
când un operand de intrare işi modifică valoarea. Este important de înţeles şi de
memorat aceste diferenţe.
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
75

Toate cele trei module vor fi plasate într-un fişier, care va fi executat de către
simulator pentru a produce urmatoarea ieşire:
Time=0 a=0 b=0 out1=1 out2=0
Time=1 a=1 b=0 out1=1 out2=0
Time=2 a=1 b=1 out1=0 out2=1
Time=3 a=0 b=1 out1=1 out2=0
Întrucât simulatorul iese din cadrul evenimentelor, nu a mai fost necesară oprirea
explicită a simulării.
În Verilog semnalele pot avea patru valori distincte: 1 – corespunzător valorii
logice “adevărat”, 0 – corespunzător valorii logice “fals”, x – corespuzător unei valori
logice oarecare (necunoscute) şi z – corespunzător stării de înaltă impedanţă. Aceste
semnale nu pot aparţine decât uneia din cele două clase: reţea sau registru.
Reţeaua reprezintă conexiunile între elementele fizice, nu are nici un fel de
capacitate de stocare iar valoarea semnalului de pe reţea depinde numai de valoarea
semnalului de sursă. O reţea are starea de înaltă impedanţă dacă nu este conectată la nici o
sursă de semnal.
Pe de altă parte, registrele pot stoca semnalul de o anumită valoare chiar şi atunci
când sunt deconectate. O valoare atribuită unui registru este păstrată de acesta până când îi
este atribuită o nouă valoare. Ca urmare, un registru joacă acelaşi rol ca şi o variabilă dintr-
un limbaj de programare. Trebuie reţinut faptul că registrul Verilog diferă de un registru
numeric deoarece registrul Verilog nu are nici o legătură cu semnalul de ceas.
Cele mai multe semnale dintr-un sistem sunt de tip reţea deoarece reprezintă
semnale trimise de ieşirile unor dispozitive către intrările altor dispozitive. Numele
(cuvintele rezervate) folosite în limbajul Verilog pentru semnalele de tip reţea vor fi
descrise pe scurt în continuare.
Prima categorie este reprezentată de semnalele, cel mai frecvent utilizate, de tip
wire şi tri. Semnalele de tip wire sunt folosite în reţelele cu o singură sursă iar semnalele
de tip tri sunt folosite în reţelele cu surse multiple. Cele două nume desemnează practic
acelaşi tip de reţea şi sunt folosite numai în scopul clarităţii programului sursă.
Numele de wand/triand şi wor/trior repezintă cea de-a doua categorie de
semnale de tip reţea care sunt folosite pentru a desemna reţele ale căror trasee realizează
funcţii logice cablate (capitolul 2.5). Cuvântul rezervat wand/triand este desemnat pentru
specificarea funcţiei „şi – and” cablată (figura 1.46) iar wor/trior specifică funcţia „sau –
or” cablată (figura 1.47). Şi în acest caz prefixul w- respectiv tri- sunt folosite doar în scop
pur funcţional, pentru creşterea clarităţii.
Cea de-a treia categorie de semnale de tip reţea sunt reprezentate de numele

+V +V K1
K2
R

Kn Out
K1 Out
K2
R

Kn

Figura 1.46. Funcţia logică „şi” Figura 1.47. Funcţia logică „sau”
cablată cablată
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
76

rezervate supply0, supply1, tri0, tri1, trireg care facilitează descrierea elementelor
speciale ale reţelelor specificaţiilor de nivel scăzut cum sunt tranzistoarele sau porţile
realizate în diverse tehnologii. Această categorie de semnale nu interesează aici deoarece
ele nu fac parte din obiectivul propus şi anume acela de simulare a circuitelor logice
combinaţionale.
Ca şi celelalte elemente ale limbajului verilog şi semnalele trebuie declarate înainte
de a fi folosite. Sintaxa declarării unui semnal este foarte simplă:
<tipul semnalului> <nume semnal> ;
unde <tipul semnalului> poate fi unul din cuvintele rezervate precizate mai sus: wire,
wand etc. iar <nume semnal> este un nume ales de programator, nume ce trebuie să
respecte regulile de scriere ale identificatorilor Verilog precizate la începutul acestui
capitol (descrierea structurii modulului). Linia declarării semnalului se termină, ca şi
celelalte linii, cu punct şi virgulă (;).
Într-un sistem descris cu ajutorul programului semnalele de tip reţea pot fi semnale
scalare corespunzătoare unei singure conexiuni sau semnale vectoriale corespunzătoare
magistralelor formate din mai multe conexiuni electrice. Cel mai adesea semnalele
vectoriale se întâlnesc în sistemele complexe similare cu cel descris în figura 1.42.
Aşa cum se vede în exemplul 1, un sistem poate avea semnale scalare: Cout,
Equal, Cin şi Mode şi semnale vectoriale: Result, In1, In2 şi OpSel.
Declararea semnalului vectorial se face în felul următor:
wire [MSB : LSB] <numele_vectorului>;
unde MSB (Most Significant Bit – cel mai semnificativ bit) este indicele bitului de rang
maxim al vectorului iar LSB (Least Significant Bit – cel mai puţin semnificativ bit) este
indicele bitului de rang minim al vectorului. În limbajul Verilog indicii sunt nume întregi
pozitive sau negative iar valoarea MSB poate fi mai mică decât LSB ceea ce este puţin
contradictoriu dacă ne gândim la modul de definire al acestor biţi la reprezentarea
informaţiei. Calculul dimensiunii vectorului se face cu relaţia următoare:
dimensiune = | MSB – LSB|
dimensiunea reprezentând numărul de biţi sau numărul de circuite ale vectorului
(magistralei).
Numele vectorului respectă aceleaşi reguli cu ceilalţi identificatori Verilog.
De asemenea semnalele pot fi interne sau externe unui modul. Semnalele externe
permit modulului să comunice cu celelalte module iar semnalele interne asigură
funcţionarea modulului. Diferenţa între semnalele interne şi cele externe constă în modul
în care acestea sunt declarate. Semnalele interne sunt declarate cu ajutorul identificatorilor
semnalelor iar semnalele externe sunt declarate prin intermediul porturilor modulului.
Specificarea porturilor unui modul se face prin intermediul a două elemente:

o numele portului aflat în lista porturilor ce urmează numelui modulului


din delimitatorul modulului. Lista numelor porturilor se pune între
paranteze rotunde, numele porturilor fiind separate prin virgulă. Lista se
foloseşte atunci când o instanţă a modulului se găseşte într-o
specificaţie ierarhică cum ar fi de exemplu atunci când modulul este
folosit pentru o componentă aflată la nuvelul de bază (vezi exemplul 5
şi exemplul 6);
o declararea portului prin care se specifică direcţia, dimensiunea (lăţimea
vectorului) şi numele portului. Aceste declaraţii se află în interfaţa
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
77

modulului (partea de început a acestuia) iar declararea porturilor este


similară cu cea a semnalelor interne:
<cuvânt_rezervat> [dimensiunea vectorului] <identificator> ;
Diferenţa de esenţă între semnalele externe şi cele interne constă în
cuvântul_rezervat din declaraţia de mai sus: pentru porturi cuvântul rezervat semnifică
sensul semnalului iar pentru semnale interne cuvântul rezervat semnifică tipul semnalului.
În Verilog porturile sunt în mod implicit considerate drept reţele de tip wire. Acest
lucru este convenabil în cazul circuitelor combinaţionale, dar în cazul circuitelor
secvenţiale vor fi necesare anumite completări care vor fi discutate atunci când vom studia
acest tip de circuite.
Pentru descrierea circuitelor combinaţionale, cel mai potrivit tip de descriere este
cel structural deoarece acest tip de descriere este cel mai apropiat de structura fizică a
circuitului (schema electrică a circuitului). Deoarece limbajul Verilog conţine un set de
porţi logice predefinite (numite primitive) este posibil ca orice circuit logic combinaţional
să fie descris cu ajutorul acestor primitive. Primitivele limbajului Verilog sunt în număr de
paisprezece şi ele pot fi folosite în descrierea structurală a circuitului. Cele paisprezece
primitive se împart în patru categorii:

o porţi logice cu mai multe intrări (ce conţin şase primitive pentru
porţile logice: and – şi, nand – şi negat, nor – sau negat, or –
sau, xnor – sau exclusiv negat şi xor – sau exclusiv; aceste
porţi logice pot avea orice număr de intrări şi numai o singură
ieşire);
o porţi logice cu mai multe ieşiri (ce conţin două primitive buf –
circuitul de amplificare şi not - inversorul; oricare din aceste
porţi are o singură intrare şi un număr nelimitat de ieşiri;
o porţi logice cu trei stări (reprezintă circuite tampon – buffer – ce
pot fi activate cu una din valorile logice „zero” sau respectiv
„unu”: bufif0 şi respectiv bufif1 sau circuite inversoare cu trei
stări ce pot fi activate cu una din valorile logice „zero” sau
respectiv „unu”: notif0 şi respectiv notif1;
o porţi logice cu etajul final în gol (pull gates).

Pentru a exemplifica modul de scriere a unui modul folosind descrierea structurală


cu ajutorul primitivelor, considerăm sumatorul complet de un bit din figura 1.48.

U1A
1 U2A
A AxorB
3 1
2 3
B 2 Sum
74136
Cin 74136
U3A
1 AandB
3
2

7408
U4A U6A
NCout U7A
1 AandCin 1
3 2 12 1 2
2 13
7404
Cout
7408 7427
U5A
1
3 BandCin
2

7408

Figura 1.48. Sumatorul complet de un bit.


2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
78

Pentru acest circuit se poate scrie modulul:

EXEMPLUL 8

module FullAdd_1Bit (Sum, Count, A, B, Cin);


output Sum, Count;
input A, B, Cin;
wire AxorB, AandB, AandCin, BandCin, NCout;

xor #5 HalfSum (AxorB, A, B);


and #4 (AandB, A, B);
xor FullSum (Sum, AxorB, Cin);
and #4 And_2 (AandCin, A, Cin);
and #4 And_3 (AandCin, B, Cin);
nor (NCout, AandB, AandCin, BandCin);
not (Cout, NCout);

endmodule

În exemplul 8 utilizarea unei primitive se face prin specificarea numelui acesteia –


de exemplu « xor », timpul de propagare (eventual) – de exemplu « #5 », un nume pentru
poartă (eventual) – de exemplu « HalfSum » şi lista semnalelor de la ieşire şi de intrare
(lista conexiunilor la poarta respectivă) – de exemplu « (AxorB, A, B) », linia încheiindu-
se cu punct şi virgulă.
Ordinea în care sunt scrise instanţele primitivelor în interiorul modulului nu are
nici o importanţă, scrierea în ordine fiind necesară doar din punct de vedera a clarităţii.
În cazul în care se foloseşte descrierea prin transformările fluxului de date trebuie
să discutăm, pentru început, despre expresiile din Verilog.
Cu excepţia câtorva sisteme fără împortanţă, semnalul de intrare suferă anumite
transformări în scopul generării semnalului de ieşire dorit. Acest procces poare fi descris
astfel:

ieşirea Å prelucrarea (intrării)

Prelucrarea semnalelor de intrare este realizată cu ajutorul expresiilor care sunt


(conform descrierii din manualul de referinţă al limbajului Verilog) construcţii ce combină
operanzii cu operatorii pentru a produce rezultate ce sunt funcţii de valorile operanzilor şi a
semnificaţiei semantice a operatorilor. În Verilog, un operator poate avea unul, doi sau trei
operanzi în funcţie de specificaţiile sale. Nu există expresie fără operanzi. În plus, anumiţi
operatori pot lucra numai cu anumiţi operanzi.
Operanzii, despre care s-a discutat deja, sunt cei reprezentaţi de elementele
reţelelor sau registrelor, referite prin numele acestora.
O altă categorie de operanzi este reprezentată de constante. Verilog permite
folosirea constantelor de diferite tipuri care pot fi specificate în diferite formate pe care le
vom discuta în continuare.
De asemenea, drept operand poate fi specificat un singur bit sau o succesiune de
biţi ai unui vector dintr-o reţea sau al unui registru.
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
79

În sfârşit, apelul unei funcţii (call) sau un sistem definit de utilizator, pot fi
folosiţi ca operanzi, dacă aceştia returnează o valoare compatibilă cu operatorul.

Constante de tip întreg


Numerele întregi scrise într-un program constituie operanzi de tip întreg
(constante) şi se considră, în mod implicit, că aceste numere sunt în baza zece, dacă nu
se specifică altceva. Numerele precedate de semnul minus sunt constante de tip întreg,
negative. Limbajul Verilog permite specificarea constantelor de tip întreg şi în alte baze
de numeraţie în afară de baza zece. Astfel, constantele de tip intreg mai pot fi scrise în
binar, octal şi hexazecimal. Numerele scrise într-o altă bază decât baza zece sunt
precedate de simbolul apostrof (‘) urmat de o literă care desemnează baza în care este
scris numărul: b sau B – pentru numere binare (în baza doi), o sau O – pentru numere
octale (în baza opt) sau h sau H – pentru numere hexazecimale (în baza şaisprezece).
Numerele specificate în acest fel sunt tratate ca numere întregi fără semn.
Dimensiunea constantei de tip întreg este determinată de către compilator dar ea
trebuie să fie de cel puţin 32 de biţi. De multe ori această dimensiune este prea mare şi
din acest motiv se folosesc adesea constantele dimensionate. Constantele dimensionate
sunt precedate de o valoare întreagă pozitivă care desemnează numărul de biţi al
constantei de tip întreg. Specificarea dimensiunii la constantele în baza zece impune
folosirea literei d sau D înaintea constantei de tip întreg.

EXEMPLUL 9

// constante la care nu este specificată dimensiunea


35 // număr zecimal (implicit)
‘h2a // număr hexazecimal
‘b1010 // număr binar

// constante la care se specifică dimensiunea


4’d7 //numărul zecimal 4 scris pe 4 biţi în loc de 32
8’b11001111 // valoare binară pe 8 biţi
8’b1 // va fi reprezentat ca 00000001
8’h1 // va fi reprezentat ca 00000001

// numere negative
-10 // număr reprezentat intern în cod complement faţă de doi pe
// 32 biţi
-8’d10 // echivalent cu – (8’d10)

// folosirea caracterului “?”


8’h1? // echivalent cu 0001zzzz
2’b1? // echivalent cu 1z

// folosirea caracterelor “x”


4’b01xx // ultimii doi biţi ai numărului sunt necunoscuţi
‘hx // număr pe 32 de biţi necunoscut

// folosirea caracterului “_”


2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
80

16’b1100_0101_1111_1000
121_523_191

Operanzi de selecţie pentru un bit sau pentru o succesiune de biţi


Putem folosi ca operand un singur bit sau o succesiune de biţi ai unui vector de
reţea sau de registru.
Sintaxa operandului de selecţie a unui bit constă în folosirea numelui vectorului
a cărui bit este selectat, urmat de indexul bitului închis între paranteze dreptunghiulare.
De exemplu:

DataBus[5]

ceea ce semnifică faptul că s-a selectat bitul cinci al vectorului DataBus.


Dacă dacă dorim să specificăm un anumit număr de biţi succesivi ai unui vector,
atunci precizarea acestora trebuie să se facă relativ la vectorul vizat. Precizarea
succesiunii de biţi folosiţi se face în mod similar cu declararea unui vector: [MSB:LSB].
În această declaraţie LSB nu poate fi mai mare ca MSB, MSB nu poate fi mai mare
decăt rangul maxim al vectorului iar LSB nu poate fi mai mic ca zero.
Dacă se foloseşte un index care depăşeşte dimensiunile vectorului sau pentru
index se folosesc valorile „x” sau „z” atunci întregul operand va avea valoarea „x” –
necunoscut.
De exemplu, declararea unei porţiuni din vectorul AddresBus[8:0], poate fi:

AddressBus[6:4]

care reprezintă un operand compus din trei biţi – biţii de pe poziţiile şase, cinci şi patru
ale vectorului AddressBus.
Operatorii aritmetici în număr de patru: “+” pentru adunare, “-“ pentru scădere,
“*” pentru înmulţire şi “/” pentru împărţire se folosesc cu căte doi operanzi. Operatorii
“+” şi “-“ pot fi folosiţi şi cu un singur operand pentru determinarea semnului acestuia.
În afară de aceşti operatori mai există şi operatorul modulo, notat cu “%”, care
returnează restul împărţirii întregi a doi operanzi.

Operatorii aritmetici tratează în mod diferit operanzii de tip întreg şi operanzii de


tip registru. Operanzii de tip întreg sunt trataţi ca operanzi cu semn pe când operanzii de
tip registru sunt trataţi ca operanzi fără semn. Din acest motiv rezultatul operaţiilor
aritmetice poate fi diferit în funcţie de tipul operanzilor. În acelaşi timp, trebuie ţinut
cont de faptul că numerele negative sunt stocate sub formă de complement faţă de doi
pe un anumit număr de biţi.

EXEMPLUL 10

1. Codul Verilog:

integer intA;
intA = -4’d12 //variabilă de tip întreg
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
81

dacă se efectuează operaţia de împărţire: intA / 3 se obţine rezultatul: -4 deoarece intA


este o variabilă de tip întreg care este tratată ca un număr cu semn. Dacă rezultatul este
atribuit unei variabile de tip registru, acesta va fi stocat sub forma 65532, număr ce
reprezintă complementul faţă de doi a lui minus patru.

2. Codul Verilog:

reg[15:0] intA;
intA = -4’d12 //variabilă de tip registru

dacă se efectuează operaţia de împărţire: intA / 3 se obţine rezultatul: 21841 deoarece


intA este o variabilă de tip registru care stochează numărul –12 sub forma
complementului faţă de doi: 65524. Acest număr împărţit la trei dă valoarea 21841.

3. Dacă operandul este o constantă nedimensionată notată ca –12 atunci operaţia –


12 / 3 va da rezultatul: –4 deoarece constanta nedimensionată este reprezentată
intern ca o constantă de tip întreg. Dacă rezultatul este atribuit unei variabile de
tip registru, acesta va fi stocat sub forma 65532, număr ce reprezintă
complementul faţă de doi a lui minus patru.

4. Dacă operandul este o constantă dimensionată: –4’d12, atunci rezultatul


operaţiei –4’d12 / 3 va fi egal cu: 1431655761. Acest lucru se întâmplă deoarece
pe durata simulării constanta –12 este reprezentată în complement faţă de doi
într-un registru de 32 de biţi (4294967283). Această valoare se împarte la 3:
4294967283 / 3 = 1431655761.

Operatorii relaţionali sunt destinaţi comparării operanzilor. În Verilog sunt


dafiniţi patru operatori relaţionali: “<” operatorul ”mai mic”, “>” operatorul “mai
mare”, “<=” operatorul “mai mic sau egal” şi “>=” operatorul “mai mare sau egal”.
Rezultatul unei expresii ce conţine unul din cei patru operatori relaţionali poate fi zero
“0” dacă rezultatul obţinut este “fals”, sau unu “1” dacă rezultatul abţinut este
“adevărat”. Dacă în expresia relaţională există cel puţin un bit în înaltă impedanţă “z”
sau necunoscut “x” atunci rezultatul va fi necunoscut “x”.
În Verilog operatorii relaţionali au o prioritate mai scăzută decât operatorii
aritmetici.

Operatorii de egalitate sunt tot în numar de patru. Datorită faptului că în cazul


operatorilor relaţionali rezultatul este necunoscut dacă măcar unul din operanzi are un
bit în înaltă impedanţă « z » sau necunoscut « x », a fost necear un mod nuanţat de
stabilire a egalităţii între doi operanzi. Egalitatea respectiv neegalitatea după tip se
notează cu „===” respectiv „!==” iar egalitatea respectiv neegalitatea logică se notează
cu „==” spectiv „!=”. Egalitatea (neegalitatea) după tip furnizează rezultatul „1” dacă
cei doi operanzi sunt egali (neegali) sau rezultatul „0” dacă cei doi operanzi sunt neegali
(egali).

EXEMPLUL 11

1. 1010 === 1010 furnizează rezultatul 1.


2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
82

2. 1010 !== 1010 furnizează rezultatul 0.


3. 1100 === 11 furnizează rezultatul 0.
4. 1100 !== 11 furnizează rezultatul 1.
5. 0110 === 0xx0 furnizează rezultatul 0.
6. 1z1z !== 1z1z furnizează rezultatul 0.

Dacă cei doi operanzi nu sunt egali ca numar de simboluri, atunci operandul cu
un număr mai mic de simboluri este completat cu zerouri spre stânga. În exemplul 3 sau
exemplul 4, al doilea operand „11” este transformat în „0011” pentru a avea acelaşi
număr de simboluri cu primul operand „1100”.
În cazul egalităţii (neegalităţii) logice, dacă unul din operanzi conţine cel puţin
un bit în starea de înaltă impedanţă „z” sau starea bitului este necunoscută „x” atunci
rezultatul operaţiei este necunoscut.

EXEMPLUL 12

1. 1010 == 1010 furnizează rezultatul 1.


2. 1010 != 1010 furnizează rezultatul 0.
3. 1z1z != 1z1z furnizează rezultatul x.
4. 1z1z == 1z1z furnizează rezultatul x

Operatorii logici sunt de două tipuri: operatori logici pe bit şi operatori logici
care acţionează asupra întregului operand.
Operatorii logici pe bit realizează operaţia logică separat pe fiecare bit ai
operanzilor şi furnizează o valoare corespunzătoare operaţiei logice efectuate.
Dacă operatorii logici pe bit au un singur operand atunci ei se numesc operatori
logici de reducere iar operaţia logică se realizează între toţi biţii operandului
furnizânduse un rezultat cu dimensiunea de un bit.
Operatorii logici care acţionează asupra întregului operand realizează operaţia
logică între valoarile logice de adevăr asociate operanzilor: „adevărat” dacă operandul
este diferit de zero sau „fals” dacă operandul este egal cu zero.
Operatorii logici pe bit (dacă se folosesc doi operanzi) sau de reducere (dacă se
foloseşte un singur operand) sunt: „~” (NOT), ”&” (AND), “|” (OR), “^” (XOR), şi
“~^” sau “^~” (XNOR).
Operatorii logici pe întregul operand sunt: „!” (NOT), “&&” (AND) şi „||” (OR).

EXEMPLUL 13

1. // efectuarea operatiei logice bit cu bit


module and2 (a,b,c);
input [1:0] a, b;
output [1:0] c;
assign c=a & b
endmodule

/* La execuţia modulului and2 se realizeaza operaţiile:

c(0) = a(0) and b(0)


2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
83

c(1) = a(1) and b(1) */

2. // efectuarea operatiei logice pe intregul operand


wire[7:0] x,y,z ; // x,y si z sunt variabile multibit
reg a ;

if ((x==y)&&(z)) a=1 // a=1 daca x este egal cu y si z este diferit
// de zero
else a= !x // a=0 daca x este diferit de zero

3. //operator logic de reducere


module chk_zero (a,z);
input [2:0] a;
output z;
assign z = ~| a; // functia logica de reducere NOR
endmodule

/* La executia modulului chk_zero se realizeaza operatia:


z = a(0) NOR a(1) NOR a(2)

Operatorii de deplasare realizează deplasarea primului operand cu un număr de


biţi specificat de către cel de-al doilea operand. Poziţiile rămase libere în urma
deplasării sunt completate cu valoarea zero. Operatorii de deplasare sunt : „ << “ –
deplasare stânga şi „ >> “ – deplasare dreapta.

EXEMPLUL 14

assign c = a >> 2; // variabila c este egala cu


// variabila a deplasata la
// dreapta cu doua pozitii

Operatorul de concatenare combină doi sau mai mulţi operanzi într-un vector.
Operatorul de concatenare se notează cu paranteze acoladă: “ { } “.

EXEMPLUL 15

wire [1:0] a,b; wire [2:0] x; wire [3:0] y,Z;


assign x = {1’b0,a}; //x[2] = 0, x[1] = a[1], x[0] = a[0]
assign y = {a, b} ; //y[3] = a[1], y[2] = a[0], y[1] = b[1],
//y[0] = b[0]

Operatorul de replicare face mai multe copii al unui operand. Operatorul de


replicare se notează: {n{operand}} unde n indică numărul de replicări ale operandului.

EXEMPLUL 16

wire [1:0] a, b; wire [4:0] x;


assign x = {2{1’b0},a}; // este echivalent cu: x = {0,0,a}
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
84

assign y = {2{a}, 3{b}}; // este echivlent cu y = {a,a,b,b}

Operatorul condiţional “?” are aceeaşi semnificaţie ca şi în limbajul C/C++ (în


funcţie de rezultatul unei condiţii se alege una din două expresii):

(conditie) ? (expresie în cazul când condiţia este adevarata) :


(expresie în cazul când condiţia este falsă)

EXEMPLUL 17

assign a=(c) ? x:y;

/* in functie de condita c se obtin rezultatele: a=x daca c este adevarat sau a=y daca c
este fals, implementare ce reproduce functionarea unui multiplexor la care x si y sunt
intrari de semnal, a este iesirea de semnal iar c este intrarea de comanda */

Atribuirea continuă se foloseşte pentru stabilirea unei valori la o conexiune


(wire) dintr-un modul. Atribuirea se poate face la un semnal de ieşire pentru ca
rezultatul unei expresii sau operaţii să fie accesibil la ieşirea modulului. Există două
tipuri de atribuiri: atribuitri continui şi atribuiri procedurale.
Atribuirea continuă este folosită în modelarea fluxului de date fiind cel mai
întâlnit tip de atribuire.
Instrucţiunea de atribuire continuă este compusă din următoarele elemente:

o cuvântul rezervat assign;


o declararea întârzierii (opţional);
o partea stângă a instrucţiunii care este destinaţia atribuirii şi care poate
fi o reţea (scalară sau vectorială) sau mai multe reţele concatenate.
Folosirea registrelor nu este permisă în partea stângă a expresiei;
o simbolul de atribuire (semnul egal „=”);
o partea dreaptă a instrucţiunii care este o expresie a cărei operanzi pot
fi de orice tip permis (constante, reţele, registre, apeluri de funcţii
etc.).

A X
B Z
C Y
D
Fig. 1.49. Modul pentru explicarea atribuirii implicite şi

Atribuirile implicite continue reprezintă atribuirile făcute o dată cu declararea


reţelelor. Pentru exemplificare considerăm un modul oarecare a cărui schemă bloc este
reprezentată în figura 1.49.

EXEMPLUL 18

1. Atribuirea continuă implicită.


2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
85

module SomeMod (Z, A, B, C, D);


output Z;
input A, B, C, D;

wire X= … ; //expresie ce contine operanzii A si B


wire Y= … ; //expresie ce contine operanzii C si D

assign Z= … ; // expresie ce contine operanzii X si Y

endmodule

2. Atribuirea continuă explicită

module SomeMod (Z, A, B, C, D);


output Z;
input A, B, C, D;

wire X;
wire Y;

assign X= … ; //expresie ce contine operanzii A si B


assign Y= … ; //expresie ce contine operanzii C si D
assign Z= … ; // expresie ce contine operanzii X si Y

endmodule

Atribuirea condiţională este exemplificată la prezentarea operatorului


condiţional (exemplul 17).
Atribuirea continuă este evaluată permanent, aşa cum arată şi numele acesteia şi
orice modificare a unui operand în membrul drept se va reflecta imediat in membrul
stâng al atribuirii. În cazul în care există mai multe atribuiri acestea vor fi evaluate în
mod concurent astfel încât funcţionarea programului să reflecte în mod fidel
comportarea structurii fizice.

Întârzierile reflectă comportarea sistemelor fizice reale. Întârzierile sunt


specificate în unităţi de timp care sunt definite în directiva compilator ‘timescale.
În cazul descrierii comportamentale a circuitelor complexe sau a sistemelor, cu
ajutorul algoritmilor, trebuie folosite noţiuni similare limbajelor de programare de nivel
înalt. Adevarata valoare a unui limbaj de nivel înalt cum este Verilog constă în faptul că
permite descierea comportamentală (funcţională) a sistemelor. Datorită faptului că
aceste cunoştiinţe nu sunt absolut necesare pentru simularea circuitelor logice
combinaţionale, ele nu vor fi prezentate deocamdată.

Directivele compilatorului
Directivele compilatorului sunt comenzi speciale care încep cu caracterul ( ` -
atenţie acest simbol nu este apoatrof: ‘ ) şi care influenţează funcţionarea simulatorului
Verilog. Prezentăm în continuare câteva din directivele compilatorului.
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
86

Directiva `timescale specifică unitatea de timp şi precizia unităţii de timp. Spre


exemplu, dacă unitatea de timp este stabilită la 10ns atunci o întârziere notată cu #3.5
reprezintă 35ns. Precizia unităţii de timp indică modul în care este făcută rotunjirea
valorii întârzierii pe timpul simulării.
Unităţile de timp valide sunt: s, ms, μs, ns, ps, fs. Pentru specificarea unităţii de
timp sau a preciziei nu pot fi folosite decât cifrele: 1, 10 sau 100.
Sintaxa directivei `timescale este :

`timescale time_unit/time_precision;

Directiva pentru definirea macroinstrucţiunilor este `define. Macroinstrucţiunile


sunt apelate cu numele macroinstrucţiunii precedat de apostrf, ca în exemplul de mai
jos.

EXEMOLUL 19

`define add_lsb a[7:0] + b[7:0]


assign line=’add_lsb; //se atribuie line = a[7:0] + b[7:0]

Directiva `include permite inserarea unui fişier text în punctul în care se găseşte
directiva. Directiva este similară celei din limbajul C/C++.

Sarcinile (task) şi funcţiile (function) sistem

Sarcinile şi funcţiile sistem sunt folosite pentru generarea intrărilor şi a ieşirilor


pe durata simulării. Numele acestora este precedat de semnul dollar ($) şi se pot găsi în
orice loc pe parcursul programului. Sarcinile sistem care extrag datele, cum este spre
exemplu $monitor trebuie să se găsească într-un bloc initial sau always. Vom prezenta
în continuare câteva dintre sarcinile sau funcţiile sistem mai des folosite.
Comenzile $display, $strobe, $monitor au aceeaşi sintaxă şi ele afişează
valorile sub formă de text pe durata simulării. Comenzile $display şi $strobe determină
o afişare ori de câte ori sunt executate pe când $monitor afişează ori de câte ori se
produce o schimbare a parametrilor. Şirul format este asemănător cu cel din C/C++
putând conţine caractere de formatare: %d (zecimal), %h (hexazecimal), %b (binar),
%c (caracter), %s (şir) şi %t (timp).
Adăugarea literelor b, h sau o la numele taskului schimbă afişarea din formatul
implicit în binar, hexazecimal sau octal.

EXEMPLUL 20

initial begin
$displayh (al,ah ); // al si ah sunt afisate in hexazecimal
$monitor (“at time=%t, d=%h, $time, a);
end

Comenzile $time, $stime şi $realtime furnizează durata simulării sub forma


unui întreg de 64 de biţi, respectiv 32 de biţi sau sub forma unui număr real.
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
87

EXEMPLUL 21

time ts;
ts = $time;

Comenzile $reset, $stop şi $finish au următoarele efecte: $reset iniţializează


simulatorul la momentul zero, $stop opreşte simulatorul şi-l pune în modul interactiv
aşteptând comenzi de la utilizator iar $finish produce ieşirea din simulator şi
reîntoarcerea în sistemul de operare.
Comanda $deposit setează o reţea la o valoare particulară. Sintaxa comenzii
este:

$deposit (nume_reţea, valoare);

1.7.2.2.Testarea programelor Verilog HDL

Există mai multe modalităţi de testare a proiectelor realizate în limbajul Verilog,


însă cea mai folosită metodă este cea cu ajutorul fişierului de testare (Test Benches).
Fişierul de test este compus din mai multe elemente:

o interfaţa cu proiectul de testat (numit şi unitate de testat – UUT –


Unit Under Test), care poate reprezenta unul sau mai multe module
Verilog;
o semnalele de test – stimulii;
o sistemul de monitorizare a răspunsului unităţii de testat la stimulii
aplicaţi

şi reprezintă o specificaţie hibridă alcătuită din instrucţiuni de tip structural şi


instrucţiuni de tip comportamental. Această specificaţie Verilog este simulată cu
ajutorul unui simulator Verilog.
Stimulii pentru modulul/modulele testat/testate sunt precizaţi direct în interiorul
fişierului de test sau pot fi furnizaţi de către un modul extern.
Pe de altă parte, semnalele de ieşire ale modulului/modulelor de testat pot fi
observate prin intermediul ieşirilor simulatorului (de exemplu formele de undă afişate
pe ecran), prin intermediul mesajelor de simulare sau pot fi scrise într-un fişier.
Fişierul de test reprezintă deci o specificaţie Verilog care are modulul său
propriu. Acest modul se deosebeşte de celelalte module prin câteva caracteristici aparte:

o modulul nu are porturi;


o stimulii care pot fi specificaţi în acest modul sau într-un modul extern
separat;
o monitorizarea ieşirilor realizată cu ajutorul sarcinilor sistem scrise într-
un bloc separat pentru creşterea lizibilităţii.

Structura generală a fişierului Test Bench este prezentată în continuare în


exemplul 22.
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
88

EXEMPLUL 22

module TestBench;
-------------------------------------------------------------------------------
reg … ; declararea semnalelor de stimulare
wire … ;
-------------------------------------------------------------------------------
initial

always declararea stimulilor


begin
#… … = … ;
#… … = … ;
end

initial
#… $finish
---------------------------------------------------------------------------------
modname UUT (…); instanţierea modulului UUT
---------------------------------------------------------------------------------
initial monitorizarea rezultatelor
$monitor (…);
---------------------------------------------------------------------------------
endmodule

După realizarea proiectului în limbaj Verilog trebuie realizată verificarea


acestuia cu ajutorul fişierului de testare. Proiectul realizat se foloseşte în fişierul de
testare fără a fi necesară nici un fel de modificare, folosindu-se în fişierul de testare o
instanţiere a modulului de test. Din acest motiv putem spune că fişierul de test poate fi
aplicat oricăreispecificaţii Verilog.
Pentru instanţierea modulului de testat (UUT) în interiorul fişierului de test, se
scrie numele modulului UUT urmat de lista de asociere a porturilor prin nume sau prin
ordinea în care acestea sunt scrise. Porturile instanţierii UUT sunt asociate cu semnalele
de stimulare. Deoarece procesele sunt concurente, ordinea de definire a stimulilor şi
instanţierea modulului de testat nu are nici o imporanţă.
În exemplul 23 se arată felul cum se defineşte un modul şi fişierul de test asociat
acestuia.

// modulul de testat

module combi (Y, A, B, C);


output Y;
input A, B, C;

endmodule

// fisierul de test
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
89

module TestBench;

combi UUT (.Y(…), .A(…), .B(…), C(…));

endmodule

Semnalele de simulare sunt declarate, aşa cum s-a arătat, în interiorul modulului
de testare sau într-un modul extern. Aceste semnale sunt asociate cu intrările modulului
UUT prin intermediul semnalelor declarate în modulul de test. Evoluţia în timp a
semnalelor de stimul se specifică într-o manieră secvenţială, de obicei în interiorul unor
blocuri de tip initial şi always.
Folosirea blocului initial cu comanda sistem $finish permite ca simularea să se
termine înr-o durată de timp determinată. Folosirea blocului always permite realizarea
buclelor infinite.
Corespondenţa între stimuli şi modulul de testat se realizează prin specificaţia
porturilor din instanţierea UUT.
În exemplul 24 se prezintă un modul corespunzător unui multiplexor cu două
intrări şi specificarea semnalelor de stimul pentru fişierul de test.
Schema electrică a multiplexorului este prezentată in figura 1.50.
COMANDA
Sel

U1A
INTRARE
1
A 3
2

7408
U3A
1 IESIRE
U4A 3
1 2 2 Y
7404 U2A 7432
1
INTRARE 3
2
B
7408

Fig. 1.50. Multiplexorul cu două intrări şi o ieşire

EXEMPLUL 24

// modulul multiplexorului cu 2 intrari si o iesire


module mux2to1 (Y, A, B, Sel);
output Y;
input A, B, Sel;

assign Y = Sel ? A : B ;

endmodule

// fisierul de test – definirea stimulilor


module TestBench;
reg Sel, A, B;
wire Y;
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
90

mux2to1 UUT (Y, A, B, Sel);


initial
begin
Sel = 1’bx; A = 1’b0; B = 1’b1;
end
always
begin
#40 Sel = 1’b0; // schimbare la 40
#20 A = 1’b01 ; // schimbare la 60
#20 Sel = 1’b1 ; // schimbare la 80
#20 B = 1’b0 ; // schimbare la 100
#20 Sel = 1’b0 ; // schimbare la 120
#20 A = 1’b1 ; // schimbare la 140
#20 Sel = 1’b1 ; // schimbare la 160
#20 B = 1’b1 ; // schimbare la 180
end
initial
#200 $finish ;

endmodule

În exemplul 25 se prezintă două forme de analiză a rezultatelor simulării:


prezentarea rezultatelor pe display (exemplul 25.a) folosind comanda sistem $monitor
sau salvarea datelor în fişier (exemplul 25.b) folosind comanda sistem $fmonitor.

EXEMPLUL 25

a.
// fisierul de test cu afisarea rezultatelor pe ecran
module TestBench;
reg Sel, A, B;
wire Y;

mux2to1 UUT (Y, A, B, Sel);


initial
begin
Sel = 1’bx; A = 1’b0; B = 1’b1;
end
always
begin
// stimuli
end
initial
#200 $finish ;
initial
begin
$display(“ TIME A B Sel Y”);
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
91

$monitor($time,” %b %b %b %b, A, B, Sel, Y);


end
endmodule

b.
// fisierul de test cu salvarea rezultatelor in fisier
module TestBench;
reg Sel, A, B;
wire Y;
integer Res;

mux2to1 UUT (Y, A, B, Sel);


initial
begin
Sel = 1’bx; A = 1’b0; B = 1’b1;
end
always
begin
// stimuli
end
initial
#200 $finish ;
initial
begin
Res = $fopen(“simlog.txt”);
$fdisplay(“ TIME A B Sel Y”);
$fmonitor($time,” %b %b %b %b, A, B, Sel, Y);
end
endmodule

Rezultatul simulării obţinut în fişierul „simulog.txt” este:

TIME A B Sel Y
0 0 1 x x
40 0 1 0 0
60 0 1 0 1
80 0 1 1 1
100 0 1 1 0
120 0 1 0 1
140 1 1 0 1
160 1 1 1 0
180 1 0 1 0

Vom prezenta în continuare modul în care se face simularea unui circuit logic
combinaţional cu ajutorul programului Silos, versiunea demonstrativă (2002.100), pus
la dispoziţia utilizatorilor în mod gratuit, de către firma Simucad Inc.
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
92

După lansarea în execuţie a programului Silos, se va deschide un proiect nou

Figura 1.51. Fereastra principala a programului Silos


prin selectarea opţiunii Project din meniul principal, iar din meniul desfăşurat se
selectează opţiunea New… (figura 1.51).

Se deschide o fereastră nouă prin intermediul căreia


se solicită numele noului proiect. Se va crea un
director nou „Silos TEST” în directorul rădăcină pe
discul în care lucrăm şi în acest director se creează
proiectul „mux2to1” extensia proiectului fiind
implicită: „.spj”. După introducerea numelui
proiectului fereastra se extinde şi se solicită
fişierele care vor fi incluse în proiect: fişiere sursă
scrise în limbaj Verilog, biblioteci, directoare ce
conţin informaţia de inclus în proiect etc.
Deocamdata proiectul nu conţine nici un fişier şi
deci se apasă butonul OK şi se răspunde YES la
Figura 1.52. Fereastra pentru
creerea proiectului nou. avertismentul apărut (figura 1.52). Dacă fişierul

Figura 1.53. Fişierul modulului mux2to1.


2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
93

sursă ce conţine modulul cu multiplexorul cu două intrări şi o ieşire există, atunci acel
fişier va fi inclus în proiect.
Pentru a crea acest fişier se poate utiliza orice editor de text sau un editor
specializat pentru scrierea programelor în limbajul Verilog. Se poate utiliza, în acest
caz, editorul programului Silos. Multiplexorul cu două intrări şi o ieşire are schema
electrică prezentată în figura 1.50. În exemplul 24 a fost descris acest circuit în modulul
„mux2to1” cu ajutorul descrierii comportamentale. Fiind vorba de un circuit logic
combinaţional vom folosi acum descrierea
structurală cu ajutorul porţilor logice. Se
selectează din meniul principal File după care se
selectează New moment în care se deschide
fereastra fişierului sursă numită generic
Source1. Se introduce textul corespunzător
modulului mux2to1 conform celor prezentate în
exemplul 26 după care se salvează acest fişier
cu numele mux2to1_module.v aşa cum este
arătat în figura 1.53.
După salvarea fişierului
mux2to1_module.v se selectează Project din
meniul principal, apoi Files şi se adaugă la
proiect acest fişier (figura 1.54). În acest
moment fişierul sursă poate fi verificat şi se
Figura 1.54. Adaugarea fişierului
mux2to1_module.v la proiect.
selectează din meniul principal opţiunea Debug,
apoi Go sau se apasă tasta. Dacă in fereastra de
ieşire a simulatorului nu sunt semnalate erori atunci fişierul sursa este corect din punct
de vedere sintactic. Dacă apar erori de sintaxă, acestea se corectează după care se reface
compilarea fişierului (acţiunea Debug -> Go).

EXEMPLUL 26

module mux2to1 (Y,A,B,Sel);

// intrarile si iesirile modulului


output Y;
input A,B,Sel;

// conexiunile interne ale circuitului


wire U4A, U1A, U2A;

not (U4A,Sel);
and (U1A,A,Sel);
and (U2A,U4A,B);
or (Y,U1A,U2A);

endmodule

Urmează acum scrierea fişierului TestBench pentru simularea modulului


mux2to1. Pentru aceasta se deschide un fişier nou cu ajutorul comenzii File urmată de
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
94

New sau se apasă combinaţia de taste Ctrl + N. În acest fişier se crează modulul de test
mux2to1_TB prezentat în exemplul 27.

EXEMPLUL 27

// TestBench pentru modulul mux2to1

`timescale 1ns / 100ps

module mux2to1_TB;

reg Sel, A, B;
wire Y;

// instantierea modululoi de testat


mux2to1 UUT (Y, A, B, Sel);

// definirea stimulilor de intrare


always
begin
#40 Sel = 0; // schimbare la 40
#20 A = 1; // schimbare la 60
#20 Sel = 1; // schimbare la 80
#20 B = 0; // schimbare la 100
#20 Sel = 0; // schimbare la 120
#20 A = 1; // schimbare la 140
#20 Sel = 1; // schimbare la 160
#20 B = 1; // schimbare la 180

//simulare completa
$finish;
end

Figura 1.55. Fereastra principală a programului Silos cu rezultatele simulării.


2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
95

initial
begin
//valori initiale
Sel = 1;
A = 0;
B = 1;
end
endmodule

La sfârşit salvăm fişierul cu ajutorul comenzii File, Save As… folosind numele
mux2to1_TB.v pentru acesta. Includem apoi acest fişier în proiect cu succesiunea de
comenzi Project urmată de Files… iar în fereastra apărută, similară cu cea prezentată în
figura 1.54 se face dublu clic pe fişierul mux2to1_TB.v sau, se selectează acest fişier,
apoi se apasă butonul Add, în final selectându-se butonul OK.
Pentru testare lansăm în execuţie proiectul cu ajutorul comenzii Debug din
meniul principal, urmată de Go, sau se apasă pe butonul din bara principală de
unelte (Main Toolbar). În urma acestei acţiuni se face compilarea fişierelor şi simularea
acestora. Dacă în fereastra de ieşire nu sunt semnalate erori putem acum să vizualizăm
semnalele circuitului. Pentru aceasta selectăm fereastra Data Analizer prin selectarea
pictogramei sau apăsarea tastei F6 sau selectarea opţiunii Window, din meniul
principal, urmată de Open New Data Analizer. Se deschide de asemenea fereastra
Explorer prin selectarea pictogramei sau Window, din meniul principal, urmată de
Open Explorer. În această fereastră sunt afişate modulele din proiect, într-o structură
ierarhică, în partea stângă şi porturile aferente acestora, în partea dreaptă. Semnalele pe
care dorim să le afişăm trebuie să apară aici. Prin tehnica “drag and drop” aceste
semnale sunt “trase” din partea dreaptă a ferestrei Explorer şi puse în partea stângă a
ferestrei Data Analizer. Semnalele din fereastra Data Analizer de care nu mai avem
nevoie le putem şterge prin selectarea acestora şi apăsarea tastei Delete. În final, pentru
a vizualiza semnalele pe toată durata simulării apăsăm în mod repetat pictograma
.Fereastra principală a programulul Silos cu rezultatele simulării este prezentată în
figura 1.55.
Rezultatele simulării sunt prezentate în figura 1.56.

Figura 1.56. Rezltatul simulării multiplexorului cu două intrări şi o ieşire


prezentat în figura 1.50.

Din această figură se observă faptul că semnalul de ieşire copiază semnalele de


intrare A sau B în funcţie de semnalul Sel : dacă Sel este egal cu unu se copiază
semnalul A iar dacă Sel este egal cu zero se copiază semnalul B.
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
96

O altă posibilitate de simulare a circuitelor logice combinaţionle este oferită de


programul ModelSim. Acest program este realizat de către firma Model Technology™
care aparţine companiei Mentor Graphics Corporation. Folosim Modelsim SE versiunea
2.7f.

Se selectează File, apoi New, după


care Project…

Spaţiul de lucru (workspace) –


pentru fiecare set de date este
creată câte o etichetă a structurii

Figura 1.57. Fereastra principală a programului ModelSim.


Programul Modelsim permite managementul proiectelor realizate în limbaj
Verilog sau VHDL cât şi în alte limbaje, editarea surselor pentru aceste limbaje de
simulare, compilarea si execuţia programelor scrise. De asemenea programul dispune de
instrumente puternice de afişare şi prelucrare a semnalelor şi a formelor de undă
rezultate în urma simulării.
Anumite variante ale programului ModelSim permite simularea proiectelor
combinate realizate atât în limbaj Verilog cât şi în limbaj VHDL.
Datorită numeroaselor facilităţi ale programlui, simularea şi depanarea proiectelor poate
fi realizată într-un timp scurt chiar şi în cazul
proiectelor complexe.
Pentru exemplificare se va simula în
programul ModelSim acelaşi circuit şi anume
multiplexorul cu două intrări şi o ieşire prezentat
în figura 1.50. De asemenea, vom folosi fişierele
deja scrise mux2to1_module.v şi
mux2to1_TB.v în cazul simulării cu ajutorul
programului Silos, prezentată anterior.
Se deschide programul Modelsim şi este
Figura 1.58. Fereastra pentru afişată fereastra din figura 1.57 (după ce se
crearea unui proiect nou. închide, eventual, fereastra de întâmpinare –
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
97

Welcome Menu).
Pentru a crea un proiect nou, din meniul principal se selectează File, din meniul
desfăşurat se alege New, după care se selectează Project… Se deschide fereastra
Create Project (figura 1.58), unde la Project Name se completează : test, la Project
Location se introduce locaţia proiectului, de exemplu :
E:\Modelsim teste\proiect1,
iar la Default Library Name rămâne valoarea implicită : work.

Figura 1.59. Fereastra de


adăugare a elementelor noi la un Figura 1.60. Adăugarea unui fişier la proiect
proiect.

După completarea acestor opţiuni se apasă butonul OK. După aceasta, se


deschide fereastra de adăugare a elementelor la proiect (figura 1.59). Astfel se poate
crea un fişier nou, se poate adăuga un fişier existent, se poate crea un director sau se
poate realiza o simulare.

Figura 1.61. Spaţiul de lucru după adăugarea fişierelor.

În această fază se vor adăuga la


proiect cele două fişiere deja create :
mux2to1_module.v şi mux2to1_TB.v care
se vor copia în directorul proiectului.
Copierea fişierelor se poate face din opţiunea
Add Existing File sau de sub sistemul de
operare Windows în directorul noului
proiect ; în exemplul nostru: E:\Modelsim
teste\proiect1,
Este evident faptul că fişierele pot fi
Figura 1.62. Fereastra de editare a create în această fază prin selectarea opţiunii
fişierului mux2to1_TB.v
Create New File.
Dacă se selectează opţiunea Add
Existing File, este afişată fereastra Add file to Project (figura 1.60). În această
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
98

fereastră se completează numele fişierului şi se bifează opţiunea de copiere a fişierului


în directorul proiectului (Copy to project directory) dacă este necesar acest lucru. La
sfârşit, după copierea celor două fişiere, se apasă butonul Close al ferestrei Add items
to the Project.
După adăugarea celor două fişiere: mux2to1_module.v şi mux2to1_TB.v
acestea apar în spaţiul de lucru ca în figura 1.61. Se selectează fişierul mux2to1_TB şi
se face dublu clic pe acesta pentru a se deschide fereastra de editare (figura 1.62). În
această fereastră se modifică funcţia sistem $finish în $stop ca în figură. După acesta
închidem fereastra şi salvăm fişierul.

Figura 1.63. Biblioteca work cu fişierele compilate.

Din meniul View se


selectează fereastra
Signals şi fereastra Wave

Figura 1.64. Crearea unei sesiuni de simulare.

Ne întoarcem în spaţiul de lucru şi pe unul din fişiere selectat se face clic


dreapta. În meniul desfăşurat se alege Compile şi apoi Compile All (acelaşi lucru se
obţine dacă se selectează Compile din meniul principal şi apoi Compile All).
Compilarea trebuie să decurgă fără să se semnaleze erori. În caz contrar, fişierul cu erori
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
99

se editează pentru corecţia acestora. Rezultatele compilării modulelor sunt stocate în


biblioteca proiectului pentru care s-a stabilit, la crearea acestuia, numele work.
În acest moment se poate trece la simularea modulului ce descrie multiplexorul
cu două intrări şi o ieşire.
Pentru aceasta, în spaţiul de lucru, în partea de jos, se selectează eticheta
Library. În spaţiul de lucru se afişează lista bibliotecilor care cuprinde şi biblioteca
work a proiectului nostru. Se expandează această bibliotecă prin clic pe semnul plus din
dreptul librăriei work şi se face dublu clic pe modulul mux2to1_TB pentru a deschide
o sesiune de simulare (figura 1.63).
Pentru vizualizarea semnalelor, din meniul principal se selectează opţiunea View
iar din aceasta fereastra Signals şi fereastra Wave (figura 1.64). În fereastra Signals se
selectează semnalele a căror formă de undă dorim să o vizualizăm iar prin tehnica Drag
and Drop acestea sunt duse în fereastra Wave (figura 1.65).

Pentru selectarea tuturor


semnalelor, în fereastra Signals
se alege din meniul principal
Edit şi de aici Select All. După
ce semnalele alese au fost duse
în fereastra Wave se trece la
simulare prin selectarea
opţiunii Simulate din fereastra
principală a programului
ModelSim şi de aici Run şi
apoi, din meniul desfăşurat
Run All. Programul este
executat până la întâlnirea
funcţiei $stop şi formele de
Figura 1.65. Transferarea semnalelor din fereastra
undă a semnalelor sunt afişate
Signals în fereastra Wave în fereastra Wave (figura 1.66).
Dacă se analizează aceste
forme de undă se constată că semnalul de ieşire /mux2to1_TB/Y copiază semnalul de
intrare /mux2to1_TB/A sau /mux2to1_TB/B după cum semnalul de selecţie
/mux2to1_TB/Sel are
valoarea unu logic, respectiv
zero logic. Aceste forme de
undă sunt similare cu cele
prezentate în figura 1.50
obţinute cu ajutorul
programului Silos. Trebuie
remarcat faptul că simulările
făcute s-au bazat pe porţi
logice ideale la care nu apar
întârzieri datorate tranziţiei
Figura 1.66. Formele de undă obţinute la simularea semnalului prin poarta reală.
multiplexorului cu două intrări şi o ieşire.
Aşa cum s-a arătat, aceste
întârzieri pot fi introduse în
program sau pot fi folosite module oferite de către producători.
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
100

1.7.3 Limbajul VHDL

Limbajul VHDL este cel de-al doilea limbaj folosit pentru descrierea structurilor
fizice (hardware) pe care-l vom folosi la simularea circuitelor logice combinaţionale.
Acest limbaj realizează o descriere a comportării structurii fizice, ascunzând detaliile de
implementare şi acoperind astfel o gamă largă de aplicaţii, permiţând simularea
circuitelor digitale din cele mai diverse.
Limbajul VHDL este folosit în procesul de proiectare a circuitelor digitale
începând de la nivelul de sistem şi până la nivelul porţii logice. De asemenea, datorită
caracterului său descriptiv, limbajul VHDL poate constitui de multe ori documentaţia de
funcţionare a unei structuri fizice.
Etapele proiectării unui circuit logic digital cu ajutorul limbajului VHDL sunt:
1. descrierea detaliată a sistemului – se stabilesc cerinţele ce trebuie să
le îndeplinească sistemul ce urmează să fie proiectat;
2. proiectarea sistemului – se face modelarea comportării sistemului în
limbaj VHDL;
3. validare – verificarea modelului prin furnizarea stimulilor şi
verificarea răspunsului aşteptat;
4. proiectarea logică – modelarea structurii la nivel RTL (Register-
transfer-level sau RT-level) cu ajutorul programelor de sinteză.
Rezultatul este reprezentat o listă de conexiuni a circuitului (netlist)
sau un model la nivel de poartă logică;
5. validare – verificarea rezultatului prin furnizarea stimulilor şi
verificarea răspunsului aşteptat;
6. proiectarea circuitului – conversia automată a descrierii structurale;
7. validare – verificarea rezultatului prin furnizarea stimulilor şi
verificarea răspunsului aşteptat;
8. obţinerea planului general a circuitului – se obţin datele necesare
implementării fizice a circuitului pe baza listei de conexiuni (netlist);
9. validare – verificarea finală a rezultatului obţinut, cu ajutorul datelor
furnizate de fabricantul circuitelor, prin furnizarea stimulilor şi
verificarea răspunsului aşteptat.

1.7.3.1. Structura unui program VHDL

În limbajul VHDL se consideră că un sistem este alcătuit din trei părţi esenţiale:
interfaţa (entity) sistemului cu mediul, corpul (architecture) sistemului cu ajutorul
căruia sunt prelucrate semnalele furnizate de interfaţă şi care trimite prin interfaţă
semnale spre exterior şi elementele suplimentare (package) adăugate corpului
sistemului pentru adăugarea unor funcţii noi. Aceste componente constituie elemente de
proiectare independente ale limbajului ce vor fi prezentate succint în continuare.
Elementul de bază a limbajului, care descrie interfaţa sistemului cu mediul
extern, este entitatea (entity). Nu poate fi conceput un program în limbaj VHDL fără
nici o entitate. De asemenea, proiectarea unui sistem va începe cu declararea unei
entităţi.
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
101

Entitatea furnizează specificaţii ale interfeţei sistemului prin două elemente:


parametrii sistemului care sunt văzuţi din exterior şi conexiunile prin care se transferă
informaţia din şi către sistem (intrările şi ieşirile sistemului).
Parametrii sistemului reprezintă declaraţii generice care sunt transferate corpului
sistemului folosindu-se cuvântul rezervat generic. Conexiunile sistemului desemnează
porturile de intrare, de ieşire sau de intrare/ieşire a acestuia cu ajutorul cuvântului
rezervat port.
Declararea unei entităţi, în general, este dată în exemplul 28.

EXEMPLUL 28

-- Un exemplu de definire a unei entitati


entity <nume> is
<paramerii> -- parametrii vizibili ai entitatii
<conexiuni> -- intrarile si iesirile entitatii
end entity <nume>;

În exemplul 29 se prezintă un exemplu pentru definirea unei entităţi


corespunzătoare unei porţi logice SAU (or gate).

EXEMPLUL 29

-- or gate
entity org is
-----------------------------------------------------------
generic (tpd_hl : time := 1 ns; -- parametrii
tpd_lh : time := 1 ns);
-----------------------------------------------------------
port (in1, in2 : std_logic; -- conexiuni
out1 : out std_logic);
-----------------------------------------------------------
end org;

Comentariile în limbajul VHDL se marchează, pe fiecare linie, cu două liniuţe „-


-" în faţa comentariului iar instrucţiunile se termină întotdeauna cu caracterul punct şi
virgulă „ ; ".
După definirea entităţii trebuie definit modul în care sistemul prelucrează
informaţia, adică ceea ce s-a numit corpul sistemului. Corpul sistemului este definit prin
intermediul arhitecturii (architecture) acestuia (architecture of entity) care poate fi de
două feluri: descriere structurală şi descriere comportamentală.
Descrierea structurală se referă la elementele componente ale sistemului şi
modul de interconectare a acestora pentru a obţine comportarea dorită a sistemului.
Sinteza pe baza descrierii structurale este mai simplu de făcut deoarece acest tip de
descriere se referă la modulele componente concrete ale sistemului.
Descrierea comportamentală (funcţională) se referă la modul de prelucrare a
semnalelor de către sistem fiind vorba în general de specificarea semnalelor de ieşire în
funcţie de semnalele de intrare. Sinteza pe baza acestui tip de descriere este mai dificil
de făcut deoarece există mai multe posibilităţi de realizare fizică.
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
102

Programele de sinteză a circuitelor digitale folosesc, în general, atât descrierea


structurală cât şi cea comportamentală a sistemului.
Deoarece variante diferite de arhitecturi ale sistemelor digitale pot implementa
aceeaşi funcţie, pentru o entitate (un sistem) pot exista mai multe arhitecturi diferite
(reciproca nu este adevărată deoarece unei arhitecturi nu-i pot corespunde mai multe
interfeţe – entităţi – diferite).
În exemplul 30 este prezentată descrierea comportamentală (algoritmică) a porţii
logice SAU a cărei entitate este definită în exemplul 29.

EXEMPLUL 30

architecture only of org is


begin
p1: process(in1, in2)
variable val : std_logic;
begin
val := in1 or in2;
case val is
when '0' =>
out1 <= '0' after tpd_hl;
when '1' =>
out1 <= '1' after tpd_lh;
when others =>
out1 <= val;
end case;
end process;
end only;

Blocul este un element de bază într-o descriere VHDL. Un bloc este o zonă de
text, mărginită, care conţine o secţiune de declaraţii şi o secţiune executabilă. Un corp
arhitectural este un bloc cu deosebirea că, în interiorul unui corp arhitectural pot fi
formate alte blocuri. În exemplul 31 este prezentat corpul arhitectural
BLOCK_STRUCTURED. În blocul exterior al corpului arhitectural sunt incluse
blocurile A şi B. Blocurile A şi B pot fi formate de asemenea din sub-blocuri. Numărul
nivelelor de includere este, în general, nelimitat.

EXEMPLUL 31

Architecture BLOCK_STRUCTURED of SYSTEM is


-- secţiunea declaraţiilor blocului exterior
begin
-- instrucţiuni executabile ale blocului exterior
A: block
-- secţiunea de declaraţii pentru blocul interior A
begin
-- instrucţiuni executabile pentru blocul interior A
end block A;
B: block
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
103

-- secţiunea de declaraţii pentru blocul interior B


begin
-- instrucţiuni executabile pentru blocul interior B
end block B;
end BLOCK_STRUCTURED;

Atunci când anumite elemente sunt mai frecvent întâlnite în programele VHDL
sau în situaţia în care dorim să utilizăm elemente predefinite în biblioteci se folosesc
pachetele (package) care încapsulează elemente ce pot fi folosite simultan în mai multe
unităţi de proiectare (date globale).
În programele VHDL se folosesc două clauze pentru apelarea unui pachet:
library şi use. Aceste clauze trebuie folosite înainte de utilizarea pachetului, de obicei
înaintea entităţii care foloseşte un element declarat în pachet.
În exemplul 32 se arată regula de definire a unui pachet.

EXEMPLUL 32

package <identificator> is
-- partea declarativă a pachetului
end [package] [identificator];

Identificatorul furnizează un nume pentru pachet, nume care se poate folosi


oriunde într-un model pentru a face referire la pachetul respectiv. În interiorul
declaraţiei de pachet se scriu declaraţii care includ tipuri, subtipuri, constante, semnale
şi subprograme.
Limbajul VHDL are câteva pachete predefinite, folosite în mod frecvent, dintre
care cele mai importante sunt: pachetul STANDARD, pachetul TEXTIO şi pachetul
STD_LOGIC_1164. Pachetul STANDARD este încărcat în mod implicit de către
compilatorul VHDL şi conţine declararea tuturor tipurilor standard, a operatorilor şi
obiectelor limbajului.
Pachetul TEXTIO conţine declaraţii de tip şi obiecte referitoare la citirea şi
scrierea textelor. Pentru utilizarea acestui pachet, înaintea descrierii entităţii, trebuie
scrise următoarele declaraţii:

library Std;
use Std.TextIO.all;

Pachetul STD_LOGIC_1164 conţine extensii ale limbajului VHDL standard.


Pentru utilizare se folosesc declaraţiile:

library IEEE
use IEEE.Std_Logic_1164.all;

1.7.3.2. Testarea programelor VHDL

Testarea unei modelări realizate în limbajul VHDL se face, similar cu cea în


limbajul Verilog, cu ajutorul unei entităţi de nivel înalt numită test bench. Există şi alte
posibilităţi dar această metodă este cea mai folosită.
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
104

VHDL test bench este de asemenea o specificaţie care are propria ei entitate şi
arhitectură dar este o specificaţie de tip special cu elemente caracteristice unei astfel de
structuri.
Principalele elemente ale unei specificaţii test bench sunt:

- entitatea test bench caracterizată prin faptul că nu are porturi;


- instanţierea componentei UUT (Unit Under Test) – relaţia
dintre test bench şi UUT este specificată prin instanţierea
componentei şi specificaţiile de tip structural;
- stimulii ce reprezintă un set de semnale declarate intern în
arhitectura test bench şi atribuite porturilor din instanţierea
UUT. Stimulii sunt definiţi prin forma de undă prin una sau
mai multe procese comportamentale.

În exemplul 33 este prezentată structura generală a test bench.

EXEMPLUL 33

entity TB is -- entitatea testbench


end entity TB;

architecture TBArch of TB is
signal A, B, … :bit; -- declararea stimulilor
signal …;
begin
UUT: entity work.MyProcessor(Beh) -- instanţiere UUT
port map (…);
stimuli: process
begin
A <= …;
B <= …;

wait for …;

wait for …;

wait;
end process stimuli;
end architecture TBArch;

Există două tipuri de semnale permise de specificaţiile VHDL: bit (pentru un


singur semnal, echivalent wire) şi bit_vector (în cazul magistralelor, echivalent bus,
situaţie în care trebuie specificată şi dimensiunea vectorului). Ordinea biţilor unui vector
este de asemenea importantă şi ea trebuie precizată la specificarea dimensiunii
vectorului. De exemplu, pentru un vector de opt biţi la care bitul şapte este cel mai
semnificativ bit (MSB), se scrie: bit_vector (7 downto 0) iar când bitul zero este cel
mai semnificativ bit: bit_vector (0 to 7).
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
105

Pentru a exemplifica modul de analiză a circuitelor logice combinaţionale cu


ajutorul limbajului VHDL vom exemplifica modul de simulare a unei porţi NAND şi a
unui multiplexor cu două intrări în mediul ModelSim SE versiunea 2.7f.
Simularea circuitelor logice a fost explicată în paragraful 1.7.2.2. unde este
prezentată schema multiplexorului (figura 1.50.) şi modul de folosire a programului
Modelsim. Modul de lucru este identic numai că de data aceasta fişierele se vor scrie în
limbajul VHDL.
Primul exemplu, cel de simulare a porţii logice NAND va conţine două fişiere:
un fişier în care este modelată poarta logică NAND numit gate.vhd şi un fişier pentru
simularea acesteia numit test_gate.vhd.
Conform celor arătate în paragraful 1.7.2.2. se creează un proiect nou cu cele
două fişiere. Conţinutul fişierelor este dat în exemplul 34.

EXEMPLUL 34

-- continutul fisierului gate.vhd


entity gate is
port(
a:in bit;
b:in bit;
q:out bit
);
end gate;

architecture dataflow of gate is


signal q_prim: bit;
begin
q_prim <= a and b after 5 ns;
q <= not q_prim;
end dataflow;

-- continutul fisierului test_gate.vhd


entity test is end test;

architecture testNand of test is


component gate
port (
a: in bit;
b: in bit;
q: out bit);
end component;
signal a,b,q: bit;
signal c: bit_vector (1 downto 0);
begin
c1: gate port map (a, b, q);
a <= c(1);
b <= c(0);
c <= "00",
"01" after 10 ns,
"11" after 20 ns,
"10" after 30 ns,
"00" after 40 ns;
end testNand;
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
106

Aceste fişiere se compilează şi se elimină eventualele erori după care se


deschide biblioteca work asa cum s-a arătat în paragraful 1.7.2.2. şi se trece la
simularea circuitului. Rezultatele simulării sunt arătate în figura 1.67.

1.67. Rezultatele simulării porţii logice NAND.

Se propune ca exerciţiu explicarea formelor de undă obţinute.


Cel de-al doilea exemplu se referă la multiplexorul cu două intrări prezentat în
figura 1.50.
În acelaşi fel, ca cel arătat mai sus, se deschide un proiect nou şi aici se
realizează cele două fişiere: mux2to1.vhd cu modelarea multiplexorului şi
test_mux2to1.vhd pentru simularea acestuia. În exemplul 35 este prezentat conţinutul
acestor fişiere.

EXEMPLUL 35

-- continutul fisierului mux2to1.vhd


library IEEE;
use IEEE.std_logic_1164.all;

entity mux2to1 is
port ( IN0, IN1, SEL : IN std_logic;
MUX_OUT : OUT std_logic);
end mux2to1;

architecture Behave of mux2to1 is


begin
MUX_OUT <= IN1 when (SEL = '1') else IN0;
end Behave;

-- continutul fisierului test_mux2to1.vhd


entity TB is
end;

library IEEE;
use IEEE.std_logic_1164.all;

architecture TBArch of TB is
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
107

component mux2to1
port ( IN0, IN1, SEL : IN std_logic;
MUX_OUT : OUT std_logic);
end component;

signal IN0, IN1, SEL, MUX_OUT : std_logic;

begin
uut: mux2to1
port map (IN0, IN1, SEL, MUX_OUT);

stimuli: process
begin
SEL <= 'X'; IN0 <= '0'; IN1 <= '1'; wait for 0 ns;
SEL <= '0'; wait for 40 ns;
IN0 <= '1'; wait for 20 ns;
IN1 <= '0'; wait for 20 ns;
SEL <= '1'; wait for 40 ns;
IN1 <= '1'; wait for 20 ns;
wait;
end process;

end TBArch;

Rezultatul simulării multiplexorului cu două intrări este prezentat în figura 1.68.

Fig. 1.68. Rezultatul simulării multiplexorului cu două intrări.

Aşa cum rezultă şi din cele prezentate, utilizarea limbajelor pentru descrierea
structurii fizice, degrevează proiectantul de activitatea privind amănuntele realizării
fizice a dispozitivului numeric, atenţia fiind îndreptată în primul rând spre funcţiile şi
performanţele sistemului.
Modul de implementare fizică a structurii proiectate reprezintă tehnologii proprii
ale firmelor producătoare de dispozitive numerice de tip ASIC (Application-Specific
Integrated Circuit) sau FPGA (Field-Programmable Gate Array) şi sunt supuse
continuu îmbunatăţirilor şi perfecţionărilor.
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
108

CAPITOLUL 2

Analiza şi sinteza circuitelor logice secvenţiale

2.1. Introducere

Circuitele logice secvenţiale (CLS) sunt circuite logice la care starea ieşirilor la
un moment dat depinde de starea intrărilor la acel moment de timp şi de stările
anterioare ale circuitului. Din acest motiv se spune că circuitele logice secvenţiale sunt
circuite cu memorie.
Schema bloc a unui circuit logic secvenţial este prezentată în figura 2.1.

Circuit logic secvenţial


x0 z0
x1 z1
principale

principale
Intrări

. .
Ieşiri

. .
. .
xn Circuit zm
y'0 y0 logic
Δ1 combina-
y’1 y1 ţional
secundare

. Δ2
secundare

.
Intrări

Ieşiri

. .
. .
y’k yk
Δk

Figura 2.1. Reprezentarea schematică a unui circuit logic secvenţial

Circuitul logic secvenţial (CLS) se obţine dintr-un dircuit logic combinaţional


(CLC) la care se adaugă o serie de elemente de circuit secundare (memorie), care
reprezintă conexiuni de reacţie inversă.
Circuitul logic secvenţial reprezentat în figura 2.1 are n+1 intrări principale sau
primare, notate cu x0, x1, …, xn, accesibile din exterior şi m+1 ieşiri principale sau primare,
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
109

notate cu z0, z1, …, zm, de asemenea accesibile din exterior.


Memoria circuitului secvenţial este realizată de către elementele de circuit
secundare, ale căror ieşiri y’0, y’1, …, y’k, sunt aduse prin legături inverse la intrarea
circuitului, formând intrările secundare ale circuitului secvenţial, y0, y1, …, yk. Starea
ieşirilor y’0, y’1, …, y’k, formează starea (internă) următoare a circuitului, iar starea
intrărilor y0, y1, …, yk, formează starea (internă) prezentă a circuitului secvenţial. Starea
următoare devine stare prezentă după un timp determinat de întârzierile cauzate de către
elementele de întârziere special introduse în buclele de reacţie sau de întârzierile de
propagare a semnalelor, inerente circuitelor fizice.
Relaţia ce există între intare, ieşire, starea prezentă şi starea următoare poate fi
exprimată fie prin tabele de stare, fie prin diagrame de stare.
leşirile unui circuit de comutare secvenţial pot fi exprimate în general ca funcţii
booleene de intrările şi starea internă a acestuia :

z0 = z0 ( x0 , x1 , K, xn , y0 , y1 , K, yk )
z1 = z1 ( x0 , x1 , K, xn , y0 , y1 , K, yk )
(2.1)
M
zm = zm ( x0 , x1 , K, xn , y0 , y1 , K, yk )

Pentru a descrie complet comportarea unui circuit secvenţial trebuie să se specifice


pe lângă ecuaţiile ieşirilor (2.1) şi comportarea sa internă, adică să se indice corespondenţa
între starea intrărilor principale şi secundare, denumită şi starea totală a circuitului, şi starea
următoare a circuitului.
Se presupune în cele ce urmează că circuitul are o comportare deterministă, adică
pentru o anumită stare a intrărilor (un set de semnale x0, x1, …, xn) şi o anumită stare
internă (un set de valori pentru y0, y1, …, yk) există o singură tranziţie posibilă, într-o stare
y’0, y’1, …, y’k. În acest caz, o variabilă de stare y’k poate fi exprimată ca o funcţie
booleană de intrările circuitului şi starea sa internă :

y0' = y0' ( x0 , x1 , K, xn , y0 , y1 , K, yk )
y1' = y1' ( x0 , x1 , K, xn , y0 , y1 , K, yk )
(2.2)
M
yk' = yk' ( x0 , x1 , K, xn , y0 , y1 , K, yk )

Ecuaţiile (2.2) poartă denumirea de ecuaţiile stării următoare. Circuitul secvenţial


se află într-o stare stabilă atunci când pentru o anumită stare a intrărilor, starea sa (internă)
prezentă este identică cu starea (internă) următoare, adică yi = y'i, pentru i = 0, 1, . . ., k.
Dacă pentru o anumită stare a intrărilor, starea prezentă a circuitului diferă de starea sa
următoare, adică yi ≠ y'i cel puţin pentru un anumit i ∈ {0, 1, . . ., k), circuitul se află într-o
stare instabilă. Pentru ca un circuit secvenţial să se comporte determinist, trebuie ca pentru
fiecare stare posibilă a intrărilor să existe cel puţin o stare internă stabilă.
Circuitele secvenţiale la care ecuaţiile ieşirii sunt de forma (2.1) iar ecuaţiile stării
următoare sunt de forma (2.2) se numesc circuite secvenţiale de tipul Mealy, iar modelul
lor matematic, automat de tipul Mealy.
Exista circuite secvenţiale la care stările ieşirilor nu depind de stările intrărilor
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
110

principale, ci numai de stările intrărilor secundare, adică de starea internă a circuitului. În


acest caz, ecuaţiile ieşirii (2.1) se transformă în ecuaţiile:

z0 = z0 ( y0 , y1 , K, yk )
z1 = z1 ( y0 , y1 , K, yk )
(2.3)
M
zm = z m ( y0 , y1 , K, yk )

Circuitele secvenţiale la care ecuaţiile ieşirii sunt de forma (2.3) iar ecuaţiile stării
urmatoare de forma (2.2) se numesc circuite secvenţiale de tipul Moore, iar inodelul lor
matematic, automat de tipul Moore.
Atunci când numărul de stări interne ale unui circuit secvenţial este finit, circuitul
este denumit circuit secvential finit iar modelul sau matematic, automat finit.
În continuare se vor trata numai circuitele secvenţiale binare, la care fiecare dintre
variabilele de intrare, de ieşire, respectiv de stare pot avea numai două valori, zero şi unu,
cu număr finit de stări.
Temporizarea semnalelor este foarte importantă în circuitele secvenţiale. În acest
sens, circuitele logice secvenţiale sunt clasificate în două categorii:

o circuite secvenţiale asincrone;


o circuite secvenţiale sincrone.

În circuitele secvenţiale asincrone starea curentă (intrările secundare provenite


pe calea de reacţie) poate fi modificată în orice moment ca efect al schimbării
variabilelor aplicate la intrarea primară. Elementul de memorie de pe calea de reacţie
este în mod obişnuit un dispozitiv de întârziere; întârzierea este realizată prin
propagarea semnalului printr-un şir de porţi logice. Întârzierea prin porţile logice nu
poate fi controlată şi de aceea circuitele secvenţiale asincrone pot deveni instabile.
Proiectarea circuitelor secvenţiale asincrone este complicată, de aceea majoritatea
circuitelor secvenţiale utilizate sunt de tip sincron. La circuitele logice secvenţiale
sincrone spre deosebire de cele asincrone, apare o intrare suplimentară, intrarea
semnalului de ceas.
Circuitele secvenţiale sincrone sunt circuite la care schimbarea stării şi a ieşirii
are loc la momente de timp bine definite. Aceste momente sunt asociate cu frontul
crescător sau cu frontul căzător al unui semnal de temporizare cunoscut ca semnal de

amplitudine front
front
crescător
descrescător

timp

durata
palier unu
perioada (HIGH) palier zero
LOW
Figura 2.2. Elementele semnalului de ceas.
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
111

ceas (clock, tact). În mod obişnuit semnalul de ceas (clock) este un semnal
dreptunghiular ale cărui elemente sunt redate în figura 2.2.
Când semnalul de ceas face o tranziţie de la zero la unu, avem un front
crescător; când semnalul de ceas face o tranziţie de la unu la zero, avem un front
căzător (sau descrescător).
Din diagrama de timp a semnalului se poate observa că perioada semnalului de
clock este intervalul de timp dintre două tranziţii succesive în acelaşi sens (între două
fronturi crescătoare sau între două fronturi căzătoare).
Tranziţiile în circuitele secvenţiale sincrone au loc doar în momentele când
semnalul de clock are fie un front crescător, fie un front căzător. La ieşirea unui circuit
sincron nu are loc nici o schimbare între două fronturi succesive, indiferent de valoarea
variabilelor aplicate la intrare.
Frecvenţa semnalului de ceas este inversul periadei semnalului de ceas.
Lăţimea semnalului de ceas este definită ca fiind intervalul de timp în care
semanlul are valoarea unu. Raportul dintre lăţimea semnalului şi perioada acestuia este
numit factor de umplere.
Un semnal de clock este activ pe front crescător dacă starea circuitului sincron se
schimbă pe frontul crescător al semnalului de clock. Dacă starea circuitului sincron se
schimbă pe frontul căzător, semnalul de clock este activ pe front căzător.

2.2. Tabelul tranziţiilor şi al ieşirilor


Comportarea unui circuit secvenţial poate fi descrisă prin tabelul tranziţiilor şi
tabelul ieşirilor, care reprezintă o modalitate de reprezentare a funcţiilor (2.2) respectiv
(2.1). În tabelul tranziţiilor există atâtea coloane câte stări diferite ale celor n+1 intrări xi
(i = 0, 1, ..., n) există, adică 2n+1 coloane şi atâtea rânduri câte stări interne distincte
există, adică 2k+1 rânduri, unde k+1 este numărul variabilelor secundare yi. Un element
al tabloului tranziţiilor, aflat la intersecţia unei coloane cu o anumită linie, reprezintă
starea urmatoare a circuitului, corespunzătoare stării interne de pe linia respectivă şi
stării intrărilor de pe coloana respectivă. Pentru automatele de tipal Mealy, tabelul
ieşirilor are aceleaşi linii şi coloane ca şi tabelul tranziţiilor. Un element al tabelului
ieşirilor, aflat la intersecţia unei anumite coloane cu o anumită linie reprezintă starea
ieşirilor corespunzatoare stării intrărilor de pe coloana respectivă şi stării interne de pe
rândul respectiv. Pentru automatul de tipul Moore tabelul ieşirilor are o singură coloană.
În tebelul tranziţiilor şi al ieşirilor, stările, respectiv ieşirile, sunt notate simbolic,
de obicei prin numere zecimale sau prin numere binare. În cel de-al doilea caz, codul
binar al stării urmatoare, respectiv al ieşirii reprezintă valorile sistemului de funcţii
(2.1), respectiv (2.2) sau (2.3) pentru starea prezentă de pe rândul respectiv şi pentru
starea intrărilor de pe coloana respeetivă. Aceste tabele pot fi completate dacă se
cunoaşte structura circuitului, determinând, în modul arătat la circuitele combinaţionale,
valoarea fiecăreia dintre: funcţiile z0, z1, …, zm, y'0, y'1, …, y'k pentru toate valorile
posibile ale variabilelor de intrare principale şi secundare.
Pentru exemplificare se consideră circuitul secvenţial a cărui reţea de comutare
este dată în figura 2.3.a.
Pentru a ţine cont de întârzierile introduse de firele de legătură şi de
întârzierea proprie a circuitului logic, se consideră toate aceste întârzieri concentrate în
elementele de întârziere notate în figura 2.3.b. cu Δ0 şi Δ1. Această ipoteză
simplificatoare permite analizarea corectă a comportării circuitului, deoarece nu
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
112

U1A U1A
2 2 Y’1
X0 X0
1 1
Δ0
Z0 Z0
3 3
Y1
7402
7402

U2A
U2A
2
1 Y0 2 Y’2
Z1
X1
3
3
1
Δ1 Z1
7402 X1
7402
Fig 2.3.a.
Fig 2.3.b.

Fig. 2.3. Analiza unui circuit secvenţial asincron


influenţează asupra modului de funcţionare. Variabilele x0 şi x1 din figura 2.3.b.
reprezintă intrările principale ale circuitului, fiecare din ele putând avea două valori: 0 şi
1 care corespund unor semnale de tensiune, corespondenţa stabilindu-se în funcţie de
logica adoptată (negativă sau pozitivă). Variabilele y0 şi y1 reprezintă intrările secundare
ale circuitului sau starea lui internă prezentă, iar variabilele y'0 şi y'1 starea internă
următoare. Atât y0 şi y1 cât şi y'0 şi y'1 pot avea valoarea logică 0 sau 1. Între y0 şi y'0
respectiv y1 şi y'1 există relaţiile (2.4).
TABELUL 2.1. a. b.
x0x1 y0y1 y0' (t ) = y0 (t + Δ0)
00 01 11 10 00 00 (2.4)
y0y1 y1' (t ) = y1 (t + Δ1)
01 01
00 11 10 00 01 11 11
01 01 00 00 01 10 Din relaţiile (2.4) rezultă că
10
11 00 00 00 00 după un interval de timp egal cu Δ0
10 10 10 00 00 z0 z 1 valoarea variabilei secundare y0
devine egală cu valoarea variabilei
y'0y'1 secundare y'0, respectiv după un
interval de timp Δ1 valoarea
variabilei secundare y1 devine egală cu valoarea variabilei secundare y'1, în momentul
considerat. Luând pentru simplificare Δ0=Δ1 = Δ, rezultă că după un interval de timp
egal cu Δ starea următoare devine starea prezentă.
Circuitele secvenţiale la care starea următoare devine stare prezentă după un
timp determinat de întârzierile inerente circuitului se numesc circuite secvenţiale
asincrone sau circuite funcţionând în modul fundamental. Pentru ca un astfel de circuit
să funcţioneze determinist, se impune ca pe fiecare coloană din tabelul tranziţiilor, adică
pentru fiecare stare a intrărilor, să existe cel puţin o stare stabila.
Circuitele secvenţiale la care starea urmatoare devine starea prezentă numai
la anumite momente de timp bine determinate, marcate prin impulsuri de tact date de către
un generator de impulsuri numit ,,orologiu", se numesc circuite secvenţiale sincrone.
Elementele de memorie ale circuitelor secvenţiale sincrone sunt circuite basculante
bistabile. La circuitele secvenţiale sincrone legăturile inverse, adică intrările la circuitele
basculante bistabile, sunt întreruptc în lipsa impulsurilor de tact fiind stabilite numai în
prezenţa tactului (fig. 2.4). Durata impulsului de tact se ia suficient de scurtă, astfel încât
legăturile inverse să fie întrerupte înainte ca ieşirile secundare ale circuitului sa-şi modifice
starea în conformitate cu starea intrărilor şi starea în care a trecut circuitul în timpul
impulsului de tact considerat. În acest fel toate stările circuitului secvenţial sincron sunt
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
113

stabile.

x0 z0
x1 z1


xn CIRCUIT LOGIC
zm
COMBINAŢIONAL
y0 y'0
y1 y'1



yk y'k

Q S
CBk R


Q S
CB1 R

Q S
CB0 R
SINCRONIZARE

Fig. 2.4. Modelul unui circuit logic secvenţial sincron.

Circuitul din fig. 2.3b are ieşirile z0, z1 identice cu intrările secundare y0,
respectiv y1. Ieşirea depinde numai de starea internă, deci circuitul secvenţial este de
tipul Moore. Deoarece există două variabile de stare, două intrări şi două ieşiri, circuitul
are patru stări interne, patru stări diferite ale intrărilor şi patru stări diferite ale ieşirilor şi
anume: 00, 01, 11 şi 10. Pentru a putea completa tabelul tranziţiilor se caută expresiile
funcţiilor y'0 şi y'1 realizate de circuit. În acest scop se foloseşte tabelul 2.2 întocmit în
modul arătat în paragraful 1.2 (tabelul 1.2).

TABELUL 2.2.
x0 x1 y0 y1 y'0 y'1 Observaţii Cunoscând funcţiile y'0(x0 x1, y0, y1) şi y'1(x0
1 y0' = x0 + y1 x1, y0, y1) se completează tabelul tranziţiilor
şi al ieşirilor (tabelul 2.1.a şi b.). Analizând
0 x x 0
tabelul 2.1.a observăm că, spre exemplu,
1 y1' = x1 + y0 pentru x0=0, x1=0 şi y0=0, y1=0 (intersecţia
x 0 0 x primei linii cu prima coloană) se obţine
valoarea y'0=1, y'1=1. Această valoare devine
valoarea lui y0y1 după o întărziere Δ (starea următoare devine stare prezentă) şi atunci
ne ducem în tabel la situaţia x0=0, x1=0 şi y0=1, y1=1. Pentru aceasta y'0=0, y'1=0 şi ne
întoarcem la prima stare. Rezultă deci, că circuitul oscilează între aceste două stări, fapt
semnalat în tabel cu săgetile cu linie punctată. Dacă vom considera acum că la intrările
circuitului avem situaţia x0=0, x1=0 şi y0=0, y1=1, observam din tabel că starea
următoare este y'0=0, y'1=1 ceea ce conduce la concluzia că circuitul rămâne în această
stare şi deci avem o stare stabilă. Săgeţile cu linie plină indică evoluţia circuitului către
stările stabile. În tabelul tranziţiilor (tabelul 2.1.a) s-au încercuit stările stabile. După
cum se vede, circuitu1 are trei stări stabile. În practică se găsesc însă numai două dintre
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
114

acestea : starea 10, numită starea 1 şi starea 01, denumită starea 0. Aceasta se datoreşte
faptului că la un circuit real nu poate fi controlată tranziţia din starea 00, decât în cazul
când se modifică numai una dintre variabilele de intrare. De exemplu, dacă circuitul se
află în starea stabila 00, ceea ce corespunde la x0=l şi x1=l şi se modifică starea intrării
x0 din 1 în 0, se trece din starea stabilă 00 în starea instabilă 10 din care se trece apoi în
starea stabila 10 (tabelul tranziţiilor, coloana a doua). Dacă însă circuitul se află în
starea stabila 00 şi se modifică intrarea x1 din 1 în 0, se trece prin starea instabilă. 01 în
starea stabila 01 (tabelul tranziţiilor, coloana a patra). Atunci când circuitul se află în
starea stabilă 00 şi se modifică ambele intrări, adică starea intrărilor devine x0=0 şi
x1=0, circuitul ar trebui sa intre teoretic în oscilaţie, adică să facă tot timpul tranziţia din
starea instabilă 11 în starea instabilă 00 (prima coloană din tabelul tranziţiilor). Această
situaţe nu poate să apară în practică deoarece, chiar dacă s-ar putea modifica simultan
ambele intrări, nu se pot modifica simultan, din cauza întârzierilor diferite pe cele două
căi de legatură inversă, stările interne ale circuitului astlel încât aceasta se stabileşte
după cum se modifică mai repede y0 sau y1, fie în starea 10 fie în starea 01. Pentru ca
circuitul să poată funcţiona determinist se impune deci condiţia ca intrările sa nu fie
niciodată simultan în starea 1. Aceasta condiţie se poate formula prin expresia logică :

x0 ⋅ x1 = 0 (2.5)

impunând circuitului studiat anterior coudiţia (2.5), acesta devine un circuit cu două
stări stabile, denumit circuit basculant bistabil RS ( x0 = S , x1 = R, z0 = Q, z1 = Q , figura
2.5).

SR
00 01 11 10
S
Q Q
1 1 0 - 1
0 0 0 - 1

Q Q⎢
R

a. b.

Fig.2.5. Circuit basculant bistabil RS construit cu porţi SAU-NU.

Timpul cât intrarea S respectiv intrarea R trebuie să stea în starea unu pentru ca
circuitul să fie adus, indiferent în ce stare s-ar afla, în starea unu, respectiv zero, este
limitat numai inferior şi anume acest timp trebuie să fie cel puţin egal cu suma
întârzierilor Δ0 şi Δ1. Deoarece există numai două stări stabile se foloseşte o singură
variabilă de stare, notata în figura 2.5 cu Q, care joacă şi rolul de variabilă de ieşire
(pentru convenţia facută privind işirile, z0 = Q, z1 = Q ). Tabelul tranziţiilor pentru
circuitul basculant bistabil RS este redat în figura 2.5b. Conform celor discutate, acest
tabel se construieşte astfel: prma coloană, din stânga tabelului, va conţine cele două stări
stabile ale circuitului pentru situaţia în care S=0 şi R=0; coloana a doua este coloana
comenzii RESET (S=0, R=1) în care circuitul trece din starea instabilă zero (când Q=1)
în starea stabilă zero; coloana a treia nu este definită pentru că se exlude situaţia în care
S=1, R=1 iar coloana a patra este coloana comenzii de SET când circuitul trece din
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
115

starea instabilă unu (când Q=0) în starea stabila unu. Trebuie menţionat că în timpul
tranziţiilor cele două ieşiri, respectiv intrări secundare nu sunt întotdeauna
complementare după cum se poate vedea din tabelul tranziţiilor 2.1 a. Din tabelul
tranziţiilor rezultat în urma consideraţiilor făcute mai sus (fig. 2.5b), se obţine ecuaţia
stării următoare, Q' ca funcţie de variabilele de intrare Q, R şi S sub forma :

Q| = S R + Q R (2.6)

determinată prin gruparea termenilor din tabelul prezentat în figura 2.5. Dacă ţinem cont
şi de faptul că S şi R nu pot fi simultan unu, adică:

SR = 0 (2.7)

rezultă ecuaţia bistabilului RS:

(
Q| = S R + Q R + SR = S R + R + Q R = S + Q R ) (2.8)

(x0) U1A TABELUL 2.3.


(y3 |0)
În mod
1
S x0x1
(y1)
2 Q
00 01 11 10
asemănător se poate
74LS00 y0y1
00 11 11 11 realiza un circuit
11
(y0)
U2A
01 11 01 01 basculant bistabil de
11
(x1)
1

11 10 00 01 tipul RS cu elemente
11
3
Q
(y|1)
2
R
74LS00
10 10 10 11 logice SI-NU, (fig.
11
Fig. 2.6. Bistabil RS cu 2.6.) căruia îi
porţi NAND corespunde tabelul
y'0y'1
tranziţiilor 2.3.
Trebuie notat faptul că nu s-au mai reprezentat întârzierile dar se ţine cont de ele. Acest
tabel se obţine procedând la fel ca şi în cazul circuitelor basculante bistabile de tipul RS cu
elemente logice SAU-NU. Se obţine tabelul 2.4. care reprezintă tabelul tranziţiilor
circuitului basculant bistabil RS realizat cu circuite ŞI-NU. Se vede imediat că ecuaţia care
descrie acest circuit este ecuaţia (2.8).
Z1
TABELUL 2.4. U2A

SR 00 01 11 10
X0
1
3
Q 2

1 - 1 1 0 7400
Z0
0 - 1 0 0 U3A
1
X1
3
| 2
Q
7400
U1
Circuitele basculante Y'
Q R
bistabile RS sunt circuite secvenţiale
elementare care pot juca rolul de Q S

element de memorie în cadrul unor Fig. 2.7. Circuit secvenţial cu bistabil RS.
circuite secvenţiale mai complexe.
Ca exemplu, se va analiza circuitul secvenţial din figura 2.7.
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
116

Starea intenă a acestui circuit este determinată de starea bistabilului RS din bucla
de reacţie şi se modifică în conformitate cu ecuaţia de stare a acestuia, deci starea
următoare a circuitului va fi dată de relaţia :

Y | = S + RY (2.9)

Scriind expresiile funcţiilor S şi R realizate de partea combinaţională a circuitului


(partea încadrată cu linie întreruptă din figura 2.7), rezultă:

R = x0Y = x0 + Y , S = x1Y , S = x1Y (2.10)

înlocuind în ecuaţia (2.9) se obţine:

( )
Y | = x1Y + x0 + Y Y = x0Y + x1Y (2.11)

TABELUL 2.5.
x0x1 Acestei ecuaţii îi corespunde tabelul tranziţiilor 2.5. Din
00 01 11 10
Y acest tabel rezultă că circuitul analizat se comportă, atâta
0 0 1 1 0 timp cât se aplică semnal de comandă numai la una din
1 1 1 0 0 intrări, ca un circuit basculant bistabil RS, iar atunci când
se comandă ambele intrări circuitul „basculeaza” (işi
Y | schimbă starea). În cazul circuitului analizat aplicarea unui
semnal de comandă la una din intrari
U1A 1
U2A
U3A înseamnă aducerea intrării respective
x
1
1 3 2
2 3 1
3 3 în starea 1. Circuitul cu o asemenea
2
74LS08
2 z comportare poartă denumirea de
74LS32 74LS32
circuit basculant bistabil JK, la care
a. se noteaza cu J intrarea de aducere in
starea 1 (J=x1,) iar cu K intrarea de
U1A
|
x y1 1 y0
aducere în starea 0 (K=x0). După cum
U2A
74LS32
se vede din tabelul tranziţiilor 2.5, pe
2 U3A
coloana corespunzătoare stării
y0 74LS08
3
| z intrărilor 11 nu există stare stabilă,
74LS32 y 1
U4
Δ1 deci acest circuit nu poate funcţiona
DELAY
asincron. Ecuaţia de stare a
U5 circuitului basculant bistabil JK
Δ0
asincron se poate obţine din ecuaţia
(2.11) realizând modificările
DELAY

b.
Figura 2.8. Circuit secvenţial asincron. menţionate mai sus. Se obţine ecuaţia
(2.12):

Q| = K Q + J Q (2.12)

În practică se folosesc însă frecvent circuite basculante bistabile JK sincronizate.


Un circuit basculant de tip T se poate obţine dintr-un circuit basculant bistabil de
tip JK prin conectarea intrării J la intrarea K printr-un inversor. În acest fel, pe intrările
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
117

J şi K ale bistabilului nu se pot aplica decât combinaţiile: 01 şi 10. Rezultă că ecuaţia de


stare a bistabilului de tip T este:

Q| = T Q + T Q (2.13)

În exemplele considerate anterior, ieşirile circuitelor secvenţiale depindeau


numai de variabilele de stare ale circuitului (automate de tip Moore). De multe ori însă,
ieşirile circuitului secvenţial sunt funcţii, nu numai de starea circuitului, ci şi de intrările
sale (automate de tip Mealy). Ca exemplu, se consideră circuitul secvenţial din figura
2.8.a. Pentru a analiza comportarea circuitului, se consideră întârzierile pe liniile de
legătură şi întârzierile elementelor logice concentrate la ieşirile elementelor logice cu
numerele 1 şi 3 de la care, prin legături inverse se obţin intrările secundare ale
circuitului (fig. 2.8.b). Pentru simplificare se ia Δ0=Δ1=Δ. În aceste condiţii, ecuaţiile
stării următoare sunt date de relaţiile :

y0| = x + y1
(2.14)
y1| = xy0 + y1

Unde y|i(t) = yi(t+Δ), pentru i=0 şi 1, iar ecuaţia ieşirii, z, este dată de relaţia :

z = xy1 + y2 (2.15)

TABELUL 2.6. TABELUL 2.7.


x x x
0 1 0 1 0 1
y1y2 y1y2 y1y2
00 00 10 00 0 0 00 00/0 10/0
01 11 11 01 1 1 01 11/1 11/1
11 11 11 11 1 1 11 11/1 11/1
10 00 11 10 0 1 10 00/0 11/1

y|0y|1 z y|0y|1/z

Comportarea circuitului este redată în tabelul tranziţiilor şi al ieşirilor 2.6.


Adeseori, pentru circuitele secvenţiale de acest tip, tabelul tranziţiilor şi al ieşirilor se
unifică într-un singur tabel, sub forma tabelului 2.7.
Pentru simplificarea scrierii, stările, intrările şi ieşirile din tabelul tranziţiilor sunt
notate adeseori prin litere sau cifre zecimale. Folosind astfel de notaţii se obţine tabelul
tranziţiilor şi al ieşirilor.
De exemplu, dacă în tabelul tranziţiilor 2.7 se folosesc notaţiile:

starea 00 ↔ q0, intrarea 0 ↔ i0,


starea 01 ↔ q1, intrarea 1 ↔ i1,
(2.16)
starea 11 ↔ q2, ieşirea 0 ↔ w0,
starea 10 ↔ q3, ieşirea 1 ↔ w1,
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
118

se obţine tabelul 2.8 sau folosind numai indicii stărilor, ieşirilor şi intrărilor din relaţiile
(2.16), se obţine tabelul stărilor 2.9.

TABELUL 2.8 TABELUL 2.9


Intrare Intrare

stare i0 i1 stare 0 1
prezentă prezentă
q0 q0/w0 q3/w0 0 0/0 3/0
q1 q2/w1 q2/w1 1 2/1 2/1
q2 q2/w1 q2/w1 2 2/1 2/1
q3 q0/w0 q2/w1 3 0/0 2/1
starea următoare/ieşire starea următoare/ieşire

2.3. Graful tranziţiilor


Comportarea unui circuit secvenţial poate fi redată pe lângă tabelul tranziţiilor,
respectiv tabelul stărilor şi prin graful tranziţiilor, respectiv diagrama stărilor. În graful
tranziţiilor (diagrama stărilor) fiecare stare a circuituhii se reprezintă printr-un nod, iar
fiecare tranziţie printr-un arc.
Circuitele secvenţiale de tipul Moore au înscrise în noduri stările, simbolic sau
codificate binar, şi ieşirile corespondente separate prin slash (simbolul de împărţire „/”),
iar pe arce au notate intrările care provoacă tranziţia respectivă (fig. 2.9).
Circuitele secvenţiale de tipul Mealy au înscrise pe arce intrările care cauzează
tranziţia, şi ieşirile obţinute în timpul tranziţiei respective, iar în noduri sunt înscrise stările
circuitului (fig. 2.10).
În graful de tranziţie, starea iniţială poate fi reprezentată printr-un cerc realizat
cu o linie dublă.

0/1∨1/1
1/0 1/1
0/0
11 11
00∨10 00∨01 00 10

0/0 1/1 0/0 0/1 1/1

11
01
Fig. 2.9. Graful tranziţiilor Fig. 2.10. Graful tranziţiilor
pentru circuitul secvenţial din pentru circuitul secvenţial din
figura 2.7. figura 2.8.

2.4. Alte modele ale circuitelor secvenţiale


În paragrafele anterioare s-au prezentat câteva modele ale circuitelor secvenţiale
fie pentru descrierea lor structurală, reţeaua de comutare sau schema logică, fie pentru
descrierea comportării lor, tabelul tranziţiilor, tabelul stărilor, graful tranziţiilor şi
diagrama stărilor. De asemenea se dă o definiţie formală a celor două tipuri de circuite
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
119

secvenţiale prezentate şi se prezintă alte două modele pentru descrierea comportării


acestora.
Modelul matematic al unui circuit secvenţial de tipul Mealy, denumit automat finit
Mealy, se defineşte în modul descris în continuare.
Un automat finit Mealy, A, constă din urmatoarele :

1. o mulţime finită Q de stari interne;


2. o mulţime finită I de intrări;
3. o mulţime finită W de ieşiri;
4. o aplicaţie T (denumită aplicaţia tranziţiilor lui A) a unei submulţimi Dτ
a mulţimii QxI pe o submulţime a lui Q;
5. o aplicaţie ω (denumită aplicaţia ieşirii lui A) a unei submulţimi Dτ a
mulţimii QxI pe mulţimea W.

Automatul finit A este dat prin urmare prin 5-uplul ordonat A =(Q, I, W, τ, ω).
De exemplu, se consideră automatul finit A1 dat prin :

⎧τ (q , i ) = q1 , ⎧ω (q0 , i0 ) = w1 ,
Q = {q0 , q1 , q2 }, ⎪ 0 0 ⎪ω (q , i ) = w ,
⎪τ (q1 , i0 ) = q2 , ⎪ 0 1
I = {i0 , i1}, ⎨ ⎨
0
(2.17)
⎪τ (q2 , i0 ) = q0 , ω (
⎪ 1 0q , i ) = w 0,
W = {w0 , w1}.
⎪⎩τ (q2 , i1 ) = q1 , ⎪⎩ω (q2 , i0 ) = w1.

Acest automat poate fi reprezentat prin diagrama stărilor din figura 2.11.
Un automat A este incomplet definit din punct de vedere al tranziţiilor dacă
Dτ=Q x I, şi complet definit dacă Dτ = Dω = Q x I. Atunci când un automat nu este
complet definit, el se numeşte automat incomplet sau automat incomplet definit.
Automatul A1 reprezentat prin diagrama stărilor din figura 2.11 este un exemplu de
automat incomplet definit.
Un automat finit Moore, A*, poate fi definit prin:

1. o mulţime finita Q* de stări interne ;


2. o mulţime finita I* de intrări;
3. o mulţime finită W* de ieşiri;
4. o aplicaţie τ* a unei submulţimi Dτ* a mulţimi Q* x I* pe o submulţime a
lui Q* ;
5. o aplicaţie ω* a unei submulţimi Dω* a mulţimii Q* în multimea W*.

Definiţia automatului Moore diferă de definiţia automatului Mealy numai prin


punctul 5. Prin urmare, dacă în exemplul precedent se înlocuieşte aplicaţia ω din relaţia
(2.17) cu ω*, dată de relaţia (2.18), se obţine un automat A1, reprezentat prin diagrama
stărilor din figura 2.12.

⎪⎧ω (q0 ) = w1
*

⎨ * (2.18)
⎪⎩ω (q2 ) = w0
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
120

i1/w0 i0/w1 i0

q0 q1 q0/w1 q1/-
i0/w0 i0
i1/- i0 i1
i0/w1 q2 q2/w0
Fig. 2.11 Diagrama stărilor Fig. 2.12. Diagrama stărilor
pentru un automat Mealy. pentru un automat Moore.

În afară de tabelul stărilor şi diagrama stărilor, un automat finit A poate fi


reprezentat şi printr-o matrice a conexiunilor CA=(Cij), având un număr de linii şi de
coloane egal cu numărul de stări interne. Elementul cij în această matrice este reuniunea
perechilor intrare/ieşire, aflate în diagrama stărilor pe arcele care conduc de la starea qi
la starea qj pentru automatul Mealy, respectiv reuniunea intrărilor care conduc de la qi
la qj pentru automatul Moore.

i1/w1
q0 q1 q2
q0 i0/w0∨i1/w1 q1 q0 ⎡ 0 i0 / w0 ∨ i1 / w1 0 ⎤
C A2 = q1 ⎢⎢ i1 / w1 0 i0 / − ⎥⎥
i0/w0
i0/w0 i0/- q2 ⎢⎣i0 / w0 i1 / w0 0 ⎥⎦
q2
Fig. 2.13. Diagrama stărilor şi matricea de conexiuni pentru
un automat Mealy.

Pentru automatul Moore se mai dă în plus un vector coloană al ieşirilor W0, cu


număr de elemente egal cu numărul de stări, fiecare element wi reprezentând ieşirea
corespunzătoare stării qi. În figura 2.13. se reprezintă un automat Mealy A2, dat prin
diagrama stărilor şi matricea conexiunilor corespondentă, iar în figura 2.14 un automat
Moore A2, dat prin diagrama stărilor, respectiv matricea conexiunilor şi vectorul
ieşirilor corespondent.

i0
q0 q1 q2
q0/w0 q1/- q0 ⎡ 0 i0 i1 ⎤ ⎡ w0 ⎤
i0
i1 C *
A2

= q1 ⎢i0 0 i1 ⎥ W = ⎢⎢ − ⎥⎥

i1 i0∨ i1 q2 ⎢⎣ 0 i0 ∨ i1 0⎥⎦ ⎢⎣ w1 ⎥⎦
q2/w1
Fig. 2.14. Diagrama stărilor şi matricea de conexiuni pentru
un automat Moore.
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
121

2.5. Analiza circuitelor logice secvenţiale


Analiza circuitelor secvenţiale se defineşte astfel: cunoscând structura circuitului
secvenţial se cere evoluţia semnalelor de ieşire pentru anumite evoluţii (secvenţe) ale
semnalelor de intrare.
O condiţie necesară pentru rezolvarea problemei de analiză a circuitelor secvenţiale
o constituie cunoaşterea stării iniţiale a circuitului analizat.
Atât pentru circuitele sincrone cât şi pentru cele asincrone, analiza presupune
parcurgerea următoarelor etape:
1. pornind de la structura circuitului se determină părţile combinaţionale
şi cele de memorie şi se defmesc semnalele de intrare, de iesire şi
semnalele secundare (de stare);
2. se stabilesc expresiile funcţiilor booleene ale ieşirilor din partea
combinaţională. Funcţiile stabilite se pun în forma canonică;
3. corespunzator combinaţiilor variabilelor de stare se realizează
codificarea stărilor şi se definesc stările circuitului;
4. se construieşte tabelul stărilor şi/sau graful de tranziţie a circuitului;
5. pentru evoluţia semnalelor de intrare şi starea iniţială impusă,
folosindu-se graful sau tabelul de tranziţie, se stabileşte evoluţia
semnalelor la ieşire.
U2A
Etapa neobligatorie dar
X
1
3
Z
de multe ori utilă din punct de
vedere practic presupune
2
U7A
74LS08 1
U4A

obţinerea unui circuit


3
U9A 1 2
1 2 3

echivalent cu primul dar mai


2 74LS32
74LS04 U3A
1 74LS08
3

U10A
2

74LS08
economic decât primul.
1 2

74LS04 U5A
1
U8A
Vom explica modul de
3
1

2
3
U6A
analiză a circuitelor logice
2

74LS32

74LS00
1

2
3 secvenţiale printr-un exemplu.
CLC
74LS00 Considerăm circuitul din
U11 figura 2.15 compus din două
părţi, o parte combinaţională
Q0 D0 Q D

U12
notată pe figură cu CLC şi o
Q1 D1 Q D parte secvenţială, de memorie,
realizată cu două circuite
Memorie basculante de tip D.
Circuitul are o singură
Fig. 2.15. Circuit logic secvenţial.
intrare notată cu x şi o singură
ieşire notată cu z.
Ecuaţia de stare a circuitului basculant D asincron este foarte simplă, circuitul
repetă la ieşirea Q ceea ce se aplică pe intrarea D:

Q| = D (2.19)

Expresiile funcţiilor de ieşire a părţii combinaţionale a circuitului din figura 2.15,


sunt:
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
122

z = xQ0
D0 = xQ0 + xQ1 (2.20)
D1 = xQ0 Q1 + xQ1Q0 = xQ0 Q1 + xQ1 + Q0

se dezvoltă formele canonice ale acestor funcţii:

z = xQ0Q1 + xQ0 Q1
D0 = xQ0Q1 + xQ0 Q1 + xQ0Q1 + xQ0Q1
(2.21)
D1 = xQ0 Q1 + xQ1Q0 = xQ0 Q1 + xQ0Q1 + xQ0Q1 +
+ xQ0Q1 + xQ0Q1 + xQ0 Q1 + xQ0 Q1

Înlocuind relaţiile (2.21) în (2.19) se poate construi acum tabelul tranziţiilor şi al ieşirii
(tabelul 2.10).

TABELUL 2.10.
Q0Q1 Q0Q1
00 01 11 10 00 01 11 10
x x
0 01 11 11 00 0 0 0 0 0
1 01 01 10 11 1 0 0 1 1

Q|0Q|1 z

Circuitul studiat are două variabile de stare. Ca urmare cele 4 combinaţii posibile
ale valorilor acestora definesc stările circuitului. Putem scrie următoarea codificare:

y0 y1 sk
0 0 -> s0
0 1 -> s1 (2.22)
1 0 -> s2
1 1 -> sk

TABELUL 2.11. 1/0


x 0/0 ∨ 1/0 Având în vedere codificarea realizată se
0 1 poate construi acum tabelul stărilor
sk s0 s1
s0 s1/0 s1/0 (tabelul 2.11). Tabelul corespunde unui
0/0 1/1 0/0
s1 s3/0 s1/0 automat de tip Mealy. Pe baza acestui
s2 s0/0 s3/1 s2 s3 tabel se poate stabili imediat graful de
s3 s3/0 s2/1 0/0
tranziţie al circuitului care este dat în
1/1
starea figura 2.16. Starea iniţială este
următoare/ieşire Fig. 2.16. Graful de reprezentată printr-un cerc cu linie
dublă. tranziţie
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
123

2.6. Sinteza circuitelor logice secvenţiale


Problema de sinteză a circuitelor logice combinaţionale se defineşte în modul
următor: cunoscând modul de funcţionare a circuitului secvenţial exprimat prin evoluţia
semnalelor de intrare respectiv a celor de ieşire (secvenţele de intrare respectiv cele de
ieşire), se cere să se stabilească structura circuitului.
Ţinând cont de această formulare rezultă că rezolvarea problemei de sinteză
presupune parcurgerea etapelor:

1. se construieşte tabelul tranziţiilor şi ieşirilor din specificaţia dată sub


formă de descriere;
2. se minimizează numărul stărilor;
3. se realizează codificarea stărilor;
4. se substituie combinaţia variabilelor de stare în tabelul stărilor şi ieşirilor
pentru a crea tabelul tranziţiilor şi stărilor;
5. se alege tipul de celule de memorie folosite (tip R-S, J-K, D, T);
6. se construieşte tabelul de excitaţie care indică valorile excitaţiilor
necesare pentru a obţine starea urmatoare dorită pentru fiecare
combinaţie stare actuală-intrare;
7. se obţin expresiile funcţiilor de excitaţie;
8. se obţin expresiile funcţiilor de ieşire;
9. se trasează schema logică a circuitului care materializează funcţiile de
excitaţie şi cele de ieşire la care se adaugă şi celulele de memorie
corespunzătoare.

Dintre etapele prezentate mai sus, prima este cea mai dificilă şi afectată de erori.
Parcurgerea ei cu succes depinde foarte mult de experienţa şi abilităţile proiectantului.
Fiecare din celelalte etape pot fi parcurse în mod sistematic manual sau folosind
programe pe calculator special realizate.
În ceea ce priveşte prima etapă, se recomandă construirea unui label de tranziţii
primar unde să fie o singură stare stabilă pe fiecare linie a tabelului. Fiind doar o singură
stare stabilă pe fiecare linie a tabelului, ieşirea poate fi considerată ca depinzând numai de
starea curentă. În acest fel este posibil să se introducă stări suplimentare care însă pot fi
eliminate mai târziu în etapa de minimizare a stărilor.
În continuare vom exemplifica acest procedeu de sinteză a circuitelor logice
combinaţionale.

2.7. Circuite basculante bistabile folosite ca elemente de memorie


pentru circuitele secvenţiale

2.7.1. Introducere

Circuitele basculante bistabile sunt circuite secvenţial elementare cu numai două


stări stabile, folosite ca elemente de memorie pentru circuitele secvenţiale mai complexe,
în scopul memorării stării interne a acestora. Circuitele basculante bistabile pot fi
construite pentru a funcţiona fie numai în regim asincron, fie numai în regim sincron, fie
atât în regim asincron cât şi în regim sincron, funcţie de tipul circuitelor secvenţiale în care
sunt folosite. De obicei, pentru circuitele secvenţiale sincrone se folosesc ca elemente de
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
124

memorie circuite basculante care pot funcţiona atât în regim sincron cât şi asincron,
intrările asincrone fiind utilizate pentru aducerea circuitului în starea iniţială, independent
de impulsul de tact.

2.7.2. Tabelele caracteristice, tabelele excitaţiilor şi ecuaţiile intrărilor

Comportarea circuitului basculant bistabil poate fi descrisă prin tabelul caracteristic


al bistabilului, în care se dă starea următoare a ieşirii în funcţie de comabinaţiile de valori
prezente ale intrărilor şi ale stării prezente sau prin ecuaţia de stare a bistabilului, care
exprimă starea următoare a acestuia în funcţie de intrări şi starea prezentă. În continuare se
prezintă tabelele caracteristice, tabelele excitaţiilor şi ecuaţiile de stare pentru câteva tipuri
de circuite basculante bistabile, folosite mai frecvent.

TABELUL 2.12.
U3A U1A
/SH
1 1
S 3 3
Q
Circuitul basculant
2 2

S R Q(t+1) 74LS00 74LS00

0 0 Q(t) H
bistabil de tipul RS . Circuilul
0 1 0 U4A basculant bistabil de tipul RS,
U2A

realizat cu module SI-NU,


1 1

1 0 1
/RH 3 3
2 2 /Q
R

1 1 ?
74LS00
respectiv SAU-NU, analizat în
74LS00

Fig. 2.17. Bistabil RS sincron.


paragraful 2.2 reprezintă cel mai
simplu circuit basculant bistabil.
Tabelul caracteristie al acestuia (tabelul 2.12) se foloseşte îndeosebi pentru a
caracteriza funcţionarea circuitului bistabil RS sincron, înţelegând prin Q (t) starea sa la
tactul t, iar prin Q (t+1) starea sa la tactul t+1, dar ramâne valabil şi pentru circuital bistabil
RS asincron, daca Q(t) se interpretează ca starea circuitului la timpul t, iar Q (t+1) starea sa
la timpul t+Δt, unde Δt este timpul de răspuns al circuitului la semnale de intrare. Pentru a
obţine un circuit bistabil RS sincron, având un circuit asincron, proiectat, de exemplu, cu
circuite logice SI-NU, se pune condiţia ca intrările sale sincrone, RH şi SH (fig. 2.17) să fie
active numai în prezenţa unui impuls de tact H, adică:

SH = S ⋅ H
(2.23)
RH = R ⋅ H

Ţinând cont de relaţiile (2.23) rezultă schema circuitului basculant bistabil din
figura 2.17.
Ecuaţia caracteristică a acestui bistabil, dedusă în paragraful 2.2, denumită şi
ecuaţie de stare, este următoarea:

Q| = S + RQ (2.24)

unde prin Q| s-a notat starea la momentul t+1, iar prin Q starea la momentul t.
În cadrul unui circuit secvenţial, circuitul basculant bistabil are rolul de a memora
starea unei anumite variabile de stare. Din acest motiv, starea sa trebuie să se modifice
funcţie de variabilele de intrare ale circuitului, în conformitate cu expresia care descrie
starea următoare a variabilei de stare considerate, denumită în acest caz ecuaţia de aplicare
a bistabilului. În general, starea următoare a unei variabile de stare Qk notată Q|k este o
funcţie de variabilele de intrare Xi, pentru i = l, ... , n şi de celalalte variabile de stare Qj,
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
125

pentru j = 1, ..., k, ..., p unde n şi p sunt numărul de variabile de intrare, respectiv de stare
pentru circnitul considerat (relaţia 2.25).

Qk| = f (x1 , x2 ,..., xn , Q1 , Q2 ,..., Q p ) (2.25)

Dacă pentru memorarea stării acestei variabile se foloseşte un bistabil, notat tot cu
Qk, expresia (2.25) devine ecuaţia de aplicare pentru acest bistabil. Pentru ca bistabilul să
memoreze starea următoare a variabilei de stare, trebuie ca la intrărite sale să se aplice
astfel de comenzi încât starea sa următoare să corespundă ecuaţiei de aplicare. Pe baza
acestei condiţii se stabilesc expresiile booleene care descriu comenzile ce trebuie aplicate
la intrările bistabilului, denumite ecuaţiile intrărilor bistabilului. Problema determinării
ecuaţiilor de intrare pentru un anumit bistabil, în cazul considerat aici pentru bistabilul RS,
se reduce la rezolvarea sistemului de ecuaţii booleene (2.26), format din ecuaţia de aplicare
şi ecuaţia de stare a bistabilului:

Qk| = f (x1 , x2 ,..., xn , Q1 , Q2 ,..., Q p )


(2.26)
Qk| = S + RQk

adică la obţinerea expresiilor:

S = f ( x1 , x2 ,..., xn , Q1 , Q2 ,..., Q p ),
(2.27)
R = f ( x1 , x2 ,..., xn , Q1 , Q2 ,..., Q p ).

Există mai multe metode practice pentru rezolvarea acestei probleme. Una din
metodele frecvent folosite se bazează pe tabelul de excitaţie al bistabilului. Tabelul de
excitaţie al unui anumit tip de bistabil arată care trebuie să fie valorile intrărilor pentru ca
bistabilul aflat într-o anumită stare sa treacă într-o stare următoare bine precizată.

TABELUL 2.13.
Q(t) Q(t+1) S R În tabelul excitaţiilor pentru bistabilul RS (tabelul 2.13) se
0 0 0 înscrie pe coloana intrării S, respectiv R, valoarea 0 şi 1, atunci
x
0 1 1 când una dintre aceste valori este obligatorie pentru tranziţia
0
1 0 0 respectivă sau se scrie un x, atunci când valoarea uneia sau a
1
1 1 x ambelor intrări este indiferentă. De exemplu, atunci când starea
0
prezentă a bistabitului este 0, iar starea sa următoare trebuie sa fie
tot 0, este obligatoriu ca intrarea S să fie în starea 0, dar intrarea R poate să fie în starea 0
sau în starea 1, adică se poate scrie x, după cum se vede în primul rând al tabelului 2.13.
Acest tabel se foloseşte pentru deducerea ecuaţiilor intrărilor bistabilului RS, aplicat într-
un caz concret, în felul urmator :

1. se scrie ecuaţia de aplicare a bistabilutui sub formă de tabel de corespondenţe,


penultima coloană fiind starea prezentă a bistabilului, iar ultima starea
următoare;
2. se adaugă două coloane corespunzătoare intrărilor S şi R;
3. se completează coloanele S şi R pe baza tabelului excitaţiilor pentru bistabilul
RS;
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
126

4. se scriu expresiile minime pentru ecuaţiile S şi R, considerând pentru poziţiile


marcate cu x valorile cele mai convenabile (condiţii „nu ţine cont”) – S şi R
sunt funcţii de variabilele din ecuaţia de aplicare.

Exemplu. Se dă ecuaţia de aplicare a bistabilului A, de tipul RS, expresia 2.28 şi se


cer ecuaţiile intrărilor R şi S.

A| = AX 1 + B X 1 (2.28)

TABELUL 2.14.
X1 B A A| S R Se întocmeşte tabelul 2.14 pe baza relaţiei 2.28 şi a
0 0 0 0 0 x tabelului 2.13. Tabelul se realizează, aşa cum s-a arătat mai sus,
0 0 1 0 0 1 pe baza variabilelor funcţiei de aplicare (X1, B, A) cu ajutorul
0 1 0 1 1 0 ecuaţiei 2.28. La acest tabel se mai adaugă coloanele S şi R care
0 1 1 1 x 0 se completează conform tabelului 2.13, ţinând cont de faptul că
1 0 0 1 1 0 A reprezintă starea prezentă iar A| starea următoare.
1 0 1 0 0 1 Din tabelul 2.14 rezultă ecuaţiile intrărilor S şi R, în
funcţie de variabilele X1, B şi A, relaţia (2.29), obţnute în urma
1 1 0 1 1 0
minimizării funcţiilor S=f(X1, B, A) şi R=f(X1, B, A) cu ajutorul
1 1 1 0 0 1
diagramelor Karnaugh din figura 2.18.

AB AB
00 01 11 10 00 01 11 10
X1 X1
0 0 1 x 0 0 x 0 0 1
1 1 1 0 0 1 0 0 1 1
Funcţia S Funcţia R

Figura 2.18. Minimizarea funcţiilor S şi R.

Ecuaţiile intrărilor S şi R sunt:

S = AB + AX 1 = A(B + X 1 )
(2.29)
(
R = AB + AX 1 = A B + X 1 )
În general, ecuaţia de aplicare a unui bistabil Q se poate scrie, folosind teorema
dezvoltării, sub forma:

Q| = QgQ + QhQ (2.30)

unde gQ şi hQ sunt funcţii boleene având ca variabile toate variabilele din ecuaţia de
aplicare a bistabilului Q cu excepţia variabilei Q.
Procedând la determinarea expresiilor intrărilor S şi R ale unui bistabil, plecând de
la ecuaţia de aplicare scrisă sub forma (2.30) se obţin, prin intermediul tabelului 2.15, în
modul arătat mai sus, funcţiile S=f(gQ, hQ, Q) şi R =f(gQ, hQ, Q), care minimizate cu
ajutorul diagramelor Karnaugh din figura 2.19, au forma :
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
127

S = QhQ ; R = Q gQ (2.31)

QhQ QhQ
00 01 11 10 00 01 11 10
gQ gQ
0 0 1 0 0 0 x 0 1 1
1 0 1 x x 1 x 0 0 0
Funcţia S Funcţia R

Figura 2.19. Determinarea funcţiilor S şi R.


TABELUL 2.15.
Q| = QgQ + QhQ =
gQ hQ Q S R Din cele prezentate mai sus rezultă că ecuaţiile
= S + QR intrărilor se pot obţine uşor folosind funcţile
0 0 0 0 0 x auxiliare gQ şi hQ (din ecuaţia 2.31) care în
0 0 1 0 0 1 cazul reprezentării funcţiei Q' pe diagrama
0 1 0 1 1 0 Karnaugh sunt date, fiecare din ele, de câte o
0 1 1 0 0 1 jumătate a acestei diagrame (conform ecuaţiei
1 0 0 0 0 x 2.30) şi anume: funcţia gQ pe jumatatea
1 0 1 1 x 0 corespunzătoare zonei Q, iar funcţia hQ pe
1 1 0 1 1 0 jumătatea corespunzătoare zonei Q (figura
1 1 1 1 x 0
Zona A Zona A
AB
AB 00 01 11 10
00 01 11 10 X1
X1
0 0 1 1 0
0 0 1 1 0 1 1 1 0 0
1 1 1 0 0
hA gA
|
Funcţia A|
Funcţia A Fig. 2.20.b.
Fig. 2.20.a.
Figura 2.20. Determinarea ecuaţiilor de intrare pe baza ecuaţiei de aplicare a
bistabilului.
2.20.a). Din figura 2.20.a, pentru ecuaţia intrării S se caută forma minimă a funcţiei hQ,
adică se iau unităţile din zona Q a diagramei iar pentru ecuaţia intrării R se caută forma
minimă a funcţiei gQ , adică se iau zerourile din zona Q a diagramei. Astfel, pentru
exemplul considerat anterior, rezultă pentru A|, conform tabelului 2.14, diagrama
Karnaugh din figura 2.20.a. Pe baza acestei diagrame se obţin pentru funcţiile q A şi hA ,
expresiile:

g A = B + X 1 ; hA = B + X 1 (2.32)

Ţinând cont de expresiile (2.31) şi (2.32) se obţin pentru S şi R aceleaşi expresii ca


şi în cazul precedent, relaţia (2.29).
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
128

Având în vedere faptul că atunci când bistabilul RS se află în starea unu logic se
poate da comanda de aducere în starea unu logic fară să se modifice nimic, rezultă că
pentru ecuaţia intrării S se pot considera pe lângă unităţile din zona A şi cele din zona A,
adică toate unităţile din diagrama Karnaugh pe care se reprezintă ecuaţia de aplicare. Din
aceleaşi motive, pentru scrierea ecuaţiei intrării R se pot considera toate zerourile din
diagramă. Prin urmare, unităţile din zona A reprezintă condiţii ,,nu ţine cont" pentru
scrierea expresiei lui S, iar zerourile din zona A reprezintă condiţii ,,nu ţine cont" pentru
scrierea expresiei lui R. În diagrama din figura 2.20.b căsuţele corespunzătoare acestor
condiţii sunt marcate prin trasarea diagonalelor. Urmărind această diagramă se constată că
nu se pot obţine pentru S şi R expresii mai simple decât cele deduse anterior. De fapt în
aceste completări, diagrama din figura 2.20.b corespunde în întregime cu diagramele din
figura 2.18.
Circuitul basculant bistabil de tipul JK. Spre deosebire de circuital basculant bistabil RS,
circuitul basculant bistabil JK admite comenzi simultane la ambele intrări, circuitul fiind
astfel conceput incât atunci când apare un asemenea caz să-şi modifice starea. Tabelul
caracteristic şi tabelul excitaţiilor pentru un circuit basculant bistabil de tipul JK sunt date
în tabelul 2.16, respectiv 2.17.
Ecuaţia de stare a circuitului basculant bistabil JK este dată de relaţia:
Q = Q K + QJ
|
(2.33)

TABELUL 2.16. TABELUL 2.17. QK


00 01 11 10
J K Q(t+1) Q(t) Q(t+1) J K J
0 0 Q(t) 0 0 0 X 0 0 0 0 1
0 1 0 0 1 1 X 1 1 1 0 1
1 0 1 1 0 X 1 hQ gQ
1 1 Q(t ) 1 1 X 0
Figura 2.21. Sinteza unui bistabil JK.

Circuitul basculant bistabil de tipul JK se poate construi folosind un circuit bistabil


RS sincron. Se consideră în acest scop ecuaţia de stare a bistabihilui JK drept ecuaţia de
aplicare pentru bistabilul RS şi se determină plecând de aici ecuaţiile intrărilor S şi R.
Ecuaţia de stare a bistabilului JK este reprezentată pe diagrama din figura 2.21. Din această
diagramă rezultă, folosind metoda prezentată mai sus pentru bistabilul RS, ecuaţiile
intrarilor S si R:
S = QJ ; R = QK (2.34)
U1A
U3A U7A
1 U9A
J 3 1 U5A 1
2 3 1 2 12 1
2 3 J 13 3
7408 2
Q 2 Q
7400 7410
7400 7400

T T
U6A U10A
U4A 1 U8A
U2A 1
1 3 1 3
/Q
1 3 2 2 12 2 /Q
3 2 K 13
2 7400 7400
K 7400 7410
7408

a. b.

Figura 2.22. Circuit bistabil JK


2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
129

Considerând circuitul bistabil RS realizat sub forma din figura 2.17 şi având
ecuaţiile intrărilor (2.34), rezultă pentru circuitul bistabil JK schema din figura 2.22.a.
Facând uz de proprietatea de asociativitate a funcţiei SI, această schemă se poate realiza cu
mai puţine elemente în forma echivalentă dată în figura 2.22.b. După cum s-a văzul în
analiza făcuta asupra circuitelor sincrone, un asemenea circuit poate funcţiona corect
numai atunci când durata impulsului de sincronizare T nu depăşeşte timpul de reacţie al
circuitului.
Deducerea ecuaţiilor intrărilor bistabilului JK folosit ca element de memorare
într-un circuit secvenţial sincron se poate face în acelaşi mod ca şi în cazul circuitului
bistabil RS, folosind în acest scop tabelul excitaţiilor. În acest caz însă, expresiile intrărilor
rezultă mai simplu, prin identificarea lor cu funcţiile hQ şi gQ din ecuaţia de aplicare,
relaţiile (2.35) şi (2.36). Astfel din :

⎧⎪Q| = QgQ + QhQ


⎨ | (2.35)
⎪⎩Q = Q K + QJ

rezultă:

K = gQ şi J = hQ (2.36)

Din cele arătate mai sus rezultă o regulă practică pentru obţinerea expresiilor intrărilor,
având funcţia de aplicare reprezentată pe diagrama Karnaugh şi anume, pentru obţinerea
expresiilor intrării J se minimizează funcţia din zona Q a diagramei, iar pentru obţinerea
expresiei intrării K se minimizează negata funcţiei din zona Q a diagramei, considerând în
acest scop zerourile din această zonă.
Pentru exemplul considerat anterior, din diagrama Karnaugh pentru ecuaţia de aplicare A|
(fig. 2.20.a) rezultă :

J = B + X 1; K = B + X1 (2.37)

Circuitul basculant bistabil de tipul T. Acest circuit basculant bistabil are o singură intrare,
notată cu T, care atunci când trece din starea zero logic în starea unu logic cauzează
schimbarea stării interne a bistabilului.
Tabelul caracteristic al circuitului basculant bistabil de tipul T şi tabelul excitaţiilor
sunt date în tabelul 2.18, respectiv 2.19.
Ecuaţia de stare a bistabilului T, rezultată din tabelul 2.18, este :

Q| = QT + QT (2.38)

TABELUL 2.18 TABELUL 2.19


T Q(t+1) Q(t) Q(t+1) T Q
0 1 Figura 2.23.
0 Q(t) 0 0 0 T Sinteza unui
0 0 1 circuit bistabil T
1 Q(t ) 0 1 1
1 1 0
1 0 1
hQ gQ
1 1 0
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
130

Se pot concepe bistabile de tipul T care să funcţioneze sincron sau bistabile de tipul
T care să funcţioneze asincron. Pentru a obţine un circuit basculant bistabil de tipul T
sincron, se poate pleca de la faptul că circuitul basculant bistabil de tipul JK işi modifică
starea atunci când intrările J şi K sunt comandate simultan, de unde rezultă că legând
impreună intrările JK ale unui circuit basculant JK se obţine schema unui circuit basculant
bistabil de tipul T. Acesta va funcţiona corect cu aceeaşi observaţie privind durata
impulsului de sincronizare ca şi la circuitul bistabil JK. La acelaşi rezultat se ajunge şi dacă
se porneşte de la ecuaţia de stare a bistabilului T, care se impune să fie ecuaţie de aplicare
pentru un bistabil JK, relaţia (2.38), reprezentată pe diagrama Karnaugh din figura 2.23.
Din diagrama Karnaugh din figura 2.23 rezultă, ţinând cont de cele arătate mai sus,
relaţiile:

J = hA = T ; K = gA =T (2.39)

La aceeaşi schemă se ajunge şi dacă se face sinteza folosind ca element de


memorie un circuit bistabil RS.
Ecuaţiie intrărilor unui circuit bistabil T folosit ca element de memorie într-un
circuit secvenţial se obţin plecând de la ecuaţia de aplicare a bistabilului, scrisă pe baza
teoremei dezvoltării, în acelaşi mod ca şi la bistabilul RS (tabelul 2.20).
Din diagrama Karnaugh a funcţiei T (figura 2.24) rezultă forma sa minimă:

T = QhQ + Q g Q (2.40)

TABELUL 2.20.
Q| = Q g Q + QhQ =
gQ hQ Q T
= QT + Q T QhQ
00 01 11 10
0 0 0 0 0 gQ
0 0 1 0 1 0 0 1 1 1
0 1 0 1 1 1 0 1 0 0
0 1 1 0 1 Funcţia T
1 0 0 0 0
1 0 1 1 0 Figura 2.24. Determinarea ecuaţiei intrării pentru
1 1 0 1 1 bistabilul T
1 1 1 1 0
Ecuaţia intrării T de mai sus (2.40) arată că pentru obţinerea sa se consideră funcţia
hQ şi negata funcţiei gQ din ecuaţia de aplicare a bistabilului. Având în vedere acest fapt se
poate deduce o regulă practică de obţinere a expresiei minime a intrării, atunci când ecuaţia
de aplicare este reprezentată pe diagrama Karnaugh şi anume: se consideră pentru scrierea
expresiei intrării T, unităţile din zona Q şi zerourile din zona Q a diagramei.
Folosind această regulă pentru ecuaţia de aplicare dată în diagrama Karnaugh din
figura 2.20.a, a exemplului prezentat anterior, rezultă pentru intrarea T a bistabilului A
expresia:

T = X 1 + AB + AB (2.41)
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
131

Intrare Ieşire 01 11 Q1Q2 Q1Q2


0 1 00 01 11 10 00 01 11 10
T Z 1 2 T T
1 2 0 0 0 0 1 1 0 1 1 0 0
1 0 1 1 0 1 0 1 1 0
3 2 1
3 4 1 4 3
Funcţia Q|1 Funcţia Q|2
1 4 0 00 10

a. b. c. d.

Figura 2.25. Sinteza unui circuit bistabil asincron de tipul T.


TABELUL 2.21.
Starea Starea următoare Q|1Q|2 Pentru a concepe o schemă de circuit
prezentă pentru intrarea T Z bistabil T asincron, se începe cu tabelul primar
Q1Q2 0 1 al stărilor, completat ţinând cont de comportarea
01 01 11 0 bistabilului (figura 2.25.a). Deoarece se
11 10 11 1 urmăreşte obţinerea unui circuit de tipul Moore,
10 10 00 1 se vede, urmărind coloana ieşirii Z, că numărul
00 01 00 0 de stări din tabelul primar al stărilor nu poate fi
redus. Pentru codificarea acestor patru stări sunt
necesare două variabile de stare Ql şi Q2, cărora li se atribuie coduri binare pe baza
diagramei tranziţiilor din figura 2.25.b. Cu această codificare rezultă tabelul tranziţiilor
(tabelul 2.21). Din acest tabel se obţin expresiile stărilor următoare ale variabilelor de stare,
Ql şi Q2, care se minimizează cu ajutorul diagramelor Karnaugh din figura 2.25.c şi 2.25.d,
rezultând :

Q1| = Q1T + Q1Q2 + Q2T


(2.42)
Q2| = Q1T + Q1Q2 + Q2T

Factorizând expresiile (2.42) se obţine:

( )
Q1| = Q1 T + Q2 + Q2T (2.43.a)
Q |
2 = Q (T + Q ) + Q T
1 2 2 (2.43.b)

Pe baza expresiilor (2.43) se obţine schema logică din figura 2.26. În vederea
reducerii numărului de elemente logice se înlocuieşte variabila Q 2 de la intrarea
elementului 1 cu expresia obţinuta prin negarea expresiei (2.43.b):

(
Q 2 = Q2T ⋅ Q1 Q2 + T ) (2.44)

adică cu conjuncţia ieşirilor elementelor logice 3 şi 5, care se poate realiza aplicând aceste
ieşiri la intrările elementului logic 1, pe baza legii asociativităţii funcţiei logice SI. În
vederea înlocuirii elementului de negare 8, care realizează complementul ieşirii Q|1, se
|
scrie pe baza diagramei Karnaugh din figura 2.25.d, expresia minimă a lui Q1 :
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
132

|
Q1 = Q1T + Q1 Q 2 + Q 2T = Q1 T + Q 2 + Q 2T ( ) (2.45)

U2A
Q1 /Q1 U4A U2A
1 U4A
3 1 1
2 2 3 1
2 4 3
2 Q1' (Z) 2 4 3
Q1' (Z)
2
T /T
U1A U3A
U1A U3A
U7A 1 1
/Q2 Q2 1 1
1 1 3 3 3 2 12 3
7 3 2 2 1 3
13 2
2
U6A /Q2 U6A
U5A 1 U5A 1
U8A 1 3
6 Q2'
1 6 3
1 5 3 2 /Q1 5 3 2 Q2'
8 3 2 2
2
/Q1 /Q2

a. b.
Figura 2.26. Schema logică a unui circuit bistabil de tipul T, asincron.

|
După cum rezultă din această relaţie, funcţia Q1 se poate obţine cu elementele
logice existente în schemă şi anume ea rezultă la ieşirea elementului logic 2, de unde poate
fi aplicată la intrarea elementului 5. În urma acestor modificări se obţine schema logică din
figura 2.26.b) cu numai şase elemente logice SI-NU. Ieşirea acestui circuit, Z, este identică
cu Q1| . Circuitelor din figura 2.26 li se pot adăuga intrări de tipul R şi S la elementele
logice 2, respectiv 4.
Circuitul bistabil de tipul T, asincron, din figura 2.26.b, poate sta la baza proiectării
unui circuit bistabil de tipul T, sincron, care să funcţioneze independent de durata
impulsului de sincronizzare. În acest scop se prevede la intrare un element logic SI-NU,
care realizează funcţia T = H T , unde H este impulsul de sincronizare.
Circuital basculant bistabil de tipul D. Acest circuit basculant bistabil are o intrare notată
cu D, iar starea bistabilului este determinată de starea acestei intrări şi anume starea
următoare este aceeaşi cu a intrării D, independent de starea prezentă a bistabilului. De
obicei intrarerea D este sincronizată, iar circuitul este prevăzut cu intrări asincrone pentru
aducerea în starea 0, respectiv 1. Tabelul caracteristic şi tabelul excitaţiilor pentru bistabilul
D sunt prezentate în tabelul 2.22, respectiv 2.23.
Din tabelul caracteristic rezultă ecuaţia de stare a bistabilului D :

Q| = D (2.46)

TABELUL 2.22. După cum se vede din relaţia (2.46),


TABELUL 2.23.
D Q(t+1) ecuaţia de aplicare a bistabilului se identifiecă
Q(t) Q(t+1) D
0 1 cu ecuaţia intrării, prin urmare ecuaţia intrării
0 0 0
1 1 se obţine minimizând ecuaţia de aplicare.
0 1 1
Pentru realizarea unui bistabil de tip D, sincron,
1 0 0
se poate folosi fie un bistabil RS, fie un bistabil
1 1 1
JK. Pentru determinarea expresiilor intrărilor
acestora, se intocmesc tabelele 2.24, respectiv 2.25.
Din tabelul 2.24 rezultă că forma minimă pentru intrările R şi S este :

R = D şi S = D (2.47)
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
133

iar din tabelul 2.25 rezultă că forma minimă pentru intrările J şi K este :

K=D şi J =D (2.48)

TABELUL 2.4. TABELUL 2.5. Pe baza expresiilor


D Q(t) Q(t+1) R S D Q(t) Q(t+1) J K (2.47) şi (2.48) se obţine
0 0 0 X 0 0 0 0 0 X schema bistabilului D dată în
0 1 0 1 0 0 1 0 X 1 figura 2.27.a, respectiv 2.27b,
1 0 1 0 1 1 0 1 1 X în care bistabilele RS, respectiv
1 1 1 0 X 1 1 1 X 0 JK sunt reprezentate simbolic
printr-un dreptunghi cu
intrările şi ieşirile corespunzătoare.

U2A U1 U2A U3
1 2 Q 1 2 Q
D R Q D K Q
T T
S /Q J /Q
/Q /Q
T T
a. b.
Figura 2.27. Sinteza circuitului bistabil de tipul D.

Circuitele basculante bistabile de tipul ,,stăpân-sclav" (master-slave). În principiu un


bistabil de tipul ,,stăpân-sclav", este format din două circuite basculante bistabile dintre
care primul, denumit ,,stăpân" memoreaza în momentul apariţiei impulsului de
sincronizare starea următoare a bistabilului, iar cel de-al doilea denumit ,,sclav"
memorează pe toată durata impulsului de sincronizare starea prezentă, urmând ca abia
după dispariţia impulsului de sincronizare să treacă în starea în care se gaseşte bistabilul
,;stăpân" care îl comandă. În acest fel se asigură o funcţionare corectă a bistabilului
independent de viteza de reacţie a bistabilului, respectiv de durata impulsului de
sincronizare. Această proprietate este importantă mai ales pentru bistabilele de tipul JK şi
T, dar şi pentru bistabilele RS în cazul folosirii acestora în registre de deplasare cu un
singur tact.

2.8. Exemplificarea sintezei unui circuit logic secvenţial


Pentru exemplificarea sintezei unui circuit logic secvenţial vom parcurge paşii
descrişi în paragraful 2.6.
Vom considera următoarea problemă: să se realizeze un circuit logic secvenţial cu
două intrări x0 şi x1 şi o ieşire z0. Comportarea circuitului este următoarea: starea iniţială a
circuitului (starea iniţială a ieşirii) este zero logic. Dacă la intrare apare secvenţa 10 -> 11 -
> 01 atunci ieşirea va căpăta valoarea unu logic. Următoarea modificare a intrării duce la
trecerea ieşirii în zero logic. Nici o altă secvenţă a semnalelor de intrare nu mai produce
starea unu logic la ieşire.

Pasul 1 (conform paragrafului 2.6).


Se realizează tabelul de tranziţii primar. Acesta are următorul cap de tabel:
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
134

Intrări
Semnificaţia stării Numele stării Ieşire
00 01 11 10

Tabelul de tranziţii primar se completează linie cu linie pe baza descrierii


funcţionării circuitului.
Funcţionarea circuitului începe cu starea iniţială care este de obicei starea în care se
află sistemul după ce a fost cuplat la sursa de alimentare. Această stare o vom numi starea
iniţială şi o vom nota cu Sinit. Pentru starea initială ieşirea va fi zero logic.
Apoi, pentru fiecare combinaţie a variabilelor de intrare, vom analiza evoluţia
circuilului. Confonn descrierii funcţionării circuitului, o singură secvenţă a semnalelor de
intrare poate duce la activarea ieşirii şi prima combinaţie din această secvenţă este 10.
Rezultă că pentru combinaţiile 00, 01 si 11 circuitul va rămâne în starea în care se afla iar
pentru combinaţia 10 el va trece într-o stare nouă. Aceasta este starea în care s-a detectat
prima combinaţie din secvenţă aşa încât o vom numi Detectl.

Intrări
Semnificaţia stării Numele stării Ieşire
00 01 11 10
Starea iniţială SInit SInit SInit SInit Detect1 0
Noua stare Detect1 se adaugă tabelului primar prin adăugarea unei linii
suplimentare şi procesul de mai sus se reia.

Numele Intrări
Semnificaţia stării Ieşire
stării 00 01 11 10
Starea iniţială SInit SInit SInit SInit Detect1 0
S-a detectat începutul
Detect1
secvenţei
Următoarea combinaţie din secvenţă, aplicată la intrare, care va duce la activarea
ieşirii (trecerea în starea unu logic a ieşirii) z0, dacă se completează secvenţa cerută la
intrare 10 -> 11 -> 01, este 11. Asta înseamnă că dacă, aflându-ne în starea Detect1, la
intrare se aplică combinaţiile 00 sau 01, secvenţa rezultată la intrare, pâna în acest moment,
va fi una din următoarele: (10, 00) sau, respectiv (10, 01) care conform specificaţiilor nu
vor putea duce la activarea ieşirii z0. Ca urmare, în aceste două cazuri circuitul va trebui să
se întoarcă în starea iniţială pentru a relua procesul de detecţie a secvenţei corecte. În cazul
în care combinaţia la intrare este 10, rezultă ca aceasta a rămas neschimbată aşa încât
circuitul va rămâne în continuare în starea Detectl aşteptând modificarea secvenţei de
intrare. Circuitul va trece într-o stare nouă doar dacă la intrare se aplică combinaţia 11.
Această nouă stare corespunde detecţiei celei de-a doua combinaţii din secvenţa care
activează ieşirea z0 aşa încât o vom numi Detect2. leşirea circuitului ramâne în continuare
în starea zero logic. Tabelul primar va arăta astfel:

Numele Intrări
Semnificaţia stării Ieşire
stării 00 01 11 10
Starea iniţială SInit SInit SInit SInit Detect1 0
S-a detectat începutul
Detect1 SInit SInit Detect2 Detect1 0
secvenţei
S-a detectat a doua
Detect2
combinaţie din secvenţă
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
135

Raţionând în mod similar rezultă că pentru combinaţiile 00 şi 10 circuitul revine în


starea iniţială, pentru combinaţia 11 circuitul rămâne în starea Detect2 iar pentru
combinaţia 01 circuitul trece într-o stare nouă. Aceasta este starea în care a fost detectată şi
cea de-a treia combinaţie din secvenţa de activare a ieşirii z0 şi ca urmare aceasta va fi
activată. Noua stare o vom numi Detect3. Din această stare circuitul revine în starea iniţială
la oricare din combinaţiile diferite de ultima combinaţie recepţionată, adică 0l.
Cum în această ultimă etapă nu au apărut stări noi, rezultă că procesul determinării
tabelului de tranziţie primar, s-a încheiat. Forma finală a tabelului de tranziţie primar este:

Numele Intrări
Semnificaţia stării Ieşire
stării 00 01 11 10
Starea iniţială SInit SInit SInit SInit Detect1 0
S-a detectat începutul
Detect1 SInit SInit Detect2 Detect1 0
secvenţei
S-a detectat a doua
Detect2 SInit Detect3 Detect2 SInit 0
combinaţie din secvenţă
S-a detectat a treia
combinaţie din secvenţă Detect3 SInit Detect3 SInit SInit 1
(ultima)

Din tabelul de tranziţie primar se obţine imediat tabelul de tranziţie al circuitului:

Intrări (x0x1) Ieşire


Numele stării
00 01 11 10 z0
SInit SInit SInit SInit Detect1 0
Detect1 SInit SInit Detect2 Detect1 0
Detect2 SInit Detect3 Detect2 SInit 0
Detect3 SInit Detect3 SInit SInit 1

Pasul 2.
În această etapă se urmăreşte eliminarea stărilor suplimentare introduse în procesul
de determinare a tabelului de tranziţie a circuitului.
Problema realizării unui circuit secvenţial cu o anumită comportare nu are o soluţie
unică. Se pot construi circuite secvenţiale cu aceeaşi comportare, dar de complexităţi
diferite, respectiv cu preţ de cost diferit. De obicei, dintre circuitele secvenţiale cu aceeaşi
comportare, acela este mai simplu şi realizabil cu o cheltuială mai redusă care are număr
mai mic de stări. Din acest motiv este important să se reducă la minimum numărul stărilor
din diagramă, respectiv tabelul stărilor care descrie comportarea circuitului secvenţial.
Pentru reducerea numărului de stări ale unui circuit secvenţial se caută acele stări
care realizează aceeaşi funcţie, adică nu se poate face distincţie între ieşirile rezultate în
urma aplicării la intrările circuitului aflat în oricare din aceste stări a aceleiaşi secvenţe de
intrări. Aceste stări se numesc echivalente şi pot fi înlocuite printr-o singură stare.
Echivalenţa a două stări se poate defini în felul următor: două stări qi şi qj ale aceluiaşi
circuit secvenţial A1, complet definit sau făcând parte din două circuite secvenţiale complet
definite A1 şi A2 se numesc echivalente, notat qi = qj, dacă pentru orice secvenţă de intrări
de lungime arbitrară aplicată circuitului A1 aflat în starea qi se obţine aceeaşi secvenţă de
ieşiri ca şi la aplicarea aceleiaşi secvenţe circuitului A1, respectiv A2 aflate in starea qj.
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
136

Echivalenţa stărilor unui singur circuit secvenţial complet definit este o relaţie de
echivalenţă; prin urmare este reflexivă, simetrică şi tranzitivă şi împarte mulţimea stărilor
circuilului în clase de echivalenţă disjuncte.
Două circuite secvenţiale Al şi A2 sunt echivalente, notat Al = A2, dacă pentru
fiecare stare qj din A2 există o stare echivalentă qi în A1 şi invers, pentru fiecare stare qi din
Al există o stare echivalentă qj în A2.

Pasul 3.
Stările automatului sunt realizate prin inermediul variabilelor de stare. Cum aceste
variabile pot lua doar două valori, rezultă că pentru n stări vom avea nevoie de cel puţin m
variabile binare, unde 2m ≥ n. În cazul nostru n = 4 aşa încât vom utiliza 2 variabile de stare
pe care le vom nota cu y0 si y1.
Vom alege următoarea codificare a stărilor:
SInit -> y0=0 y1=0
Detectl -> y0=0 y1=l
Detect2 -> y0=1 y1=l
Detect3 -> y0=1 y1=0
În general există n! posibilităţi de codificare a celor n stări.

Pasul 4.
Înlocuind codurile de mai sus în tabelul de tranziţie, obţinem:

x0x1
00 01 11 10 z0
y0y1
00 00 00 00 01 0
01 00 00 11 01 0
11 00 10 11 00 0
10 00 10 00 00 1

Din acest tabel putem obţine diagramele Karnaugh pentru funcţiile de stare Y0, Y1
şi a ieşirii z0, corespunzăoare variabilelor de stare y0 şi y1. Pe baza acestor diagrame
realizăm minimizarea funcţiilor.

Funcţia Y0 Funcţia Y1 Funcţia z0


x0x1 x0x1 x0x1
00 01 11 10 00 01 11 10 00 01 11 10
y0y1 y0y1 y0y1
00 0 0 0 0 00 0 0 0 1 00 0 0 0 0
01 0 0 1 0 01 0 0 1 1 01 0 0 0 0
11 0 1 1 0 11 0 0 1 0 11 0 0 0 0
10 0 1 0 0 10 0 0 0 0 10 1 1 1 1

Expresia funcţiilor obţinute este:

Y0 = x 0 x1 y0 + x0 x1 y1
Y1 = x0 x1 y 0 + x0 x1 y1
z 0 = y0 y1
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
137

Pasul 5.
În această etapă se alege tipul de celule de memorie folosite (tip RS, JK, D,T).

Pasul 6.
Pentru tipul de memorie aleasă se construieşte tabelul de excitaţie care indică
valorile excitaţiilor ce trebuiesc aplicate intrărilor memoriilor pentru a obţine starea
următoare dorită pentru fiecare combinaţie stare actuală-intrare. Aplicand regulile din
paragraful 2.7.2 se obţin următoarele tabele de excitaţii:

Celule de memorie tipul D


D0 D1
x0x1 x0x1
00 01 11 10 00 01 11 10
Q0Q1 Q0Q1
00 0 0 0 0 00 0 0 0 1
01 0 0 1 0 01 0 0 1 1
11 0 1 1 0 11 0 0 1 0
10 0 1 0 0 10 0 0 0 0

Celule de memorie de tipul RS


R0 S0 R1 S1
x0x1 x0x1 x0x1 x0x1
00 01 11 10 00 01 11 10 00 01 11 10 00 01 11 10
Q0Q1 Q0Q1 Q0Q1 Q0Q1
00 X X X X 00 0 0 0 0 00 X X X 0 00 0 0 0 1
01 X X 0 X 01 0 0 1 0 01 1 1 0 0 01 0 0 X X
11 1 0 0 1 11 0 X X 0 11 1 1 0 1 11 0 0 X 0
10 1 0 1 1 10 0 X 0 0 10 X X X X 10 0 0 0 0

Celule de memorie de tipul JK


J0 K0 J1 K1
x0x1 11 x0x1 x0x1 x0x1
00 01 10 00 01 11 10 00 01 11 10 00 01 11 10
Q0Q1 Q0Q1 Q0Q1 Q0Q1
00 0 0 0 0 00 X X X X 00 0 0 0 1 00 X X X X
01 0 0 1 0 01 X X X X 01 X X X X 01 1 1 0 0
11 X X X X 11 1 0 0 1 11 X X X X 11 1 1 0 1
10 X X X X 10 1 0 1 1 10 0 0 0 0 10 X X X X

Celule de memorie de tipul T


T0 T1
x0x1 x0x1
00 01 11 10 00 01 11 10
Q0Q1 Q0Q1
00 0 0 0 0 00 0 0 0 1
01 0 0 1 0 01 1 1 0 0
11 1 0 0 1 11 1 1 0 1
10 1 0 1 1 10 0 0 0 0
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
138

Pasul 7.
Pe baza diagramei Karnaugh şi a tabelelor de excitaţie ale celulelor de memorie
folosite, se obţin expresiile funcţiilor de excitaţie.

Celule de memorie de tipul D

D0 = x 0 x1Q0 + x0 x1Q1
D1 = x0 x1 Q 0 + x0 x1Q1

Celule de memorie de tipul RS

R0 = x1 + x0 Q1
S 0 = x0 x1Q1
R1 = x 0 + x1Q0
S1 = x0 x1 Q 0

Celule de memorie de tipul JK

J 0 = x0 x1Q1
K 0 = x1Q0 + x0 Q1
J1 = x0 x1 Q 0
K1 = x 0 x1 + x1Q0

Celule de memorie de tipul T

T0 = x1Q0 + x0Q0 Q1 + x0 x1 Q1Q1


T1 = x 0Q1 + x1Q0Q1 + x0 x1 Q 0 Q1

Pasul 8.
Funcţia z0 Pe baza tabelului de tranziţie se obţine expresia
x0x1 funcţiei de ieşire. Pentru toate cazurile, funcţia de ieşire
00 01 11 10 depinde numai de starea circuitului şi conform diagramei
Q0Q1
Karnaugh alăturate, va avea expresia:
00 0 0 0 0
01 0 0 0 0
z0 = Q0 Q1
11 0 0 0 0
10 1 1 1 1

Pasul 9.
Pe baza ecuaţiilor determinate la paşii 8 şi 9 se trasează schema logică a circuitului
care materializează funcţiile de excitaţie şi cele de ieşire la care se adaugă şi celulele de
memorie corespunzătoare. Schemele logice sunt date mai jos pentru fiecare tip de celulă de
memorie.
2ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
139

Celule de tip D

X0

1
1 2 2 12 1 D0
13 3
2 D Q

X1 /Q 1
1 3
2 12 1 D1 2 Z0
1 2 13 3
2 D Q

/Q
1
2 12
13

Celule de tip RS

1 R0
1 3
X0 3 2 R Q
2 S0
S /Q
1 2 1
3
1 2 Z0
2 12
13

X1
1 R1
1 3
1 2 3 2 R Q
2 S0
S /Q

1
2 12
13

Celule de tip JK

X0 1 J0
2 12
13 J Q
K0
1 2
1 K /Q
31
2 3
2
1
X1 1 3
3 2 Z0
2

1 2
1 J1
2 12
13 J Q
K1
1 K /Q
3 1
2 3
2

1
3
2
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
140

Celule de tipul T

1
3
2

X0
1 T0
2 12
1 2 13 T Q

/Q

X1
1
3
2 Z0
1
3 7408
2
1 2

1 T1
2 12
13 T Q

/Q

2.9. Analiza circuitelor logice secvenţiale asistată de calculator


Vom prezenta succint, în continuare, analiza circuitelor logice secvenţiale cu
ajutorul pachetului de programe OrCAD bazându-ne pe cele arătate în paragraful 1.6, cu
ajutorul limbajului Verilog, bazându-ne pe cele arătate în paragraful 1.7.2 şi cu ajutorul
limbajului VHDL bazându-ne pe cele arătate în paragraful 1.7.3.

2.9.1. Simularea circuitelor logice secvenţiale cu ajutorul aplicaţiei OrCAD

Pentru simularea unui circuit basculant bistabil construit cu circuite logice


SAU-NU vom construi în aplicaţia OrCAD Capture schema electrică din figura 2.28. Se
va face verificarea circuitului cu ajutorul opţiunii Design Rules Check (din meniul Tools)
şi după realizarea profilului de simulare similar cu cel prezentat în figura 2.29, se trece la
simularea circuitului.

OFFTIME = .5uSR U1A


ONTIME = .5uS CLK 2
DELAY = 0 1
Q
STARTVAL = 0 V
3
OPPVAL = 1 V
74LS02

U2A
2
OFFTIME = 1uS S 1
/Q
ONTIME = 1uS CLK 3
DELAY = 0 V
STARTVAL = 0 V
74LS02
OPPVAL = 1

Figura 2.28. Circuitul pentru simularea


unui circuit basculant bistabil realizat cu
porţi SAU-NU.

Figura 2.29. Profilul de simulare.


2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
141

Rezultatul simulării este prezentat în figura 2.30.

Figura 2.30. Rezultatul simulării bistabilului RS realizat cu porţi SAU-NU.

Se propune ca temă explicarea formelor de undă din figura din figura 2.30.
Următorul exemplu se referă la circuitul basculant bistabil realizat cu porţi ŞI-NU.
Se realizează în aplicaţia OrCAD Capture schema electrică din figura 2.31.

OFFTIME = .5uS/S U3A U1A


ONTIME = .5uS CLK 1 2 1
DELAY = 0 3
7404 Q
STARTVAL = 0 V
2
OPPVAL = 1 V
7400

U2A
1
OFFTIME = 1uS /R U4A 3
ONTIME = 1uS CLK
DELAY = 0
1
7404
2 2
/Q

V
Figura 2.32. Rezultatul simulării circuitului din
figura 2.31.
STARTVAL = 0 V
7400
OPPVAL = 1

Figura 2.31. Bistabil RS cu porţi ŞI-NU

Se vor compara formele de undă din figura 2.30 cu cele din figura 2.32.
Simularea funcţionării unui circuit basculant bistabil sincron de tipul JK se va face
cu ajutorul circuitului din figura 2.33 iar rezultatul simulării este arătat în figura 2.34.
OFFTIME = 10mS J
ONTIME = 10mS CLK
DELAY = 0
STARTVAL = 0 V
OPPVAL = 1
U4A
OFFTIME = 5msS T 14 12
ONTIME = 5msS CLK J Q Q
DELAY = 0 1 V
STARTVAL = 0 CLK
V
OPPVAL = 1 3 13
CLR

K Q /Q
V
OFFTIME = 20msS
ONTIME = 20msSCLK
K 74LS73A
Figura 2.34. Rezultatul simulării bistabilului de tip
2

DELAY = 0
STARTVAL = 0
OPPVAL = 1
V
HI
JK
Figura 2.33. Schema de simulare a unui
circuit basculant bistabil de tipul JK.
În cazul simulării circuitelor
electronice care conţin circuite
basculante bistabile, cu ajutorul
aplicaţiei Orcad PSpice AD, se
efectuează aceeaşi paşi ce cei descrişi
în paragraful 1.6. În plus, se poate
stabili starea iniţială (la începutul
simulării) a circuitelor basculante
bistabile. Această stare iniţială se
stabileşte în profilul de simulare, aşa
cum este arătat în figura 2.35.
Pentru aceasta, se selectează din
meniul PSpice aflat în bara principală a
aplicaţiei OrCAD Capture, opţiunea de
Figura 2.35. Stabilirea stării iniţiale a bistabililor. creare a unui profil de simulare: New
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
142

Simulation Profile sau opţiunea de editare a unui profil de simulare existent: Edit
Simulation Profile, după caz. În fereastra apărută, selectăm Options, de aici Gate-level
Simulation şi apoi pentru Initialize all flip-flops to selectăm valoarea zero aşa cum se
arată în figura 2.35. Starea iniţială a bistabilelor poate fi zero, unu sau oarecare
(simbolozată cu X).

2.9.2. Simularea circuitelor logice secvenţiale cu ajutorul Verilog HDL

U1 Pentru simularea circuitelor logice secvenţiale cu


D D Q Q ajutorul limbajului Verilog vom folosi aplicaţia Silos
CK CK QN /Q descrisă în paragraful 1.7.2.2. Se va simula un latch de tip D
Figura 2.36. Latch D (figura 2.36) care memorează datele prezentate la intrarea D
sincron. la comanda semnalului de tact Ck.
Programul Latch D_module.v în limbaj Verilog ce
descrie funcţionarea circuitului latch D sincron, este prezentat în exemplul 36.

EXEMPLUL 36.

// Modul latch D

module D (Ck, D, Q, QN);


input Ck;
input D;
output Q;
output QN;

assign Q = Ck ? D : Q;
assign QN = Ck ? ~D : QN;

endmodule

Structura fişierului de test Test Bench, numit Latch D_TB.v este prezentată în
exemplul 37.

EXEMPLUL 37.

//TestBench pentru modulul latch D

`timescale 1 ns/1ns

module Test ();

reg D;
wire Q, QN;
reg Ck;

D DUT(.Ck(Ck), .D(D), .Q(Q), .QN(QN));


2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
143

initial
begin
Ck = 0;
D = 0;
#5 D = 1;
#30 D = 0;
#2 D = 1;
#8 D = 0;
$finish;
end
always #10 Ck <= ~Ck;
endmodule

Rezultatul simulării este prezentat în figura 2.37.

Figura 2.37. Rezultatul simulării latch-ului D sincron.

2.9.3. Simularea circuitelor logice secvenţiale cu ajutorul VHDL

Pentru simularea circuitelor logice secvenţiale cu ajutorul VHDL vom folosi


programul ModselSim (varianta SE PLUS 5.7f) descrisă în paragraful 1.7.2.2.
Se construiesc fişierele pentru modelarea latch-ului D, Latch_D.vhd conform
exemplului 37 şi pentru testarea latch-ului, test_Latch_D.vhd, conform exemplului 38.

EXEMPLUL 37.

-- Entitatea
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;

ENTITY D_latch IS
PORT(Ck, D: IN std_logic;
Q, QN: OUT std_logic);
END D_latch;

-- Arhitectura
ARCHITECTURE Comportament OF D_latch IS
BEGIN
Latch: PROCESS(Ck, D)
BEGIN
IF (Ck='1') THEN
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
144

Q <= D;
QN <= Not D;
END IF;
END PROCESS;
END Comportament;

EXEMPLUL 38.

-- Entitatea de test
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;

ENTITY Test IS
END Test;

-- Arhitectura asociat'a entit'a'tii de test


ARCHITECTURE Test OF Test IS
SIGNAL D, Q, Qn: std_logic;
SIGNAL Ck: std_logic := '0';

COMPONENT Dcomp
PORT(Ck, D: IN std_logic;
Q, QN: OUT std_logic);
END COMPONENT;

FOR ALL: Dcomp USE ENTITY WORK.D_latch(Comportament);

BEGIN

DUT: Dcomp PORT MAP(Ck, D, Q, QN);

Ck <= Not Ck AFTER 10 ns;


D <= '0', '1' AFTER 5 ns, '0' AFTER 35 ns, '1' AFTER 37 ns, '0' AFTER 45 ns;

END Test;

Rezultatul simulării este prezentat în figura 2.38.

Figura 2.38. Rezultatul simulării latch-ului D.


2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
145

Seminar
Seminar 1
1.1. Cu ajutorul tabelelor de adevăr se vor verifica teorema absorbţiei (relaţia 0.11 din
curs) şi teorema de Morgan (relaţia 0.12 din curs).

1.2. Se consideră forma canonică normal disjunctivă a unei funcţii:

f3 = P1 + P3 + P5 + P7 (s.1)

să se construiască tabelul de adevăr al acestei funcţii şi forma canonică normal


conjunctivă.

1.3. Se consideră funcţia:

f4 = x3x1 + x2x0 (s.2)

Să se construiască tabelul de adevăr al funcţiei şi să se scrie forma normal disjunctivă.

1.4. Să se arate că pentru forma canonică disjunctivă a unei funcţii oarecare:

Pi ⋅ Pj = 0 pentru i ≠ j (s.3)

[teorema1, relaţia (0.21), pagina 14 din curs].

1.5. Să se arate că pentru forma canonică disjunctivă a unei funcţii oarecare:

Si + Sj = 1 pentru i ≠ j (s.3)

[teorema2, relaţia (0.22), pagina 14 din curs].

1.6. Să se demonstreze cu ajutorul axomelor si teoremele algebrei binare că relaţia:

xy = x ⋅ x y (s.4)

este adevărată.
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
146

Rezolvare

( )
x ⋅ x y = x ⋅ x + y = x x + xy = xy

1.7. Se consideră circuitul logic din figura s.1. Să se analizeze dacă acest circuit este
combinaţional. U1A
1
x0 3
2
x1 U3A
7408 1
2 12
x2 13 y0
U2A 7427
1
x3 3
2

7408

Figura s.1.

Rezolvare
U1A Se constată uşor că numerotarea reţelei
x0
1
3 A conform regulii 1.1 din curs (pagina 19) nu
2
x1
7408 1
U3A
este posibilă deci vom studia dacă această
x2
2
13
12
y0 reţea este combinaţională. Pentru aceasta se
1
U2A 7427 introduce variabila secundară xa şi se
x3
2
3

B
studiază influenţa acestei variabile, cu
xa 7408 ajutorul tabelului de adevăr, asupra ieşirii y0.
Figura s.2. În orma construirii tabelului de adevăr se
constată că ieşirea y0 depinde de variabila xa
şi deci circuitul nu este combinaţional.

1.8. Să se construiască folosind numai porţi ŞI-NU (NAND) circuitul logic secvenţial a
cărui ecuaţie logică a ieşirii este:

y0 = x3 x0 + x 2 x1

Rezolvare

Folosind teorema De Morgan, obţinem:

y0 = x3 x0 ⋅ x2 x1

inversorul se va construi cu ajutorul unei porţi ŞI-NU cu toate intrările legate între ele (se
va studia şi exemplul de la pagina 28, figura 1.9 din curs).

1.9. Circuitul obţinut la problema 1.8 reprezintă un arbore boolean? Dacă răspunsul este
afirmativ atunci se va face analiza acestui circuit conform metodei descrise în curs la
pagina 23 din curs.

1.10. Se va întocmi un program în limbajul C++ conform modelului de la pagina 25 din


curs pentru verificarea ecuaţiei obţinute la problema 1.9.
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
147

Seminar 2
2.1. Se dă circuitul din figura s.3.

1
x0 3 1
2 3
x1 2
1
3 1
2 3
2

1 1
x2 3 1 3
2 3 2 y0
x3 2 1
1 3
3 2
2

Figura s.3.

Să se analizeze dacă circuitul este combinaţional şi dacă răspunsul este afirmativ să se scrie
ecuaţia funcţiei de ieşire y0 şi să se realizeze un program pentru verificarea funcţiei
obţinute.

Rezolvare

Circuitul nu poate fi numerotat conform regulii 1.1 din curs. Se trece la analiza circuitului.

1
x0 3 1
2 1 3
x1 a 2 5
1 e
3 1
2 3 3
c 2
h
1 1
x2 3 1 3
2 2 3 2 y0
x3 b xa ? 1
1 f 3
3 2
2 4 g
d
Figura s.4.

Se introduce variabila xa şi se studiază dacă ieşirea depinde de aceasta. Pentru aceasta se


realizează tabelul de adevăr ca în figura s.5.
Acest tabel poate fi realizat, pentru a simplifica munca, în Microsoft Excel din
pachetul de programe Microsoft Office. În primele coloane: A, B, C, D, E se introduc
variabilele: xa, x3, x2, x1 şi x0. În coloanele F pâna la N inclusiv, rândul doi, se introduc
formulele:
- coloana F: =IF(NOT(D2 * E2);"1";"0")
- coloana G: =IF(NOT(B2 * C2);"1";"0")
- coloana H: =IF(NOT(E2 * G2);"1";"0")
- coloana I: =IF(G2 * B2;"1";"0")
- coloana J: =IF(NOT(F2 * H2);"1";"0")
- coloana K: =IF(H2+A2;"1";"0")
- coloana L: =IF(I2 * K2;"1";"0")
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
148

- coloana M: =IF(NOT(J2 * L2);"1";"0")


- coloana N: =IF(NOT(L2*M2);"1";"0")
Apoi formulele se extind şi pe celelalte coloane prin tehnica copy-paste.

Figura s.5.

Se observă din tabel că funcţia de ieşire y0 nu depinde de variabila xa şi deci circuitul este
combinaţional.
Pentru a scrie ecuaţia de ieşire se poate determină succesiv:

a = x1 x0
b = x3 x2
c = bx0 = x3 x2 x0
d = bx3 = x3 x2 x3

e = ac = x1 x0 x3 x2 x0
f = c + xa = x3 x2 x0 + xa
(
g = df = x3 x2 x3 x3 x2 x0 + xa )
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
149

( )
h = ge = x3 x2 x3 x3 x2 x0 + xa x1 x0 x3 x2 x0

( ) ( )
y0 = gh = x3 x2 x3 x3 x2 x0 + xa x3 x2 x3 x3 x2 x0 + xa x1 x0 x3 x2 x0

Pentru ca funcţia de ieşire nu depinde de variabila xa putem scrie:

y0 = x3 x2 x3 x3 x2 x0 x3 x2 x3 x3 x2 x0 x1 x0 x3 x2 x0

2.2. Se dau funcţiile:


1) f4 = P0 + P2 + P3 + P4 + P5 + P6 + P7 + P8 + P9 + P13;
2) f4 = P0 + P1 + P2 + P3 + P5 + P7 + P9 + P11 + P12 + P13.
Să se obţină forma minima a acestor funcţii prin metoda tabelelor Karnaugh şi prin metoda
Quine Mc Kluskey. Formele minime vor fi verificate cu ajutorul programului următor:

program vizualizare_clc_4_variabile;

label
01,02;

type
tstr=string[8];

var
termeni:array[0..15] of tstr;
y,a,b,c,d,n,m,u:byte;
mes:tstr;

procedure eval_term(a,b,c,d:byte;termeni:tstr;var u:byte);


var
n,m:byte;
begin
u:=0;

if termeni='' then exit;


m:=pos('a',termeni);
if m<>0 then
begin
if m<>1 then
begin
if termeni[m-1]='/' then
begin
if not a = 254 then exit;
end
else
if a=0 then exit;
end
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
150

else
if a=0 then exit;
end;
m:=pos('b',termeni);
if m<>0 then
begin
if m<>1 then
begin
if termeni[m-1]='/' then
begin
if not b = 254 then exit;
end
else
if b=0 then exit;
end
else
if b=0 then exit;
end;
m:=pos('c',termeni);
if m<>0 then
begin
if m<>1 then
begin
if termeni[m-1]='/' then
begin
if not c = 254 then exit;
end
else
if c=0 then exit;
end
else
if c=0 then exit;
end;
m:=pos('d',termeni);
if m<>0 then
begin
if m<>1 then
begin
if termeni[m-1]='/' then
begin
if not d = 254 then exit;
end
else
if d=0 then exit;
end
else
if d=0 then exit;
end;
2 ANALIZA ŞI SINTEZA DISPOZITIVELOR NUMERICE
151

u:=1;
end;

begin
02:
for a:=0 to 15 do
termeni[a]:='';
writeln('Introduceti termenii functiei:');
for a:=0 to 15 do
begin
readln(mes);
if mes='' then goto 01;
termeni[a]:=mes;
end;
01:
n:=0;
for d:=0 to 1 do
for c:=0 to 1 do
for b:=0 to 1 do
for a:=0 to 1 do
begin
y:=0;
for m:=0 to 15 do
begin
eval_term(a,b,c,d,termeni[m],u);
y:=y or u;
end;
writeln('P',n,' ',d,c,b,a,'---','f4=',y);
n:=n+1;
end;
readln(mes);
if mes='q' then exit;
goto 02;
end.

După lansarea programului se introduc pe rând termenii funcţiei sub forma: a,b,c,d,
termenii direcţi (a fiind termenul de rang minim: 20 şi d termenul de rang maxim: 23 ) si /a,
/b, /c, /d termenii negaţi. După scrierea fiecărui termen se apasă tasta "ENTER". La
terminarea introducerii se mai apasă o dată tasta "ENTER" şi pe ecran va fi afişat
răspunsul funcţiei introduse.
Dacă raspunsul funcţiei minimizate coincide cu funcţia canonică înseamnă că
minimizarea s-a făcut corect.

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