Sunteți pe pagina 1din 9

Proiectarea sumatoarelor binare

Un alt circuit logic combinațional simplu și


foarte util, care poate fi construit folosind doar
câteva porți logice de bază şi care îi permite să
adune împreună două sau mai multe numere binare,
este Sumator Binar.

Un Sumator Binar elementar poate fi realizat din porți standard AND și Ex-OR, permițându-ne
să "adăugăm" împreună două numere binare de un singur bit, A și B.

Adăugarea acestor două cifre produce o ieșire numită SUM și a doua ieșire numită bitul CARRY
sau Carry-out (COUT) în conformitate cu regulile pentru adăugarea binară. Una dintre principalele
utilizări Sumatorului Elementar constă în circuitele aritmetice și de numărare.

(Augen
123 A d)
+ (Adden
B d)
789
SU
912
M

Din lecțiile de matematică de la școală, am aflat că fiecare coloană de numere este adăugată
împreună pornind de la partea dreaptă, și că fiecare cifră are o valoare ponderată în funcție de
poziția sa în coloană.
Când fiecare coloană este adăugată împreună, se generează un transfer dacă rezultatul este mai
mare sau egal ca 10 (numărul de bază). Aceast transfer este apoi adăugat la rezultatul adăugării
următoarei coloane în stânga și așa mai departe.
La sumarea numerilor binare stă exact aceeași idee ca și pentru sumarea numerelor zecimale, dar
de această dată transportul este generat doar atunci când rezultatul în orice coloană este mai mare
sau egal cu "2" (numărul de bază binar). Cu alte cuvinte, 1 + 1 creează un bit de transport.

Adăugarea binară a doi biți

0 0 1 1
+ + +
+1
0 1 0
(carry) 1
0 1 1
←0

Când doi biți unici, A și B sunt sumaţi împreună, sumarea a "0 + 0", "0 + 1" și "1 + 0" duce la
"0", sau la "1"; la coloana finală cu "1 + 1" suma este egală cu "2". Insă numărul 2 nu există în
binar, 2 în binar este egal cu 10, cu alte cuvinte un zero pentru suma plus un bit suplimentar de
transport.
Schema bloc Semi-Sumatorului binar

Pentru problema simplă de mai sus de sumare de un bit, bitul de transport rezultat poate fi
ignorat. Este posibil să fi observat altceva în ceea ce privește adăugarea acestor două biți: suma
adăugării lor binare seamănă cu cea a unei Porți Exclusive-OR. Dacă etichetăm cele două biți ca A
și B, atunci tabelul de adevăr rezultant este suma celor doi biți dar fără transport final.
Intrare cu 2 intrări exclusiv-OR

Symbol Truth Table

B A S

0 0 0

0 1 1

2-input Ex-OR Gate 1 0 1

1 1 0

Putem observa din tabelul adevărului de mai sus că poartă de OR exclusiv produce "1" atunci
când numai una dintre intrări au "1" logic, şi intrari nu sunt egale, fix ca şi la semisumatorul
elementar. Cu toate acestea, pentru a efectua sumarea a două numere, microprocesoarele și
calculatoarele electronice necesită biți suplimentari de transmisie pentru a calcula corect ecuațiile,
astfel încât trebuie să rescriem sumarea anterioară pentru a include două biți de date de ieșire așa
cum se arată mai jos.

00 00 01 01
+ 00 + 01 + 00 + 01
00 01 01 10

Din ecuațiile de mai sus știm acum că o poartă Exclusive-OR va produce la ieșire "1" când intrarea
numai o singură intrare este la livel logic "1", deci avem nevoie de o ieșire suplimentară pentru a
genera bitul de transport când ambele intrări A și B sunt la în stare de "1" logică. O poartă digitală
care respectă aceste cereri, care produce la ieșire "1" când ambele intrări A și B sunt "1" este
standartă ”Şi”.
Poartă Şi cu doua întrări

Symbol Truth Table

B A C

0 0 0

0 1 0

2-input AND Gate 1 0 0

1 1 1

Prin combinarea porților Exclusive-OR cu poarta AND primim un simplu circuit numeric binar
digital cunoscut sub numele de semisumator.

Circuit semisumator
Un semisumator este un circuit logic care efectuează o operație de sumare intre două numere binare.
Semisumator generează o sumă și o valoare de transfer, în format binar.

Symbol Truth Table

SU
B A CARRY
M

0 0 0 0

0 1 1 0

1 0 1 0

1 1 0 1

Din tabelul de adevăr a semisumatorului se poate observa că ieșirea SUM (S) este rezultatul porții
Exclusive-OR, iar ieșirea (Cout) este rezultatul porții AND.

Pentru SUM bit:

SUM = A XOR B = A ⊕ B

Pentru CARRY bit:

CARRY = A AND B = A.B


Un dezavantaj major al circuitului semisumator se observă când este folosit ca un sumator binar
complet, si constă în fapt că nu există nicio prevedere pentru un "Carry-in" din circuitul precedent
când se adună împreună biți de date multiple.

De exemplu, să presupunem că dorim să sumăm împreună doi octeți de date de 8 biți, orice bit de
transport rezultat ar trebui să fie capabil să se deplaseze prin biți pornind de la bitul cel mai puțin
semnificativ (LSB). Cea mai complicată operație pe care le poate face semisumator este "1 + 1", şi,
din cauză ca semisumatorul nu are intrare pentru transport, valoarea rezultantă va fi incorectă. O
modalitate simplă de a depăși această problemă este de a folosi un circuit de sumare binară de tip
Full Adder (Sumator elementar).

Sumator elementar

Diferență principală dintre sumator elementar și semisumatr este că sumator elementar are trei
intrări. Două intrări de date de un bit, A și B, ca mai înainte, plus o intrare suplimentară Carry-in (C-
in) pentru a primi transport dintr-o etapă anterioară, după cum se arată mai jos.

Diagrama completă sumatorului elementar

Sumatorul elementar poate fi considerat ca două sumatoare elementare conectate împreună, unde
primul semisumator transmite transportul generat la următorul semisumator:

Deoarece circuitul de mai sus este facut două jumătăți adiacente conectate împreună, tabelul de
adevăr pentru întregul sumator cuprinde o coloană suplimentară pentru a ține cont de intrarea Carry-
in, precum și de ieșirea sumară, S și Carry-out.

Pentru SUM (S) bit:

SUM = (A XOR B) XOR Cin = (A ⊕ B) ⊕ Cin

Pentru CARRY-OUT (Cout) bit:

CARRY-OUT = A AND B OR Cin(A XOR B) = A.B + Cin(A ⊕ B)


Symbol Truth Table

C- Su
B A C-out
in m

0 0 0 0 0

0 0 1 1 0

0 1 0 1 0

0 1 1 0 1

1 0 0 1 0

1 0 1 0 1

1 1 0 0 1

1 1 1 1 1

Sumatorul cu calcul transportului inlanţuit:

Un dezavantaj principal al "cascadării" împreună a sumatoarelor de 1 bit pentru a adăuga numere


mari binare este că, dacă intrările A și B se schimbă, suma la ieșirea sa nu va fi validă până când
toate intrările Cin nu au primit valorile lor corecte, deoarece MSB (cel mai semnificativ bit) al
sumei trebuie să aștepte orice modificare de la intrarea a LSB (bit mai puțin semnificativ). În
consecință, va exista o întârziere finită înainte pînă cînd ieșirea va răspunde la oaricăre modificăre a
intrărilor sale, rezultând o întârziere acumulată.

Atunci când mărimea biților care sunt adăugați nu este prea mare, de exemplu, 4 sau 8 biți sau
viteza de utilizare sumatorului nu este importantă, această întârziere poate să nu fie importantă. Cu
toate acestea, atunci când mărimea biților este mai mare, de exemplu 32 sau 64 de biți folosiți în
sumatoare de multi-bit , sau suma este necesară la o viteză foarte mare, această întârziere poate
deveni definitiv de mare şi procesele de sumare pot să nu fie completate corect.

O soluție este de a genera semnalele de Cin, utilizind valori de A și B mai degrabă decât folosind
transportul inlănţuit de mai sus. Această abordare aduce un alt tip de circuit de sumare binară, numit
Sumator binar cu calcul transportului inlănţuit (CTA, Carry Look Ahead), unde viteza sumatorului
paralel poate fi îmbunătățită considerabil folosind o logică de CTA.

Avantajul CTA, este în aceea că lungimea timpului de calcul valorii sumei este independent de
numărul de biți de date utilizați în sumare.

Sumatorul cu calcul transportului anticipat.

Descrierea în cod Verilog Sumatorului elementar:

module sumEl(SlagA,SlagB,Cin,SummaOut,Cout);
input SlagA,SlagB;
input Cin;
output SummaOut;
output Cout;
assign SummaOut = SlagA^SlagB^Cin;
assign Cout = (SlagA&SlagB)^(SlagA^SlagB)&Cin;
endmodule

TestBench sumatorului elementar

module sumEl_TB();
parameter wordlength = 1;
reg [wordlength-1:0] A;
reg [wordlength-1:0] B;
reg Cin;
reg [wordlength:0] AB;
wire [wordlength-1:0] Sout;
wire Cout;
sumEl DUT(A,B,Cin,Sout,Cout);

initial
begin
$monitor("A=%b, B=%b, Cin=%b, SumMod=%b, CoutMod=%b, ControlSum=%b",
A,B,Cin,Sout,Cout,AB);
end

always
begin
#10;
A=$random;
B=$random;
Cin=$random;
AB=A+B+Cin;
end

endmodule

Rezultatul sintezei sumatorului elementar

Descrierea în cod Verilog Sumatorului cu calcul transportului inlanţuit:

module sum4b(A,B,Cin, Sout, Cout);


input [3:0] A,B;
input Cin;
output [3:0] Sout;
output Cout;
wire [3:0] Cbus;
SumE S0(A[0], B[0], 1'b0, S[0], Cbus[0]);
SumE S1(A[1], B[1], Cbus[0], S[1], Cbus[1]);
SumE S2(A[2], B[2], Cbus[1], S[2], Cbus[2]);
SumE S3(A[3], B[3], Cbus[2], S[3], Cout);
endmodule
TestBench modulului sumatorului cu calcul transportului inlanţuit
module comSum_TB();
parameter wordlength = 4;
reg [wordlength-1:0] A;
reg [wordlength-1:0] B;
reg Cin;
reg [wordlength:0] AB;
wire [wordlength-1:0] Sout;
wire Cout;

comSum DUT(A,B,Cin,Sout,Cout);

initial
begin
$monitor("A=%b, B=%b, Cin=%b, SumMod=%b, CoutMod=%b, ControlSum=%b",
A,B,Cin,Sout,Cout,AB);
end

always
begin
#10;
A=$random;
B=$random;
Cin=$random;
AB=A+B+Cin;
end

endmodule

Descrierea in Verilog Modulului de calcul transportului anticipat

module CLA(A,B,Cin,C);
parameter wordlength = 4;
input [worldlength:0] A,B;
input Cin;
output [worldlength:0] C;

assign P[0]=0;
assign G[0]=0;
assign P[1]=A[1]^B[1];
assign G[1]=A[1]&B[1];
assign P[2]=A[1]^B[1];
assign G[2]=A[1]&B[1];
assign P[3]=A[1]^B[1];
assign G[3]=A[1]&B[1];
assign P[4]=A[1]^B[1];
assign G[4]=A[1]&B[1];
assign C[0] = Cin;
assign C[1] = P[1]*Cin+G[1];
assign C[2] = P[2]*C[1]+G[2];
assign C[3] = P[3]*C[2]+G[3];
assign C[4] = P[4]*C[3]+G[4];
module sum4bCLA(A,B,Cin, Sout, Cout);
input [3:0] A,B;
input Cin;
output [3:0] Sout;
output Cout;
wire [3:0] Cbus;
CLA C0(A, B, Cin Cbus);
SumE S0(A[0], B[0], Cbus[0], S[0], 1'bz);
SumE S1(A[1], B[1], Cbus[1], S[1], 1'bz);
SumE S2(A[2], B[2], Cbus[2], S[2], 1'bz);
SumE S3(A[3], B[3], Cbus[3], S[3], 1'bz);
endmodule

Mersul lucrarii
1. Descriti în Verilog Sumator elementar;
2. Descriţi în Verilog TestBench pentru sumator elementar;
3. Sintetizaţi sumator elementar;
4. Descriti în Verilog Sumator cu calcul transportului inlanţuit;
5. Descriţi în Verilog TestBench pentru Sumator cu calcul transportului inlanţuit;
6. Sintetizaţi Sumator cu calcul transportului inlanţuit;
7. Descriti în Verilog Sumator cu calcul transportului anticipat;
8. Descriţi în Verilog TestBench pentru Sumator cu calcul transportului anticipat;
9. Sintetizaţi Sumator cu calcul transportului anticipat;

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