Spartan 6: ¿Cómo uso mi reloj diferencial?

1

mi placa de evaluación SP601 viene con un oscilador diferencial de 200 V LVDS de 200 MHz. Hasta ahora, solo he estado usando el reloj de un solo extremo provisto con la placa. Estoy teniendo problemas con la forma de formatear el archivo de restricciones del usuario para usar el reloj diferencial. Esto es lo que tengo hasta ahora en mi archivo de restricciones de usuario.

NET "clk_N" LOC = "K16"; ## 5 on U5 EG2121CA, 5 of U20 SI500D (DNP)
NET "clk_P" LOC = "K15"; ## 6 on U5 EG2121CA, 4 of U20 SI500D (DNP)

Lo que tenía antes, cuando usé el reloj de un solo extremo, fue:

NET "clk" LOC = "V10"; ## 5 on X2 USER OSC Socket
NET "clk" TNM_NET = "clk";
TIMESPEC "TS_clk" = PERIOD "clk" 37 ns HIGH 50%;

Además, después de incluir con éxito el reloj en mi archivo de restricciones de usuario, ¿qué cambios debo hacer en mi código para pasar del reloj de una sola punta al reloj diferencial? Originalmente, tengo una señal llamada clk , y disparo el flanco ascendente de esta señal. Ahora que tengo dos señales, el método del flanco ascendente no parece funcionar. ¿Debo hacer una nueva señal que sea clk_1 - clk_2 , donde clk_1 y clk_2 son las dos señales diferenciales? No sé si cambiar la fuente de mi reloj debería afectar la forma en que se escribe el resto de mi código.

Lo que estoy diciendo es que soy nuevo en los FPGA, y tengo una idea de cómo funciona la señalización diferencial en teoría, pero no estoy seguro de cómo funciona en la práctica. Estoy usando VHDL.

    
pregunta Eugene Wu

1 respuesta

2

Por restricciones, haz algo como esto:

NET "clk_P" LOC = "K15" | IOSTANDARD=LVDS_33; ## 6 on U5 EG2121CA, 4 of U20 SI500D (DNP)
NET "clk_N" LOC = "K16" | IOSTANDARD=LVDS_33; ## 5 on U5 EG2121CA, 5 of U20 SI500D (DNP)
NET "clk_P" TNM_NET = "clk";
TIMESPEC "TS_clk" = PERIOD "clk" 5 ns HIGH 50%;

Solo necesita restringir el lado P, según enlace . Asegúrese de obtener el IOSTANDARD correcto. Quizás LVPECL_25, LVPECL_33, LVDS_25, o LVDS_33, dependiendo de la fuente del reloj. Ver Xilinx UG381. Es posible que también deba configurar DIFF_TERM = TRUE junto con IOSTANDARD para habilitar la terminación de diferencial interna de 100 ohmios. Verifique el diseño / esquema de la placa para ver si ya existe una resistencia de terminación discreta, en cuyo caso debe dejar desactivado DIFF_TERM o agregar DIFF_TERM = FALSE.

Entonces necesitarás crear una instancia de IBUFGDS en lugar de IBUFG, quizás algo como esto:

IBUFGDS ibufg_inst (.I(clk_P), .IB(clk_N), .O(clk_ibufg));
BUFG bufg_inst (.I(clk_ibufg), .O(clk));

Luego solo usa clk como lo hiciste antes. Si está utilizando un DCM o PLL, debería poder colocar la instancia de DCM o PLL entre IBUFGDS y BUFG.

    
respondido por el alex.forencich

Lea otras preguntas en las etiquetas