module Multiplicador #(parameter width = 4,Dec=2, Mag = width-Dec-1)(
input wire [width-1:0] A,B,
output reg [width-1:0] Result
);
reg [2*width-1:0] Aux,AuxMul;//Realiza el resultado de las operaciones
reg [width-1:0] AuxA,AuxB;
localparam [width:0]//Extremos de los overflow
maximo = 2**(width-1)-1,
minimo = 2**(width-1)+1;
always @*//Realiza la multiplicacion y convierte A en positivo
begin
Aux = A*B;
if (A[width-1])//Si A fuese negativo se pasa a positivo
AuxA = -A;
else//Si A fuese positivo se queda asi
AuxA = A;
end
always @*
begin
if (B[width-1])//Si B fuese negativo se pasa a positivo
AuxB = -B;
else//Si B fuese positivo se queda asi
AuxB = B;
end
always @*
begin//El resultado de la multiplicacion
AuxMul = AuxA[width-2:0]*AuxB[width-2:0];//Obtiene la multiplicacion de los positivos
//Del auxiliar de la multiplicación se obtiene 2 magnitudes y la fraccion para que sea comparable con el maximo que tiene una magnitud y un decimal
if (AuxMul[2*Mag + 2*Dec -1 : Dec] > maximo)//Si se diera el caso de overflow
begin
if ( (A[width-1] == 1 && B[width-1] == 1) || (A[width-1] == 0 && B[width-1] == 0) )// Resultado positivo con overflow es el maximo
Result = maximo;
else
Result = minimo;
end
else//Resultado negativo con overflow es un minimo
Result = Aux[2*width-2-Mag:Dec];//Se trunca el resultado para ser representable
end
endmodule
No hay comentarios:
Publicar un comentario