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

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

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 usaba el reloj de un solo extremo, era:

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 cambiar del reloj de un solo extremo 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 de flanco ascendente no parece funcionar. ¿Debo hacer una nueva señal que sea clk_1- clk_2, dónde clk_1y clk_2están las dos señales diferenciales? No sé si cambiar mi fuente de reloj debería afectar la forma en que se escribe el resto de mi código.

Lo que digo 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.

Respuestas (1)

Para 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 http://www.xilinx.com/support/answers/57109.html . Asegúrese de obtener el IOSTANDARD correcto. Tal vez LVPECL_25, LVPECL_33, LVDS_25 o LVDS_33, según 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 diferencial interna de 100 ohmios. Verifique el diseño/esquema de la placa para ver si ya hay una resistencia de terminación discreta, en cuyo caso debe dejar DIFF_TERM desactivado o agregar DIFF_TERM = FALSE.

Luego, deberá crear una instancia de un IBUFGDS en lugar de un IBUFG, tal vez 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.

También se debe verificar el esquema para ver si se necesita una terminación interna.
Sí, estaba llegando a eso. Supongo que será necesario, no estoy seguro de por qué un diseñador optaría por una resistencia de terminación discreta para una entrada de reloj diferencial como esa. Podría ser difícil colocarlo en la ubicación correcta en el tablero.
Lo he visto en las placas de desarrollo de Xilinx antes, no estoy seguro de si hay una razón.
¿Es FD_100 una configuración real? Pensé que era DIFF_TERM = TRUE.
Hmm, tal vez sea solo DIFF_TERM = TRUE. Hay una tabla completa en UG381 de diferentes estilos de terminación con nombres que parecen ir en el archivo UCF, como FD_100 y FP_VCCO_50, NS_70_ND_187_FD_100, etc.
En la lectura adicional, parece que IN_TERM y OUT_TERM son solo para señalización de un solo extremo, y solo existe DIFF_TERM para una terminación de 100 ohmios para señalización diferencial.
¿Entonces escribiría esto? NET clk_P DIFF_TERM = VERDADERO;
Simplemente agréguelo después de IOSTANDARD y sepárelo con otro |
Pero supongo que ponerlo en su propia línea también funcionaría.