Cómo representar números reales negativos en representación de punto fijo

0

Encuentro este módulo para la adición de dos números de punto fijo. Manual de uso de este módulo: enlace

¿Cómo agregar -1.5 (o cualquier número real negativo) a 0.5 (cualquier número real)?

Mi problema es que: sé cómo representar números positivos en una representación de punto fijo. Pero no sé cómo representar -1.5 (o cualquier número real negativo), pero traté de tomar el complemento de 1.5 de 2 y se me dio como entrada, pero no está dando la salida adecuada.

Editar: lo intenté, lo que dijeron Wouter y el empresario, pero eso tampoco funciona.

Editar: Agregado Testbench del módulo.

module qadd(
input [N-1:0] a,
input [N-1:0] b,
output [N-1:0] c
);


//Parameterized values
parameter Q = 15;
parameter N = 32;

reg [N-1:0] res;

assign c = res;

always @(a,b)
begin
//both negative
if(a[N-1] == 1 && b[N-1] == 1) begin
    //sign
    res[N-1] = 1;
    //whole
    res[N-2:0] = a[N-2:0] + b[N-2:0];
end
//both positive
else if(a[N-1] == 0 && b[N-1] == 0) begin
    //sign
    res[N-1] = 0;
    //whole
    res[N-2:0] = a[N-2:0] + b[N-2:0];
end
//subtract a-b
else if(a[N-1] == 0 && b[N-1] == 1) begin
    //sign
    if(a[N-2:0] > b[N-2:0])
        res[N-1] = 1;
    else
        res[N-1] = 0;
    //whole
    res[N-2:0] = a[N-2:0] - b[N-2:0];
end
//subtract b-a
else begin
    //sign
    if(a[N-2:0] < b[N-2:0])
        res[N-1] = 1;
    else
        res[N-1] = 0;
    //whole
    res[N-2:0] = b[N-2:0] - a[N-2:0];
end
end

endmodule

// Banco de pruebas

module qadd_tf;

// Inputs
reg [32:0] a;
reg [32:0] b;

// Outputs
wire [32:0] c;

// Instantiate the Unit Under Test (UUT)
qadd #(16,33) uut (a, b, c);

initial begin
    // Initialize Inputs

    b[32]=1;
    b[31:16]= 16'b00000000_00000001;
    b[15:0] = 16'b10000000_00000000;
    a[32]=0;
    a[31:16]= 16'b00000000_00000000;
    a[15:0] = 16'b10000000_00000000;

    #100;


    #100;
end

endmodule
    
pregunta Jay Patel

2 respuestas

1

Como el Entepreneur intenta decir en su comentario (al menos piensa que eso es lo que quiere decir), y cuando leo el código, usan la magnitud de signo, no el complemento de 2s.

La adición de 2s-complement no tiene que distinguir entre números positivos y negativos (esa es una de las cosas importantes a favor de 2s-complemento).

No veo qué factor de escala se usa, por lo que no puedo decir cómo representar - 1.5, pero parece que sabes cómo representar una red 1.5, así que simplemente cambia el signo.

respuesta al comentario

  

Sign Bit = 0, todos los bits de la parte entera son 1, y todos los bits de la parte fraccional son 0, cuando agrego -1.5 a 0.5. (- 1.5 se representa como lo sugiere Wouter. También ahora, he añadido Testbench del módulo , puedes simularlo en tu PC.

No soy un experto en este idioma (¿VHDL? ¿Verilog?), pero eso es lo que este código debe producir, específicamente debido a la línea

res[N-2:0] = a[N-2:0] - b[N-2:0];

Esto genera un desbordamiento (porque | b | > | a |). Pienso que la sección debería ser

else if(a[N-1] == 0 && b[N-1] == 1) begin

   if(a[N-2:0] > b[N-2:0]){
       // |a| > |b]
       res[N-1] = 1;
       res[N-2:0] = a[N-2:0] - b[N-2:0];

   } else {
       // |b| >= |a]
       res[N-1] = 0;
       res[N-2:0] = b[N-2:0] - a[N-2:0];
   } 

(Y es posible que desee consultar la última sección).

    
respondido por el Wouter van Ooijen
0

1) Con respecto a su código para casos Reste a-b y Reste b-a, estos dos los pasos se intercambian: res [N-1] = 1; res [N-1] = 0;

2) Además, como Wouter señaló, debe verificar las magnitudes para asegurarse de no restar el valor más grande del valor más pequeño, lo que provocará un resultado negativo de 2 en el complemento que no usa en su metodología , resultando en muchos muchos bits no deseados que se establecen.

Hay dos sistemas que se discuten aquí. (Suponga que todos los valores, incluido el ajuste de resultado dentro de 32 bits).

COMPLEMENTO DE DOS: Primero veamos el complemento de 2 porque es el más fácil de implementar y no es el método utilizado en su código. El paso aritmético de sumar o restar siempre será exactamente el mismo, será una adición de 32 bits.   Si ingresas uno o ambos números como negativos, deben escribirse en el complemento a 2, y el resultado de la suma también será el complemento a 2. Ese es el aspecto favorable de la adición del complemento a 2. A la lógica del sumador no le importa si el número es negativo o positivo, combina los bits usando el mismo paso lógico exacto.   Entonces, para lograr la resta necesitas crear una versión negativa del número que se está restando, y representarlo en el complemento de 2. Luego agrega los dos valores igual que siempre. Recuerde, tanto para el punto entero como para el punto fijo, tomar el complemento de 2 de un número puede hacerse cambiando los 32 bits y luego agregando un "1" a la posición de bit más baja.

Ejemplo con valores de 4 bits: (5 - 3) = (5 + -3) = (0101b + (comp 2 (0011b))) = (0101b + 1101b) = 0010b = 2

MAGNITUDES POSITIVOS CON LETE DE BANDERA DE FIRMA: El segundo sistema que se analiza aquí y que parece estar destinado a su código es un sistema donde todos los números se representan como números binarios positivos, pero con el bit alto reservado como indicador para recordarnos que el número representa una magnitud en la dirección negativa, debajo de 0. Entonces, un 3 y un -3 siempre se escribirán como _0000000 00000000 00000000 00000011. Pero el bit alto (31) será 0 para un número positivo y 1 para un número negativo.   Esto requiere que la operación de adición se adapte para acomodar las diversas combinaciones de signos y magnitudes de los dos operandos. La razón de esto es que, en última instancia, está operando con todos los valores positivos internamente. Y para evitar producir un número negativo internamente, debe verificar los signos y comparar las magnitudes de los operandos para determinar qué operación se requiere, anticipar el signo del resultado y asegurarse de que el orden de las operaciones nunca cause un valor negativo.   Una vez que haya calculado la magnitud que necesita para determinar y aplicar el signo adecuado al bit alto de su resultado, establézcalo en 0 si sabe que el resultado debería ser positivo, o en 1 si sabe que el resultado debería ser negativo.

    
respondido por el Entrepreneur

Lea otras preguntas en las etiquetas