¿Puede VHDL leer archivos binarios, es decir, no archivos de texto?

0

Tengo un archivo binario que representa el contenido de la memoria de un dispositivo de memoria. Quiero cargar estos en mi banco de pruebas. Obviamente, el archivo hexadecimal no es un archivo de texto, por lo que no existe ningún concepto de salto de línea y retorno de carro.

El problema es que, por lo que puedo ver, VHDL solo lee archivos de texto, también conocidos como archivos ASCII. No puedo encontrar una manera de leer archivos binarios.

El archivo no tiene estructura como tal, todos los contenidos en él deben cargarse en la matriz std_logic_vector, lo que obviamente requerirá un análisis.

    
pregunta quantum231

2 respuestas

2

En primer lugar, los archivos hexadecimales son archivos de texto. En segundo lugar, me ha resultado más fácil escribir scripts para analizar los archivos externos en VHDL, que usar las capacidades limitadas de procesamiento de texto de VHDL.

Otra opción que tienes es usar parte de la RAM del FPGA. Puedes configurar la RAM usando tu archivo hexadecimal. Esto es perfecto si estás probando la memoria interna.

Una nota de advertencia: el texto IO no es compatible con muchos IDE para la síntesis, aunque se encuentra en la especificación VHDL. Una vez perdí algunas horas analizando el texto en VHDL solo para encontrar que no se sintetizaría.

Editar Sé que esto no es una respuesta a la pregunta original, pero quería señalar que hay mejores herramientas para la tarea. Puede ahorrarse muchos dolores de cabeza utilizando una biblioteca de análisis.

    
respondido por el user110971
2

Sí, VHDL puede leer y escribir archivos binarios. Sin embargo, no hay garantías en cuanto al formato exacto del archivo, aparte de que puede leer un archivo que escribió anteriormente, con la misma versión del mismo simulador. (esto fue hace unos diez años, así que perdona cualquier confusión en los detalles)

Por experimento, encontré eso en Modelsim. los archivos binarios son casi como se esperaba (aunque no recuerdo si usó un orden de bytes big-endian o little-endian en el archivo).

Xilinx ISIM utilizó el carácter opuesto, y agregó / esperaba un encabezado de 9 bytes antes de los datos, rechazando los archivos sin ese encabezado. Xilinx también rechazó explícitamente mi solicitud de documentación en el formato del encabezado, por lo que recurrí a extraerlo de un archivo y presentarlo en otros, a través de head, tail y cat (en Linux, obviamente). Usé un genérico booleano, "is_isim" para controlar el intercambio de endian de acuerdo con el simulador.

No he intentado trasladar estos antiguos bancos de pruebas a ghdl, pero es probable que sea similar a Modelsim en su facilidad de uso aquí.

En cualquier caso, lee datos binarios en un Tnteger , palabras de 32 bits a la vez, y traduce desde allí a std_logic_vector o registros u otros tipos según corresponda (en mi caso, los archivos fueron SEG- Formato Y, un archivo binario utilizado en geofísica)

Si estás familiarizado con Python, un script será más fácil, pero la estricta VHDL y el énfasis en la verificación del tiempo de compilación hacen que obtener los resultados esperados a través de la ruta VHDL sea bastante fácil una vez que superas la joroba inicial.

Acceso a archivos binarios ...

Desde el LRM (VHDL-2008) (editado por brevedad):

  

5.5 Tipos de archivos
  5.5.1 General
    file_type_definition :: = file of type_mark

Ejemplo:

type IntFile is file of integer;
  

5.5.2 Operaciones de archivo
  Dada la siguiente declaración de tipo de archivo:
  tipo FT es un archivo de TM;
  Las siguientes operaciones se declaran implícitamente inmediatamente después de la declaración del tipo de archivo:
  procedimiento FILE_OPEN (archivo F: FT; External_Name: en STRING;
            Open_Kind: en FILE_OPEN_KIND: = READ_MODE);
  procedimiento FILE_CLOSE (archivo F: FT);
  procedimiento READ (archivo F: FT; VALUE: out TM);
  procedimiento ESCRIBIR (archivo F: FT; VALOR: en TM);
  procedimiento FLUSH (archivo F: FT);
  función ENDFILE (archivo F: FT) return BOOLEAN;

Ejemplo:

procedure ReadFile is
   file MyFile : IntFile;
   variable i : integer;
begin
   File_Open(MyFile,"beethoven_5.wav");
   while not EndFile(MyFile) loop
      Read(MyFile,I);
      Audio_Dac <= I;
   end loop;
   File_Close(My_File);
end ReadFile;

Tenga en cuenta que esto no analiza los archivos WAV correctamente, por lo que probablemente no reproducirá la Quinta Sinfonía de Beethoven en su simulador. Y si su archivo es un número entero de bytes, pero no de enteros de 32 bits, puede tratarlo como file of character y usar los atributos character'pos y 'val para traducir a enteros.

Es posible que puedas tratarlo como un file of bit_vector(7 downto 0) pero no lo he intentado recientemente.

    
respondido por el Brian Drummond

Lea otras preguntas en las etiquetas