VHDL 2008 - Uso de un paquete flotante personalizado

1

Estoy intentando usar el paquete de punto flotante que viene con VHDL2008 para tener un tipo de punto flotante personalizado; Necesito números flotantes de media precisión (16 bits).

Como no tenía experiencia con VHDL, seguí la "guía de usuario del paquete de punto flotante" encontré aquí . En la página 7, describe cómo usar "float_pkg" con tamaños de bits personalizados.

Para probarlo, hice un archivo simple que simulo con Modelsim.

Al intentar compilarlo:

vcom -work work -2008 -explicit -stats=none C:/.../testfloat.vhdl

Me sale el error:

** Error: C:/.../testfloat.vhdl(32): (vcom-1443) Interface package "fixed_pkg" requires a package instance actual

Traté de buscar ese error en Google ya que no lo entiendo, pero hasta ahora no he obtenido ningún resultado.

Aquí está mi archivo VHDL:

Library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
use IEEE.numeric_std.all;
use IEEE.fixed_float_types.all;
use IEEE.float_pkg.all;

entity test is
  port (
    data_A    : in  std_logic_vector (25-1 downto 0);
    data_B    : in  std_logic_vector (25-1 downto 0);

    data_out  : out std_logic_vector (25-1 downto 0)
    );

end entity test;

architecture rtl of test is

use IEEE.fixed_float_types.all;
package my_float_pkg is new ieee.float_generic_pkg
  generic map (
     float_exponent_width => 5,          -- 5 bits of exponent
     float_fraction_width => 11,         -- default will be float(5 dt –11)
     float_round_style    => round_zero, -- Truncate, don’t round
     float_denormalize    => false,      -- no denormal numbers
     float_guard_bits     => 0,          -- Unused by round_zero, set to 0
     float_check_error    => false,      -- Turn NAN and overflow off.
     no_warning           => true        -- turn warnings off
     );

begin

  process(data_A, data_B)
    variable data_A_float     : work.my_float_pkg.float(5 downto -11);
    variable data_B_float     : work.my_float_pkg.float(5 downto -11);
    variable data_out_float   : work.my_float_pkg.float(5 downto -11);
  begin

    data_A_float := to_float(data_A, data_A'high, data_A'low);

  end process;
end architecture;

El contenido del proceso no es relevante por el momento.

    
pregunta Nerradia

1 respuesta

1

Consulte el formulario del paquete genérico en float_generic_pkg.vhdl:

package fixed_pkg is new IEEE.fixed_generic_pkg
                           generic map (<>)

Ver IEEE Std 1076-2008

  

6.5.7.2 Aspectos genéricos del mapa

     

Un real asociado con un paquete genérico formal en un aspecto de mapa genérico debe ser un nombre que denota una instancia del paquete no instanciado nombrado en la declaración del paquete genérico formal, como sigue:

     
    

...
    b) Si la declaración de paquete genérico formal incluye un aspecto de mapa genérico del paquete de interfaz en el formulario que incluye el símbolo de la caja (< >), entonces el paquete instanciado denotado por el real puede ser cualquier instancia del paquete no identificado mencionado en el formato formal. declaración de paquete genérico.

  

Le falta un real para el formal, que es un paquete genérico.

Cree una instancia de IEEE.fixed_generic_pkg y proporcione el nuevo nombre de instancia como el real.

architecture rtl of test is

use IEEE.fixed_float_types.all;
package fixed_pkg is new IEEE.fixed_generic_pkg
    generic map (
        fixed_round_style    => IEEE.fixed_float_types.fixed_round,
        fixed_overflow_style => IEEE.fixed_float_types.fixed_saturate,
        fixed_guard_bits     => 3,
        no_warning           => false
    );
package my_float_pkg is new ieee.float_generic_pkg
  generic map (
     float_exponent_width => 5,          -- 5 bits of exponent
     float_fraction_width => 11,         -- default will be float(5 dt –11)
     float_round_style    => round_zero, -- Truncate, don’t round
     float_denormalize    => false,      -- no denormal numbers
     float_guard_bits     => 0,          -- Unused by round_zero, set to 0
     float_check_error    => false,      -- Turn NAN and overflow off.
     no_warning           => true,       -- turn warnings off
     fixed_pkg            => fixed_pkg   -- ADDED
     );

begin

  process(data_A, data_B)
    variable data_A_float     : my_float_pkg.float(5 downto -11);
    variable data_B_float     : my_float_pkg.float(5 downto -11);
    variable data_out_float   : my_float_pkg.float(5 downto -11);
  begin

    data_A_float := my_float_pkg.to_float (
                    arg            => data_A(data_A_float'length - 1 downto 0), 
                    exponent_width => data_A_float'high, 
                    fraction_width => 0 - data_A_float'low  
                  );
  end process;
end architecture;

También elimine el trabajo de prefijo de las referencias a my_float_pkg en las declaraciones de variables en el proceso. Tenga en cuenta que se agrega un prefijo a la llamada to_float, my_float_pkg no se hace visible por cláusula de uso.

Eso te deja con un error para la llamada a la función de conversión to_float que está fuera del dominio de esta pregunta. Consulte la declaración en float_generic_pkg:

    -- std_ulogic_vector to float
       function to_float (
          arg                     : STD_ULOGIC_VECTOR;
          constant exponent_width : NATURAL := float_exponent_width; -- length of FP output exponent
          constant fraction_width : NATURAL := float_fraction_width) -- length of FP output fraction
         return UNRESOLVED_float;

Los anchos se dan como naturales. El valor real para el ancho de la fracción se debe dar al valor 0 - data_A_float'low para hacer que el número sea la longitud natural. (Tenga en cuenta que las referencias data_A'high y ' low se ajustaron a data_A_float'high y 'low , también estaba definiendo la longitud incorrecta).

Y ahora la conversión funciona si el argumento to_float call tiene la misma longitud que el tipo de resultado.

Tenga en cuenta que el mapa genérico IEEE fixed_pkg para generic_fixed_pkg se usó sin tener en cuenta su uso real (no se evaluó el posible impacto de sus constantes genéricas de float_generic_pkg en my_float_pkg).

Si vas a usar IEEE.fixed_pkg, puedes proporcionarlo como el real en lugar de crear una instancia de fixed_generic_pkg primero.

Además de no usar el paquete Synopsys std_logic_unsigned (que tiene un equivalente a IEEE -2008 numeric_std_unsigned) tampoco usa el paquete numeric_std.

    
respondido por el user8352

Lea otras preguntas en las etiquetas