obteniendo un error de para bucles en vhdl

3

Hola, estoy tratando de usar 2 anidados para bucles en vhdl pero me sale este error.

[Synth 8-561] la expresión de rango no se pudo resolver en 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 for loops 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 solucionar esto?

Estoy usando vivado2017.2

    
pregunta OnurTR

3 respuestas

4

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 ...

    
respondido por el Brian Drummond
1
  

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 observa el mensaje de error que dice:
la expresión de rango no podría resolverse en una constante

Tu bucle for usa variables. Les has dado un valor predeterminado, pero eso no los hace constantes. Para la síntesis, el rango del bucle debe ser estático (es decir, implica un número definido de iteraciones).

    
respondido por el Oldfart
1

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

Los bucles se desenrollan mientras se sintetizan para replicar hardware. Por lo tanto, los límites deben ser definidos y bien conocidos para el sintetizador. No hay límite definido aquí en su código.

    
respondido por el MITU RAJ

Lea otras preguntas en las etiquetas