sábado, 16 de octubre de 2010

Source Synchronous Clocking

Source-synchronous clock se refiere a una técnica usada en buses de alta velocidad para enviar/recibir datos entre dos dispositivos. Existe otro método llamado system synchronous que veremos en un próximo blog.
En el caso de un sistema source-synchronous, el dispositivo transmisor (source) envía el reloj junto con el (los) dato(s). De este modo el timing de los datos, unidireccionales, estan referenciados a este especifico clock (a veces llamado strobe) generado por el dispositivo origen (source).




En la figura de arriba el FPGA es el dispositivo de destino, sin embargo, en otra situación el FPGA puede ser el dispositivo transmisor.
Este tipo de clocking es común en interfaces de alta/muy-alta velocidad como el Intel Front Side Bus, HyperTransport, SPI-4.2 y la mas común DDR.
Ventaja: dado que el reloj y los datos son generados por un mismo dispositivo, variaciones en los retardos de  propagación generados por variaciones de PVT (Process Voltage Temperature) serán los mismos para el reloj y los datos. Completamente diferente a lo que suele ocurrir cuando un tercer dispositivo genera el reloj del sistema.
Desventaja: la principal es la creación de un dominio de reloj en el dispositivo receptor separado del reloj principal del mismo. Como consecuencia es necesario un bloque de sincronización en el receptor para transferir el dato recibido, sincronizado con el reloj del transmisor, al dominio del reloj receptor (pues generalmente la lógica del receptor trabaja a una frecuencia no relacionada para nada con la frecuencia del reloj del source synchronous). Para muy altas velocidad problemas de cross-talk y skew pueden aparecer.
Si bien este sistema añade mas lógica, comparado con un sistema de reloj general, permite trabajar con altas velocidades transmisión. Por ejemplo 622 Mbit/s para SPI-4.2.


Relación dato-reloj
Hay dos opciones de relación reloj-dato definidas de antemano por el protocolo del bus source synchronous con que se esté trabajando.
Por ejemplo, cuando se lee una memoria DDR el dato está sincronizado (edge-aligned) con el flanco del reloj. Así, los datos a la salida de la memoria se ven como en la siguiente figura:


Por lo que para realizar una captura correcta del dato, en el receptor normalmente se hace pasar el reloj por un elemento de control de reloj, tipo DCM en los FPGAs de Xilinx, para desplazar (shitf) el reloj 90 grados y asi capturar el dato en los DDR flip-flops sin problema.
En otros protocolos, SPI-4.2 por ejemplo, dato y reloj tienen la siguiente relación:


El reloj esta desplazado (normalmente centrado) con respecto al dato, por lo que el receptor puede usar perfectamente el reloj del transmisor para efectuar el registro de los datos. Sin embargo, en algunas interfaces con este tipo de relación reloj-dato, se usa un PLL o DCM para desplazar (phase offset) la entrada de reloj de modo de hacer un ajuste 'fino' del flanco de reloj para la mejor captura del dato.


Independientemente de la relación reloj-dato con que se trabajo SIEMPRE se deben usar los flip-flops localizados en los bloques E/S, ya sea para transmitir o para recibir. Por ejemplo para el caso de Xilinx se debe usar un contraint como el siguiente:

INST *abus_ddr_* IOB=TRUE;# Fuerza el uso de IOB 
                          #flip-flops en las señales *abus_ddr_*


Para no aburrirlo y que no se haga muy largo este post, seguiré con System-Synchronous en el próximo.... (cdo? ... no se :) :) )

No hay comentarios:

Publicar un comentario