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.