martes, 13 de marzo de 2012

VHDL 2008: Declaraciones de Contexto (Context Declarations)

En VHDL 2008 hay una nueva unidad de diseño (desgin unit) llamada Context Declaration, o Declaración de Contexto (DC). 

Que es y que hace la DC? 
En primer lugar el estándar VHDL-2008 pre-define una declaración de contexto de la siguiente manera para usar el paquete numeric_std:

1 context ieee_std_conext is
2   library ieee;
3   use ieee.std_logic_1164.all;
4   use ieee.numeric_std.all;
5 end;


 De este modo en mi proyecto puedo directamente escribir: 

1 context ieee.ieee_std_conext;
2
3 entity ...

Pero, así como está pre-definido el contexto arriba mencionado, VHDL2008 permite definir 'user defined' contextos, permitiendo de este modo juntar en un solo archivo TODOS los paquetes que se usan para un proyecto específico. Por ejemplo puedo definir:

1 context mis_paquetes is
2  library ieee;
3  use ieee.std_logic_1164.all;
4  use ieee.numeric_std.all;
5  use my_library.all;
6  use ieee.fixed_pkg.all;
7  .....
8 end;

Donde se escribe una DC?
Ahora bien, como ya dije al comienzo una DC es una design unit, tal como lo es una entidad, un paquete, una configuración, por lo que una DC DEBE escribirse en un archivo aparte, por ejemplo mis_paquetes_context.vhd, e incluirlo dentro del proyecto como cualquier otro desing unit (del mismo modo que se incluye un paquete por ejemplo, puedes ver el blog al respecto). 

Uso del DC?
Una vez definida, se debe incluir en el proyecto la design unit, para usarla en los diferentes componentes del proyecto. 
De este modo en cada otra design unit se debería escribir lo siguiente:

1 context work.mis_paquetes;
2
3 entity . . . .

El uso de 'work.' se debe a que por defecto la mayoría de las herramientas compilan los unidades de diseño en esa librería. Esto puede cambiarse a gusto por el diseñador.
 
Cuidado/Advertencia -> Compatibilidad
Antes de hacer uso de esta característica de VHDL 2008 deberías verificar que tu herramienta de síntesis soporte VHDL 2008. Debido q esto depende de q herramienta de síntesis estés usando, XST, Quartus, Synplify, Precision, etc; no te puedo guiar al respecto, pero normalmente es una tarea sencilla. 
El otro problema q uede presentarse es que la herramienta de síntesis soporte VHDL 2008, pero la de simulación no ! :) ... Por lo que directamente aconsejo verificar ambas herramientas antes de comenzar a trabajar con CD. 

Hasta pronto ! 

jueves, 19 de enero de 2012

Problemas con System Generator / Simulink - 2

Problema 2 - Importando Múltiples Sistemas generados por SysGen en un modulo top en ISE


Cuando se trabaja con sistemas complejos puede suceder que se genere el sistema Simulink-SysGen para cada uno de ellos, y luego en el ambiente ISE escribir el modulo (entity-architectura) que interconecta los diferentes sistemas. Teóricamente este proceso debería hacerse sin problemas, sin embargo HAY PROBLEMAS no documentados, q llevaron largas horas de debug  hasta encontrar primero la fuente del problema y luego la solución. 
El siguiente gráfico detalla los distintos archivos y flujo de síntesis en el caso de que múltiples sistemas generados por separado por System Generator desean ser integrados en un solo modulo de mas alto nivel. 




System Generator crea un archivo de proyecto con la extensión .sgp que puede agregarse como una fuente a Project Navigator en el ISE. Este archivo contiene toda la información necesaria sobre el diseño en System Generator.
Sin embargo, cuando se realiza un diseño jerárquico teniendo dos o más diseños de System Generator como componentes del modulo de mayor jerarquía, se deben renombrar las librerías HDL (autmaticamente generadas por System Generator) para evitar conflictos de nombres y otros comportamientos no deseados durante la simulación. 
System Generator tiene un comando que cambia los nombres de la librería para todos los archivos relacionados en el diseño de un proyecto de System Generator. Además, también hace una copia de seguridad en el caso de que se quiera recuperar el nombre de la biblioteca original. La siguiente es la sintaxis de este comando:

XLSWITCHLIBRARY (target_dir, FROM_LIB, TO_LIB)

Reemplaza todas las bibliotecas HDL referidas como FROM_LIB con TO_LIB en un diseño de System Generator ubicado en la carpeta target_dir.
Importante: este comando se debe ejecutar desde la consola de Matlab.


Modo de Uso 
Suponiendo que se tienen dos proyectos de System Generator cuyos nombres son 'delay_bram' y 'eco_bram', la ejecución del comando XLSWITCHLIBRARY para el cambio del nombre de la librería 'work' (nombre dado por defecto por SysGen) a otro nombre (dado por el usuario) se detalla a continuación: 



Una ejecutado este comando, los sistemas generados por SysGen pueden ser usados como componentes en ISE sin tener problemas.

PD: de nuevo gracias a Layla y Esteban por este aporte. 

miércoles, 30 de noviembre de 2011

Problemas con System Generator / Simulink - 1

Hace poco terminé de dictar uno de mis cursos favoritos basado en el flujo de diseño DSP/FPGA. El curso tuvo mucho éxito, pero como siempre que se implementa algo surgen problemas que solo aparecen cuando uno hace algo.... la teoría es muy linda hasta que  se tiene que implementar.... :) . . . 

Uno de los grupos de alumnos, Layla y Esteban, tuvieron problemas que no estaban documentados por ningún lado, y a fin de que Uds. no gasten tanto tiempo como ellos en encontrar soluciones, decidieron compartir problemas con soluciones. 

Problema 1- Error Debido a la Configuración de Idiomas de la PC
Dentro de un bloque Simulink cuando se le asigna una constante expresada en decimal a un bloque 'CMult' de System Generator, y luego al querer simular el sistema aparece un error relacionado al bloque pero cuyo mensaje es bastante encriptado.... 




Seguramente este mensaje de error es generado porque existe un problema de 'mal entendimiento' en la representación de números decimales: System Generator lo representa de un modo diferente al modo representado por el sistema operativo de la PC. Esto es muy común que nos pase a los que tenemos la PC configurada para el idioma español. Por defecto el número decimal, en todas las opciones del español, se representa con una coma. Mientras que System Generator lo representa con un punto. entonces !, existe una incongruencia que el compilador no sabe que hacer y genera el mensaje de error encriptado. En el ejemplo mostrado en la figura arriba el error se genera por querer asignar un valor de 2,3 a CMult. Si en su lugar se asigna 2.3  no existe ningún error. 

Solución
Cambiar la configuración regional de su PC a Inglés: Panel de Control -> Opciones Regionales y Lenguaje.

viernes, 11 de noviembre de 2011

Error: "Port 'clock' has illegal connections.This port is connected to an input buffer and other componentes"

Este mensaje de error realmente no de mucha idea de cual es el problema, es por ello que deseo aclararlo acá.

Lo que realmente significa este mensaje, es que la entrada de reloj () está siendo ruteada al buffer de entrada y de alli a un DCM, por ejemplo. Por ello no es posible usar esta misma señal de entrada, clock, como señal de reloj en cualquier componente sincrónico. Esto se debe a que cuando uno usa un DCM el ruteo entre el pin de entrada y el DCM es un ruteo dedicado de bajo skew y bajo retardo, y no tiene derivaciones, es decir no puede usarse esa señal en otro lugar porque no tiene ruteo disponible. Así, el unico reloj disponible es la salida del DCM. 

Un solución a este problema es usar otro pin de E/S por el que entra el mismo reloj, pero sin enviarlo a un DCM. En este caso se puede usar un pin E/S como entrada de reloj del DCM, y otro pin E/S, con el mismo reloj, que puede ser usado para los componentes sincronicos que necesiten ser controlados por este reloj. 

La otra solución es usar también dos pines E/S, y dos DCMs, uno para cada frecuencia de trabajo que se necesite.

Greetings..... 

viernes, 28 de octubre de 2011

Generando el Hex del ASCII para ROM/RAM usando Matlab

En un previo post , http://hdl-fpga.blogspot.com/2011/06/memorias-rom-fpga-vhdl-como.html, detallé la codificación en VHDL para inferir memorias ROM e implementarlas en FPGAs. Una de las partes mas 'aburridas' de esta codificación es primero pasar de la letra al ASCII y después del ASCII al Hex respectivo. Especialmente para el caso de un string o número muy largo, o varios strings. 
Por ello, en uno de mis últimos cursos que dicté uno de mis alumnos no quería 'aburrirse' realizando las dos conversiones, entonces uso sus conocimientos y me presentó una solución tan ingeniosa como efectiva: escribió una pequeña función en Matlab que hace no solo las mencionadas conversiones sino que también genera directamente la sintaxis VHDL respectiva para la asociación del arreglo ROM  con sus valores respectivos. Gracias Ihosvanni por evitar que nos aburramos !. Acá va un screenshot del .m:




Básicamente lo que hace este código .m es tomar tres mensajes, y convertirlos en ASCII y luego al Hex respectivo. Para este caso planteado el resultado de la ejecución es algo como esto: 

0=>x"56",1=>x"61",2=>x"6C",3=>x"6F",4=>x"72",
5=>x"65",6=>x"73",7=>x"20",8=>x"64",9=>x"65",
. . . . . .
51=>x"20",52=>x"21",others=>x"20"


Así, lo único que queda por hacer es copiar y pegar estos valores en el arreglo ROM declarado tal como se detalló en el previo bloq. 
Este .m se puede perfectamente adaptar a distintos casos, por ejemplo remover mensajes, agregar más mensajes, etc. Por supuesto tener la precaución de que si se remueve algún mensaje, se deben remover todas las referencias al mismo, si se agregan mensajes, agregar las referencias respectivas. También se puede usar para casos en los que se quiere inicializar una memoria tipo RAM con un arreglo definido tal como se detalla en el previo blog.

El código Matlab lo puedes bajar de este link: ascii2rom.m

Espero que sea de utilidad, si es así ... bueno, házmelo saber ! 

jueves, 27 de octubre de 2011

Mensaje de error: "Can't find net or instance name"

Este mensaje suele ser comun cuando queremos restringir (constraint) alguna net o componente de nuestro diseño mediante el uso de constraints en el .ucf. Usualmente eso se debe a que en el .ucf usamos un nombre, normalmente el nombre de la señal o componente en nuestro código VHDL/Verilog, que la herramienta de Síntesis o de Place and Route modificó y nosotros no nos enteramos y consecuentemente el constraint usado en el .ucf hace alusión a una señal o componente que no existe. 
Xilinx ofrece un programa, ejecutable desde comando de linea, llamado netgen, que lee el archivo .ngc o .ngd del sistema implementado y genera el .vhd o .v respectivo para llevar a cabo una simulación funcional (usando .ngc) o post place and route simulación (usando el .ngd). Aún cuando la idea no es llevar a cabo la simulación, el archivo .vhd/.v puede perfectamente ser usado para los fines que buscamos: encontrar los nombres de la señal o componente que necesitamos restringir. 
Los pasos a seguir para usar netgen son similares a los ya explicados anteriormente para pasar de .ngc a .vhd, pero acá los detallos de nuevo.

Pasos para usar 'netgen' (para pasar de .ngc a .vhd) 
  1. Abrir una ventana de 'comandos' o 'DOS': Inicio -> Ejecutar. En la ventanita que se abre escribir 'cmd' y presione 'Aceptar'. 
  2. La ventana de comandos de Window se abrirá normalmente en tu directorio de documentos. 
  3. Usando el viejo comando 'cd' ir hasta el directorio donde está el archivo .ngc que se desea convertir.
  4. Escribir 'netgen -ofmt vhdl mi_archivo.ngc' y presione enter para generar el archivo 'mi_archivo.vhd'. En caso de obtener un mensaje de error diciendo que no reconoce como ejecutable al programa 'netgen', deberá anteponerle el camino del directorio donde reside el ejecutable, por ejemplo:
  5. f:\mi_proyecto>f:\Xilinx\12.1\ISE_DS\ISE\bin\nt\netgen -ofmt  mi_archivo.ngc 
    Si deseas que el archivo .vhd tenga otro nombre usá el siguiente comando: 
    f:\mi_proyecto>f:\Xilinx\12.1\ISE_DS\ISE\bin\nt\netgen -ofmt  mi_archivo.ngc mi_vhd.vhd
Ahora si ya podés abrir el .vhd y buscar las señales o componentes de tu interés. Si bien el archivo .vhd, que en realidad es un modelo de simulación del  sistema implementado. Parece bastante complicado, pero se puede 'leer' e interpretar la implementación, notando el uso de componentes tipo 'primitivas'. Usando un 'search' o búsqueda podemos encontrar las señales o componentes que necesitamos. 

miércoles, 26 de octubre de 2011

Necesitas pasar de .ngc a .edf ?

Como bien es sabido las herramientas de síntesis producen como resultado un archivo comúnmente llamado EDIF (Electronic Design Interchange File) cuya extensión es .edf que básicamente describe en un formato de texto los componentes del diseño y sus conexiones (netlist). Este tipo de archivos es independiente del fabricante de la herramienta de síntesis, teniendo como objetivo establecer un formato común entre los diferentes vendedores de herramientas EDA (Electronic Design Automation). A pesar de ser un formato comumnente adaptado y usado, Xilinx prefirió tener su propio archivo resultado de síntesis llamado NGC, .ngc, que en realidad contiene información del netlist y del archivo de restricciones físicas (llamado .ncf). Este archivo .ngc NO es un archivo de texto por lo que no se puede leer. Sin embargo, sabiendo Xilinx que a algunos Ingenieros nos gusta saber que hay en el netlist, ofrece un ejecutable que convierte de .ngc a .edf. Este program se llama ngc2edif.exe y se debe ejecutar desde una ventana tipo DOS. 

Pasos para convertir NGC a EDIF
  1. Abrir una ventana de 'comandos' o 'DOS': Inicio -> Ejecutar. En la ventanita que se abre escribir 'cmd' y presione 'Aceptar'. 
  2. La ventana de comandos de Window se abrirá normalmente en tu directorio de documentos. 
  3. Usando el viejo comando 'cd' ir hasta el directorio donde está el archivo .ngc que se desea convertir.
  4. Escribir 'ngc2edif.exe mi_archivo.ngc mi_archivo.edf' y presione enter. En caso de obtener un mensaje de error diciendo que no reconoce como ejecutable al programa 'ngc2edif', deberá anteponerle el camino del directorio donde reside el ejecutable, por ejemplo:
  5. f:\mi_proyecto>f:\Xilinx\12.1\ISE_DS\ISE\bin\nt\ngc2edif mi_archivo.ngc mi_archivo.edf
  6. Ahora ya podés abrir el .edf y 'ver' el netlist respectivo...