domingo, 21 de agosto de 2011

Como almacenar en ROM un archivo de audio en Simulink/SysGen

Describiré a continuación los pasos necesarios para poder usar una memoria ROM como medio para almacenar los datos digitalizados de un archivo de audio. Posteriormente, una vez con los datos en la ROM, es posible llevar a cabo el necesario procesamiento de la senal. En caso de implementar el diseño en el FPGA, la inicialización de la memoria ROM es automáticamente llevada a cabo. 

Características del Bloque ROM de SysGen
- Datos son almacenados por individualmente, por palabra, y todos los datos tienen el mismo tipo (signed, unsigned, etc.), el mismo ancho (cantidad de bits) y la misma posición para el punto binario. 
- Cada dato es asociado con exactamente una dirección de memoria.
- El rango de direcciones de la memoria es desde 0 hasta N-1, siendo N la profundidad de la memoria (cantidad de datos). 
- La dirección de la memoria debe ser controlado por un dato entero, sin signo (unsigned) y en tipo punto fijo. 
- El bloque ROM tiene un puerto de entrada para las direcciones, y un puerto de salida para los datos de salida. 
- El bloque ROM puede ser implementado en:
    - RAM distribuida (LUTs y lógica discreta asociada).
    - Bloque dedicados de memoria RAM. 
- La performance máxima de un bloque ROM se logra cuando: 
    - La opción 'Provide reset port for output register' no es seleccionada. 
    - La opcion 'Depth' es menor a 16.384.
    - La 'Latency' es 2 o mayor. 

Como calcular el tamaño del Bloque ROM
Para poder almacenar un archivo de audio en un Bloque ROM es necesario saber el tamano del archivo a fin de poder dimensionar la ROM, pues los parametros principlaes del bloque ROM, tal como se vera mas abajo, son su profundidad (cantidad de datos) y el ancho del datos (cantidad de bits por dato). 
Para obtener esta informacion se hace uso de algunas funciones basicas de Matlab, las cuales son ejecutadas en la ventana de comandos de Matlab:
- 'wavread': ésta función lee un archivo de audio tipo wave, .wav, de Microsoft. 
   Uso 1:
          archivo_audio = wavread('musica.wav);
le asigna a la variable archivo_audio los datos del archivo musica.wav.
   Uso 2:
          tamano = wavread('musica.wav', 'size');
le asigna a la variable tamano la cantidad de datos del archivo 'musica'wav'. 
   Uso 3:
          [archivo_audio_1, Fs, nbits] = wavread('audio.wav');
le asigna a la variable archivo_audio_1 los datos del archivo musica.wav; a la variable Fs la frecuencia de muestreo del archivo musica.wav y a la variable nbits el numero de bits por muestra. 
- 'size': esta función también puede usarse para determinar el tamaño del archivo correspondiente. 
   Uso: 
       tamano_2 = size(wavread('musica.wav'),1);
Notar que el uso de size('  ',1); retorna la cantidad de filas del arreglo '   ', mientras que size('  ',2) retorna la cantidad de columnas del arreglo. 

A continuación se muestra la ejecución de los comandos detallados arriba y su correspondiente resultado en la ventana workspace. 




Configuración de los Parámetros del Bloque ROM
Una vez ejecutados los comandos descritos anteriormente, se puede proceder a la configuración de los parámetros del bloque ROM. Para ello, por supuesto, se debe agregar el bloque ROM al sistema que se quiere diseñar en Simulink. Al hacer doble click sobre el bloque ROM se abrirá la ventana de configuración del bloque. 
Tab 'Basic': 
A fin de escribir los parámetros en forma genérica se puede configurar la ROM usando los comandos antes ejecutados. Estos se detallan en la siguiente figura. 




Tab 'Output Type':
en este tab los parametros se refieren al dato de salida. Por supuesto que existe una relacion directa entre el dato que se grabo en la ROM con el dato que sale de la ROM. Como la grabacion o almacenamiento del dato se hizo en forma automatica, de algun modo se debe conocer el rango de los datos almacenados en la ROM a fin de que los datos de salida sean configurados de modo que se pueda reproducir la senal correctamente. 
Para ello se puede ejecutar en la ventana de comandos de Matlab el comando: 


        rango_datos=wavread('musica.wav')


Para luego inspeccionar la variable rango_datos al presionar dos veces sobre la misma en la ventana Workspace, Así, se mostrará en la ventana 'Variable Editor' del entorno Matlab, todos los datos de la respectiva variable. Por ejemplo, comúnmente se puede observar que los datos .wav tienen un rango desde +1.0 a -1.0. También es posible obtener estos valores usando: 


       max(rango_datos)


       min(rango_datos)

Basado en lo valores obtenidos, +1.0 a -1.0, se puede decir que se necesitan como mínimo 2 bits para la parte entera. Mientras que para la parte decimal, la cantidad de bits dependerá de la precisión que se desea. Aunque una gran precisión implica una gran numero de bits, lo que implica mayores recursos, sobre todo mayor cantidad de bloques ROM. Un valor de compromiso puede ser 6 bits para la parte decimal. La configuracion para este tab puede verse en la siguiente figura. 




Direccionamiento del Bloque ROM 

Normalmente se usa un contador para generar las direcciones del bloque ROM. El contador debe contar desde la dirección 0 hasta la máxima dirección de memoria, que es el valor asignado al parámetro 'Depth' durante la configuración del bloque ROM. 




Esquema del Sistema con Bloque ROM 
Finalmente juntando los bloques, el sistema debería ser semejante al mostrado a continuación.  
Bien, espero que esta guía te haya ahorrado mucho tiempo.... pues yo perdí un monnnnnnnnnnnnnnnnnnntón de tiempo buscando algo similar que nunca pude encontrar.... :) 



2 comentarios:

  1. yo uso ISE y no encuentro como usar ROM en este simulador, podrías darme una mano?, ademas quisiera saber como reproducir el archivo

    ResponderEliminar
  2. Buen blog...
    quisiera saber como puedo utilizar este archivo, es decir como puedo reproducirlo desde la FPGA, gracias.

    ResponderEliminar