Vhdl VGA Problem

0

Estoy haciendo un proyecto fpga en vhdl para mis estudios.

Estoy mostrando un perro en la pantalla que intento mover. Eso funciona bien para derecha, izquierda y arriba, pero al tratar de hacer que el perro caiga, se mueve de una manera extraña: es como el perro "se desplaza", es difícil de describir pero no es el perro el que mueve su tipo de ventana que se mueve en una lista de los siguientes perros.

Si muevo la parte else Spot <= '0' del código, otras direcciones (derecha y abajo) se vuelven inválidas (el mismo error).

aquí está el enlace del video: enlace

Aquí está el código completo: enlace

Aquí está la parte del código de error (creo):

begin

if clk25'event and clk25='1' then
    if Compteur_pixels >= origineX and compteur_pixels < origineX + tailleX 
    and compteur_lignes >= origineY and compteur_lignes < origineY + tailleY  then
        Spot <= dog (ligne,Pixel); --dog and is an array of 0 and 1 
        Pixel := Pixel+1;


        if pixel >= tailleX then 
            pixel := 0; 
            ligne := ligne + 1;

                if ligne >= tailleY then 
                ligne := 0;

                     else Spot <= '0';

                if direction = "00011100" then     -- right key pressed (A)
                   if originex < 700  then
                         originex := origineX + 1; --increment X origin of dog
                    end if;

                elsif direction = "00011010" then -- left (w)
                    if originex > 83  then
                        originex := origineX - 1;
                    end if;

                elsif direction = "00111010" then -- up
                    if originey > 46 then
                        originey := originey - 1;       
                    end if;

                elsif direction = "01000010" then  -- down
                    if originey < 450  then
                        originey := originey + 1;
                    end if;
                end if;
            end if;
        end if;
    end if;
end if ;

end process ;
    
pregunta Comeon

3 respuestas

1

Gracias a un amigo, espero que la señal de sincronización vertical sea igual a 0 para hacer que mi imagen se mueva. Resolvió el problema porque el origen del sprite ahora cambia solo cuando la pantalla está cerca de volver a dibujarse.

    
respondido por el Comeon
0

Tienes algunos píxeles blancos ('1') en el borde o en la matriz de tu perro. Si simplemente lo desliza como hace el algoritmo, verá el error de "desplazamiento" del que habla. Haga su matriz (es decir, sprite), tenga ceros en los bordes si desea moverla un píxel a la vez. O simplemente puede borrar la pantalla y volver a pintar en cada movimiento del cursor.

    
respondido por el MIkeB
0

Mis comentarios anteriores fueron incorrectos, porque el desplazamiento es dentro de el área de sprite, con el resto de la pantalla despejada. No podría decir eso por tu descripción.

Ahora puedo ver que cuando mueves el origen de un perro que se muestra parcialmente en la pantalla, no ajustas las posiciones de Pixel y Ligne dentro del perro. Entonces, al mover el sprite en una dirección, lo mueves FUERA del rango de escaneo y comienzas a dibujarlo en (0,0) en coordenadas de perro cuando llegues a la siguiente línea.

Si te mueves en la otra dirección, deberías saltarte una línea. Lo que era (1,0) o (0,1) en las coordenadas del perro ahora debería ser (2,0) o (0,2) pero no hace ese ajuste. Sin embargo, si lo hicieras, deberías perderte la primera línea o columna de píxeles y dibujar un sprite incompleto.

Una mejor respuesta es detectar solo el movimiento de sprites y procesar el origen cuando el contador de píxeles esté completamente fuera del marco. O al menos, fuera del sprite en el eje Y.

También, haga que los valores de los límites (83, 46, etc.) no sean números mágicos, sino que dependan del tamaño del sprite, por ejemplo. VGA_height - Dog_height - margin;

    
respondido por el Brian Drummond

Lea otras preguntas en las etiquetas