Structura și Organizarea Calculatoarelor Titular: BĂRBULESCU Lucian-Florentin
Chapter 3 ADUNAREA ȘI SCĂDEREA NUMERELOR BINARE CU SEMN
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/6/2018 SOC_03 2017-2018 3
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/6/2018 SOC_03 2017-2018 4
ADUNAREA FXP ÎN COD DIRECT Diagrama 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/6/2018 SOC_03 2017-2018 5
ADUNAREA FXP ÎN COD DIRECT Cazul I: A 0 și B 0 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/6/2018 SOC_03 2017-2018 6
ADUNAREA FXP ÎN COD DIRECT Cazul 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 S s =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 S s =1. Se obține S = B - A =-( A - B )=1-( A - B )= Acest bit 1 nu este reprezentat fizic deoarece este în afara formatului. 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ă! 3/6/2018 SOC_03 2017-2018 7
ADUNAREA FXP ÎN COD DIRECT Cazul 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 S s =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 S s =0. Se obține S = B - A =-( A - B )=1-( A - B )= Acest bit 1 nu este reprezentat fizic deoarece este în afara formatului. 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ă! 3/6/2018 SOC_03 2017-2018 8
ADUNAREA FXP ÎN COD DIRECT Cazul 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 S s =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/6/2018 SOC_03 2017-2018 9
ADUNAREA FXP ÎN COD DIRECT Exemple: 3/6/2018 CSO_03 2016-2017 10
ADUNAREA FXP ÎN COD DIRECT Concluzii: Dacă operanzii A și B au același semn: Operația internă coincide cu operația externa; Ieșirea C out 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 C out =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 C out 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 C out =1; Când C out =1, rezultatul apare in cod complement față de 2 și trebuie convertit în cod direct 3/6/2018 SOC_03 2017-2018 11
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/6/2018 SOC_03 2017-2018 12
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/6/2018 SOC_03 2017-2018 13
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 Cout + Bs Cout Overflow = Cout (As Bs) CF2 = Cout 3/6/2018 SOC_03 2017-2018 14
SUMATOR FXP ÎN COD DIRECT 3/6/2018 SOC_03 2017-2018 15
SUMATOR FXP ÎN COD DIRECT 3/6/2018 SOC_03 2017-2018 16
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/6/2018 SOC_03 2017-2018 17
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/6/2018 SOC_03 2017-2018 18
SCĂDEREA FXP ÎN COD DIRECT Exemple: 3/6/2018 SOC_03 2017-2018 19
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/6/2018 SOC_03 2017-2018 20
SUMATROR/SCĂZĂTOR FXP ÎN COD DIRECT 3/6/2018 SOC_03 2017-2018 21
SUMATROR/SCĂZĂTOR FXP ÎN COD DIRECT 3/6/2018 SOC_03 2017-2018 22
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/6/2018 SOC_03 2017-2018 23
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/6/2018 SOC_03 2017-2018 24
ADUNAREA FXP ÎN COD COMPLEMENT FAȚĂ DE 2 Cazul I: A 0 și B 0 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 2 0 + 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/6/2018 SOC_03 2017-2018 25
ADUNAREA FXP ÎN COD COMPLEMENT FAȚĂ DE 2 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 2 0 + A +1- B = 1 2 1 + 0 2 0 + A - B A < B A+B=0+ A +1+1- B =1 2 0 + A +(1- B )= 1 2 0 + 1+ A - B = = 1 2 0 + (1-( B - A ))= 1 2 0 + B - A Se observă ca bitul de semn este corect iar suma este reprezentată corect in cod complement față de 2. 3/6/2018 SOC_03 2017-2018 26
ADUNAREA FXP ÎN COD COMPLEMENT Cazul III: A < 0 și B 0 FAȚĂ DE 2 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 2 0 +(1-( A - B ))= = 1 2 0 + A - B A < B A+B=1+ A +0+ B = 1+(1- A )+ B = 1 2 1 + 0 2 0 + B - A Se observă ca bitul de semn este corect iar suma este reprezentată corect in cod complement față de 2. 3/6/2018 SOC_03 2017-2018 27
ADUNAREA FXP ÎN COD COMPLEMENT FAȚĂ DE 2 Cazul IV: A < 0 and B < 0 Operanzii 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 2 1 +1 2 0 +(1-( A + B ))=1 2 1 +1 2 0 +( 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 2 1 +0 2 0 +(1- A )+(1- B )= = 1 2 1 +0 2 0 +1+1-( A + B )= 1 2 1 +0 2 0 +1+1-(1+ S )= = 1 2 1 +0 2 0 +(1- S )=1 2 1 +0 2 0 + 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). 3/6/2018 SOC_03 2017-2018 28
ADUNAREA FXP ÎN COD COMPLEMENT Exemple: FAȚĂ DE 2 3/6/2018 SOC_03 2017-2018 29
ADUNAREA FXP ÎN COD COMPLEMENT FAȚĂ DE 2 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 C 0 <> C -1. În restul cazurilor C 0 = C -1 Deci Overflow = C 0 C -1 3/6/2018 SOC_03 2017-2018 30
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/6/2018 SOC_03 2017-2018 31
SCĂDEREA FXP ÎN COD COMPLEMENT FAȚĂ DE 2 A-B = 1 2 1 + 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. 3/6/2018 SOC_03 2017-2018 32
SCĂDEREA FXP ÎN COD COMPLEMENT FAȚĂ DE 2 Exemple: 3/6/2018 SOC_03 2017-2018 33
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/6/2018 SOC_03 2017-2018 34
SUMATOR/SCĂZĂTOR FXP ÎN COD COMPLEMENT FAȚĂ DE 2 3/6/2018 SOC_03 2017-2018 35
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 2 1 + iaa iab = iaa - iab Deoarece rangul 2 1 nu are reprezentare fizică. 3/6/2018 SOC_03 2017-2018 36
SUMATOR/SCĂZĂTOR FXP ÎN COD COMPLEMENT FAȚĂ DE 2 3/6/2018 SOC_03 2017-2018 37
SUMATOR/SCĂZĂTOR FXP ÎN COD COMPLEMENT FAȚĂ DE 2 Model VHDL 3/6/2018 CSO_03 2016-2017 38
ÎNTREBĂRI? 3/6/2018 SOC_03 2017-2018 39