FPGA: retrasos intencionales a través de la colocación / enrutamiento manual

0

En mi diseño de FPGA, tengo algunas señales de entrada que deben retrasarse considerablemente antes de que lleguen al primer registro cronometrado. Hay elementos de retardo cerca de los pines para exactamente ese propósito, pero su retardo máximo todavía es demasiado bajo.

Así que quiero forzar las señales en un desvío a través del FPGA para lograr el retraso requerido. Me doy cuenta de que esto no es "por el libro", pero quizás otros hayan estado en la misma situación.

Pregunta: ¿Existen algunas reglas de "mejores prácticas" para este tipo de cosas?

Siempre que el retardo requerido pueda lograrse "en el papel" en ambos sentidos, ¿cuál es el preferido: señales que viajan grandes distancias o señales que pasan por la lógica combinatoria? ¿Qué tipo de lógica es la más adecuada para ese propósito (LUT, carry chain, ...)?

Si eres un diseñador experimentado y no puedes pensar en ninguna diferencia, eso también sería información útil.

Estoy usando un Altera Cyclone V, pero la pregunta debería responderse en general.

    
pregunta Stefan

6 respuestas

3

Lo que he hecho en un diseño reciente es multiplicar la frecuencia del reloj y usar un retraso temporizado. Eso me puede dar granularidad en la región sub-5ns con un FPGA barato.

Este documento de Lattice describe cómo hacer exactamente lo que está pidiendo (Engaña al compilador para que no optimice los buffers).

    
respondido por el Spehro Pefhany
2

Sincronizar la entrada y retrasarla con la cantidad adecuada de flip-flops sería la forma en que lo implementaría. ¿Cuál es su frecuencia de reloj y el retardo de entrada requerido? ¿Es aceptable una cierta variación en el retraso?

    
respondido por el Humpawumpa
1

Es bastante difícil detener los retrasos intencionales del PAR que "optimizan".

Si bien esta sugerencia no es la "mejor práctica", funciona siempre que tenga algunos pines de repuesto. Elija una cantidad de pines en lados opuestos del dispositivo y coloque sus números de pines en el archivo de restricciones. Luego ejecute su señal de una a la siguiente E / S. El PAR se verá obligado a enrutar las señales a través del chip y de regreso. No es necesario que las señales dirijan los pines externos, puede mantener las salidas en estado triple, aunque un sniff de capacitancia en el pin externo puede agregar más retraso si lo enruta a través del propio pin.

    
respondido por el Neil_UK
1

Como dijiste: eso no es recomendable. Tampoco estoy seguro de que sea necesario. La razón principal para retrasar una señal de entrada es para que no caiga dentro del tiempo de configuración y retención de su registro. El retraso de la almohadilla de E / S debería ser más que suficiente para eso.
Otra forma de resolver el problema es ver si puede usar el borde opuesto del reloj. No es ideal pero a veces hay que hacerlo.

Tengo la sensación de que este es otro caso de "Cuéntanos tu problema, no tu solución".

Si desea agregar otro retraso, tiene que usar algo que no se puede optimizar. Puede intentar usar un sumador donde la segunda entrada se pueda "programar". Simplemente nunca lo programes con ningún otro valor, entonces cero. Algo como:

reg [x:0] dummy;
    assign delayed_signal = signal + dummy;

always @(posedge clk or negedge reset_n)
   it (!reset_n)
       dummy <= 'b0;    
   else
      if (load_dummy)
         dummy <= {dummy,dummy_input};

Ahora debes asegurarte de que "load_dummy" y "dummy_input" son señales válidas que de alguna manera pueden cambiar, pero nunca lo hacen. p.ej. desde un registro de CPU o desde dos puertos de entrada que están vinculados.

Pero sospecho que la demora:

  • Sé muy pequeño.
  • No es lo mismo para todos los bits.

Una mejor alternativa, muy precisa pero más difícil, es usar un reloj interno de alta velocidad para "sincronizar" las señales.

    
respondido por el Oldfart
1

Sí, hay una mejor práctica: ¡No se demore en la lógica combinatoria!

Si no está utilizando la tasa de datos doble, seleccione el borde apropiado del reloj externo.

En caso de doble velocidad de datos (o si el reloj externo es plesiócrono a la lógica interna), use un PLL para recuperar y cambiar de fase el reloj externo. Luego, coloque un FIFO de doble reloj entre el nuevo dominio de reloj y su lógica interna.

    
respondido por el Andreas
0

¿Podrías usar un contador y un búfer? Ponga sus datos en un búfer y reinicie el contador. Use cualquier valor de reloj y contador que necesite para darle el retardo requerido, luego use una comparación de la salida del contador para habilitar la salida del búfer de modo que escupa los datos, o los sincronice donde se supone que debe ir.

    
respondido por el GigaJoules

Lea otras preguntas en las etiquetas