conversión de lógica estándar a float en vhdl

3

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

  

No se puede encontrar en la biblioteca.

También intenté crear la nueva biblioteca ieee_proposed , pero aún así mostraba un error.

También intenté usar IEEE.numeric_std.all .

Nuevamente, dio un error <to_real> no declarado.

¿Necesito usar algún otro paquete de biblioteca?

Estoy usando ISE Design Suite 14.7. Una cosa más: es también para sintetizar. 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 & gt ;. Asegúrese de que la biblioteca haya sido compilada y de que haya una biblioteca y una cláusula de uso en el archivo VHDL.
  Línea 5: no se puede encontrar < float_generic_pkg > en la biblioteca < ieee & gt ;. Asegúrese de que la biblioteca haya sido compilada y de que haya una biblioteca y una cláusula de uso 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.

    
pregunta aman2392

1 respuesta

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 analizado, elaborado y simulado.

Los cambios:

  • He modificado la cláusula de contexto, incluida una referencia de biblioteca para ieee_proposed, eliminé todo lo que no fuera necesario.
  • 'x' y 'y' eran demasiado cortos para usar. Los aumenté a longitud 32 como un primer intento. No recuerdo la longitud mínima de 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 hex equivalente a 42 decimal). Esto es para que pueda su diseño sin escribir un banco de pruebas.
  • Agregué una función a cadena [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í). Solo se necesita aquí para verificar que la entrada 42 veces 0.5 es 21.
  • El paquete float_pkg se obtiene de la página web VHDL-2008 Support Library , una lectura cuidadosa proporciona un enlace de descarga para el -1993 versión compatible.
  • Hay modificaciones a sus asignaciones de señales concurrentes. No hay rutinas de conversión reales 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.

Ha borrado 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_PROPOSED standard_additions_c.vhdl
  ghdl -a --work = IEEE_PROPOSED standard_textio_additions_c.vhdl
  ghdl -a --work = IEEE_PROPOSED std_logic_1164_additions.vhdl
  ghdl -a --work = IEEE_PROPOSED numeric_std_additions.vhdl
  ghdl -a --work = IEEE_PROPOSED 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 aquí están.

Luego analice, elabore y simule 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 = 000000000000000000000000000000
  dafsm.vhdl: 33: 9: @ 0ms: (nota de informe): y = 000000000000000000000000000010101

Hay dos salidas porque hay un evento de inicialización en s antes de que s se asigne a r * 0.5 . Tenga en cuenta que hice que el proceso del monitor fuera sensible a s porque y es una salida y no puede aparecer en una lista de sensibilidad del proceso. He recreado el valor y que se habrá asignado.

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

La -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.

Aproveche la documentación en la página web anterior.

    
respondido por el user8352

Lea otras preguntas en las etiquetas