El problema aquí es que estás diseñando código para síntesis sin entender realmente lo que eso significa.
La síntesis genera hardware para implementar su diseño: piense en las implicaciones de un bucle cuyo rango no sea constante: implica que, a medida que cambia los límites del bucle, el hardware aparece o desaparece mágicamente para implementar ese cambio.
No va a suceder; al menos no en los FPGA de hoy.
Por lo tanto, debe transformar su algoritmo en uno con restricciones de bucle estático.
Por ejemplo, puedes transformar
for i in cursor_pos_x to cursor_pos_x + length - 1 loop
do something;
end loop;
en
subtype my_loop_range is natural range min_x to max_x;
for i in my_loop_range loop
if i >= cursor_pos_x and i < cursor_pos_x + length then
do something;
end if;
end loop;
Ahora siempre recorre todo el rango, pero solo si dos comparadores que comparan el índice de bucle con los límites de su variable (o señal) dicen "sí", se habilitará el bloque do_something
.
Mientras que los bucles son peores: en general no existe un límite de bucle definido, por lo que las herramientas de síntesis pueden darles un soporte aún más deficiente.
Por cierto, te das cuenta de que (en un proceso cronometrado) tu bucle se desenrollará completamente, generando suficiente hardware para ejecutar todo el bucle en un solo ciclo de reloj, ¿verdad? Si tiene dos bucles anidados con 250 iteraciones cada uno, eso será bastante hardware ...