No hay entradas factibles para el subprograma "CONV_INTEGER"

0

He implementado un componente de sumador simple con dos entradas y una salida.

port ( A,B :  in std_logic_vector(31 downto 0);
       R   : out std_logic_vector(31 downto 0)
     );

Creé un banco de pruebas para probar este componente. Luego modifiqué este banco de pruebas para leer las entradas de un archivo de texto y para escribir los resultados en un archivo de texto. Actualmente las entradas deben ser cadenas binarias; De manera similar, la salida se escribe como una cadena binaria.

Ahora mejoraría este banco de pruebas para leer las entradas como valor entero del archivo de texto. Pude hacer este cambio con éxito. Pero también me gustaría que la salida se escribiera como un entero: en este caso, el compilador informa de un error en una línea del siguiente código fuente.

architecture tb4 of tb4_AdderBehav is
  component AdderBehav is
    port ( A,B :  in std_logic_vector(31 downto 0);
           R   : out std_logic_vector(31 downto 0)
       );
  end component;

  signal A,B : std_logic_vector(31 downto 0);
  signal R   : std_logic_vector(31 downto 0);

begin
  dut: AdderBehav port map (A,B,R);

  process
    variable tbInputs, tbOutput : line;
    variable va, vb, vr : integer;
    file data_file : text;
    file result_file : text;

  begin
    file_open(data_file,"dati_int.txt",READ_MODE);
    file_open(result_file,"risultati_int.txt",WRITE_MODE);

    while not endfile(data_file) loop
      readline(data_file,tbInputs); read(tbInputs,va); read(tbInputs,vb);
      A <= conv_std_logic_vector(va, A'length);
      B <= conv_std_logic_vector(vb, B'length);
      wait for 10 ns;
      --vr := conv_integer(R);   -- ERROR: No feasible entries for subprogram "CONV_INTEGER"
      --write(tbOutput,vr);
      write(tbOutput,R);
      writeline(result_file,tbOutput);
    end loop;

    file_close(data_file);
    file_close(result_file);
    wait;
  end process;

end tb4;

¿Por qué ocurre el error en el código fuente que se muestra arriba? En el código fuente he incluido las siguientes bibliotecas:

ieee.std_logic_1164.all;
ieee.std_logic_textio.all;
ieee.std_logic_arith.all;
ieee.numeric_std.all;
std.textio.all;
    
pregunta enzom83

2 respuestas

1

La respuesta breve: primero elimine la biblioteca no estándar ieee.std_logic_arith.all;

Este y sus primos firmados std_logic_ [un] son un lío de funciones ligeramente ambiguas que ocultan lo que significa su código y pueden fallar inesperadamente como este ejemplo. Conv_std_logic_vector genera una representación firmada o sin firmar? ¿Eso depende de qué bibliotecas estás usando? ¿Conv_integer se convierte en un entero, o DE un entero?

En segundo lugar, decida qué representan sus cantidades std_logic_vector : ¿números firmados o no firmados?
Puede declararlos como signed o unsigned en su lugar (de la biblioteca ieee.numeric_std ). Si DEBES mantenerlos como std_logic_vector (¿POR QUÉ?), Entonces puedes convertir entre los tipos a través de signed (), unsigned (), std_logic_vector ().

Entonces puedes reemplazar

A <= conv_std_logic_vector(va, A'length);
vr := conv_integer(R);

con

A <= to_unsigned(va, A'length);     -- or to_signed
vr := to_integer(R);
    
respondido por el Brian Drummond
1

Recomendaría usar solo los tipos ieee.numeric_std unsigned / signed para estas tareas y ditch std_logic_arith.

Usando ieee.numeric_std para convertir std_logic_vector - > entero:

int := to_integer(unsigned(slv));

Usando ieee.numeric_std para convertir un entero - > std_logic_vector:

slv := std_logic_vector(to_unsigned(int, slv'length));

Las funciones unsigned / to_unsigned se pueden reemplazar con signed / to_signed si está usando números firmados.

    
respondido por el kraigher

Lea otras preguntas en las etiquetas