Lectura de archivo en cada flanco ascendente del reloj en VHDL

0

Hola, estoy tratando de leer datos de un archivo que contiene 62500 líneas de números binarios de 12 bits para instanciar mi matriz 2D (una especie de RAM). Sin embargo, mi problema es que este proceso ocurre en un ciclo de reloj, lo que ejerce una presión extrema sobre el hardware y la síntesis no termina. Quiero leer una línea de datos del archivo en cada ciclo de reloj. Sin embargo, no puedo porque la función a la que llamo no está muy abierta a modificaciones. ¿Cómo puedo leer una sola línea de datos en cada ciclo de reloj?

Esto es lo que tengo hasta ahora después de semanas de investigación y experimentación

 type RamType is array(0 to PICTURE_WIDTH_HEIGHT - 1, 0 to 
 PICTURE_WIDTH_HEIGHT - 1) of bit_vector(11 downto 0);

 impure function InitRamFromFile (RamFileName : in string) return RamType is
 FILE RamFile : text is in RamFileName;
 variable RamFileLine : line;
 variable RAM : RamType;
 begin
 for y in 0 to 249 loop
 for x in 0 to 249 loop
 readline (RamFile, RamFileLine);
 read (RamFileLine, RAM(x,y));
 end loop;
 end loop;
 return RAM;
 end function;

 signal RAM : RamType := 
 InitRamFromFile("\ASUS\Users\AsusPc\Desktop\project_son\pictureData.data");

Intenté reemplazar los bucles FOR anidados anteriores con IF anidados y convertir las variables anteriores en señales para hacer que este proceso sea adecuado para mi propósito, pero recibí errores que simplemente dicen que RamFile y RamFileLine deben ser variables. Ya me he quedado sin ideas. Por favor, ayúdame. Estoy usando la placa BASYS3 y el entorno Vivado2017.2.

Por cierto, picture_height_width es 250 y no hice lo que dije arriba en la función. Me deshice de la función decleración y traté de hacerlo de manera clásica.

pictureData.data contiene datos binarios puros y nada más.

    
pregunta OnurTR

1 respuesta

4

No tiene sentido probar este enfoque. La síntesis SOLO se puede leer de un archivo en el momento de la inicialización; no hay "archivos" en un FPGA real. La lectura de datos en un proceso cronometrado requiere una interfaz de hardware que va desde un simple UART en serie a una Ethernet MAC o una interfaz de tarjeta SD (con un zócalo de tarjeta SD en su tarjeta FPGA), todos estos proyectos significativos por derecho propio.

Si su herramienta de síntesis tiene problemas de rendimiento al inicializar la memoria, p. ej. una llamada a la función que lee un archivo (y sé que algunos lo hacen) tienes que encontrar otro enfoque.

Pruebe esto agregando una declaración de "Informe" cada vez que comience a leer una nueva fila del archivo. Si está utilizando Xilinx ISE de cierta cosecha, verá que se ralentiza de forma cuadrática a medida que avanza, una matriz suficientemente grande que toma horas para un trabajo que cualquier otra herramienta puede completar en menos de un segundo. (Alternativamente, las declaraciones del "Informe" pueden pasar en segundos, lo que le muestra que otra cosa se está demorando.

Un enfoque alternativo simple (si la prueba de "Informe" muestra que este es el problema) es usar un pequeño programa escrito en el idioma que elija, leer ese archivo y escribir otro archivo que contenga los mismos datos, pero precedido por algo como

library ieee;
use ieee.numeric_std.all;

package ROM is
   subtype byte is unsigned (7 downto 0);
   type ROM_type is array(0 to 249, 0 to 249) of byte;
   constant My_ROM : ROM_type := (

y seguido por

   );
end package My_ROM;

Y usa ese paquete en tu diseño.

Pero sospecho que el problema está en otra parte y tendrá que detenerse, pasar uno o dos años aprendiendo el diseño de sistemas digitales y volver a este problema más adelante.

    
respondido por el Brian Drummond

Lea otras preguntas en las etiquetas