Negar un número en VHDL usando la menor lógica

1

Quiero hacer algo como esto:

variable a, b (both signed)
variable error (signed also)

if (a is positive) 
    b = error
else
    b = -error

Hasta ahora tengo algo como esto:

if (a(a'high) = '0') then
    b <= error;
else
    b <= -1 * error;
end if;

Pero esto no funciona porque la multiplicación hace que el RHS tenga un ancho mayor.

¿Cuál es la mejor manera de atacar esto? Podría escribir una función para hacer una negación del complemento a 2 y usar esto, pero también estoy bastante preocupado por el efecto sobre los requisitos de tiempo.     

pregunta benjwy

2 respuestas

1

Algo como:

variable a: signed(7 downto 0);
variable error: signed(a'range);
variable b: unsigned(a'range);

if a < 0 then
  b:=-error;
else
  b:=error;
end if;

De cualquier forma que lo hagas, la lógica debería terminar igual (incluso si lo multiplicas por -1, espero que el sintetizador sea lo suficientemente inteligente como para notarlo y que solo pegue un conjunto de LUT y una cadena de arrastre allí.)

    
respondido por el Martin Thompson
1
begin 

     b <= not(error) + "00000001"; 

end 

Hay algunos casos de ventaja, ten cuidado, lee esto cuidadosamente.

Creo que lo sabes, pero lo mencionaré por si acaso. los bits son bits y su interpretación la realiza el usuario, puede ser una imagen, una señal, un número, un número positivo, etc. La mayoría de FPGAs trata los números como complemento a dos.

    
respondido por el 0x90

Lea otras preguntas en las etiquetas