Habilitar reloj para salida de VHDL para DAC

1

Tengo un reloj del sistema, me gustaría usar el reloj del sistema para manejar un reloj DAC. Solo deseo enviar el reloj al DAC cuando lo habilite. "Anding" las señales juntas es lo primero que intenté:

DAC_CLK <= DAC_SHIFTOUT_EN_H and SYS_CLK;--Output to DAC clock pin

El problema está en la simulación: había una runt desde que el reloj iba a lo alto y el retraso lógico combinatorio en la señal DAC_SHIFTOUT_EN_H. Así que decidí ir por una ruta diferente: usé esto para probar y almacenar el reloj, que funcionó en la simulación pero no funciona en un Altera Max10 Fpga.

DAC_CLK_COMB : process(SYS_CLK,DAC_SHIFTOUT_EN_H)
begin
  if  DAC_SHIFTOUT_EN_H = '0' then
    DAC_CLK_TEMP <=  '0';
  else
    DAC_CLK_TEMP <=  SYS_CLK;
  end if;
end process;
DAC_CLK <= DAC_CLK_TEMP;--Output to DAC clock pin

Encontré algunos recursos en Internet sobre los relojes Gating, pero hacen recomendaciones basadas únicamente en el tiempo que no me importa porque no estoy usando la lógica en sentido descendente. ¿Cuál es la mejor manera de utilizar una habilitación de reloj para una salida sin retrasarla con un reloj si es aceptable un retraso de menos de un ciclo de reloj?

    
pregunta laptop2d

2 respuestas

2

En general, los relojes FPGA no deben usarse en lógica combinatoria. Los buses de reloj se enrutan especialmente a través del FPGA y su uso sin fines de reloj puede crear problemas inesperados en el cierre de tiempo para otras partes de su diseño.

El problema principal en su caso, sin embargo, es que casi siempre terminará con una señal que comienza o termina, con una fracción de un solo impulso de reloj .

Sin cronometrar su salida, confía en que sus dos señales DAC_SHIFTOUT_EN_H y SYS_CLK estén perfectamente alineadas, lo que probablemente nunca lo estarán, debido a retrasos en el fanout y el enrutamiento .

Primero, verifique si su FPGA tiene un búfer de reloj con una habilitación, un estado triple. Esta será tu solución más fácil.

Además de eso, puede crear dos señales y alternarlas en los bordes alternos del reloj: una en el borde ascendente y otra en la caída. Entonces xor los dos resultados. Al igual que:

process(clk, en)
begin
    If (en = '0') then
        a <= '0';
        b <= '0';
    else
        if (rising_edge(clk)) then
            a <= not a;
        end if;
        if (falling_edge(clk)) then
            b <= not b;
        end if;
    end if;
    dac_clk <= a xor b;
end process;

Es probable que tu segundo intento esté fallando, por la misma razón que tu primer intento es. Como lo demuestra su simulación, su señal DAC_SHIFTOUT_EN_H se retrasa muy ligeramente con respecto a su SYS_CLK. La falla se produce en su salida con lógica asíncrona (en ambos casos), ya que su señal de salida incluye la porción muy pequeña de SYS_CLK que se mantiene hasta que su DAC_SHIFTOUT_EN_H finalmente caiga, tal vez picosegundos demasiado tarde.

El hecho de que su segunda simulación no mostrara el mismo problema probablemente se deba a que el diseño de la nueva síntesis no causó problemas para una simulación de comportamiento. Sin embargo, esto no significa que los problemas no existan.

Aquí he simulado tu segundo intento. Pero agregué manualmente un pequeño retraso en la señal DAC_SHIFTOUT_EN_H . Puedes ver que produce el mismo resultado que tu primer intento. Hice el retraso lo suficientemente grande como para ser visto, facilitando su visualización.

Espero que esto ayude.

    
respondido por el Blair Fonville
0

No active los relojes. Nunca. Los FPGA tienen lógica dedicada para el reloj y para los datos, y están no diseñados para ser mezclados.

La solución más fácil para hacer descender un reloj del IC es usar una primitiva DDR. Luego, para su requerimiento específico, no lo conduzca a menos que esté habilitado, debería poder usar la habilitación del módulo DDR para ello.

    
respondido por el Aaron D. Marasco

Lea otras preguntas en las etiquetas