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.... :) 



miércoles, 10 de agosto de 2011

System Generator: Co-Simulación en Hardware

La idea de este blog es presentar los pasos necesarios para llevar a cabo la Co-Simulación en Hardware (CSH) de un sistema construido en Simulink usando los bloques del Xilinx Blockset. La teoría detrás de todo esto está bastante detallada en los documentos provistos por Xilinx, así es que no abarcaré la misma. 
Qué es CSH? 
Es una herramienta disponible en el ambiente de desarrollo Simulink/System Generator que permite co-simular en hardware lo que se simula en software. Veamos que significa esto: En primer lugar cuando uno trabaja en el entorno Simulink/System Generator los sistemas que se construyen son simulados en ese mismo entorno, es decir TODO se realiza en software. Sin embargo se puede fácilmente construir el hardware equivalente de ese sistema (construido en software), configurar el FPGA respectivo, y simular en hardware lo mismo que se simular en software e incluso al mismo tiempo. Por eso, este proceso es justamente llamado 'Co-Simulación', porque se simulan ambos sistemas, hardware y software, al mismo tiempo. 
Pasos a seguir:

Paso 1:
Sigue los pasos que normalmente ejecutas para construir tu sistema en Simulink. A modo de ejemplo, supongamos que ya he construido el siguiente sistema y lo quiero co-simular. 




Paso 2:
Compilar el sistema para CSH: abrir el bloque 'System Generator', y en 'Compilation' seleccioná 'Hardware Co-Simulation'. Aparecerá un menú de los boards que por defecto trae instalado System Generator, tal como se muestra en la siguiente figura. 




En este paso debes, cuidadosamente, seleccionar el board que va ser usado para la co-simulación, y a su vez que tipo de conexión usarás para comunicar el board (JTAG o Ethernet) con la PC. En caso de que el board no aparezca dentro del listado de los boards que vienen por defecto, deberás seguir todo un procedimiento para agregar el board a la lista de boards disponibles. Este procedimiento ya lo expliqué en un blog anterior "Como agregar el XUPV5 board para Co-Simulación en Hardware".
Como voy a usar el XUPV5 para la Co-Simulación, y además como ya seguí los pasos del blog mencionado anteriormente (que buen blog !!! :) ), selecciono XUPV5 JTAG para la compilación del sistema. 






Paso 3:
Presionar 'Generate' para comenzar la 'Compilación del Sistema'. Qué genera 'Generate'? 
  • El hardware asociado con el sistema en Simulink
  • La interface física para la comunicación entre la PC y el board XUPV5.
Si una presiona la opción 'Show Details' de la ventana de compilación, se puede ver los diferentes pasos que se ejecutan durante 'Generate'. En sí lo que se ejecuta es un script que invoca todas las herramientas del ISE necesarias para llegar finalmente al archivo de configuración del FPGA. Es decir herramientas como XST, Translate, MAP, P&R, TRACE, y BitGen. 


Paso 4:
Terminada la compilación System Generator crea un nuevo bloque. Este bloque es la versión 'hardware' del sistema en Simulink (versión software). 
Este bloque hardware se usará en el sistema que se desea co-simular. Debes copiar y pegar este bloque tal como muestra la siguiente figura. 


Este bloque se usa igual que cualquier otro bloque del sistema, es decir se pueden excitar sus entradas y leer sus salidas. Durante la co-simulación el bloque CSH interactúa con el board para:
  • Configurar el FPGA
  • Control del reloj del board.
  • Transmisión y Recepción de datos a y desde el FPGA por medio del cable JTAG
Este bloque tiene unos parámetros de configuración que es conveniente modificarlos tal como se detalla en el siguiente paso. 



Paso 5:
Abrí el bloque CSH, comúnmente llamado 'JTAG Cosim', presionando dos veces el mouse sobre el bloque. La ventana de configuración del bloque aparecerá tal como se muestra a continuación. 


Dejar las opciones que por defectos son mostradas. 
En la opción de 'Cable' usá la siguiente configuración: 
  • Type: Xilinx Platform USB (o el tipo de cable que usa para la conexión PC-Board).
  • Speed: 1.5MHz


Si durante este paso el board está conectado, puedes usar la opción 'Blink Cable LED' para comprobar si la conexión PC-Board es correcta. 

Paso 6:
Volviendo al sistema en Simulink, conectá la(s) entrada(s) del bloque CSH o JTAG Cosim, a lo(s) mismo(s) estímulos usados para los otros bloques. La salida conéctela a un 'Sink' similar al usado para el sistema, facilitando así la comparación. Debajo puede observar el sistema que he completado en este paso. 


Paso 7:
Verificá que el board esté conectado a la PC por medio del cable oportunamente seleccionado en la configuración del bloque JTAG Cosim (Paso 5), y que el board esté encendido.
Ejecutá  la simulación como siempre lo haces.
Los dos sistemas son simulados al mismo tiempo, y como 'teóricamente' son los mismos sistemas, uno en software y otro en hardware, las formas de ondas vistas en los bloques 'Sink' deberían ser las mismas tal como se muestra en la siguiente figura. 



Si has llegado a este punto solo leyéndo,.... bueno es hora de 'meterle manos' al hardware y animarte a hacer una Co-Simulación... eso sí, me contas como salió todo ! :) ... 

Hasta la próxima...


Version .pdf del blog? presiona acá :) 

Como agregar el XUPV5 board para Co-Simulación en Hardware con System Generator/Simulink

Co-Simulación en Hardware (Hardware Co_Simulation) es una poderosa herramienta en el ambiente de desarrollo Simulink-System Generator. Permite al diseñador simular en 'paralelo' en real-hardware, lo mismo que se simula en software usando los bloques de SysGen. 
Cando uno installa la version full de ISE, al instalar System Generator por defecto se instalan lo que se llaman 'plug-in' de los boards DSP de Xilinx. Sin embargo, dado que el XUPV5 board no es considerado un 'board DSP' no aparece en la lista de opciones de los boards para llevar a cabo co-simulation. Si aparece el ML505 board, que CASI igual que el XUPV5, pero con una 'pequeña' diferencia: el ML505 tiene un Virtex 5 XC5VLX50T, mientras que el XUPV5 tiene un XC5VLX110T. Pequeña gran diferencia que hace que NO se pueda usar el plug-in del board ML505 para el board XUPV5. Entonces... cual es la salida/solución si uno tiene el XUPV5 y quiere hacer Co-Simulación?????? 

Agregando el XUPV5 a la Lista de Boards de Co-Simulación
Paso 1:
Una vez abierto Simulink y abriendo colocado el bloque 'System Generator' en un diseño cualquiera, abrir el bloque 'System Generator' (doble click sobre el bloque). La ventana de configuración del bloque 'SysGen' aparecerá. Seleccione en 'Compilation' la opción 'Hardware Co-Simulation', y luego en el menú siguiente seleccione 'New Compilation Target'. 




Paso 2:
La ventana 'System Generator Board Description Builder' se abrirá. 




En esta ventana hay varios elementos a configurar. 
Paso 3: 
'Target Board Identification': Board Name: puede usarse cualquier nombre. Convenientemente use uno que facilite la identificación del board. Por ejemplo, XUPV5.
Paso 4:
'System Clock': 1- Frequency(MHZ): escribir la frecuencia del reloj del board que se usará normalmente como fuente de reloj para el FPGA. El oscilador de entrada al LX110T es de 100MHz. 2- Pin Location: el pin de E/S por el cual entra el oscilador el FPGA: AH15.
Paso 5:
'JTAG Options': por defecto la comunicación entre el board y el PC es hara usando JTAG. Hay otra opción que es la de usar Ethernet, pero como la configuración es mas complicada explicare ahora la de JTAG, después, de acuerdo a los pedidos, puedo explicar la de Ethernet. Las opciones de la configuración JTAG son: 1- Boundary Scan Position: esta es la posición del FPGA en la cadena JTAG de dispositivos en el board. El valor a introducir acá es 5, es decir es el quinto dispositivo de la cadena. Usando iMPACT es posible 'ver' la cadena y deducir la posición del FPGA. 2- IR Length: este es un parámetro necesario para la comunicación a través de JTAG. Si está el board conectado a su PC/Laptop por medio del cable JTAG, presione 'Detect' para que automáticamente se invoque iMPACT y llene los datos requeridos. Sino tiene el board conectado directamente escriba: 16,16,8,8,10.


Paso 6:
'Targetable Devices': en esta sección se debe introducir el FPGA que usa el board XUPV5. Click 'Add' y seleccione: Virtex 5, XC5VLX110T, Speed -1, package ff1136. Click OK.
Hasta acá la configuración de esta ventana debería ser similar a la mostrada a continuación: 


Paso 7:
En la sección 'Non-Memory Mapped Ports' click el botón 'Add' para agregar algunos puertos de E/S del FPGA que considere necesarios. La ventana 'Configure a Port' aparecerá. Introduzca el nombre del puerto de E/S, seleccione la direccion del mismo, y la ubicacion (Location). Opcionalmente puede tambien seleccionar si el puerto deber ser configurado con el resistor de Pullup o Pulldown. Una vez terminado con estas configuraciones, Click 'Add Pin'. El puerto de E/S configurado sera ahora mostrado en la parte llamada 'Pin List'. Para introducir otro puerto seleccione 'Save and Starte New'. Se pueden introducir tantos puertos como hagan falta. Una vez concluida esta tarea, presione 'Save and Close'.




Nota importante: Se aclara que este paso es totalmente OPCIONAL para la Co-Simulación. 


Paso 8:
Una vez completados los pasos anteriores, la siguiente figura debería ser similar a la que tienes en tu computadora (excepto por los 'Non-Memory Mapped Ports', que pueden no estar o pueden ser otros)




Paso 9:
Presionar 'Install' para instalar la configuracion del XUPV board en el directorio de plug-in de SysGen.




Navegue hasta el directorio:  ../Xilinx/
 En ese directorio debería ahora aparecer el directorio XUPV5 JTAG, tal como muestra la siguiente figura: 




Paso 10:
Finalizada la instalación un ventana de Simulink aparecerá con los puertos de E/S configurados. 




Grabe la librería de los puertos de E/S. Estos puertos pueden ahora usarse en cualquier sistema con System Generator. 

Paso 11:
Para probar que todo esta instalado correctamente. Cierre Matlab y luego ábralo nuevamente. En cualquier sistema de Simulink con el bloque System Generator, abra el bloque System Generator, y seleccione en 'Compilation', 'Hardware Co-Simulation'. Ahora deberia aparecer en la lista XUPV5 JTAG. 




Paso 12:
Listo ! ... el XUPV5 puede ahora usarse para correr Co-Simulación en Hardware de su sistema Simulink. 

Versión pdf   :)


domingo, 7 de agosto de 2011

Navegador de Documentos de Xilinx (Xilinx Document Navigator) -> Muy Recomendable

Xilinx ofrece una herramienta para controlar sus miles de documentos de una manera muy facil.... En realidad es una herramienta poco conocida, pero que la recomiendo mucho mucho para los que trabajamos con esta empresa.

El software Xilinx Document Navigator (XDN) puede ser bajado del sitio de soporte de Xilinx http://www.xilinx.com/support/ . En la columna identificada como "Additional Resources" se encuentra el link para descargar la herramienta "Download Documentation Navigator", que está comprimida e nun archivo .zip. Installe el XDN siguiendo las indicaciones respectivas. 
Al abrir el XDN lo primero que debería hacer es configurar el directorio donde quiere que los documentos a ser descargados sean grabados. Para ello presione el mouse sobre el icono
La ventana de 'Preferences Dialog' se abrirá. Escriba el directorio que desea usar como directorio raíz de sus documentos a descargar. La siguiente figura muestra un ejemplo de configuración. 




Ahora sí podemos empezar a familiarizarnos con el XDN.
La ventana principal es mostrada en la siguiente figura: 




Veamos los puntos importantes: 
  1. La primer columna sobre la izquierda es la que determina que documentos serán mostrados en la columna (ventana) principal. Por defecto todos los documentos son seleccionados. Uno puede seleccionar los docs a mostrar posicionando el mouse sobre el producto a seleccionar, entonces sobre la derecha del producto aparece una flecha verde, presione sobre la flecha para seleccionar ese producto en particular. Inmediatamente la columna principal de documentos sera actualizada para mostrar los documentos seleccionados. XDN ofrece también la posibilidad de grabar una configuración de selección de productos que uno puede invocar posteriormente. Por ejemplo, si te interesan nada mas que los docs relacionados al V5, puedes seleccionar Virtex-5 tal como se explicó recientemente, y luego presionar boton derecho y seleccionar 'Save Settings As', y en la ventana de dialogo escriba V5 por ejemplo. Ahora en el 'pull-down' menú de la primer columna podrás elegir entre la configuración por defecto, 'All Documents' y la((s) configuración(es) que tu  crees. 
  2. La ventana principal muestra los documentos seleccionados. De estos docs hay mucha información detallada, entre la mas importantes está:
    • Columna de 'Location' (ubicación), indica si el doc es un doc que está en la web site de Xilinx, indicado como 'Web', o fué descargado y esta en el directorio de descarga de los docs, estos están indicados como 'Local'. Una tercera opción es para los docs que son solo para ser vistos en la web de Xilinx, indicados como 'Web Only', es decir no se pueden descargar estos docs.  
    • Columna 'Status', indica si el doc respectivo ha sido actualizado a una nueva versión, o si es un doc nuevo, o si ha sido removido.
  3. El icono de búsqueda (binoculares) abre una nueva ventana en la que es posible escribir la palabra de búsqueda, la cual será buscada en los documentos mostrados en la columna de documentos. Los docs que tienen la palabra buscada son mostrados en orden, colocando primero el doc que mas 'hits' tiene. 
Para descargar un doc de interés solo se debe seleccionar el doc,  colocando el mouse sobre el mismo, presionar botón derecho del mouse y seleccionar 'Download Document'. Lo mejor de esta herramienta que el doc que se descarga se graba en el directorio raíz, previamente configurado (tal como se explicó anteriormente), y en subsiguientes sub-directorios que la herramienta crea de acuerdo al producto origen del doc. Por ejemplo, si se descarga el doc " ML505/ML506/ML507 Reference Design User Guide", el doc será grabado en el directorio "/Virtex-5/documentation/boards_and_kits/" . Esto creo que es lo mejor de esta herramienta!! Una vez descargado un doc, en la columna 'Location' aparecerá ahora 'Local' (en lugar de Web), y en la columna 'Status' aparecerá 'Downloaded' (descargado). 
Lo unico que no me gusta es que los docs que uno ya ha descargado no son reconocidos por XDN, por lo que se deberian descargar de nuevo para que XDN los vea y los grabe en el directorio respectivo. De todos modos: 

La verdad es que hubiera deseado saber de esta herramienta antes !