Sunteți pe pagina 1din 11

Test FC

Reprezentarea numerelor în binar:

1. Semn mărime (SM)

Numerele în semn mărime sunt formate din reprezentarea binară ( în


baza 2, se mai numește și magnitudine) și bitul de semn ( 0, dacă numărul este
pozitiv, respectiv 1 dacă numărul este negativ). În acest format numărul 0 are
2 reprezentări (0+ = 0.....000 și 0- = 10.....00) .

9 8 7 6 5 4 3 2 1 0
1 0 0 0 0 0 1 1 0 0

Bit de Biți de magnitudine


Semn
Reprezentarea în Semn Mărime a numărului -12

9 8 7 6 5 4 3 2 1 0
0 0 0 0 0 0 1 1 0 0

Bit de Biți de magnitudine


Semn
Reprezentarea în Semn Mărime a numărului +12

Domeniul de valori ( valoarea cea mai mare/mică ce poate fi reprezentată pe n-biți)


pentru codul de reprezentare Semn-Mărime este de fapt valoarea maximă/minimă ce
poate fi reprezentată pe biții de magnitudine (biții de la 0 la n-1). Dacă numărul este
reprezentat pe n biți, atunci primul (cel mai semnificativ) bit este bitul de semn și n-1
biți rămân pentru reprezentarea efectivă. Deci, cea mai mică valoare reprezentată pe
n-1 biți în binar (fără semn) este -2n-1+1 ,iar cea mai mare este +2n-1-1.
Domeniu valoric: [-2n-1+1, +2n-1-1]
2. Complementul de 1 (C1)

Numerele în complementul de 1 se reprezintă similar cu cele din semn mărime.


Cel mai din stânga (semnificativ) bit este alocat semnului ( este 0 pentru numerele
pozitive și 1 pentru numerele negative). Pentru a „completa” restul biților se iau
decizii în funcție de semn. Dacă numărul este pozitiv se reprezintă la fel ca și în semn
mărime, iar dacă numărul este negativ se complementează bit cu bit ( în loc de 0 se
pune 1 și în loc de 1 se pune 0). Și în acest format numărul 0 are 2 reprezentări ( 0 + =
00.....0 2 și 0- = 11....1 2).
!Atenție: Dacă numărul este pozitiv NU se complementează biții de magnitudine,
reprezentarea numerelor pozitive în C1 fiind identică cu cea din SM.
9 8 7 6 5 4 3 2 1 0
1 1 1 1 1 1 0 0 1 1

Bit de Biți de magnitudine


Semn
Reprezentarea în Complement de 1 a numărului -12

9 8 7 6 5 4 3 2 1 0
0 0 0 0 0 0 1 1 0 0

Bit de Biți de magnitudine


Semn
Reprezentarea în Complement de 1 a numărului +12

Domeniul de valori ( valoarea cea mai mare/mică ce poate fi reprezentată pe n-


biți) pentru codul de reprezentare în complement față de 1 este de fapt identic cu cel
din semn mărime.
Domeniu valoric: [-2n-1+1, +2n-1-1]
3. Complementul de 2(C2)
Numerele în complementul de 2 sunt reprezentate foarte similar ca și în
complementul de 1. Pe n biți, primul (cel mai din stânga/ semnificativ) bit este alocat
pentru semn( 0 pentru numerele pozitive, respectiv 1 pentru cele negative), iar
pentru biții de magnitudine se ia o decizie similară cu cea de la complementul față de
1. Dacă numărul este pozitiv, bitul de semn este 0 , iar biții de magnitudine reprezintă
numărul în binar. Pentru numerele pozitive reprezentarea în SM, C1 și C2 este aceiași.
Dacă numărul este negativ, în schimb, biții de magnitudine se complementează și se
mai adaugă încă un 1. În acest format 0 are o singură reprezentare.
!Atenție: Dacă numărul este pozitiv NU se complementează biții de magnitudine
și nu se adună 1, reprezentarea numerelor pozitive în C2 fiind identică cu cea din SM
și C1.
Scurtătură: Pentru a face conversia rapidă de la SM la C2 se poate folosi
următoarea metodă: Începând de la primul bit ce urmează după bitul de semn ( din
dreapta lui) se complementează bit cu bit până se ajunge la cel mai din dreapta bit de
1, apoi restul se lasă neschimbat ( se păstrează).
9 8 7 6 5 4 3 2 1 0
1 1 1 1 1 1 0 1 0 0

Bit de Biți de magnitudine


Semn
Reprezentarea în Complement de 2 a numărului -12

9 8 7 6 5 4 3 2 1 0
0 0 0 0 0 0 1 1 0 0

Bit de Biți de magnitudine


Semn
Reprezentarea în Complement de 2 a numărului +12

Domeniul de valori ( valoarea cea mai mare/mică ce poate fi reprezentată pe n-


biți) pentru codul de reprezentare în complement față de 2 diferă față de codurile de
reprezentare precedente. Motivul reprezintă adunarea unui 1 ce „mută”
reprezentarea din C1 cu o poziție. Astfel, 0 nu mai are 2 reprezentări, ci una singură
(0.....0) , fapt ce cauzează eliberarea unei poziții/ posibile reprezentări. Deci avem o
reprezentare (1 00000....0) în C2 în plus față de celelalte coduri, denumită „anomalia”
complementului față de 2. De aceea avem posibilitatea de a reprezenta și numărul -
2n-1 pe n biți.
Domeniu valoric: [-2n-1, +2n-1-1]

Rezolvare exercițiul 1:
1. Proiectați un modul cu 2 intrări și 2 iesiri:

 Intrarea in_0, reprezentand valori in invervalul [-128; 127] in Complement de 2


 Intrarea in_1, reprezentand valori in intervalul [-127; 127] in Semn Marime
 Iesirea eq, pe 1 bit. Initial, iesirea eq este 0. Iesirea eq va fi egala cu 1 daca cele
doua intrari au aceeasi valoare conform formatelor de reprezentare a acestora.
Nota: 0 == +0 si 0 == -0
 Iesirea max, pe acelasi numar de biti ca intrarile. Initial, iesirea max va fi egala -
1 reprezentat in SM. Iesirea max va fi egala cu valoarea maxima dintre cele doua
intrari, reprezentata in formatul respectiv. In caz de egalitate, iesirea max nu se va
modifica.

Modulul reactioneaza doar la schimbarea intrarii in_1

Vom începe problema prin a determina spațiul de memorie necesar fiecărei


intrări. Pentru intrarea in_0, putem reprezenta valoarea maximă +127. Știm că
numărul este reprezentat în Complement de 2, deci din domeniul de valori al lui C2
avem că cel mai mare număr ce poate fi reprezentat este +2n-1-1 .Deci trebuie să
găsim cel mai mic număr natural n pentru care 127 să fie mai mic ca și 2n-1-1 . Astfel îl
putem găsi pe n ca fiind [ log2127]+1 ( parte întreagă din logaritm în baza 2 din 127,
totul adunat cu 1). În urma calculelor obținem [6.989]+1, adică 6 + 1, adică ne sunt
necesari 7 biți de magnitudine. Dacă adăugăm și bitul de semn avem 7+1, adică 8 biți.
Deci intrarea in_0 va fi reprezentată pe 8 biți , adică de la bitul 7 la bitul 0 ( input
[7:0] in_0). Pentru intrarea in_1 avem tot 127 cea mai mare valoare, dar în semn
mărime. Putem folosi aceiași formulă [ log2127]+1 + 1 (bitul de semn) = [ log2127]+2
= [6.989] +2 = 6+2 = 8. Deci tot pe 8 biți va fi și in_1 ( input [7:0] in_1).

Algoritm: Ce avem de făcut?


Practic ni se dau 2 numere la intrare (in_0 și in_1) în formate diferite și trebuie să
găsim maximul. Unul este în complement de 2 , iar celălalt în semn mărime. Din
teoria prezentată mai sus știm că dacă ambele numere sunt pozitive au aceiași
reprezentare, deci le putem compara direct. Dacă unul este pozitiv și cel de al doilea
este negativ, maximul este ,desigur, numărul pozitiv, și nu sunt egale, cu excepția
cazului în care , ambele sunt 0. Și în final, dacă ambele sunt negative, vom avea
reprezentări diferite în C2 și SM. Deci o posibilă soluție ar fi să luăm numărul în SM și
să îl transformăm („convertim”) în C2 , ca apoi să le putem compara.
În primul rând vom declara modulul cu intrările și ieșirile sale:

Urmează să facem inițializările (eq este inițial 0, iar max va fi egală cu 1 în SM):

Începem să verificăm pe cazuri. Dacă ambele numere sunt pozitive, adică dacă
bitul de semn al celor două numere este 0 (in_0[7] = in_1[7] = 0), atunci le comparăm
biții de magnitudine.

Începem să verificăm pe cazuri. Dacă ambele numere sunt pozitive, adică dacă
bitul de semn al celor două numere este 0 (in_0[7] = in_1[7] = 0), atunci le comparăm
biții de magnitudine.
Vom considera acum, cazul în care unul este pozitiv și unul negativ. Maximul este
cel pozitiv, și verificăm dacă nu cumva sunt ambele nule.
Și în final cazul în care sunt negative:

module comp(input[7:0] in_0, input[7:0] in_1, output reg eq, output reg[7:0] max);

initial begin

eq=1'b0;

max = 1;

max[7]=1;

end

always @(in_1)begin

if(in_0[7]==0 && in_1[7] == 0) begin

// Ambele numere sunt pozitive

if(in_0[7:0] == in_1[7:0])begin

eq = 1'b1; //sunt egale

end
else begin

if(in_0[6:0]> in_1[6:0])begin

max[7:0] = in_0[7:0];

end

else begin

max[7:0] = in_1[7:0];

end

end

if((in_0[7]^in_1[7]) == 1'b1) begin

//Una este pozitivă și cealaltă negativă

if((in_0[6:0] ==8'b10000000 || in_0[6:0] ==8'b00000000 )&&


in_1[6:0]==8'b00000000)begin

//Numerele sunt 0

eq = 1'b1;

end

else begin

if(in_0[7]==1'b0)begin

// in_0 este pzoitiv

max[7:0] = in_0[7:0];

end

else begin

//in_1 este pozitiv

max[7:0] = in_1[7:0];

end

end

end

end

if(in_0[7] == 1 && in_1[7] == 1)begin

if((~in_0[6:0]+1) == in_1[6:0])begin

eq = 1'b1;

end
else begin

if((~in_0[6:0]+1) > in_1[6:0])begin

max[7:0] = in_0[7:0];

end

else begin

max[7:0] = in_1[7:0];

end

end

end

end

endmodule

Porți logice, implementare circuite:


Implementarea porților logice se pot realiza în Verilog prin mai multe metode.
Cea mai simplă prevede simularea rezultatului prin operații pe biți, iar o alta
presupune folosirea primitivelor.
Primitive:
OR (SAU) : or(iesire, intrare_1, intrare_2,...., intrare_n)
AND (ȘI) : and(iesire, intrare_1, intrare_2,..., intrare_n)
NOR (SAU-NU) : nor(iesire, intrare_1, intrare_2,...., intrare_n)
NAND (ȘI-NU) : nand(iesire, intrare_1, intrare_2,..., intrare_n)
XOR (SAU-EXCLUSIV) : xor(iesire, intare_1, intare_2, ...., intrare_n)
NOT (NEGARE): not(ieșire, intrare)
Metoda cea mai simplă folosește operatorii pe biți. Astfel pentru fiecare poartă
avem:
AND :
»Operator : &
o Model implementare : assign Y = A&B
o Implementare multiplă: assign Y = A&B&C& ... &N

OR :
»Operator : |
o Model implementare : assign Q = A| B
o Implementare multiplă: assign Q = A|B|C | ... |N
XOR :
»Operator : ^
o Model implementare : assign Y = A^ B
o Implementare multiplă: assign Y = A^B^C ^ ... ^N

NOT :
»Operator :~
o Model implementare : assign out = ~A
o Implementare multiplă: -

Celelate tipuri de porți (nand , nor ,nxor) se obțin din poarta logică corespunzătoare
ce urmează a fi negata. De exemplu :
NAND =» assign out = ~(A&B);

! Pentru rezolvarea problemei de implementare se pornește întotdeauna de la ieșire


(ieșiri) spre intrări.
EXEMPLU REZOLVARE PROBLEMĂ:

Implementati urmatoarea schema logica in Verilog:


Pornim întotdeauna de la ieșire. Ieșirea în cazul acesta este q.q este ieșirea unei porți OR (SAU). Deci
vom scrie assign q = ( )|( ); . Urmează să completăm parantezele de la prima intrare din
poarta OR , care este defapt o ieșire dintr-un inversor ( o poartă NOT). Codul devine assign q = (
~() )|();. Cea de a dou-a paranteză a porții OR reprezintă ieșirea unei porți XOR (SAU- EXCLUSIV)
. Completăm cea de a doua paranteză și codul devine: assign q = ( ~() )|( ()^ () ); . Ne
întoarcem la prima paranteză, la intrarea inversorului. Intrarea în poarta NOT este defapt o poartă
AND înre b și c. Codul devine: assign q = ( ~(b & c) )|( ()^ () );. Trecem din nou la cea
de a doua paranteză și completăm prima paranteză de la XOR. Observăm că prima ieșire de la poarta
XOR este c negat . Codul devine assign q = ( ~(b & c) )|( (~c)^ () );. . În final,
completăm și cea de a doua paranteză al lui XOR , care este ieșirea dintr-o poartă AND între a și b.
Deci codul este: assign q = ( ~(b & c) )|( (~c)^ (a & b) );.

Codul FINAL:
module implementare ( input a, input b,input c, output q);
assign q = ( ~(b & c) )|( (~c)^ (a & b) );
endmodule

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