Página 1 de 1

leer un archivo binario en memoria

Publicado: 04 Ene 2019, 16:56
por wilco2009
Pues nada, que se ve que ultimamente estoy espeso.
Estoy intentando leer un archivo binario en memoria para luego poder utilizarlo para sacar sonido en la pano, y no hay forma de hacerlo funcionar.

El código que estoy usando es el siguiente:

Código: Seleccionar todo

	reg [7:0] audio_memory [0:22662];
	reg [7:0] r;
	integer f_bin;
	
	initial begin
		$display("Loading audio file.");
		f_bin = $fopen("seldon_24_8.raw");
		r = $fread(f_bin, audio_memory[0]);
		$closer(f_bin);
	end
	 
Invariablemente me da el siguiente error:
ERROR:Xst:850 - "Send_Audio_Stream.v" line 75: Unsupported System Function Call.
¿Qué es lo que no estoy haciendo bien?

Re: leer un archivo binario en memoria

Publicado: 04 Ene 2019, 17:07
por mcleod_ideafix
"No eres tú, soy yo" te diría el XST si pudiera hablar.

En general, no puedes usar ficheros binarios de la forma en la que planeas. Lo que se hace habitualmente es convertirlos a ficheros HEX. Esto es, un fichero de texto con un valor de memoria escrito en hexadecimal en cada linea. En el repo del ZX-UNO verás que hay varios "bin2hex.c" repartidos por ahí, precisamente para lo mismo.

Te copio/pego el fuente de uno de ellos (este en concreto tal como está no te valdrá porque como mucho carga ficheros binarios de hasta 64K. Cambia el 65536 por el valor que sea en tu caso):

Código: Seleccionar todo

#include <stdio.h>
#include <string.h>

int main (int argc, char *argv[])
{
	FILE *f;
	unsigned char *scr;
	char nombre[256];
	int i,leido;
	
	if (argc<2)
		return 1;
	
	scr = malloc(65536);
	f = fopen (argv[1],"rb");
	if (!f)
		return 1;
		
	leido = fread (scr, 1, 65536, f);
	fclose (f);
	
	strcpy (nombre, argv[1]);
	nombre[strlen(nombre)-3]=0;
	strcat (nombre, "hex");
	
	f = fopen (nombre, "wt");
	for (i=0;i<leido;i++)
		fprintf (f, "%.2X\n", scr[i]);
	fclose(f);
	
	return 0;
}
Una vez que tienes tu fichero de texto hexadecimal, lo cargas en tu memoria así:

Código: Seleccionar todo

$readmemh ("seldon_24_8.hex", audio_memory);