Primitivas de sincronización CDC para una FPGA Altera

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:

  • ¿Altera (u otra fuente reconocida) proporciona una biblioteca de primitivas de sincronización?
  • De no ser así, ¿qué pasos deben tomarse para garantizar que un bloque de sincronización escrito a mano se sintetice correctamente, simule correctamente y se someta a un análisis de tiempo correcto?

Una respuesta con un ejemplo de un sincronizador básico (por ejemplo, 2-Flop) sería bien considerada.

¿Qué tipo de señal quieres sincronizar? ¿Una luz estroboscópica, una bandera, un valor de contador, un vector de bits o algo más complejo?
Un std_logic_vetor. He implementado ingenuamente el sincronizador de protocolo de enlace de cuatro fases de este documento que simula correctamente, pero no estoy convencido de haberle "dicho" al FPGA todo lo que necesita saber para sintetizar correctamente.
Vea esta pregunta donde una respuesta enumera varios atributos alterados para la sincronización.
Actualicé los módulos sincronizadores en nuestra PoC-Library y subí los primeros cambios a GitHub. Gracias por el enlace a los atributos de Altera. Lo probaré en un diseño de Stratix IV y actualizaré mi publicación si todo funciona como se esperaba. Actualmente, mi diseño bloquea Quartus, por lo que es difícil encontrar la línea de código defectuosa (Xilinx compila mis archivos VHDL sin quejas).
Hola de nuevo. Actualicé las fuentes de PoC y mi respuesta para abordar los sincronizadores específicos de Altera. Actualmente estos circuitos funcionan en un diseño StratixIV en una placa DE4.

Respuestas (1)

El sincronizador de cuatro fases presentado es una implementación buena y correcta.

Solo tiene una desventaja:
tiene una Ventrada, 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?

  1. Deshabilita la extracción del registro de desplazamiento ( 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.
  2. Marque los registros como registros asincrónicos ( ASYNC_REG = TRUE). Esto es necesario para que las simulaciones posteriores a la síntesis supriman los valores metaestables.
  3. Coloque los registros uno cerca del otro ( RLOC = X0Y0). Esto coloca el sincronizador 2-FF en el mismo segmento.
  4. 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 TIGrestricció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

Editar: sincronizador 2-FF específico de Altera:

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?

  1. Ambos flip flops están marcados con PRESERVEpara dificultar las optimizaciones.
  2. 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.

  3. 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.

Sincronizadores de nivel superior:

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.