He diseñado un sistema con Artix-7 FPGA en un tablero personalizado. El objetivo es transferir datos de 32 bits a un chip externo incorporado cuyo bus de datos es un puerto inout
. Primero, un poco de historia:
El chip externo está controlado por un reloj de 100MHz generado por el FPGA, llamémoslo o_clk
. El FPGA genera este reloj a través de un MMCM en el generador de interfaz de memoria (MIG IP) utilizando el reloj del sistema diferencial de 200MHz. El o_clk
se devuelve de la salida del FPGA y se le da a otra bola como un reloj de entrada, llamémoslo i_clk
.
El chip externo recibe el o_clk
y ve datos sobre el flanco ascendente de este reloj. Sin embargo, cuando el chip externo envía datos de vuelta a FPGA, el FPGA ve estos datos en el bucle de retorno i_clk
. La idea detrás de hacerlo es que podemos tratar las comunicaciones como fuente síncrona, en ambas direcciones (recuerde, es un puerto inout
). Algo como abajo:
FPGA --> EC is synchronous to FPGA because FPGA generates clock
EC --> FPGA is synchronous to EC because FPGA gets external clock (virtually from EC)
Para restringir este diseño, he usado i_clk
para establecer los retrasos de entrada en el io_data
y he usado o_clk
para restringir la salida en el mismo io_data
bus. Me he asegurado de que estoy usando un reloj reenviado ( create_generated_clock
) (usando el ODDR2) para la restricción set_output_delay
.
Aquí están mis restricciones:
create_clock -period 10.000 -name i_clk -waveform {0.000 5.000} [get_ports i_clk]
set_clock_groups -name loopback_grp -asynchronous -group [get_clocks i_clk] -group [get_clocks o_clk]
set_input_delay -clock i_fx3_pclk -max 8.000 [get_ports io_fx3_fdata]
set_input_delay -clock i_clk -min 2.000 [get_ports io_data]
set_output_delay -clock o_clk -max 2.000 [get_ports io_data]
set_output_delay -clock o_clk -min -0.500 [get_ports io_data]
El sistema parece funcionar correctamente cuando lo ejecuto en hardware, pero aún tengo algunas dudas porque todavía soy un desarrollador de FPGA amateur y este es mi primer gran diseño de FPGA.
Mis preguntas son:
- ¿He diseñado un buen sistema?
- ¿Es correcto tratar la comunicación de EC - > ¿FPGA como fuente síncrona? (La otra dirección es la sincronización de origen porque FPGA proporciona reloj, si no me equivoco.)
- ¿Son correctas mis restricciones?