2 votos

obteniendo error de los bucles for en vhdl

Hola estoy tratando de usar 2 bucles for anidados en vhdl pero me da este error.

La expresión de rango [Synth 8-561] no pudo ser resuelta a una constante [318]

No entiendo por qué este código no funciona ya que cursor_pos_x o cursor_pos_y no son constantes.

este es el bucle for que tengo

   for i in (cursor_pos_x) to (cursor_pos_x + length - 1) loop --318
   for j in (cursor_pos_y) to (cursor_pos_y + length - 1) loop

cursor_pos_x y cursor_pos_y son señales y tienen tipo entero. y la longitud es

signal length : integer range 0 to 250:= 250
signal cursor_pos_x : integer range 0 to 250 := 0;

¿Cómo puedo solucionarlo?

Estoy usando vivado2017.2

6voto

Brian Drummond Puntos 27798

El problema aquí es que estás diseñando código para la síntesis sin entender realmente lo que eso significa.

La síntesis genera hardware para implementar tu diseño: piensa en las implicaciones de un bucle cuyo rango no es constante: implica que, al cambiar los límites del bucle, el hardware aparece o desaparece mágicamente para implementar ese cambio.

No va a suceder; al menos no en las FPGAs actuales.

Por lo tanto, tienes que transformar tu algoritmo en uno con restricciones de bucle estático.

Por ejemplo, puede 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 se hace un bucle sobre todo el rango, pero sólo si dos comparadores que comparan el índice del bucle con los límites de su variable (o señal) dicen "sí", el do_something bloque sea habilitado.

Los bucles while son peores : t

Por cierto, te das cuenta de que (en un proceso con reloj) tu bucle estará completamente desenrollado, generando suficiente hardware para ejecutar todo el bucle en un solo ciclo de reloj, ¿verdad? Si tienes dos bucles anidados con 250 iteraciones cada uno, eso será bastante hardware...

1voto

yeyo123321 Puntos 8

No entiendo por qué este código no funciona ya que cursor_pos_x o cursor_pos_y no son constantes.

Ese es exactamente el problema. Si miras el mensaje de error dice:
La expresión de rango podría no se resuelve en una constante

Tu bucle for utiliza variables. Les has dado un valor por defecto pero eso no las convierte en constantes. Para la síntesis, el rango del bucle debe ser estático (es decir, implica un número definido de iteraciones).

1voto

GRoNGoR Puntos 81

El rango en un bucle for debe ser constante para poder sintetizarlo. El sintetizador Vivado arroja un error porque no puede resolver los rangos dinámicos en su expresión formada por cursor_posx y length.

Los bucles se desenrollan mientras se sintetizan para replicar el hardware. Así que los límites tienen que ser definidos y bien conocidos por el sintetizador. No hay ningún límite definido aquí en su código.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X