Você está na página 1de 2

module PontosFlutuantes(

input logic [31:0] A,B,


input logic clk,
output logic exception,
output logic [31:0] SumFloat);
reg [23:0] mantA, mantB;
reg [7:0] expA, expB, d;
reg sinalA, sinalB;
reg [24:0] sum_mant;
logic exp_sum;
integer i;
logic bit_guarda, bit_arredond, stick_bit;
always_comb begin
mantA <= A[22:0]+ 23'b10000000000000000000000; // Mantisa do num
ero A
mantB <= B[22:0]+ 23'b10000000000000000000000; // Mantisa do num
ero B
expA <= A[30:23] - 8'd127; // Expoente do numero A
expB <= B[30:23] - 8'd127; // Expoente do numero B
sinalA = A[31]; // Sinal do numero A
sinalB = B[31]; // Sinal do numero B
// Se o exponte do numero A for menor do que o expoente do numer
o B
// deve-se trocar os dois expoentes para realizar a subtraao, afi
m encontrar
// a diferena entre os expoentes (d)
if(expA<expB) begin
expA <= expB;
expB <= A[30:23] - 8'd127;
mantA <= mantB;
mantB <= A[22:0]+ 23'b10000000000000000000000;
end
d <= expA-expB;
//O expoente da soma temporariamente o maior expoente entre os n
umeros
exp_sum <= expA;
// Se os sinais possuem sinais diferentes deve-se fazer o comple
mento de 2 do operando B
if(sinalA != sinalB) begin
mantB <= (~mantB)+ 23'b1;
end
bit_guarda <= mantB[d];
bit_arredond <= mantB[d-8'd1];

//stick_bit <= |(mantB[(d-8'd2):0]);


mantB <= mantB >> d;
sum_mant <= mantA + mantB;
//
Se (i) Os sinais de A e B so diferentes E (ii) Os expoentes de A
e B so iguais E (iii) O bit mais significativo de S 1 E (iv) O vai-um 0, ENTO S ne
gativo, logo
//
o Substitua S pelo seu complemento de 2
if ((A[31] != B[31]) && (A[30:23] == B[30:23]) && (sum_mant[23]=
=1) && (sum_mant[24]==0))
begin
sum_mant <= (~sum_mant)+1;
end
if ((A[31] == B[31]) && (sum_mant[24]==1))
sum_mant <= sum_mant >> 1;
else begin
sum_mant <= sum_mant <<1;
sum_mant[0] <= bit_guarda;
exp_sum <= exp_sum + 1;
//
//
//
//
//
//

for (i = sum_mant[23]; i!= 1)


begin
sum_mant <= sum_mant << 1;
exp_sum <= exp_sum + 1;
i <= sum_mant[23];
end
end
sum_float[31] = signalA;
sum_float[]
end

endmodule