Usando ambos bordes de reloj en un diseño FPGA

4

Entonces, después de recibir algunos consejos de algunas buenas personas aquí, logré armar mi primer diseño de FPGA (muy modesto). Básicamente, son solo unos pocos registros y contadores, y solo se ejecutan a unos pocos MHz, pero podría sintetizarlo e implementarlo sin advertencias, y las señales reales que aparecen parecen hacer lo que la simulación me hizo pensar que harían. Aprendí algunas cosas a lo largo del camino.

Ahora quiero aprender a establecer restricciones de tiempo y ejecutar análisis de tiempo. Así que estoy leyendo el documento de Xilinx UG612 y veo en la parte superior de la página 205 :

"Usa solo un borde del reloj"

Hmm. Parece que violé la ley. Parte de mi diseño es un registro de desplazamiento de carga paralelo: utilicé la cobertura del último ciclo del reloj para cargarla (de un contador que se registró en la posición anterior). Un boceto rápido:

Por supuesto, no estoy usando directamente el campo negativo aquí, pero la señal de carga se deriva de él. Pensé que esto era bueno, pero Xilinx me dice que no hagas eso.

¿Estoy equivocado? Si es así, ¿por qué? ¿Qué debo hacer en su lugar?

    
pregunta dmb

3 respuestas

2
  

"Usa solo un borde del reloj"

No sé por qué dirían eso. Puede usar los flancos de reloj ascendentes y descendentes en el diseño y el analizador de tiempo lo tendrá en cuenta.

Por lo tanto, un reloj de 200MHz le dará 5 ns desde el flanco ascendente hasta el flanco ascendente, pero solo 2,5 ns desde el flanco ascendente hasta el flanco descendente. Hice un pequeño ejemplo usando valores de 16 bits:

always @(posedge clk)
   result1 <= counter + hold;
always @(negedge clk)
   result2 <= counter + hold;

A continuación se muestra una captura de pantalla del análisis de tiempo ISE. Es para un reloj de ciclo de servicio de 5 ns y 50%.

El texto trata sobre una ruta que falla desde el bit 3 de counter al bit 15 de result2 . Como puede ver, utiliza el flanco ascendente como origen y el flanco descendente para el destino.

    
respondido por el Oldfart
1

Los elementos lógicos en el FPGA generalmente se diseñan con tiempo de retención cero , específicamente para permitirle diseñar con un solo borde de reloj.

En su ejemplo, esto significa que tanto la señal CTR INC como la señal SR LOAD se ven como afirmadas en el borde 0, y ninguna se ve como afirmada en el borde 15. El valor que se carga en el registro de desplazamiento será el que está en el contador antes del borde 0. El efecto de incrementar el contador no se verá en el registro de desplazamiento hasta la próxima vez que se active SR LOAD.

Si hizo que la señal SR siguiera la misma forma de onda que CTR INC, esto seguiría siendo cierto y el comportamiento del circuito sería el mismo.

    
respondido por el The Photon
1

No se equivoca, solo hace que su vida sea más difícil de lo que debe ser ... especialmente en lo que respecta al cierre de tiempo (es más difícil desarrollar restricciones precisas). Puede hacer que este diseño funcione fácilmente solo en el flanco ascendente.

Me parece que, si quieres cargar cuando counter = 0, podrías tener una lógica combinatoria que: assign load = (counter==15) (o similar). Esto hará que su señal de carga retroceda 1/2 ciclo de reloj, y se verá en el borde ascendente de edge0 como se afirma. Sin embargo, hay muchas maneras de hacer esto (usando todos los FF con cronómetro ascendente), y probablemente un poco de googlear será de gran ayuda.

    
respondido por el CapnJJ

Lea otras preguntas en las etiquetas