Estoy trabajando en mi primer diseño de FPGA no trivial y finalmente necesito Clock Domain Crossing (CDC).
Existen múltiples recursos ( entre otros ) que analizan varias arquitecturas para CDC y algunas preguntas relacionadas . La teoría está bien, pero al menos uno de esos recursos enumera trampas para los incautos y al menos un proyecto enumera múltiples atributos VHDL necesarios para sintetizar correctamente en un dispositivo Xilinx.
Estoy apuntando a Altera MAX10 para este proyecto usando VHDL. He codificado a mano un sincronizador de apretón de manos, pero de alguna manera sospecho que hay más.
Entonces:
Una respuesta con un ejemplo de un sincronizador básico (por ejemplo, 2-Flop) sería bien considerada.
El sincronizador de cuatro fases presentado es una implementación buena y correcta.
Solo tiene una desventaja:
tiene una V
entrada, para notificar al sincronizador de entradas cambiadas.
Esto se puede automatizar mediante un registro de n bits en el dominio del reloj de origen y un comparador de n bits: si la entrada cambió, afirmar V=1
.
Input_d <= Input when rising_edge(Clock);
V <= '1' when (Input_d /= Input) else '0'; -- input changed
La implementación de un sincronizador 2-FF, el núcleo de cada sincronizador de nivel superior, con los atributos y restricciones requeridos se puede encontrar de la siguiente manera:
¿Qué tiene de especial en comparación con las chanclas dobles normales?
SHREG_EXTRACT = NO
). Synthesis intenta encontrar cadenas de chanclas y colocarlas en registros de desplazamiento dedicados como Xilinx SRL32
. Estos cambiadores dedicados no son buenos para entradas metaestables.ASYNC_REG = TRUE
). Esto es necesario para que las simulaciones posteriores a la síntesis supriman los valores metaestables.RLOC = X0Y0
). Esto coloca el sincronizador 2-FF en el mismo segmento.Las chanclas tienen nombres únicos y se colocan en un grupo de tiempo especial llamado METASTABILITY_FFS
. Restricciones de Xilinx:
INST "*FF1_METASTABILITY_FFS" TNM = "METASTABILITY_FFS";
Todas las rutas de temporización desde un FF normal a un FF metaestable se ignoran, a través de la TIG
restricción.
NET "*_async" TIG;
INST "*_meta*" TNM = "METASTABILITY_FFS";
TIMESPEC "TS_MetaStability" = FROM FFS TO "METASTABILITY_FFS" TIG;
Fuentes: sync_Bits_Xilinx.ucf , Metastability.ucf
Agregué una nueva declaración de generación en la implementación genérica de 2-FF , para elegir una implementación específica de Altera: sync_Bits_Altera.vhdl
¿Qué tiene de especial esta versión?
PRESERVE
para dificultar las optimizaciones.El primer / el flip flop metaestable se anota con:
attribute ALTERA_ATTRIBUTE of Data_meta : signal is "-name SYNCHRONIZER_IDENTIFICATION ""FORCED IF ASYNCHRONOUS""";
para marcar estas chanclas como un circuito sincronizador.
Todas las rutas a estos registros se establecen como false_path
:
attribute ALTERA_ATTRIBUTE of rtl : architecture is "-name SDC_STATEMENT ""set_false_path -to [get_registers {*|sync_Bits_Altera:*|\gen:*:Data_meta}] """;
Esta es la sintaxis de anotación de restricciones SDC en línea.
Por supuesto, PoC-Library también tiene un sincronizador predefinido para vectores de bits llamado PoC.misc.sync.Vector , que se basa en el sincronizador genérico 2-FF. Si los bits maestros cambian, todos los bits se transfieren al dominio del reloj del receptor.
Paebbels
Damián
Damián
Paebbels
Paebbels