structura și organizarealuci/soc/soc_03.pdfÎn formula de mai sus semnul minus se referă la...
TRANSCRIPT
Structura și Organizarea Calculatoarelor
Titular:
BĂRBULESCU Lucian-Florentin
Chapter 3
ADUNAREA ȘI SCĂDEREA
NUMERELOR BINARE CU SEMN
3/5/2019 SOC_03 2018-2019 3
CONȚINUT
Adunarea FXP în cod direct
Sumator FXP în cod direct
Scăderea FXP în cod direct
Sumator/Scăzător FXP în cod direct
Adunarea FXP în cod complement față de 2
Scăderea FXP în cod complement față de 2
Sumator/Scăzător FXP în cod complement față de 2
3/5/2019 SOC_03 2018-2019 4
ADUNAREA FXP ÎN COD DIRECT
Se consideră operanzii 0|A|<1 și 0|B|<1 reprezentați în cod direct.
Rezultatul este 0|S|<1, în același format ca A și B.
Dacă se obține|S|>1 atunci apare o depășire de format ce trebuie semnalată ca eroare.
O caracteristică importantă a operațiilor cu numere reprezentate în cod direct este aceea că bitul de semn se generează separat deoarece bitul de semn nu are pondere.
3/5/2019 SOC_03 2018-2019 5
ADUNAREA FXP ÎN COD DIRECTDiagrama bloc a unui sumator binar pentru numere FXP cu
semn reprezentate în cod direct
Unde
/ sumator/scăzător binar pentru numere fără semn;
OBG circuit generare bit depășire (Overflow);
SBG circuit generare bit semn;
IOG circuit generare semnal intern selecție operație.Pentru detalii vezi slide 13
3/5/2019 SOC_03 2018-2019 6
ADUNAREA FXP ÎN COD DIRECTCazul I: A0 și B0
Operanzii vor fi deci reprezentați ca A=0,|A| și B=0,|B|
Deci S=A+B=0,|S|
Deoarece numerele au același semn, pentru anumite cazuri poate să apară depășire (Overflow). Așadar există două sub-cazuri:
0|A|+|B|<1
În acest caz Overflow = 0 și rezultatul este reprezentat corect in cod direct
|A|+|B| 1
Rezultatul nu poate fi reprezentat în formatul dorit. Se va genera eroare de depășire (Overflow = 1)
Bitul de semn nu are relevanță.
Observație! În ambele sub-cazuri operația internă este identică cu operația externă!
3/5/2019 SOC_03 2018-2019 7
ADUNAREA FXP ÎN COD DIRECTCazul II: A 0 și B 0
Operanzii sunt reprezentați ca A=0,|A| și B=1,|B|
Deoarece suma a două numere cu semne diferite este mai mică decât fiecare din numere, este evident că nu se va obține niciodată o eroare de depășire (Overflow = 0).
În funcție de semnul rezultatului apar două sub-cazuri:
|A| |B|
Bitul de semn al sumei este Ss=0, deci rezultatul este pozitiv.
În acest caz |S|=|A|-|B|, iar rezultatul este reprezentat corect în cod direct.
|A|<|B|
Rezultatul este negativ, deci Ss=1.
Se obține |S|=|B|-|A|=-(|A|-|B|)=1-(|A|-|B|)=
Rezultatul este corect dar este reprezentat in cod complement față de 2 și va trebui convertit in cod direct.
Observație! În ambele sub-cazuri operația internă este diferită de operația externă!
|B||A|
Acest bit 1 nu este reprezentat fizic deoarece este în afara formatului.
3/5/2019 SOC_03 2018-2019 8
ADUNAREA FXP ÎN COD DIRECTCazul III: A 0 și B 0
Operanzii sunt reprezentați ca A=1,|A| and B=0,|B|
Deoarece suma a două numere cu semne diferite este mai mică decât fiecare din numere, este evident că nu se va obține niciodată o eroare de depășire (Overflow = 0).
În funcție de semnul rezultatului apar două sub-cazuri:
|A| |B|
Bitul de semn al sumei este Ss=1 , deci rezultatul este negativ.
În acest caz |S|=|A|-|B|, iar rezultatul este reprezentat corect în cod direct.
|A|<|B|
Rezultatul este pozitiv, deci Ss=0.
Se obține |S|=|B|-|A|=-(|A|-|B|)=1-(|A|-|B|)=
Rezultatul este corect dar este reprezentat in cod complement față de 2 și va trebui convertit in cod direct.
Observație! În ambele sub-cazuri operația internă este diferită de operația externă!
|B||A|
Acest bit 1 nu este reprezentat fizic deoarece este în afara formatului.
3/5/2019 SOC_03 2018-2019 9
ADUNAREA FXP ÎN COD DIRECTCazul IV: A < 0 și B < 0
Operanzii sunt reprezentați ca A=1,|A|și B=1,|B|
Deoarece suma a două numere negative este un număr negativ, aceasta poate fi reprezentată ca S=A+B=1,|S|. În acest caz poate să apară o eroare de depășire.
Se analizează două sub-cazuri:
0 |A|+|B|< 1
În acest caz |S|=|A|+|B|, Overflow = 0 și rezultatul este reprezentat corect in cod direct. Bitul de semn al sumei este Ss=1
|A|+|B| 1
Rezultatul nu poate fi reprezentat în formatul dorit. Se va genera eroare de depășire (Overflow = 1)
Bitul de semn nu are relevanță.
Observație! În ambele sub-cazuri operația internă este identică cu operația externă!
3/5/2019 CSO_03 2018-2019 10
ADUNAREA FXP ÎN COD DIRECTExemple:
3/5/2019 SOC_03 2018-2019 11
ADUNAREA FXP ÎN COD DIRECTConcluzii:
Dacă operanzii A și B au același semn:
Operația internă coincide cu operația externa;
Ieșirea Cout este “transport” deoarece operația este de adunare;
Bitul de semn este identic cu bitul de semn al celor doi operanzi;
Dacă |A|+|B|<1, rezultatul este corect și reprezentat în cod direct;
Dacă |A|+|B|1, atunci Cout=1 și se generează un semnal overflow.
Dacă operanzii A și B au semne diferite:
Operația internă este diferită de operația externa;
Nu apare overflow;
Ieșirea Cout are semnificație de “împrumut” deoarece operația efectuată este de scădere;
Dacă |A| |B|, rezultatul este corect și reprezentat în cod direct;
Dacă |A|<|B|, rezultatul este corect și reprezentat în cod complement față de 2 și Cout=1;
Când Cout=1, rezultatul apare in cod complement față de 2 și trebuie convertit în cod direct
3/5/2019 SOC_03 2018-2019 12
CONȚINUT
Adunarea FXP în cod direct
Sumator FXP în cod direct
Scăderea FXP în cod direct
Sumator/Scăzător FXP în cod direct
Adunarea FXP în cod complement față de 2
Scăderea FXP în cod complement față de 2
Sumator/Scăzător FXP în cod complement față de 2
3/5/2019 SOC_03 2018-2019 13
SUMATOR FXP ÎN COD DIRECT
Sinteza unui sumator în cod direct se bazează pe utilizarea unui sumator binar și generarea următoarelor semnale(vezi figura de pe slide 5):
IntOP – operația internă (0 - adunare, 1 - scădere);
Ss – bit de semn (0 - pozitiv, 1 - negativ);
Overflow – semnal depășire de format, activ în 1;
CF2 – semnal ce indică modul de reprezentare al rezultatului (0 – cod direct, 1 – cod complement față de 2).
Sinteza acestor semnale se bazează pe concluziile din slide 11.
Tabela de adevăr pentru aceste semnale este:
3/5/2019 SOC_03 2018-2019 14
SUMATOR FXP ÎN COD DIRECT
As Bs Cout || IntOP Ss Overflow CF2
0 0 0 || 0 0 0 0
0 0 1 || 0 0 1 -
0 1 0 || 1 0 0 0
0 1 1 || 1 1 0 1
1 0 0 || 1 1 0 0
1 0 1 || 1 0 0 1
1 1 0 || 0 1 0 0
1 1 1 || 0 1 1 -
După minimizare:
IntOP = As Bs
Ss = As• + Bs•Cout
Overflow = Cout•(As ⊙ Bs)
CF2 = Cout
Cout
3/5/2019 SOC_03 2018-2019 15
SUMATOR FXP ÎN COD DIRECT
3/5/2019 SOC_03 2018-2019 16
SUMATOR FXP ÎN COD DIRECT
3/5/2019 SOC_03 2018-2019 17
CONȚINUT
Adunarea FXP în cod direct
Sumator FXP în cod direct
Scăderea FXP în cod direct
Sumator/Scăzător FXP în cod direct
Adunarea FXP în cod complement față de 2
Scăderea FXP în cod complement față de 2
Sumator/Scăzător FXP în cod complement față de 2
3/5/2019 SOC_03 2018-2019 18
SCĂDEREA FXP ÎN COD DIRECT
Scăderea prin adunarea complementului față de 2 al scăzătorului
(descazut – scazator = diferenta)
Această metodă se bazează pe următoarea proprietate a numerelor fracționare reprezentate în FXP:
|A| -|B| = 1 + |A| -|B| = |A| + (1 -|B|) = |A| + | |
În formula de mai sus semnul minus se referă la operația internă!
Această metodă are avantajul că folosește un sumator pentru scădere ceea ce reduce mult complexitatea schemelor logice folosite pentru adunare / scădere.
B
3/5/2019 SOC_03 2018-2019 19
Exemple:
SCĂDEREA FXP ÎN COD DIRECT
3/5/2019 SOC_03 2018-2019 20
CONȚINUT
Adunarea FXP în cod direct
Sumator FXP în cod direct
Scăderea FXP în cod direct
Sumator/Scăzător FXP în cod direct
Adunarea FXP în cod complement față de 2
Scăderea FXP în cod complement față de 2
Sumator/Scăzător FXP în cod complement față de 2
3/5/2019 SOC_03 2018-2019 21
SUMATROR/SCĂZĂTOR FXP ÎN COD DIRECT
3/5/2019 SOC_03 2018-2019 22
SUMATROR/SCĂZĂTOR FXP ÎN COD DIRECT
3/5/2019 SOC_03 2018-2019 23
CONȚINUT
Adunarea FXP în cod direct
Sumator FXP în cod direct
Scăderea FXP în cod direct
Sumator/Scăzător FXP în cod direct
Adunarea FXP în cod complement față de 2
Scăderea FXP în cod complement față de 2
Sumator/Scăzător FXP în cod complement față de 2
3/5/2019 SOC_03 2018-2019 24
ADUNAREA FXP ÎN COD COMPLEMENT FAȚĂ DE 2
Sunt două diferențe importante între adunarea numerelor reprezentate în cod complement față de 2 și adunarea numerelor reprezentate în cod direct:
1. În cazul adunării în cod complement față de 2 bitul de semn este tratat ca orice alt bit al numărului astfel încât operația se realizează pe 1+m ranguri. Asta înseamnă că bitul de semn al rezultatului este obținut în urma operației de adunare și nu este generat cu ajutorul unei scheme logice separată.
2. Operația internă este întotdeauna identică cu operația externă
În continuare, ca și în cazul codului direct, se va realiza o analiză detaliată a celor 4 cazuri (8 sub-cazuri) posibile.
3/5/2019 SOC_03 2018-2019 25
ADUNAREA FXP ÎN COD COMPLEMENT FAȚĂ DE 2
Cazul I: A0 și B0
Operanzii sunt reprezentați ca și în codul direct A=0,|A| și B=0,|B|
Deoarece suma a două numere pozitive este un număr pozitiv rezultă că S=A+B=0,|S|
Deoarece numerele au același semn, pentru anumite cazuri poate să apară depășire (Overflow). Așadar există două sub-cazuri:
0|A|+|B|<1
A+B=0+|A|+0+|B|=0+|A+B|=0+|S|
Rezultatul este reprezentat corect în cod complement față de 2 și nu se generează eroare de depășire (Overflow=0).
|A|+|B| 1
A+B=0+|A|+0+|B|=0+1+|S|=1•20+|S|
În mod evident rezultatul este absurd deoarece adunarea a două numere pozitive nu poate genera un număr negativ! Acest lucru se întâmplă deoarece apare o depășire de format (Overflow=1).
3/5/2019 SOC_03 2018-2019 26
Cazul II: A 0 și B <0
Operanzii sunt reprezentați ca A=0,|A| și B=1,|B|
Deoarece numerele au semne diferite, este evident că nu se va obține niciodată o eroare de depășire (Overflow = 0).
În funcție de semnul rezultatului apar două sub-cazuri:
|A| |B|
A+B=0+|A|+1+1-|B|=1•20+|A|+1-|B|= 1•21+ 0•20+|A|-|B|
|A|<|B|
A+B=0+|A|+1+1-|B|=1•20+|A|+(1-|B|)= 1•20+ 1+|A|-|B|=
= 1•20+ (1-(|B|-|A|))= 1•20+ |B|-|A|
Se observă ca bitul de semn este corect iar suma este reprezentată corect in cod complement față de 2.
ADUNAREA FXP ÎN COD COMPLEMENT FAȚĂ DE 2
3/5/2019 SOC_03 2018-2019 27
Cazul III: A < 0 și B 0
Operanzii sunt reprezentați ca A=1,|A| și B=0,|B|
Ca și în cazul anterior rezultatul este un număr subunitar și nu se generează eroare de depășire.
|A| |B|
A+B=1+|A|+0+|B|=1+(1-|A|)+0+|B|= 1•20+(1-(|A|-|B|))=
= 1•20+ |A|-|B|
|A|<|B|
A+B=1+|A|+0+|B|= 1+(1-|A|)+|B|= 1•21+ 0 •20 +|B|-|A|
Se observă ca bitul de semn este corect iar suma este reprezentată corect in cod complement față de 2.
ADUNAREA FXP ÎN COD COMPLEMENT FAȚĂ DE 2
3/5/2019 SOC_03 2018-2019 28
Cazul IV: A < 0 and B < 0Operanzii sunt reprezentați în cod complement față de 2 ca A=1,|A| și B=1,|B|
Deoarece suma a două numere negative este un număr negativ, S=A+B=1,|S|
Deoarece numerele au același semn, ca și în cazul I, poate să apară overflow.
0|A|+|B|<1
A+B=1+|A|+1+|B|=1+(1-|A|)+1+(1-|B|)=
= 1•21+1•20+(1-(|A|+|B|))=1•21+1•20+(|A|+|B|)
Rezultatul este reprezentat corect în cod complement față de 2 și nu apare overflow(Overflow=0).
|A|+|B| 1
A+B= 1+|A|+1+|B|= 1•21+0•20+(1-|A|)+(1-|B|)=
= 1•21+0•20+1+1-(|A|+|B|)= 1•21+0•20+1+1-(1+|S|)=
= 1•21+0•20+(1-|S|)=1•21+0•20+|S|
În mod evident rezultatul este absurd deoarece suma a două numere negative nu poate fi un număr pozitiv!
Asta înseamnă ca se va genera overflow (Overflow=1).
ADUNAREA FXP ÎN COD COMPLEMENT FAȚĂ DE 2
3/5/2019 SOC_03 2018-2019 29
Exemple:
ADUNAREA FXP ÎN COD COMPLEMENT FAȚĂ DE 2
3/5/2019 SOC_03 2018-2019 30
Concluzii:
În toate cazurile operația internă este identică cu operația externă.
Dacă operanzii A și B au același semn: Rezultatul este exprimat corect în cod complement față de 2
doar dacă suma valorilor absolute a numerelor este subunitară (Overflow=0);
Rezultatul este eronat (Overflow=1) dacă suma valorilor absolute a numerelor este supraunitară.
Dacă operanzii A și B au semne diferite: Nu există overflow (Overflow=0);
Rezultatul este întotdeauna corect în cod comlement față de 2
Când apare overflow atunci C0 <> C-1.
În restul cazurilor C0 = C-1
Deci Overflow = C0 C-1
ADUNAREA FXP ÎN COD COMPLEMENT FAȚĂ DE 2
3/5/2019 SOC_03 2018-2019 31
CONȚINUT
Adunarea FXP în cod direct
Sumator FXP în cod direct
Scăderea FXP în cod direct
Sumator/Scăzător FXP în cod direct
Adunarea FXP în cod complement față de 2
Scăderea FXP în cod complement față de 2
Sumator/Scăzător FXP în cod complement față de 2
3/5/2019 SOC_03 2018-2019 32
A-B = 1•21 + A - B = A + (1 -B) = A + B
În formula de mai sus semnul minus se referă la operația externă!
Din formulă rezultă că scăderea a două numere reprezentate în complement față de 2 se realizează prin adunarea complementului față de 2 al scăzătorului.
Acest lucru permite implementarea unui sumator/scăzător simplu pentru numere reprezentate în complement față de 2.
SCĂDEREA FXP ÎN COD COMPLEMENT FAȚĂ DE 2
3/5/2019 SOC_03 2018-2019 33
Exemple:
SCĂDEREA FXP ÎN COD COMPLEMENT FAȚĂ DE 2
3/5/2019 SOC_03 2018-2019 34
CONȚINUT
Adunarea FXP în cod direct
Sumator FXP în cod direct
Scăderea FXP în cod direct
Sumator/Scăzător FXP în cod direct
Adunarea FXP în cod complement față de 2
Scăderea FXP în cod complement față de 2
Sumator/Scăzător FXP în cod complement față de 2
3/5/2019 SOC_03 2018-2019 35
SUMATOR/SCĂZĂTOR FXP ÎN COD COMPLEMENT FAȚĂ DE 2
3/5/2019 SOC_03 2018-2019 36
SUMATOR/SCĂZĂTOR FXP ÎN COD COMPLEMENT FAȚĂ DE 2
Dacă iOperation = 0 oaS = iaA + iaB + 0•2-m = iaA + iaB;
Dacă iOperation = 1 oaS = iaA + iaB + 1•2-m = iaA + iaB
= 1•21+ iaA – iaB = iaA - iaB
Deoarece rangul 21 nu are reprezentare fizică.
3/5/2019 SOC_03 2018-2019 37
SUMATOR/SCĂZĂTOR FXP ÎN COD COMPLEMENT FAȚĂ DE 2
3/5/2019 CSO_03 2018-2019 38
SUMATOR/SCĂZĂTOR FXP ÎN COD COMPLEMENT FAȚĂ DE 2
Model VHDL
3/5/2019 SOC_03 2018-2019 39
ÎNTREBĂRI?