¿Cómo resolver problemas de enrutamiento en Artix7?

Estoy trabajando con Artix 7 (xc7a15tftg256). Cuando llega el momento de ejecutar la implementación, muestra el siguiente mensaje de error:

[Lugar 30-574] Mala ubicación para el enrutamiento entre un pin IO y BUFG. Si esta condición subóptima es aceptable para este diseño, puede usar la restricción CLOCK_DEDICATED_ROUTE en el archivo .xdc para degradar este mensaje a ADVERTENCIA. Sin embargo, se desaconseja encarecidamente el uso de esta anulación. Estos ejemplos se pueden usar directamente en el archivo .xdc para anular esta regla de reloj. < set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets input_IBUF] >

  • input_IBUF_inst(IBUF.O) está bloqueado paraIOB_X0Y83
  • input_IBUF_BUFG_inst(BUFG.I) es colocado provisionalmente por clockplacer enBUFGCTRL_X0Y30

Para mi aplicación verifico rising_edge(input). Por favor proporcione la solución en este problema.

Suena como si estuviera usando un pin de entrada que no es de reloj para su entrada de reloj. No todos los pines de entrada pueden enrutarse directamente a las redes de reloj global en el FPGA. Si inputen realidad es una señal de reloj, y si lo que está usando es una placa personalizada, diría que haga un rediseño y asegúrese de usar una entrada de reloj dedicada y correcta. Si inputno es un reloj como tal, sino solo una señal en la que desea activar el borde, ¿por qué no usar una señal de reloj "real" para muestrearla?
¿Agrega IOB durante la síntesis? ¿O utiliza el IBUF en su diseño? En ese caso, debe eliminarlo y dejar que la herramienta decida.

Respuestas (1)

Se recomienda utilizar pines compatibles con reloj (CC pines) para las entradas de reloj. Estos se pueden enrutar a BUFG.

Pero el error está en otra parte de tu código. Como escribiste, estás usando

if rising_edge(input) then

No puede usar risen_edge en ninguna red de reloj, esto los promueve a una red de reloj, cuya entrada no lo es.

La forma correcta es sincronizar la entrada con 2 D-FF y agregar una detección de borde después de eso (3rd D-FF, not-gate y and-gate). Todos los FF están controlados por el reloj de su sistema.

input_meta <= input      when rising_edge(Clock);  -- 1st synchronizer D-FF
input_sync <= input_meta when rising_edge(Clock);  -- 2nd synchronizer D-FF
input_d    <= input_sync when rising_edge(Clock);  -- edge detection D-FF (d = delayed)
input_re   <= not input_d and input_sync;          -- edge detection equation (re = rising edge)

process(Clock)
begin
  if rising_edge(Clock) then
    if (input_re = '1') then
      -- do something
    end if;
  end if;
end process;
"si risinig_edge (entrada) entonces" está perfectamente bien, ¿por qué cree que no es correcto? ¡El hecho de que se llame INPUT no significa que no pueda ser un reloj!
@FarhadA Mi respuesta tiene 2 partes: 1) con respecto al uso del pin CC para las entradas de reloj y 2) usando el borde ascendente en ninguna red de reloj. Como puede ver, Vivado inserta un IBUF y un BUFG para la entrada, porque el OP usó rising_edge(input). Entonces, o nombró una red de reloj real input(nombre extraño para un reloj) o el OP usó el borde ascendente en una señal de datos, lo que es incorrecto para la síntesis (en la mayoría de los casos). Ingresar señales de reloj en un FPGA en pines sin capacidad de reloj es una falla de diseño.