Snake Proyect

SNAKE FPGA

INTEGRANTES

Fs0mqI9n_400x400.png
Sergio Capote 20141686015
Ivan Fierro 20141615040
Diego Moreno 20141615021

RESUMEN

Para el Proyecto final de Sistemas Digitales decidimos elaborar el juego de snake, medianto verilog, un programa para modelar sistemas electronicos y de esta manera emularlo en la pantalla VGA, donde el usuario utilizara los botones de la FPGA para mover a la "snake" y lograr el objetivo del juego, que es acumular score y no estrellarse con los bordes de la pantalla limitada previamente.

INTRODUCCION

Realizar el juego de snake para controlarlo desde la tarjeta FPGA y que este logre ser emulado en la pantalla VGA, de esta manera cumplir con el objetivo de sincronizarlos y hacer el juego lo mas parecido posible al juego de snake sacado muhos años atras.

OBJETIVOS

  • Sincronizar el controlador entre la tarjeta FPGA y la pantalla VGA
  • Permitir al usuario escoger el nivel de velocidad de movimiento de la snake
  • Mostrar el score que lleva el usuario mientras juega la partida

El Snake o juego de la serpiente se basa en controlar una larga y delgada criatura, semejante a una serpiente, que se mueve alrededor de un plano delimitado, recogiendo alimentos (o algún otro elemento), tratando de evitar golpear a su propia cola o las "paredes" que rodean el área de juego, pero en este caso para dicho proyecto no se tendra la opcion de que la serpiente evite de alguna manera toca su cola, ya que esta ira ganando puntaje de un valor definido, por cada "Alimento" que recoja, pero por otro lado al golpear los limites de el plano, la criatura reiniciara en una pocision denominada "el centro".


images%20%281%29.png

Diseño Del Proyecto

Para realizar el proyecto se necesita principalmente de:

Tarjeta FPGA

En este caso es una digilent Nexys 2
NEXYS2.jpg

Verilog

usado para modelar sistemas electrónicos
pad_screenshot.jpg

Características De Diseño

Aca se encuentras las limitaciones dentro del programa y caracteristicas importantes

Posicionamiento espacial

Respecto al tamaño del cuadro por el cual apareceria la criatura y por el cual reaparecería la comida aleatoriamente es de 640x480 pixeles y de esta manera, el centro de la pantalla y en el que tendría lugar la snake para un reset es el punto 320,240

Limitaciones

  • La snake no cambiaba de tamaño al recoger algun alimento.
  • La snake no moría al chocarse con la cola ya que esta tenia siempre un tamaño particular.
  • En el momento en el que el juego se reiniciaba, los alimentos seguían en el mismo lugar que fueron puestos antes de el reset.

VGA (Video Graphics Array)

Adaptador Gráfico de vídeo, estándar de gráfico el cual fue el mínimo que todo hardware soporta antes de cargar un dispositivo

  • Resolucion de la pantalla = 640x480
  • Tarjeta gráfica que comercializo IBM por primera vez

Colores de la VGA

resulta que la VGA gracias a dos diferentes adaptadores puede conseguir mas colores, con el CGA consigue 16 máximo mientras que con el EGA es capaz de utilizar sus 64 entradas y utilizar hsta 256 diferentes colores
VGA_palette_with_black_borders.svg.png

Videos de youtube Snake

https://www.youtube.com/watch?v=iSiEghlp2Fo
https://www.youtube.com/watch?v=ieSFSVOZsS8
https://www.youtube.com/watch?v=03hgUZ3CsM4

+Módulos (Código Verilog)

Modulo Posición

input s1;
    input s2;
    input s3;
    input s4;
    input s5;
    reg p=0;
    output reg [9:0] posx=320;
    output reg [9:0] posy=240;    
    output reg rset=0;    
    reg clk2;
    reg [17:0] temp=0;
    reg [1:0] dirx=0;
    reg [1:0] diry=0;
    always @(posedge clk) begin
        temp=temp+1;
        clk2=temp[17];    

        if (s1==1 & s2==0 & s3==0 & s4==0) begin
            diry=2'b10;
            dirx=2'b00;
            end
        else if (s1==0 & s2==1 & s3==0 & s4==0) begin
            dirx=2'b01;
            diry=2'b00;
            end
        else if (s1==0 & s2==0 & s3==1 & s4==0) begin
            diry=2'b01;
            dirx=2'b00;
            end            
        else if (s1==0 & s2==0 & s3==0 & s4==1) begin
            dirx=2'b10;
            diry=2'b00;
            end
        else begin
            dirx=dirx;
            diry=diry;
            end    
        if (s5==1 | p==1) begin
            dirx=2'b00;
            diry=2'b00;
            end
            else begin
            dirx=dirx;
            diry=diry;
            end
    end

    always @(posedge clk2) begin
        if (diry==2'b10 & dirx==2'b00)begin
            if (posy<=450) begin            
            posy=posy+1;
            posx=posx;
            rset=0;
            p=0;
            end 
            else begin
            posy=240;
            posx=320;
            rset=1;
            p=1;
            end            
            end
        else if(dirx==2'b01 & diry==2'b00)begin
            if (posx<=610) begin
                posx=posx+1;
                posy=posy;
                rset=0;
                p=0;
                end
                else begin
                posy=240;
                posx=320;
                rset=1;
                p=1;
                end
                end
        else if(dirx==2'b10 & diry==2'b00)begin
            if (posx>=10) begin
                posx=posx-1;
                posy=posy;
                rset=0;
                p=0;
                end 
                else begin
                posx=320;
                posy=240;
                rset=1;
                p=1;
                end
                end
        else if(diry==2'b01 & dirx==2'b00)begin
            if (posy>=10) begin
                posy=posy-1;
                posx=posx;
                rset=0;
                p=0;
                end
                else begin
                posx=320;
                posy=240;
                rset=1;
                p=1;
                end
                end
        else if(dirx==2'b00 & diry==2'b00) begin
                posx=posx;
                posy=posy;
                rset=0;
                p=0;
                end
            if (s5==1) begin
                posx=320;
                posy=240;
                rset=1;
                p=1;
            end
            else begin
            posx=posx;
            posy=posy;
            end
            end

endmodule

Modulo Comida Del Snake

module comida(clk, posx1, posy1, posx, posy,add);

input clk;
input [9:0] posx;
input [9:0] posy;
output reg [9:0] posx1=300;
output reg [9:0] posy1=200;
output reg add=0;
reg [9:0] cont1=0;
reg [9:0] cont2=0;
reg clk2;
reg [17:0] temp=0;

always @(posedge clk) begin
temp=temp+1;
clk2=temp[17];    
end

    always @(posedge clk2) begin
cont1=cont1+611;
cont2=cont2+653;
end
    always @(posedge clk) begin
    if (posx1>610) begin 
        posx1=610;
        add=0;
    end
    else posx1=posx1;
    if (posy1>450)begin
        add=0;
        posy1=450;
    end
    else posy1=posy1;
    if (posx1<20) begin
        add=0;
        posx1=20;
    end
    else posx1=posx1;
    if (posy1<20) begin
        add=0;
        posy1=20;
    end
    else posy1=posy1;
    if ((posx>=posx1-10) & (posx<=posx1)& (posy>=posy1-10) & (posy<=posy1)) begin
        posx1=posx1+cont1;
        posy1=posy1+cont2;    
        add=1;
    end
    else begin
        posx1=posx1;
        posy1=posy1;
        add=0;
    end
end

endmodule
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License