RULETA ELECTRÓNICA
Fs0mqI9n_400x400.png

INTEGRANTES

López, Fabián oc.ude.gobbsu.aimedaca|bzepolfd#oc.ude.gobbsu.aimedaca|bzepolfd
Esguerra, Julián C. oc.ude.gobbsu.aimedaca|arreugsej#oc.ude.gobbsu.aimedaca|arreugsej
Arias, Camilo A. oc.ude.gobbsu.aimedaca|sairaac#oc.ude.gobbsu.aimedaca|sairaac

RESUMEN

Como proyecto final del curso de sistemas digitales, optamos por diseñar una ruleta electrónica programada y visualizada en ISE, donde el usuario utilizará los botones de la fpga para mover un indicador sobre el tablero, el número que indique será al que apueste.

Palabras Claves - Apuesta, Ruleta, Indicador, Casillas.

INTRODUCCIÓN

El proyecto tiene como finalidad realizar un juego de azar que hoy en día se conoce como ruleta, por lo general se juega en un casino donde las personas apuestan su dinero.

Teniendo claro algunas características de este juego y con el conocimiento adquirido de programación durante el semestre en la asignatura de sistemas digitales, se buscó innovar su método de juego, se diseñará e implementará a través del lenguaje verilog, este código debe tener la sintaxis adecuada para que se pueda controlar con la ayuda de la tarjeta nexys2.

OBJETIVOS

• Implementar un juego de azar a partir del lenguaje Verilog y usarlo en una Nexys 2.
• Implementar visualmente el área de juego en la cual el usuario realizará la apuesta.
• Proyectar el juego en una pantalla VGA usando el puerto de la FPGA.

MARCO TEÓRICO

• TARJETA NEXYS 2

La Nexys-2 es una plataforma para diseño de sistemas digitales, basado en el FPGA Xilinx Spartan 3E. Con memorias SDRAM de 16MB y Flash ROM de 16MB, la Nexys-2 es ideal para procesadores embebidos como el Microblaze™ 32-bit RISC de Xilinx. El puerto USB2 junto a la colección de dispositivos I/O (leds, displays, pulsadores), puertos de datos y conectores de expansión, permiten obtener un amplio rango de diseños, que se pueden completar sin necesidad de componentes adicionales.

NEXYS2high2.jpg

• CABLE VGA

Un cable VGA se usa para conectar un monitor a la computadora. Este cable transfiere la señal de la imagen desde la computadora hasta el monitor para que se pueda visualizar en él.

VGA.jpg

• RULETA

tapete-ruleta-americana.png

CARACTERÍSTICAS

• El movimiento del indicador va hacer controlado por medio de los pulsadores de la tarjeta Nexys 2.
• En la pantalla se mostrará las casillas de color negro,rojo y verde donde el jugador podrá realizar la apuesta.
• El indicador que señala el numero ganador se va a visualizar por momentos durante su recorrido.

LIMITACIONES

• La ruleta de casino que se utiliza hoy en día tiene 38 números posibles para jugar, en este proyecto debido a falta de tiempo se opto por dejarlo de 32 números.
• En este Proyecto no se realizó el plato fisco ni visualmente, razón por la cual se diseño un movimiento aleatorio entre los números de 0 al 31.
• El usuario únicamente podrá realizar una apuesta por juego.
• Por problemas algebraicos en la programación no se va a visualizar la esfera, si no un cuadrado para el movimiento aleatorio.

DISEÑO

• Diagrama RTL

map.png

TOP_ESTACIONAMIENTO.

Este módulo reúne los demás módulos y los conecta para realizar una optima función de la nexys2.
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date:    07:44:55 11/04/2015 
// Design Name: 
// Module Name:    top_ruleta 
// Project Name: 
// Target Devices: 
// Tool versions: 
// Description: 
//
// Dependencies: 
//
// Revision: 
// Revision 0.01 - File Created
// Additional Comments: 
//
//////////////////////////////////////////////////////////////////////////////////
module top_ruleta(clk,reset,sw,sw1,sw2,sw3,sw4,sw5,apuesta,btn1,btn2,btn3,salidas,anodos,hsync,vsync,rgb);
    input clk,reset,sw,sw1,sw2,sw3,sw4,sw5,apuesta,btn1,btn2,btn3;
    output hsync, vsync;
    output [2:0] rgb;
    output [3:0] anodos;
    output [6:0] salidas;
    wire [3:0] w_unidades;
    wire [3:0] w_decenas;
    wire [3:0] w_centenas;
    wire [3:0] w_mil;
    wire [9:0] w_posx;
    wire [9:0] w_posy;
        acumulador acum        (.apuesta(apuesta),.sw2(sw2),.sw3(sw3),.sw4(sw4),.clk(clk),.unidades(w_unidades),.decenas(w_decenas),.centenas(w_centenas),.mil(w_mil));
        sieteseg visualizar    (.unidades(w_unidades),.decenas(w_decenas),.centenas(w_centenas),.mil(w_mil),.clk(clk),.anodos(anodos),.salidas(salidas));
        movimiento cuadro        (.btn1(btn1),.btn2(btn2),.btn3(btn3),.sw5(sw5),.reset(reset),.clk(clk),.sw1(sw1),.posx(w_posx),.posy(w_posy));
        tablero vga                (.clk(clk),.reset(reset),.posx(w_posx),.posy(w_posy),.sw(sw),.hsync(hsync),.vsync(vsync),.rgb(rgb));
endmodule

ACUMULADOR
El acumulador es el encargado de realizar la sumatoria de la apuesta a ingresar.

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date:    09:28:46 10/20/2015 
// Design Name: 
// Module Name:    acumulador 
// Project Name: 
// Target Devices: 
// Tool versions: 
// Description: 
//
// Dependencies: 
//
// Revision: 
// Revision 0.01 - File Created
// Additional Comments: 
//
//////////////////////////////////////////////////////////////////////////////////
module acumulador(sw2,sw3,sw4,apuesta,clk,unidades,decenas,centenas,mil);
    input sw2,sw3,sw4,apuesta,clk;
    output reg [3:0] unidades = 0;
    output reg [3:0] decenas = 0;
    output reg [3:0] centenas = 0;
    output reg [3:0] mil = 0;
    reg [31:0] cont = 0;
    reg clk3 = 0;
    always@(posedge clk3) begin
        if (sw2 == 0 & sw3 == 0 & sw4 == 0 & apuesta == 1) begin
            if (unidades < 10) begin
                unidades = unidades + 1;
            end
            else if (unidades == 10) begin
                unidades = 0;
            end
        end
        else if (sw2 == 0 & sw3 == 1 & sw4== 0 & apuesta == 1) begin
            if (decenas < 10) begin
                decenas = decenas + 1;
            end
            else if (decenas == 10) begin
                decenas = 0;
            end
        end
        else if (sw2 == 0 & sw3 == 0 & sw4 == 1 & apuesta == 1) begin
            if (centenas < 10) begin
                centenas = centenas + 1;
            end
            else if (centenas == 10) begin
                centenas = 0;
            end
        end
        else if (sw2 == 0 & sw3 == 1 & sw4 == 1 & apuesta == 1) begin
            if (mil < 10) begin
                mil = mil + 1;
            end
            else if (mil == 10) begin
                mil = 0;
            end
        end
        else begin
            unidades = unidades;
            decenas = decenas;
            centenas = centenas;
            mil = mil;
        end
    end
    always @(posedge clk) begin
        if (cont < 12500000) begin
            cont = cont + 1;
        end
        else begin
            clk3 = ~clk3;
            cont = 0;
        end
    end
endmodule

VISUALIZACIÓN SIETE SEGMENTOS
En este módulo se crea la opción de ver la apuesta a realizar para la ruleta.

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date:    09:20:57 10/20/2015 
// Design Name: 
// Module Name:    sieteseg 
// Project Name: 
// Target Devices: 
// Tool versions: 
// Description: 
//
// Dependencies: 
//
// Revision: 
// Revision 0.01 - File Created
// Additional Comments: 
//
//////////////////////////////////////////////////////////////////////////////////
module sieteseg(
     input clk,
    input [3:0] unidades,
     input [3:0] decenas,
     input [3:0] centenas,
     input [3:0] mil,
    output reg [6:0] salidas,
    output reg [3:0] anodos
     );
     reg [1:0] next_state;                                                                                                                                                  
     parameter d1 = 0, d2 = 1, d3 = 2, d4 = 3;
     reg [1:0] current_state = d1;
     reg [25:0] cont = 0;
     reg clk2 = 0;
    always @(unidades,decenas,centenas,mil,current_state) begin
        case(current_state)      
        d1: begin
        anodos=4'b1110;
            case (unidades)                     
                4'b0000 :  salidas = 7'b1000000;        
                4'b0001 :  salidas = 7'b1111001;
                4'b0010 :  salidas = 7'b0100100;
                4'b0011 :  salidas = 7'b0110000;
                4'b0100 :  salidas = 7'b0011001;
                4'b0101 :  salidas = 7'b0010010;
                4'b0110 :  salidas = 7'b0000010;
                4'b0111 :  salidas = 7'b1111000;
                4'b1000 :  salidas = 7'b0000000;
                4'b1001 :  salidas = 7'b0010000;
                default :  salidas = 7'b1111111;
            endcase
            next_state=d2;
        end
        d2: begin
        anodos=4'b1101;
            case (decenas)                 
                4'b0000 :  salidas = 7'b1000000;        
                4'b0001 :  salidas = 7'b1111001;
                4'b0010 :  salidas = 7'b0100100;
                4'b0011 :  salidas = 7'b0110000;
                4'b0100 :  salidas = 7'b0011001;
                4'b0101 :  salidas = 7'b0010010;
                4'b0110 :  salidas = 7'b0000010;
                4'b0111 :  salidas = 7'b1111000;
                4'b1000 :  salidas = 7'b0000000;
                4'b1001 :  salidas = 7'b0010000;
                default :  salidas = 7'b1111111;
            endcase
            next_state=d3;
        end
        d3: begin
        anodos=4'b1011;
            case (centenas)                 
                4'b0000 :  salidas = 7'b1000000;        
                4'b0001 :  salidas = 7'b1111001;
                4'b0010 :  salidas = 7'b0100100;
                4'b0011 :  salidas = 7'b0110000;
                4'b0100 :  salidas = 7'b0011001;
                4'b0101 :  salidas = 7'b0010010;
                4'b0110 :  salidas = 7'b0000010;
                4'b0111 :  salidas = 7'b1111000;
                4'b1000 :  salidas = 7'b0000000;
                4'b1001 :  salidas = 7'b0010000;
                default :  salidas = 7'b1111111;
            endcase
            next_state=d4;
        end
        d4: begin
        anodos=4'b0111;
            case (mil)                 
                4'b0000 :  salidas = 7'b1000000;        
                4'b0001 :  salidas = 7'b1111001;
                4'b0010 :  salidas = 7'b0100100;
                4'b0011 :  salidas = 7'b0110000;
                4'b0100 :  salidas = 7'b0011001;
                4'b0101 :  salidas = 7'b0010010;
                4'b0110 :  salidas = 7'b0000010;
                4'b0111 :  salidas = 7'b1111000;
                4'b1000 :  salidas = 7'b0000000;
                4'b1001 :  salidas = 7'b0010000;
                default :  salidas = 7'b1111111;
            endcase
            next_state=d1;
        end
        default: begin
            anodos=4'b1111;
            salidas = 7'b1111111;
            next_state=d1;
        end    
    endcase
    end
    always @(posedge clk) begin
    if (cont < 12500) begin
            cont = cont + 1;
        end
        else begin
            clk2 = ~clk2;
            cont = 0;
        end
    end
    always @(posedge clk2) begin
        current_state=next_state;
    end
endmodule

CUADRO_MOVIMIENTO
Este módulo es el encargado de mover el cuadro con el cual se realizara la apuesta.

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date:    09:18:15 11/03/2015 
// Design Name: 
// Module Name:    movimiento 
// Project Name: 
// Target Devices: 
// Tool versions: 
// Description: 
//
// Dependencies: 
//
// Revision: 
// Revision 0.01 - File Created
// Additional Comments: 
//
//////////////////////////////////////////////////////////////////////////////////
module movimiento(
    input btn1,btn2,btn3,sw5,reset,sw1,clk,
    output reg [9:0] posx=18,
    output reg [9:0] posy=214
    );
     reg [1:0] sitio;
     reg izq;
     reg der;
     reg updown;
     reg [31:0] cont = 0;
     reg clk4 = 0;
     always @(posedge clk4) begin
        if (sitio==0) begin
            if (sw1==1 & reset==0) begin
                if (izq==1 & posx>18) begin
                    posx=posx-76;
                end
                else if (izq==1 & posx==18) begin
                    posx=posx;
                end
                else if (updown==1 & sw1==1 & posy>234) begin
                    posy=posy-58;
                end
                else if (updown==1 & sw1==1 & posy==234) begin
                    posy=posy;
                end
                else if (updown==1 & sw1==0 & posy<466) begin
                    posy=posy+58;
                end
                else if (updown==1 & sw1==0 & posy==466) begin
                    posy=posy;
                end
                else if (der==1 & posx<550) begin
                    posx=posx+76;
                end
                else if (der==1 & posx==550) begin
                    posx=posx;
                end
                else if (sitio==1) begin
                    posx=posx;
                    posy=posy;
                end
                else begin
                    posx=posx;
                    posy=posy;
                end
            end
            else if (sw1==1 & reset==1)begin
                posx=18;
                posy=214;
            end
            else begin
                posx=posx;
                posy=posy;
            end
        end
        else begin
            posx=posx;
            posy=posy;
        end
        if (sw5==1 & reset==0) begin
            sitio=1;
        end
        else if (reset==1) begin
            sitio=0;
        end
        else if (sw5==0) begin
            sitio=0;
        end
        else begin
            sitio=sitio;
        end
        if (btn1==1) begin
            izq=1;
            updown=0;
            der=0;
        end
        else if (btn2==1) begin
            izq=0;
            updown=1;
            der=0;
        end
        else if (btn3==1) begin
            izq=0;
            updown=0;
            der=1;
        end
        else begin
            izq=0;
            updown=0;
            der=0;
        end
     end
     always @(posedge clk) begin
        if (cont < 12500000) begin
            cont = cont + 1;
            clk4 = clk4;
        end
        else begin
            clk4 = ~clk4;
            cont = 0;
        end
     end
endmodule

VGA- TABLERO
Este es el módulo encargado de realizar los gráficos y todos los aspectos que se visualizan en el monitor.

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date:    09:53:18 10/22/2015 
// Design Name: 
// Module Name:    tablero 
// Project Name: 
// Target Devices: 
// Tool versions: 
// Description: 
//
// Dependencies: 
//
// Revision: 
// Revision 0.01 - File Created
// Additional Comments: 
//
//////////////////////////////////////////////////////////////////////////////////
module tablero(
    input clk,reset,
    input [9:0]posx, 
    input [9:0]posy,
    input [2:0]sw, 
    output hsync, vsync,
    output [2:0] rgb
    );
    //signal declaration
    reg [2:0] rgb_reg;
    wire video_on;
     wire [9:0] x,y;
    //instantiate vga sync circuit
    vga_sync vsync_unit (.clk(clk), .reset(reset), .hsync(hsync), . vsync(vsync), .video_on(video_on), . p_tick(), .pixel_x(x), .pixel_y(y));
    //rgb buffer
     always @(posedge clk, posedge reset) begin
        if (reset) rgb_reg <= 0;
        else begin
            if (x>posx & x<(20+posx) & y>posy & y<(20+posy)) rgb_reg<=3'b100;
            //apuesta
            else if (x>=214 & x<=218 & y>=18 & y<=100)      rgb_reg<=3'b000;
            else if (x>=214 & x<=254 & y>=96 & y<=100)      rgb_reg<=3'b000;
            else if (x>=250 & x<=254 & y>=18 & y<=100)      rgb_reg<=3'b000;
            //u
            else if (x>=270 & x<=310 & y>=18 & y<=22)      rgb_reg<=3'b000;
            else if (x>=270 & x<=274 & y>=18 & y<=59)      rgb_reg<=3'b000;
            else if (x>=270 & x<=310 & y>=57 & y<=61)      rgb_reg<=3'b000;
            else if (x>=307 & x<=310 & y>=59 & y<=100)      rgb_reg<=3'b000;
            else if (x>=270 & x<=310 & y>=96 & y<=100)      rgb_reg<=3'b000;
            //s
            else if (x>=326 & x<=366 & y>=18 & y<=22)      rgb_reg<=3'b000;
            else if (x>=326 & x<=330 & y>=18 & y<=100)      rgb_reg<=3'b000;
            else if (x>=326 & x<=366 & y>=57 & y<=61)      rgb_reg<=3'b000;
            else if (x>=362 & x<=366 & y>=18 & y<=100)      rgb_reg<=3'b000;
            else if (x>=326 & x<=366 & y>=96 & y<=100)      rgb_reg<=3'b000;
            //b
            else if (x>=80 & x<=100 & y>=200 & y<=203)    rgb_reg<=3'b111;
            else if (x>=80 & x<=83 & y>=200 & y<=230)        rgb_reg<=3'b111;
            else if (x>=97 & x<=100 & y>=200 & y<=215)    rgb_reg<=3'b111;
            else if (x>=80 & x<=100 & y>=214 & y<=216)    rgb_reg<=3'b111;
            //p
            else if (x>=554 & x<=574 & y>=200 & y<=203)    rgb_reg<=3'b111;
            else if (x>=563 & x<=565 & y>=200 & y<=230)    rgb_reg<=3'b111;
            else if (x>=554 & x<=574 & y>=227 & y<=230)    rgb_reg<=3'b111;
            //i
            else if (x>=40 & x<=60 & y>=255 & y<=258)        rgb_reg<=3'b111;
            else if (x>=40 & x<=43 & y>=255 & y<=285)        rgb_reg<=3'b111;
            else if (x>=57 & x<=60 & y>=255 & y<=285)        rgb_reg<=3'b111;
            else if (x>=40 & x<=60 & y>=282 & y<=285)        rgb_reg<=3'b111;
            //0
            else if (x>=142 & x<=145 & y>=255 & y<=285)    rgb_reg<=3'b111;
            //1
            else if (x>=204 & x<=224 & y>=255 & y<=258)    rgb_reg<=3'b111;
            else if (x>=204 & x<=207 & y>=270 & y<=285)    rgb_reg<=3'b111;
            else if (x>=204 & x<=224 & y>=269 & y<=271)    rgb_reg<=3'b111;
            else if (x>=221 & x<=224 & y>=255 & y<=270)    rgb_reg<=3'b111;
            else if (x>=204 & x<=224 & y>=282 & y<=285)    rgb_reg<=3'b111;
            //2
            else if (x>=283 & x<=303 & y>=255 & y<=258)    rgb_reg<=3'b111;
            else if (x>=283 & x<=303 & y>=269 & y<=271)    rgb_reg<=3'b111;
            else if (x>=300 & x<=303 & y>=255 & y<=285)    rgb_reg<=3'b111;
            else if (x>=283 & x<=303 & y>=282 & y<=285)    rgb_reg<=3'b111;
            //3
            else if (x>=362 & x<=365 & y>=255 & y<=270)    rgb_reg<=3'b111;
            else if (x>=362 & x<=382 & y>=269 & y<=271)    rgb_reg<=3'b111;
            else if (x>=379 & x<=382 & y>=255 & y<=285)    rgb_reg<=3'b111;
            //4
            else if (x>=441 & x<=461 & y>=255 & y<=258)    rgb_reg<=3'b111;
            else if (x>=441 & x<=444 & y>=255 & y<=270)    rgb_reg<=3'b111;
            else if (x>=441 & x<=461 & y>=269 & y<=271)    rgb_reg<=3'b111;
            else if (x>=458 & x<=461 & y>=270 & y<=285)    rgb_reg<=3'b111;
            else if (x>=441 & x<=461 & y>=282 & y<=285)    rgb_reg<=3'b111;
            //5
            else if (x>=520 & x<=540 & y>=255 & y<=258)    rgb_reg<=3'b111;
            else if (x>=520 & x<=523 & y>=255 & y<=285)    rgb_reg<=3'b111;
            else if (x>=520 & x<=540 & y>=269 & y<=271)    rgb_reg<=3'b111;
            else if (x>=537 & x<=540 & y>=270 & y<=285)    rgb_reg<=3'b111;
            else if (x>=520 & x<=540 & y>=282 & y<=285)    rgb_reg<=3'b111;
            //6
            else if (x>=600 & x<=620 & y>=255 & y<=258)    rgb_reg<=3'b111;
            else if (x>=617 & x<=620 & y>=255 & y<=285)    rgb_reg<=3'b111;
            //7
            else if (x>=40 & x<=60 & y>=312 & y<=315)        rgb_reg<=3'b111;
            else if (x>=40 & x<=43 & y>=312 & y<=342)        rgb_reg<=3'b111;
            else if (x>=57 & x<=60 & y>=312 & y<=342)        rgb_reg<=3'b111;
            else if (x>=40 & x<=60 & y>=339 & y<=342)        rgb_reg<=3'b111;
            else if (x>=40 & x<=60 & y>=326 & y<=328)        rgb_reg<=3'b111;
            //8
            else if (x>=125 & x<=145 & y>=312 & y<=315)    rgb_reg<=3'b111;
            else if (x>=125 & x<=128 & y>=312 & y<=327)    rgb_reg<=3'b111;
            else if (x>=142 & x<=145 & y>=312 & y<=342)    rgb_reg<=3'b111;
            else if (x>=125 & x<=145 & y>=339 & y<=342)    rgb_reg<=3'b111;
            else if (x>=125 & x<=145 & y>=326 & y<=328)    rgb_reg<=3'b111;
            //9
            else if (x>=204 & x<=224 & y>=312 & y<=315)    rgb_reg<=3'b111;
            else if (x>=204 & x<=207 & y>=312 & y<=342)    rgb_reg<=3'b111;
            else if (x>=221 & x<=224 & y>=312 & y<=342)    rgb_reg<=3'b111;
            else if (x>=204 & x<=224 & y>=339 & y<=342)    rgb_reg<=3'b111;
            else if (x>=198 & x<=201 & y>=312 & y<=342)    rgb_reg<=3'b111;
            //10
            else if (x>=300 & x<=303 & y>=312 & y<=342)    rgb_reg<=3'b111;
            else if (x>=274 & x<=277 & y>=312 & y<=342)    rgb_reg<=3'b111;
            //11
            else if (x>=362 & x<=382 & y>=312 & y<=315)    rgb_reg<=3'b111;
            else if (x>=362 & x<=365 & y>=327 & y<=342)    rgb_reg<=3'b111;
            else if (x>=362 & x<=382 & y>=326 & y<=328)    rgb_reg<=3'b111;
            else if (x>=379 & x<=382 & y>=312 & y<=327)    rgb_reg<=3'b111;
            else if (x>=362 & x<=382 & y>=339 & y<=342)    rgb_reg<=3'b111;
            else if (x>=356 & x<=359 & y>=312 & y<=342)    rgb_reg<=3'b111;
            //12
            else if (x>=441 & x<=461 & y>=312 & y<=315)    rgb_reg<=3'b111;
            else if (x>=441 & x<=461 & y>=326 & y<=328)    rgb_reg<=3'b111;
            else if (x>=458 & x<=461 & y>=312 & y<=342)    rgb_reg<=3'b111;
            else if (x>=441 & x<=461 & y>=339 & y<=342)    rgb_reg<=3'b111;
            else if (x>=435 & x<=438 & y>=312 & y<=342)    rgb_reg<=3'b111;
            //13
            else if (x>=520 & x<=523 & y>=312 & y<=327)    rgb_reg<=3'b111;
            else if (x>=520 & x<=540 & y>=326 & y<=328)    rgb_reg<=3'b111;
            else if (x>=537 & x<=540 & y>=312 & y<=342)    rgb_reg<=3'b111;
            else if (x>=514 & x<=517 & y>=312 & y<=342)    rgb_reg<=3'b111;
            //14
            else if (x>=600 & x<=620 & y>=312 & y<=315)    rgb_reg<=3'b111;
            else if (x>=600 & x<=603 & y>=312 & y<=327)    rgb_reg<=3'b111;
            else if (x>=600 & x<=620 & y>=326 & y<=328)    rgb_reg<=3'b111;
            else if (x>=617 & x<=620 & y>=327 & y<=342)    rgb_reg<=3'b111;
            else if (x>=600 & x<=620 & y>=339 & y<=342)    rgb_reg<=3'b111;
            else if (x>=594 & x<=597 & y>=312 & y<=342)    rgb_reg<=3'b111;
            //15
            else if (x>=40 & x<=60 & y>=369 & y<=372)        rgb_reg<=3'b111;
            else if (x>=40 & x<=43 & y>=369 & y<=399)        rgb_reg<=3'b111;
            else if (x>=40 & x<=60 & y>=383 & y<=385)        rgb_reg<=3'b111;
            else if (x>=57 & x<=60 & y>=384 & y<=399)        rgb_reg<=3'b111;
            else if (x>=40 & x<=60 & y>=396 & y<=399)        rgb_reg<=3'b111;
            else if (x>=34 & x<=37 & y>=369 & y<=399)        rgb_reg<=3'b111;
            //16
            else if (x>=125 & x<=145 & y>=369 & y<=372)    rgb_reg<=3'b111;
            else if (x>=142 & x<=145 & y>=369 & y<=399)    rgb_reg<=3'b111;
            else if (x>=119 & x<=122 & y>=369 & y<=399)    rgb_reg<=3'b111;
            //17
            else if (x>=204 & x<=224 & y>=369 & y<=372)    rgb_reg<=3'b111;
            else if (x>=204 & x<=207 & y>=369 & y<=399)    rgb_reg<=3'b111;
            else if (x>=221 & x<=224 & y>=369 & y<=399)    rgb_reg<=3'b111;
            else if (x>=204 & x<=224 & y>=383 & y<=385)    rgb_reg<=3'b111;
            else if (x>=204 & x<=224 & y>=396 & y<=399)    rgb_reg<=3'b111;
            else if (x>=198 & x<=201 & y>=369 & y<=399)    rgb_reg<=3'b111;
            //18
            else if (x>=283 & x<=303 & y>=369 & y<=372)    rgb_reg<=3'b111;
            else if (x>=283 & x<=286 & y>=369 & y<=384)    rgb_reg<=3'b111;
            else if (x>=300 & x<=303 & y>=369 & y<=399)    rgb_reg<=3'b111;
            else if (x>=283 & x<=303 & y>=383 & y<=385)    rgb_reg<=3'b111;
            else if (x>=283 & x<=303 & y>=396 & y<=399)    rgb_reg<=3'b111;
            else if (x>=277 & x<=280 & y>=369 & y<=399)    rgb_reg<=3'b111;
            //19
            else if (x>=362 & x<=382 & y>=369 & y<=372)    rgb_reg<=3'b111;
            else if (x>=362 & x<=365 & y>=369 & y<=399)    rgb_reg<=3'b111;
            else if (x>=379 & x<=382 & y>=369 & y<=399)    rgb_reg<=3'b111;
            else if (x>=362 & x<=382 & y>=396 & y<=399)    rgb_reg<=3'b111;
            else if (x>=339 & x<=359 & y>=369 & y<=372)    rgb_reg<=3'b111;
            else if (x>=339 & x<=342 & y>=384 & y<=399)    rgb_reg<=3'b111;
            else if (x>=356 & x<=359 & y>=369 & y<=384)    rgb_reg<=3'b111;
            else if (x>=339 & x<=359 & y>=383 & y<=385)    rgb_reg<=3'b111;
            else if (x>=339 & x<=359 & y>=396 & y<=399)    rgb_reg<=3'b111;
            //20
            else if (x>=458 & x<=461 & y>=369 & y<=399)    rgb_reg<=3'b111;
            else if (x>=418 & x<=438 & y>=369 & y<=372)    rgb_reg<=3'b111;
            else if (x>=418 & x<=421 & y>=384 & y<=399)    rgb_reg<=3'b111;
            else if (x>=435 & x<=438 & y>=369 & y<=384)    rgb_reg<=3'b111;
            else if (x>=418 & x<=438 & y>=383 & y<=385)    rgb_reg<=3'b111;
            else if (x>=418 & x<=438 & y>=396 & y<=399)    rgb_reg<=3'b111;
            //21
            else if (x>=520 & x<=540 & y>=369 & y<=372)    rgb_reg<=3'b111;
            else if (x>=520 & x<=523 & y>=384 & y<=399)    rgb_reg<=3'b111;
            else if (x>=537 & x<=540 & y>=369 & y<=384)    rgb_reg<=3'b111;
            else if (x>=520 & x<=540 & y>=383 & y<=385)    rgb_reg<=3'b111;
            else if (x>=520 & x<=540 & y>=396 & y<=399)    rgb_reg<=3'b111;
            else if (x>=497 & x<=517 & y>=369 & y<=372)    rgb_reg<=3'b111;
            else if (x>=497 & x<=500 & y>=384 & y<=399)    rgb_reg<=3'b111;
            else if (x>=514 & x<=517 & y>=369 & y<=384)    rgb_reg<=3'b111;
            else if (x>=497 & x<=517 & y>=383 & y<=385)    rgb_reg<=3'b111;
            else if (x>=497 & x<=517 & y>=396 & y<=399)    rgb_reg<=3'b111;
            //22
            else if (x>=600 & x<=620 & y>=369 & y<=372)    rgb_reg<=3'b111;
            else if (x>=617 & x<=620 & y>=369 & y<=399)    rgb_reg<=3'b111;
            else if (x>=600 & x<=620 & y>=383 & y<=385)    rgb_reg<=3'b111;
            else if (x>=600 & x<=620 & y>=396 & y<=399)    rgb_reg<=3'b111;
            else if (x>=577 & x<=597 & y>=369 & y<=372)    rgb_reg<=3'b111;
            else if (x>=577 & x<=580 & y>=384 & y<=399)    rgb_reg<=3'b111;
            else if (x>=594 & x<=597 & y>=369 & y<=384)    rgb_reg<=3'b111;
            else if (x>=577 & x<=597 & y>=383 & y<=385)    rgb_reg<=3'b111;
            else if (x>=577 & x<=597 & y>=396 & y<=399)    rgb_reg<=3'b111;
            //23
            else if (x>=57 & x<=60 & y>=426 & y<=456)        rgb_reg<=3'b111;
            else if (x>=40 & x<=43 & y>=426 & y<=441)        rgb_reg<=3'b111;
            else if (x>=40 & x<=60 & y>=440 & y<=442)        rgb_reg<=3'b111;
            else if (x>=17 & x<=37 & y>=426 & y<=429)        rgb_reg<=3'b111;
            else if (x>=17 & x<=20 & y>=441 & y<=456)        rgb_reg<=3'b111;
            else if (x>=34 & x<=37 & y>=426 & y<=441)        rgb_reg<=3'b111;
            else if (x>=17 & x<=37 & y>=440 & y<=442)        rgb_reg<=3'b111;
            else if (x>=17 & x<=37 & y>=453 & y<=456)        rgb_reg<=3'b111;
            //24
            else if (x>=125 & x<=145 & y>=426 & y<=429)    rgb_reg<=3'b111;
            else if (x>=142 & x<=145 & y>=441 & y<=456)    rgb_reg<=3'b111;
            else if (x>=125 & x<=128 & y>=426 & y<=441)    rgb_reg<=3'b111;
            else if (x>=125 & x<=145 & y>=440 & y<=442)    rgb_reg<=3'b111;
            else if (x>=125 & x<=145 & y>=453 & y<=456)    rgb_reg<=3'b111;
            else if (x>=102 & x<=122 & y>=426 & y<=429)    rgb_reg<=3'b111;
            else if (x>=102 & x<=105 & y>=441 & y<=456)    rgb_reg<=3'b111;
            else if (x>=119 & x<=122 & y>=426 & y<=441)    rgb_reg<=3'b111;
            else if (x>=102 & x<=122 & y>=440 & y<=442)    rgb_reg<=3'b111;
            else if (x>=102 & x<=122 & y>=453 & y<=456)    rgb_reg<=3'b111;
            //25
            else if (x>=204 & x<=224 & y>=426 & y<=429)    rgb_reg<=3'b111;
            else if (x>=221 & x<=224 & y>=441 & y<=456)    rgb_reg<=3'b111;
            else if (x>=204 & x<=207 & y>=426 & y<=456)    rgb_reg<=3'b111;
            else if (x>=204 & x<=224 & y>=440 & y<=442)    rgb_reg<=3'b111;
            else if (x>=204 & x<=224 & y>=453 & y<=456)    rgb_reg<=3'b111;
            else if (x>=181 & x<=201 & y>=426 & y<=429)    rgb_reg<=3'b111;
            else if (x>=181 & x<=184 & y>=441 & y<=456)    rgb_reg<=3'b111;
            else if (x>=198 & x<=201 & y>=426 & y<=441)    rgb_reg<=3'b111;
            else if (x>=181 & x<=201 & y>=440 & y<=442)    rgb_reg<=3'b111;
            else if (x>=181 & x<=201 & y>=453 & y<=456)    rgb_reg<=3'b111;
            //26
            else if (x>=283 & x<=303 & y>=426 & y<=429)    rgb_reg<=3'b111;
            else if (x>=300 & x<=303 & y>=426 & y<=456)    rgb_reg<=3'b111;
            else if (x>=260 & x<=280 & y>=426 & y<=429)    rgb_reg<=3'b111;
            else if (x>=260 & x<=263 & y>=441 & y<=456)    rgb_reg<=3'b111;
            else if (x>=277 & x<=280 & y>=426 & y<=441)    rgb_reg<=3'b111;
            else if (x>=260 & x<=280 & y>=440 & y<=442)    rgb_reg<=3'b111;
            else if (x>=260 & x<=280 & y>=453 & y<=456)    rgb_reg<=3'b111;
            //27
            else if (x>=362 & x<=382 & y>=426 & y<=429)    rgb_reg<=3'b111;
            else if (x>=362 & x<=365 & y>=426 & y<=456)    rgb_reg<=3'b111;
            else if (x>=379 & x<=382 & y>=426 & y<=456)    rgb_reg<=3'b111;
            else if (x>=362 & x<=382 & y>=440 & y<=442)    rgb_reg<=3'b111;
            else if (x>=362 & x<=382 & y>=453 & y<=456)    rgb_reg<=3'b111;
            else if (x>=339 & x<=359 & y>=426 & y<=429)    rgb_reg<=3'b111;
            else if (x>=339 & x<=342 & y>=441 & y<=456)    rgb_reg<=3'b111;
            else if (x>=356 & x<=359 & y>=426 & y<=441)    rgb_reg<=3'b111;
            else if (x>=339 & x<=359 & y>=440 & y<=442)    rgb_reg<=3'b111;
            else if (x>=339 & x<=359 & y>=453 & y<=456)    rgb_reg<=3'b111;
            //28
            else if (x>=441 & x<=461 & y>=426 & y<=429)    rgb_reg<=3'b111;
            else if (x>=441 & x<=444 & y>=426 & y<=441)    rgb_reg<=3'b111;
            else if (x>=458 & x<=461 & y>=426 & y<=456)    rgb_reg<=3'b111;
            else if (x>=441 & x<=461 & y>=440 & y<=442)    rgb_reg<=3'b111;
            else if (x>=441 & x<=461 & y>=453 & y<=456)    rgb_reg<=3'b111;
            else if (x>=418 & x<=438 & y>=426 & y<=429)    rgb_reg<=3'b111;
            else if (x>=418 & x<=421 & y>=441 & y<=456)    rgb_reg<=3'b111;
            else if (x>=435 & x<=438 & y>=426 & y<=441)    rgb_reg<=3'b111;
            else if (x>=418 & x<=438 & y>=440 & y<=442)    rgb_reg<=3'b111;
            else if (x>=418 & x<=438 & y>=453 & y<=456)    rgb_reg<=3'b111;
            //29
            else if (x>=520 & x<=540 & y>=426 & y<=429)    rgb_reg<=3'b111;
            else if (x>=520 & x<=523 & y>=426 & y<=456)    rgb_reg<=3'b111;
            else if (x>=537 & x<=540 & y>=426 & y<=456)    rgb_reg<=3'b111;
            else if (x>=520 & x<=540 & y>=453 & y<=456)    rgb_reg<=3'b111;
            else if (x>=497 & x<=517 & y>=426 & y<=429)    rgb_reg<=3'b111;
            else if (x>=514 & x<=517 & y>=426 & y<=456)    rgb_reg<=3'b111;
            else if (x>=497 & x<=517 & y>=440 & y<=442)    rgb_reg<=3'b111;
            else if (x>=497 & x<=517 & y>=453 & y<=456)    rgb_reg<=3'b111;
            //30
            else if (x>=600 & x<=620 & y>=426 & y<=429)    rgb_reg<=3'b111;
            else if (x>=600 & x<=603 & y>=426 & y<=456)    rgb_reg<=3'b111;
            else if (x>=617 & x<=620 & y>=426 & y<=456)    rgb_reg<=3'b111;
            else if (x>=600 & x<=620 & y>=453 & y<=456)    rgb_reg<=3'b111;
            else if (x>=577 & x<=597 & y>=426 & y<=429)    rgb_reg<=3'b111;
            else if (x>=577 & x<=580 & y>=426 & y<=456)    rgb_reg<=3'b111;
            else if (x>=594 & x<=597 & y>=426 & y<=456)    rgb_reg<=3'b111;
            else if (x>=577 & x<=597 & y>=453 & y<=456)    rgb_reg<=3'b111;
            //00
            else if (x>=230 & x<=270 & y>=200 & y<=230)     rgb_reg<=3'b000;
            else if (x>=390 & x<=430 & y>=200 & y<=230)     rgb_reg<=3'b001;
            else if (x>=0 & x<=10 & y>=185 & y<=468)         rgb_reg<=3'b011;
            else if (x>=10 & x<=12 & y>=185 & y<=468)         rgb_reg<=3'b011;
            else if (x>=13 & x<=167 & y>=188 & y<=239)    rgb_reg<=3'b010;
            else if (x>=171 & x<=325 & y>=188 & y<=239)    rgb_reg<=3'b010;
            else if (x>=329 & x<=483 & y>=188 & y<=239)    rgb_reg<=3'b010;
            else if (x>=487 & x<=636 & y>=188 & y<=239)    rgb_reg<=3'b010;
            else if (x>=10 & x<=644 & y>=185 & y<=187)     rgb_reg<=3'b011;
            else if (x>=10 & x<=644 & y>=240 & y<=242)     rgb_reg<=3'b011;
            else if (x>=10 & x<=644 & y>=295 & y<=297)     rgb_reg<=3'b011;
            else if (x>=10 & x<=644 & y>=352 & y<=354)     rgb_reg<=3'b011;
            else if (x>=10 & x<=644 & y>=409 & y<=411)     rgb_reg<=3'b011;
            else if (x>=10 & x<=644 & y>=466 & y<=468)     rgb_reg<=3'b011;
            else if (x>=89 & x<=91 & y>=240 & y<=468)     rgb_reg<=3'b011;
            else if (x>=168 & x<=170 & y>=185 & y<=468)     rgb_reg<=3'b011;
            else if (x>=247 & x<=249 & y>=240 & y<=468)     rgb_reg<=3'b011;
            else if (x>=326 & x<=328 & y>=185 & y<=468)     rgb_reg<=3'b011;
            else if (x>=405 & x<=407 & y>=240 & y<=468)     rgb_reg<=3'b011;
            else if (x>=484 & x<=486 & y>=185 & y<=468)     rgb_reg<=3'b011;
            else if (x>=563 & x<=565 & y>=240 & y<=468)     rgb_reg<=3'b011;
            else if (x>=637 & x<=640 & y>=185 & y<=468)     rgb_reg<=3'b011;
            else if (x>=13 & x<=88 & y>=243 & y<=294)     rgb_reg<=3'b010;
            else if (x>=92 & x<=167 & y>=243 & y<=294)     rgb_reg<=3'b001;
            else if (x>=171 & x<=246 & y>=243 & y<=294)     rgb_reg<=3'b000;
            else if (x>=250 & x<=325 & y>=243 & y<=294)     rgb_reg<=3'b001;
            else if (x>=329 & x<=404 & y>=243 & y<=294)     rgb_reg<=3'b000;
            else if (x>=408 & x<=483 & y>=243 & y<=294)     rgb_reg<=3'b001;
            else if (x>=487 & x<=562 & y>=243 & y<=294)     rgb_reg<=3'b000;
            else if (x>=566 & x<=641 & y>=243 & y<=294)     rgb_reg<=3'b001;
            else if (x>=13 & x<=88 & y>=298 & y<=351)     rgb_reg<=3'b000;
            else if (x>=92 & x<=167 & y>=298 & y<=351)     rgb_reg<=3'b001;
            else if (x>=171 & x<=246 & y>=298 & y<=351)     rgb_reg<=3'b000;
            else if (x>=250 & x<=325 & y>=298 & y<=351)     rgb_reg<=3'b000;
            else if (x>=329 & x<=404 & y>=298 & y<=351)     rgb_reg<=3'b001;
            else if (x>=408 & x<=483 & y>=298 & y<=351)     rgb_reg<=3'b000;
            else if (x>=487 & x<=562 & y>=298 & y<=351)     rgb_reg<=3'b001;
            else if (x>=566 & x<=641 & y>=298 & y<=351)     rgb_reg<=3'b000;
            else if (x>=13 & x<=88 & y>=355 & y<=408)     rgb_reg<=3'b001;
            else if (x>=92 & x<=167 & y>=355 & y<=408)     rgb_reg<=3'b000;
            else if (x>=171 & x<=246 & y>=355 & y<=408)     rgb_reg<=3'b001;
            else if (x>=250 & x<=325 & y>=355 & y<=408)     rgb_reg<=3'b001;
            else if (x>=329 & x<=404 & y>=355 & y<=408)     rgb_reg<=3'b000;
            else if (x>=408 & x<=483 & y>=355 & y<=408)     rgb_reg<=3'b001;
            else if (x>=487 & x<=562 & y>=355 & y<=408)     rgb_reg<=3'b000;
            else if (x>=566 & x<=641 & y>=355 & y<=408)     rgb_reg<=3'b001;
            else if (x>=13 & x<=88 & y>=412 & y<=465)     rgb_reg<=3'b000;
            else if (x>=92 & x<=167 & y>=412 & y<=465)     rgb_reg<=3'b001;
            else if (x>=171 & x<=246 & y>=412 & y<=465)     rgb_reg<=3'b000;
            else if (x>=250 & x<=325 & y>=412 & y<=465)     rgb_reg<=3'b001;
            else if (x>=329 & x<=404 & y>=412 & y<=465)     rgb_reg<=3'b000;
            else if (x>=408 & x<=483 & y>=412 & y<=465)     rgb_reg<=3'b000;
            else if (x>=487 & x<=562 & y>=412 & y<=465)     rgb_reg<=3'b001;
            else if (x>=566 & x<=641 & y>=412 & y<=465)     rgb_reg<=3'b010;
            else if (x>=0 & x<=640 & y>=0 & y<=480)        rgb_reg<=3'b110;//fondo
            else rgb_reg <= sw;
        end
    end
    // output
    assign rgb = (video_on) ? rgb_reg : 3'b000;
endmodule

COMPLEMENTO VGA-TABLERO

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date:    10:22:30 10/22/2015 
// Design Name: 
// Module Name:    vga_sync 
// Project Name: 
// Target Devices: 
// Tool versions: 
// Description: 
//
// Dependencies: 
//
// Revision: 
// Revision 0.01 - File Created
// Additional Comments: 
//
//////////////////////////////////////////////////////////////////////////////////
module vga_sync(
    input clk,reset,
    output hsync, vsync, video_on, p_tick,
    output [9:0] pixel_x, pixel_y
    );
    localparam HD = 640;
    localparam HF = 48 ; 
    localparam HB = 16 ; 
    localparam HR = 96 ; 
    localparam VD = 480; 
    localparam VF = 10; 
    localparam VB = 33; 
    localparam VR = 2;
    reg mod2_reg;
    wire mod2_next ;
    reg [9:0] h_count_reg, h_count_next;
    reg [9:0] v_count_reg , v_count_next;
    reg v_sync_reg , h_sync_reg;
    wire v_sync_next , h_sync_next ;
    wire h_end, v_end, pixel_tick;
    always @(posedge clk, posedge reset)
        if (reset)begin 
            mod2_reg <= 1'b0;
            v_count_reg <= 0;
            h_count_reg <= 0;
            v_sync_reg <= 1'b0;
            h_sync_reg <= 1'b0;
        end
        else begin
            mod2_reg <= mod2_next;
            v_count_reg <= v_count_next;
            h_count_reg <= h_count_next;
            v_sync_reg <= v_sync_next;
            h_sync_reg <= h_sync_next;
        end
    assign mod2_next = ~mod2_reg;
    assign pixel_tick = mod2_reg;
    assign h_end = (h_count_reg==(HD+HF+HB+HR-1));
    assign v_end = (v_count_reg==(VD+VF+VB+VR-1));
    always @*
        if (pixel_tick)
            if (h_end)
                h_count_next = 0;
            else
                h_count_next = h_count_reg+1;
        else
            h_count_next = h_count_reg;
    always @*
        if (pixel_tick & h_end)
            if (v_end)
                v_count_next = 0 ;
            else
                v_count_next = v_count_reg + 1;
        else
            v_count_next = v_count_reg;
    assign h_sync_next = (h_count_reg>=(HD+HB) && h_count_reg<=(HD+HB+HR-1));
    assign v_sync_next = (v_count_reg>=(VD+VB) && v_count_reg<=(VD+VB+VR-1));
    assign video_on = (h_count_reg<HD) && (v_count_reg<VD);
    assign hsync = h_sync_reg;
    assign vsync = v_sync_reg;
    assign pixel_x = h_count_reg;
    assign pixel_y = v_count_reg;
    assign p_tick = pixel_tick;
endmodule

RAMDON
Este módulo es el encargado de generar un numero aleatorio para saber si el jugador gana o pierde.

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date:    10:33:24 11/03/2015 
// Design Name: 
// Module Name:    ramdon 
// Project Name: 
// Target Devices: 
// Tool versions: 
// Description: 
//
// Dependencies: 
//
// Revision: 
// Revision 0.01 - File Created
// Additional Comments: 
//
//////////////////////////////////////////////////////////////////////////////////
module ramdon(
 data,
 out,  // Output of the counter
 enable          ,  // Enable  for counter
 clk             ,  // clock input
 reset              // reset input
 );
 //----------Output Ports--------------
 output [5:0] out;
 //------------Input Ports--------------
 input [5:0] data;
 input enable, clk, reset;
 //------------Internal Variables--------
 reg [5:0] out;
 wire        linear_feedback;
 //-------------Code Starts Here-------
 assign linear_feedback =  ! (out[5] ^ out[3]);
 always @(posedge clk)
 if (reset) begin // active high reset
 out <= 8'b0 ;
 end else if (enable) begin
 out <= {out[4],out[3],
 out[2],out[1],
 out[0], linear_feedback};
 end
endmodule

VISUALIZACIÓN ÁREA DE JUEGO

IMG_1361.JPG

CRONOGRAMA DE ACTIVIDADES

cronograma.jpg

CONCLUSIONES

• La FPGA puede generar en la visualización un máximo de 8 colores.
• En el siete segmentos, la apuesta máxima es de 9999 donde solo se puede ingresar una apuesta de 4 dígitos.

REFERENCIA

http://cassinos.es/la-ruleta-electronica/
https://es.wikipedia.org/wiki/Ruleta
http://server4.foros.net/viewtopic.php?p=8756&mforum=ruletayalgomas

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