Una breve introducción al uso de idelay de xilinx oddr

Sabemos que existen recursos ilógicos y ologicos en selectio de xilinx FPGA, que pueden realizar funciones como iddr / oddr, idelay y odelay. Cuando comenzó, es posible que no esté familiarizado con las primitivas de xilinx. Busque palabras clave como iddr idelay en herramientas-> plantillas de idioma de vivado y podrá ver las plantillas primitivas para dispositivos como A7. Cópialo para dibujar una calabaza, luego simúlalo y básicamente podrás aprender a usarlo.

1.oddr

Tanto oddr como iddr son iguales. Tome oddr como ejemplo, primero vaya a las plantillas y cópielas.

Agregue una fuente de simulación, cree un archivo de simulación simple.

módulo simu_oddr (
 
    );
        
    reg clk = 1'd0;
    siempre
    para siempre # 2 clk = ~ clk;
 
       ODDR # (
       .DDR_CLK_EDGE ("OPPOSITE_EDGE"), // "OPPOSITE_EDGE" o "SAME_EDGE" 
       .INIT (1'b0), // Valor inicial de Q: 1'b0 o 1'b1
       .SRTYPE ("SYNC") / / Establecer / Tipo de reinicio: "SYNC" o "ASYNC" 
    ) ODDR_inst (
       .Q (Q), // Salida DDR de 1 bit
       .C (clk), // Entrada de reloj de 1 bit
       .CE (1'd1), // Entrada de habilitación de reloj de 1 bit
       .D1 (1'd1), // Entrada de datos de 1 bit (flanco positivo)
       .D2 (1'd0), // Entrada de datos de 1 bit (flanco negativo)
       .R (1 'd0),


    
 

El uso de endmodule ODDR se explica en la página 127 del manual de referencia ug471 en selectoi Lo primero que debe consultar cuando utilice estos recursos es el manual oficial de recursos.

Breve descripción:

CE está habilitado, C es el reloj, D1 y D2 salen respectivamente en los flancos ascendente y descendente del reloj, Q es la salida, S / R se reinicia, R = 1 Q salidas 0, S = 1, Q salidas 1 , y el valor predeterminado debe ser Ambos son iguales a 0, y cuando ambos son iguales a 1, se emite 0. También hay instrucciones en el manual "OPPOSITE_EDGE" o "SAME_EDGE", que indican que el tiempo de muestreo es diferente. No conozco las diferencias específicas de la aplicación.

A través de la simulación, puede ver cuál es la salida: genera 1 en el flanco ascendente y 0 en el flanco descendente. También puede ver que la salida tiene un pequeño retraso. iddr y oddr pueden recibir datos fácilmente en la interfaz rgmii y convertirlos a gmii. En general, se debe prestar atención a la alineación del reloj y los datos. El reloj de muestreo puede tener una fase hacia atrás, 90 ° 1 // 4 ciclos, y el reloj se retrasará un poco al emitir. De acuerdo con la situación real, 125M DDR es sigue siendo muy fácil El muestreo es estable.

2.idelay

Díganos en ug471 que solo los bancos hp tienen odelay, y ug475 explica qué series tienen bancos hp. En pocas palabras, los bancos hp son mucho más rápidos y admiten odelay, y el voltaje solo puede ser de 1.2V a 1.8V. Entre ellos, todas las series A7 no tienen odelay, solo K7 (opiniones reservadas, solo míralo brevemente), por lo que la búsqueda de odelay en las plantillas de idioma no tiene primitivas de la serie A.

El papel de idelay es lograr un retraso de entrada. En la práctica, debería haber un uso más claro. Aquí hay algunas introducciones cuando estudio por mi cuenta. Idelay también se introdujo en ug471. Hay retrasos fijos y retrasos variables. Idelay ctrl debe ser instanciado cuando se usa. La precisión del retraso puede estar relacionada con el reloj de acceso de idelay ctrl. Solo hay un ctrl idelay en un banco, y el mismo banco necesita idelay u odelay. La precisión del retardo es la misma. Aunque idelay ctrl se puede conectar a 200Mhz, 300Mhz, el mismo banco solo se puede conectar a uno, y solo necesita ser instanciado una vez. Cuando se utiliza idelay para varios bancos, se debe crear una instancia varias veces.

`
 
módulo s de escala de tiempo 1ns / 1ps (
 
    );
    
    reg clk = 1'd0;
    siempre
    para siempre # 2.5 clk = ~ clk;
    
    
     (* IODELAY_GROUP = "idelay" *)
       IDELAYCTRL IDELAYCTRL_inst (
       .RDY (), // Salida de 1 bit: Salida lista
       .REFCLK (clk), // Entrada de 1 bit: Entrada de reloj de referencia
       .RST (1'd0) / / Entrada de 1 bit: entrada activa de restablecimiento alto
    );
 
    
    reg clk2 = 1'd0;
    siempre @ (posedge clk)
        clk2 <= ~ clk2;
    
    
    cable DATAOUT;
    
       (* IODELAY_GROUP = "idelay" *) // Especifica el nombre del grupo para los IDELAY / ODELAY asociados e IDELAYCTRL
    
       IDELAYE2 # (
          .CINVCTRL_SEL ("FALSE"), // Habilita la inversión dinámica del reloj (FALSE, TRUE)
          .DELAY_SRC ("IDATAIN"), // Entrada de retardo (IDATAIN, DATAIN)
          .HIGH_PERFORMANCE_MODE ("FALSE"), // Jitter reducido (" TRUE "), Potencia reducida (" FALSE ")
          .IDELAY_TYPE (" FIXED "), // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE
          .IDELAY_VALUE (31), // Configuración de tap de retardo de entrada (0-31)
          .PIPE_SEL (" FALSE "), // Seleccione el modo canalizado, FALSE, TRUE
          .REFCLK_FREQUENCY (200.0), // Frecuencia de entrada de reloj IDELAYCTRL en MHz (190.0-210.0, 290.0-310.0).
          .SIGNAL_PATTERN ("DATOS") // DATOS,


          .CNTVALUEOUT (CNTVALUEOUT), // Salida de 5 bits: Salida de valor de contador
          .DATAOUT (DATAOUT), // Salida de 1 bit: Salida de datos retardada
          .C (1'd1), // Entrada de 1 bit: Entrada de reloj
          . CE (1'd0), // Entrada de 1 bit: Entrada de incremento / decremento de habilitación alta activa
          .CINVCTRL (1'd0), // Entrada de 1 bit: Entrada de inversión de reloj dinámico
          .CNTVALUEIN (1'd0), // Entrada de 5 bits: Entrada de valor de contador
          .DATAIN (1'd0), // Entrada de 1 bit: Entrada de datos de retardo interno
          .IDATAIN (clk2), // Entrada de 1 bit: Entrada de datos de la E / S
          .INC ( 1'd0), // Entrada de 1 bit: Incremento / Disminución de entrada de retardo de tap
          .LD (1'd0), // Entrada de 1 bit: Carga la entrada
          IDELAY_VALUE .LDPIPEEN (1'd0), // Entrada de 1 bit: Habilita el registro
          PIPELINE para cargar la entrada de datos .REGRST (1'd0) // 1 -bit input: Active-high reset tap-delay input
       );
 
endmodule
Esto instancia un ctrl idelay, que pertenece al grupo idelay. Esta declaración no ha sido estudiada para su uso. No sé si especificar idelay2 y qué ctrl está atado fijo. El puerto ctrl idelay es muy simple. Simplemente conecte el reinicio primero a 0 durante la simulación. En la práctica, se recomienda invertir el pin de bloqueo pll del reloj de entrada para asegurarse de que el ctrl idelay esté en el estado de reinicio antes de que se bloquee el reloj. (bloqueo = 0).

De acuerdo con la configuración recomendada en idelay2, la diferencia entre la entrada DATIN e IDATAIN es el retardo interno o la entrada IO, el retardo fijo FIXED, el valor de idelay primero ingresa 0, el reloj es 200M y todos los demás están conectados a 0. Aquí, la función de idelay es conectar la señal IDATAIN a ilogic, retrasar 0 pulsaciones y luego enviarla desde DATAOUT. Las instrucciones para la variable delay están disponibles en ug471. Aún no las he aprendido. Compruébalo si lo necesitas.

Idelay tiene 0-31 grifos, divididos en un medio ciclo de 200M 2.5ns, cada grifo es 2.5ns / 32 = 0.078125 ns

Cuando valor = 0, se puede ver que la salida se retrasa en 0.6ns, cuando valor = 10, el retraso es 1.38ns. 0.078125 * 10 + 0.6 = 1.38125, que es aproximadamente lo mismo.

De hecho, los recursos como oddr e idelay deberían ser relativamente simples de usar. Tal vez he usado oddr / iddr en la práctica, y no me resulta demasiado difícil depurarlo. Este artículo presenta brevemente el uso de estas dos primitivas, desde copiar Primitivas, consulte el manual para introducir a la simulación, otras primitivas son similares, y lo más importante es aprender a aprender.

Al final del artículo, volveré a introducir generate. De igual forma, busque en herramientas -> plantillas de idioma.

 
   genvar <var>;
   generate
      for (<var> = 0; <var> <<limit>; <var> = <var> +1)
      begin: <label>
         <instantiation>
      end
   endgenerate
Esto se puede instanciar fácilmente Varios módulos similares son producidos.

       genvar i; // genvar i; también se puede definir en la instrucción
       generate generate
              for (i = 0; i <10; i = i + 1)
              begin: mymodule
                     assign a [i] = reg [i];
              end
       endgenerate
 
- - ——————————————
Declaración de derechos de autor: Este artículo es el artículo original del blogger de CSDN "La misma edad_", de acuerdo con el acuerdo de derechos de autor CC 4.0 BY-SA, adjunte el original enlace fuente y esta declaración para reimprimir.
Enlace original: https://blog.csdn.net/q774318039a/article/details/88910399

Supongo que te gusta

Origin blog.csdn.net/yundanfengqing_nuc/article/details/114633568
Recomendado
Clasificación