jueves, 21 de abril de 2011

Clocking un ADC con un reloj generado en el FPGA ?

Recientemente me encontré con la siguiente disyuntiva.... puedo usar el DCM del FPGA para generar el reloj de un ADC?
Concluí que todo depende de la frecuencia de trabajo. Recordar que normalmente el DCM no 'filtra' el jitter de entrada, y que a su vez el jitter en el IO pad, es mayor que el jitter a la salida del DCM., influenciado especialmente,  por la actividad de los IO pads cercanos.
Aún cuando este ejemplo es un poco extremo, pero para mostrar la importancia del jitter ADC de muy alta velocidad, la hoja de datos del Max104, explícitamente dice que el jitter tiene directa influencia en la relación SNR y limita la máxima velocidad de subida (dv/dt) que puede ser digitalizada sin contribuir a errores significantes.
Concretamente, hay dos problemas críticos:
- El ADC usa este reloj para la conversión. En algún tipo de conversor el jitter del reloj puede ser crítico para obtener un valor digital estable.
- El ADC usa el reloj para la transmisión serie o paralela del dato convertido. El jitter del reloj produce jitter en los datos que se transmiten, dependiendo del Rx estos datos serán correctamente leídos o no.


Como conclusión, leer atentamente la hoja de datos del ADC en lo que respecta al jitter permitido. Desde el punto de vista práctico,  si la frecuencia de trabajo es relativamente alta, considere usar una fuente de reloj independiente para el ADC.


Gracias por tu atención !

miércoles, 20 de abril de 2011

Otro uso del 'if-generate'

La instrucción 'generate' generalmente es usada para replicar instanciaciones de componentes, usando el típico 'for-generate' y algunas veces el 'if-generate' dentro del 'for-generate' (ejemplo típico: un registro de desplazamiento).
Sin embargo el 'if-generate' tiene otro uso que no es muy conocido, pero es muy útil: condicionalmente puede incluir u omitir cierta parte del diseño. Usualmente la inclusión u omisión depende del valor de una constante genérica (generic), de modo que la expresión del 'if-generate' es globalmente estática.
Cuáles son los típicos usos de este 'if-generate'?, normalmente son dos :
- Lógica que se agrega al diseño solo con propósito de debug, pero que no se desea que sea implementada en el diseño final.
- Procesos o instanciación de componentes usados solos durante simulación.

A continuación hay un esquema de como se usa el 'if-generate'  para generar o no cierta lógica del diseño en función del generic 'debug' definido en la entity:

 1 entity my_system is 
 2   generic ( debug: boolean := true)
 3   port (
 4        . . .
 5     ); 
 6 end entity my_system;
 7
 8 architecture rtl of my_system is 
 9 . . .
10 begin
11  . . .
12  debug_comp: if debug generate
13   .. .
14  end generate debug_comp;
15  . . . 
16 end architecture; 



Have a grrrrrrrrreat day !

sábado, 2 de abril de 2011

Atributos de Sintesis, Directivas y Restricciones (constraints)

Atributos (de síntesis en HDL):
Es una propiedad asociada con un dato objeto (señal, variable, …)  que es usada por la herramienta de síntesis y, en ciertos atributos, por la herramienta de mapeo. Los atributos de síntesis son definidos y aplicados en el código VHDL o Verilog que se deseen usar. Sin embargo, no se puede usar cualquier atributo, sino los definidos por la herramienta de síntesis a usar. Para agregarle portabilidad al código VHDL/Verilog algunos atributos pueden ser reemplazados por restricciones establecidas en el archivo de restricciones (.ucf para el caso de Xilinx).
Un ejemplo de atributo muy usado es que selecciona el tipo de coodifiacion que se asigna a casa estado de una maquina de estados descripta en VHDL:

type my_fsm_state is (reset, load, count, hold);
attribute syn_encoding: string;
attribute syn_encoding of my_fsm_state: type is “gray”;

Otro ejemplo de uso de atributo de sintesis, se detalla a continuación. En este caso se define un arreglo de vectores, que se desea sea sintetizado en los bloques de memoria RAM del FPGA, y no en los bloques de memoria distribuida:

type ram_type is array(63 downto 0) of  std_logic_vector(15 downto 0);
signal ram: ram_type;
attribute syn_ramstyle: string;
attribute syn_ramstyle of ram: signal is “block_ram”;

Un ejemplo de atributo que pueder ser usado en el codigo VHDL pero que en realidad es mejor que se use una restriccion en el .ucf es el siguiente:

attribute loc: string;
attribute loc of {signal_name| label_name}: {signal |label} is “location”;

En este ejemplo se define la locacion de un pin del FPGA especifico para una determinada senial. Al hacerlo en el código VHDL le quita portabilidad al código, como asi también, si existen un gran numero de pines de E/S se agregan muchas líneas al código que complican su comprensión.

Directivas
Controlan el modo que el diseño es analizado antes de la síntesis. Algunas directivs en realidad se escriben como si fueran comentarios dentro del código VHDL. Es decir comienzan con los dos guiones ‘- -‘, y a continuación la palabra ‘pragma’ o ‘synposys’ (para el caso de usar herramienta de síntesis de Synposys).
Una directiva comúnmente encontrada y usada en los códigos VHDL es:
- - pragma translate_off
- - pragma translate_on

Estas directivas instruyen al compilador VHDL a deshabilitar y habilitar la síntesis del código VHDL. Recuerde que la síntesis del código es automáticamente habilitada al comienzo de cada archivo VHDL. A partir de ahí, en cualquier lugar del archivo se pueden usar estar directivas.
Otra directiva que es usualmente usada es:
- - pragma synthesis_off
- - pragma synthesis_on

Estas se usan cuando se requiere o necesita ‘ocultar’ a la herramienta de síntesis instrucciones VHDL usadas solo para simulación. Cualquier texto entre estas directivas será chequeado por sintaxis pero no será sintetizado.

Restricciones (de Implementación):
      Controlan la herramienta del mapeo, colocación (placement), frecuencia (timing) y otras opciones de implementación de la lógica generada en el FPGA. Generalmente las resticicones son mantenidas en un archivo diferente del archivo VHDL. Por ejemplo para el entorno ISE de Xilinx las restricciones se deben escribir en el archvio  llamado ‘user define constraint’ (.ucf). Este archivo es leído por la herramientas de mapeo, place and route para aplicar las restricciones en la lógica implementada.
Ejemplo de restricciones del .ucf:

# asignación de un pin (P110) a un seniel de E/S
INST “MUXBUF_D0_OUT” LOC=P110;
# especificacion del periodo del reloj master_clk
TIMESPEC TS_master = PERIOD “master_clk” 50;


Les recomiendo leer la información del manual del usuario de la herramienta de síntesis y de la herramienta de mapeo y place and route para las restricciones.