conversión de lógica estándar en flotante en vhdl

Soy nuevo en este campo. Tengo un problema con la conversión de la entrada lógica estándar en valores reales. He estado usando to_floatla función pero siempre mostraba un error. Cuando usé el paquete float_generic_pkg, mostró un error:

No se puede encontrar en la biblioteca.

También intenté crear una nueva biblioteca ieee_proposedpero aún mostraba un error.

Intenté usar IEEE.numeric_std.all, también.

Nuevamente dio error <to_real>no declarado.

¿Necesito usar algún otro paquete de biblioteca?

Estoy usando ISE Design Suite 14.7. Una cosa más: también es para síntesis. Por favor, ayúdame.

Aquí está el código:

library ieee;
use ieee.std_logic_1164.all; 
use ieee.float_pkg.all; 
use ieee.float_generic_pkg.all; 

entity dafsm is 
port (x : in std_logic_vector (1 downto 0); 
      y : out std_logic_vector (1 downto 0)); 
end dafsm; 

architecture fpga of dafsm is 
   signal r,s : real range 0.0 to 15.0; 
begin 
   r <= to_float(x);
   s <= r * 0.5; 
   y <= to_slv(s); 
end fpga;

Los mensajes de error:

Línea 4: No se puede encontrar <float_pkg> en la biblioteca <ieee>. Asegúrese de que la biblioteca se compiló y que una biblioteca y una cláusula de uso están presentes en el archivo VHDL.
Línea 5: No se puede encontrar <float_generic_pkg> en la biblioteca <ieee>. Asegúrese de que la biblioteca se compiló y que una biblioteca y una cláusula de uso están presentes en el archivo VHDL.
Línea 12: <real> no se declara.
Línea 14: <r> no se declara.
Línea 15: <s> no se declara.
Línea 16: <y> no se declara.

to_float es correcto, ya sea en VHDL-2008 desde ieee.float_pkg o usando ieee_proposed. Así que publique el mensaje de error exacto de esta versión y un ejemplo mínimo que produce el problema.
Gracias por su ayuda, señor. Aquí está el código: biblioteca ieee; use ieee.std_logic_1164.all; utilice ieee.float_pkg.all; utilice ieee.float_generic_pkg.all; la entidad dafsm es el puerto (x: en std_logic_vector (de 1 a 0); y: fuera de std_logic_vector (de 1 a 0)); fin dafsm; la arquitectura fpga de dafsm es la señal r,s: rango real de 0,0 a 15,0; comenzar r <= a_flotar (x); s <= r * 0,5; y <= a_slv(s); fpga final;
Línea 4: No se puede encontrar <float_pkg> en la biblioteca <ieee>. Asegúrese de que la biblioteca se compiló y que una biblioteca y una cláusula de uso están presentes en el archivo VHDL. Línea 5: No se puede encontrar <float_generic_pkg> en la biblioteca <ieee>. Asegúrese de que la biblioteca se compiló y que una biblioteca y una cláusula de uso están presentes en el archivo VHDL. Línea 12: <real> no se declara. Línea 14: <r> no se declara. Línea 15: <s> no se declara. Línea 16: <y> no se declara. por favor ayúdame señor
¿Está configurando las herramientas para usar VHDL-2008?
No hay compatibilidad con VHDL-2008 en ISE. forums.xilinx.com/t5/Synthesis/VHDL-2008-support-in-ISE-14-7/…

Respuestas (1)

Hice algunos cambios en tu código. Los cambios se explicarán a continuación.

library ieee;
use ieee.std_logic_1164.all; 
library ieee_proposed;
use ieee_proposed.float_pkg.all; 


entity dafsm is 
    port (
        x:      in  std_logic_vector (31 downto 0) := x"0000002A"; 
        y:      out std_logic_vector (31 downto 0)
    ); 
end dafsm; 

architecture fpga of dafsm is 
    function to_string(inp: std_logic_vector) return string is
        variable image_str: string (1 to inp'length);
        alias input_str:  std_logic_vector (1 to inp'length) is inp;
    begin
        for i in input_str'range loop
            image_str(i) := character'VALUE(std_ulogic'IMAGE(input_str(i)));
        end loop;
        -- report "image_str = " & image_str;
        return image_str;
end;
    signal r,s : real range  0.0 to 15.0;  
begin 
    r <= to_real(to_float(x));
    s <= r * 0.5; 
    y <= to_slv(to_float(s));
monitor: 
    process(s)
    begin
        report "y = " & to_string(to_slv(to_float(s)));
    end process;
end architecture fpga;

Esta analizada, elaborada y simulada.

Los cambios:

  • Modifiqué la cláusula de contexto, incluida una referencia de biblioteca para ieee_proposed, eliminé todo lo que no era necesario.
  • `x` e `y` eran demasiado cortos para usar. Los aumenté a la longitud 32 como primer intento. No recuerdo la longitud mínima en la parte superior de mi cabeza, puede averiguarlo leyendo la documentación en el sitio web anterior o leyendo el código fuente del paquete. Puede ser más corto, sabía que 32 funcionaría.
  • Agregué un valor predeterminado para `x` (el equivalente hexadecimal de 42 decimal). Esto es para poder diseñar su diseño sin tener que escribir un banco de pruebas.
  • Agregué una función to_string[std_logic_vector return string], esto se hizo en ghdl, que no cumple con IEEE Std 1076-2008, y la función no estaba disponible. Escribí la función para cumplir con el estándar, sección 5.7 Representaciones de cadenas (tenía esto por ahí). Aquí solo se necesita verificar que la entrada 42 por 0.5 es 21.
  • El paquete float_pkg se obtiene de la página web de la biblioteca de soporte de VHDL-2008 , una lectura cuidadosa proporciona un enlace de descarga para la versión compatible con -1993.
  • Hay modificaciones a sus asignaciones de señales concurrentes. No hay rutinas reales de conversión a/desde std_logic_vector. todo se canaliza a través del nuevo tipo de flotador.
  • Agregué un monitor para decirnos cuál es el resultado.

Usted borró cuidadosamente cualquier información de identificación del proveedor de sus mensajes de error y no tengo sus implementaciones de ninguna manera, usé ghdl.

Primero compilé las fuentes en un directorio llamado ieee_proposed para crear una biblioteca ieee_proposed:

ghdl -a --work=IEEE_PROPUESTA adiciones_estándar_c.vhdl
ghdl -a --work=IEEE_PROPUESTA adiciones_estándar_textio_c.vhdl
ghdl -a --work=IEEE_PROPUESTA adiciones_std_logic_1164.vhdl
ghdl -a --work=IEEE_PROPUESTA adiciones_numéricas_estándar.vhdl
ghdl -a --work =IEEE_PROPUESTA numeric_std_unsigned_c.vhdl
ghdl -a --work=IEEE_PROPOSED fixed_float_types_c.vhdl
ghdl -a --work=IEEE_PROPOSED fixed_pkg_c.vhdl
ghdl -a --work=IEEE_PROPOSED float_pkg_c.vhdl

No necesitamos todo esto para demostrar su código, pero ahí está.

Luego analizó, elaboró ​​y simuló su código:

ghdl -a -P./ieee_proposed dafsm.vhdl
ghdl -e -P./ieee_proposed dafsm
ghdl -r dafsm
dafsm.vhdl:33:9:@0ms:(nota del informe): y = 00000000000000000000000000000000
dafsm.vhdl:33:9 :@0ms:(nota de informe): y = 00000000000000000000000000010101

Hay dos salidas porque hay un evento de inicialización santes de sque se asigne r * 0.5. Tenga en cuenta que hice que el proceso del monitor fuera sensible sporque y es una salida y no puede aparecer en una lista de sensibilidad del proceso. Recreé el valor yque habrá asignado.

El segundo es el resultado, 15 en hexadecimal es 21 decimal.

El -P./ieee_proposed le dice a ghdl que busque en el directorio actual una biblioteca de subdirectorios ieee_proposed (el nombre del directorio es el mismo que el de la biblioteca). Podría haberlo colocado en la ruta de búsqueda de la biblioteca de ghdl, parecía innecesario para esta demostración.

El uso de otras herramientas puede variar.

David Bishop nos asegura que esto debería ser elegible para síntesis. No me he probado.

Por favor, aproveche la documentación en la página web anterior.