leer un archivo binario en memoria

Diseño HDL con este lenguaje. Módulos y testbenchs. Estilos y trucos de codificación, etc. NOTA: dado que hay entornos como ISE que soportan Verilog pero no SystemVerilog, señalad dentro de un post que de lo que se va a tratar es SystemVerilog si es el caso.
Responder
wilco2009
Veroboard
Mensajes: 15
Registrado: 17 Ago 2018, 10:53

leer un archivo binario en memoria

Mensaje por wilco2009 » 04 Ene 2019, 16:56

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?

Avatar de Usuario
mcleod_ideafix
Site Admin
Mensajes: 75
Registrado: 14 Ago 2018, 01:15

Re: leer un archivo binario en memoria

Mensaje por mcleod_ideafix » 04 Ene 2019, 17:07

"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);

Responder

Volver a “Verilog / SystemVerilog”