Invertir reloj XYNIN ZYNQ / ARTIX7 sin inducir sesgo

1

Para el diseño HDL que estoy desarrollando actualmente para un SoC de zynq, necesito invertir una señal de reloj debido a un par diferencial intercambiado en el nivel de placa.

El uso de "NO" para invertir agrega una LUT en la ruta y, como tal, introduce un sesgo de al menos 500ps entre el invertido y el original (que también se coloca en otra salida diferencial. Y esto es demasiado en nuestro caso.

¿Hay una manera de invertir una señal de reloj para que la inclinación entre el original y la copia invertida sea mínima?

He encontrado una posible solución utilizando la primitiva ODDR, pero esto parece más una solución que una solución.

Gracias de antemano.

    
pregunta Thomas

2 respuestas

1

Con los dispositivos Xilinx, usar una ODDR es en realidad la forma recomendada de emitir una señal de reloj en un pin, especialmente si tiene restricciones de tiempo estrictas. Haga esto para ambos clk y clk180 , y ambos tendrán el mismo tiempo repetible. No es una solución en absoluto.

Ver comentario en el foro de Xilinx aquí por un ingeniero de Xilinx:

  

ODDR mantiene el ciclo de trabajo y proporciona el mejor camino posible. Sin enrutamiento del reloj en ninguna interconexión, el reloj permanece en los recursos del reloj global al que pertenecen.

También se menciona en la Guía de usuario de Xilinx 7-Series Select IO , página 128, sección "Recursos OLOGIC" > "Reenvío de reloj":

  

La salida DDR puede reenviar una copia del reloj a la salida. Esto es útil para propagar.   un reloj y datos DDR con retrasos idénticos, y para generación de múltiples relojes

Podría jugar con el equilibrio de los retrasos de LUT con otras LUT, ODELAY y restricciones, pero esto no se acercará a la simplicidad o la previsibilidad de temporización del método ODDR.

    
respondido por el scary_jeff
0

Podrías intentar agregar el mismo retraso a ambas salidas. El truco es introducir una lógica que no pueda optimizarse, pero agrega un retraso de LUT.

Probablemente esté familiarizado con el uso de puertas EXOR para invertir condicionalmente una señal.

Yo agregaría una función EXOR a ambos puertos de salida. La señal de "control" de un EXOR es alta y la otra no. La señal de control en cada puerta EXOR debe ser tal que pueda cambiar. p.ej. un registro en el que puede escribir un uno o cero. Nunca harás eso, pero las herramientas de síntesis no lo saben, así que tiene que mantener la puerta EXOR. No puede optimizarlo.

Ayer traté de evitar que la lógica fuera optimizada usando varias restricciones de Xilinx pero falló. Al final, utilicé el método de trabajo seguro que describí anteriormente, pero utilicé un pin de entrada para hacer que la LUT no inversora no se optimice:

//
// Same delay path for o1 and o2 
// where o2 = ~o1
//
module keep (
   input  clk,
   input  reset_n,
   input  never_changes, // Always low 
   output o1,o2
  );

reg [1:0] count;

   // Some (arbitrary) test registers
   always @(posedge clk or negedge reset_n)
   begin
      if (!reset_n)
        count <= 2'b0;
      else
        count <= count + 2'b01;
   end  

/* 
   This did not work:   
   XOR2 X1(.I0(count[1]),.I1(1'b0),.O(o1));
   // synthesis attribute optimize of X1 is off
   XOR2 X2(.I0(count[1]),.I1(1'b1),.O(o2));
   // synthesis attribute optimize of X2 is off
 */
 // This can't fail: Note that never_changes should be low
   assign o1 = never_changes ^ count[1];
   assign o2 = ~count[1];

endmodule   

Este es el resultado de las salidas después de place & ruta:

    
respondido por el Oldfart

Lea otras preguntas en las etiquetas