Вы находитесь на странице: 1из 13

UNIVERSIDAD NACIONAL DE INGENIERIA FACULTAD DE ELECTROTECNIA Y COMPUTACION

Ingeniera Electrnica Electrnica Digital II

Reporte de Proyecto Juego Mastermind

Carlos Jos Luis Martnez Hernndez Ever Enrique Ruiz Nicaragua Jonathan Amador

Grupo 3T1-eo

2010

INTRODUCCION
Una FPGA (Field programmable gate arrays) es un dispositivo semiconductor que contiene bloques de lgica cuya interconexin y funcionalidad se puede programar. La lgica programable puede reproducir desde funciones tan sencillas como las llevadas a cabo por una puerta lgica o un sistema combinacional hasta complejos sistemas en un chip. Los diseos digitales han tomado un cambio despus de muchos aos. Las FPGAs que contienen un equivalente de un milln de compuertas lgicas y diez mil flip-flops. Esto significa que sera demasiado tedioso usar los mtodos tradicionales de diseo lgico usando los diagramas lgicos cuando los circuitos digitales pueden contener miles de compuertas. Por eso hoy en da los sistemas digitales son diseados por software escrito en la forma de lenguaje de descripcin de software o HDLs (Hardware description languages). Los HDL usados ms comnmente hoy en da son Verilog and VHDL. Ambos son ampliamente usados. Cuando se usa estos lenguajes el diseador lo que hace es describir el comportamiento de los circuitos lgicos que son escritos de una forma bastante similar a las ecuaciones Booleanas. La computadora ayuda a disear la simulacin de diseo de Verilog o VHDL y a sintetizar el diseo para pasarlo a hardware.

En este proyecto los circuitos digitales se hicieron con Verilog y sintetizando el diseo con Xilinx. Y para pasarlo a la FPGA Spartan 3-E se uso el programa Digilent Adept.

Objetivos

Conocer y Dar a conocer las FPGA su funcionamiento y aplicaciones. Desarrollar un juego mastermind para ver el funcionamiento de las FPGA. Motivar al uso de FPGA para futuros proyectos. Usar este juego para usarlo para el entretenimiento.

Mastermind Este es un juego en el cual un jugador debe adivinar un cdigo secreto. En nuestro caso el retador determina el cdigo de tres dgitos. Cada digito puede tener un valor de 0 a 7. El retador debe comparar la combinacin del oponente con el cdigo secreto y anunciar cuantos elementos tienen el valor correcto y estn en el lugar correcto. Nuestro trabajo fue la realizacin de un circuito que actu como el retador.

Salidas y Entradas usadas en la FPGA 4 3 3 1 pushboton (btn3, btn2, btn1, btn0). displays de 7 segmentos. leds (ld2, ld1, ld0). swith (sw0). Instrucciones de uso Se presiona el botn btn3 que sirve como reset del juego y registro del numero a encontrar, luego se introduce un numero crea que es el numero a buscar, esto se hace presionando los botones btn2, btn1, btn0 correspondientes al tercer digito, segundo digito, primer digito respectivamente, para saber si es ese nmero, se ponen en alto el sw0. El ld2 corresponde al tercer digito, el ld1 al segundo digito, el ld0 al primer digito al primero. Si el ld parpadea quiere decir que ese nmero tiene un valor correcto pero no corresponde en lugar. Si el est siempre encendido quiere decir que el valor es correcto y que est en el lugar correcto. El juego termina cuando los tres leds estn siempre encendidos

Programacin En este programa se usaron 8 mdulos, un esquemtico como top y el .ucf.

Cdigo de los modulos


module Contador_en( input clk, /*reloj a 1Hz*/ input clr, input en, output reg [2:0]q ); always@(posedge clk or posedge clr) begin if(clr==1) q<=0; else if(en==1) q<=q+1; end endmodule /*Esta parte es un sumador*/ /*con una habilitacin */

module tap3x4( input wire [2:0]x14_12, input wire [2:0]x10_8, input wire [2:0]x6_4, input wire [2:0]x2_0, output [15:0]x ); assign x[14:12]=x14_12[2:0]; /*Convierten un bus de tres bits en uno de 4 bits*/ assign x[10:8] = x10_8[2:0]; /*El cuarto bit el programa lo hace cero o manda a tierra*/ assign x[6:4] = x6_4[2:0]; assign x[2:0] = x2_0[2:0];

endmodule

module x7seg( input wire [15:0]x, input wire clk, /*Reloj a 50Mhz*/ input wire clr, output reg[6:0] a_to_g, output reg [3:0]an, output wire dp ); wire [1:0]s; reg [3:0]digit; wire [3:0] aen; reg [19:0]clkdiv; assign dp = 1; /*Punto decimal apagado*/ assign s = clkdiv[19:18]; /*Cuenta cada 5.2ms*/ assign aen[3] = 0; /*Pone el aen3 apagadoo*/ assign aen[2] = 1; /*Pone aen2 on*/ assign aen[1] = 1; /*Pone aen1 on*/ assign aen[0] = 1; /*Pone aen0 on*/ //Tambin se pudo poner //assign aen=4'b0111; en vez de los 4 separados. always @(*) /*Multiplexor de 4-1*/ case(s) 0:digit = x[3:0]; 1:digit = x[7:4]; 2:digit = x[11:8]; 3:digit = x[15:12]; default:digit = x[3:0]; endcase always @(*) case(digit) 0: a_to_g = 7'b0000001; 1: a_to_g = 7'b1001111; 2: a_to_g = 7'b0010010; 3: a_to_g = 7'b0000110; 4: a_to_g = 7'b1001100; 5: a_to_g = 7'b0100100; /*Decodificador para el display de 7 segmentos*/

6: a_to_g = 7'b0100000; 7: a_to_g = 7'b0001111; 8: a_to_g = 7'b0000000; 9: a_to_g = 7'b0000100; 10: a_to_g = 7'b0001000; 11: a_to_g = 7'b1100000; 12: a_to_g = 7'b0110001; 13: a_to_g = 7'b1000010; 14: a_to_g = 7'b0110000; 15: a_to_g = 7'b0111000; default:a_to_g = 7'b0000001; endcase always @ (*) /*Selector de digito*/ begin an=4'b1111; if(aen[s] == 1) an[s] = 0; end

always @ (posedge clk or posedge clr) begin if(clr == 1) clkdiv<=0; else clkdiv<=clkdiv+1; end endmodule module contador( input clk, /*reloj a 50Mhz*/ output reg [2:0]q ); always@( posedge clk) /*Sumador*/ begin if (clk==1) q<=q+1; end

/*Divisor de reloj*/

endmodule module tap3x1(

input [2:0]q, output x ); assign x=q[2]; /*Convierte un bus de tres bits en uno de 1 bit*/ endmodule

module reg_random( input clr, input [2:0]q, output reg[2:0]x ); always@(posedge clr) begin if (clr==1) /*Si clr==1*/ assign x=q; /*Guarda q en x*/ end endmodule module Comparador( input [2:0]q, input [2:0]a, input [2:0]b, input [2:0]c, output [2:0]x ); wire eq1; wire eq2; wire eq3; wire eq4; wire eq5; wire eq6; wire eq7; wire eq8; wire eq9; assign eq1=~(q[2]^a[2]); assign eq2=~(q[1]^a[1]); assign eq3=~(q[0]^a[0]); assign x[2]=eq1&eq2&eq3; assign eq4=~(q[2]^b[2]); assign eq5=~(q[1]^b[1]); assign eq6=~(q[0]^b[0]); /*Compara si q = a con compuertas exnor*/

/*Compara si q = b con compuertas exnor*/

assign x[1]=eq4&eq5&eq6; assign eq7=~(q[2]^c[2]); assign eq8=~(q[1]^c[1]); assign eq9=~(q[0]^c[0]); assign x[0]=eq7&eq8&eq9; endmodule module Led( input en, input mclk, input [2:0]x, output reg led ); reg [24:0]q; /*Compara si q = c con compuertas exnor*/

/*reloj a 50Mhz*/

always@(posedge mclk) begin if (mclk==1) q<=q+1; end

/*Divisor de reloj*/

always@( posedge mclk) begin if(en ==1) case (x) 0: led =0; 1: led=q[24]; /*Cambia cada 0.6s*/ 2: led=q[24]; /*Cambia cada 0.6s*/ 3: led=q[24]; /*Cambia cada 0.6s*/ 4: led=1; 5: led=1; 6: led=1; 7: led=1; endcase else led=0; end endmodule

# Universal UCF NET "mclk" LOC = "B8" NET "btn3" LOC = "A7" NET "btn2" LOC = "M4" NET "btn1" LOC = "C11" ; NET "btn0" LOC = "G12" ; net "rcclk" loc = "C8"; NET "sw0" LOC = "P11" ; NET "LED2" NET "LED1" NET "LED0" LOC = "P7" LOC = "M11" LOC = "M5" ; ; ;

; ; ;

NET "a_to_g[0]" NET "a_to_g[1]" NET "a_to_g[2]" NET "a_to_g[3]" NET "a_to_g[4]" NET "a_to_g[5]" NET "a_to_g[6]" NET "dp" NET "an[0]" NET "an[1]" NET "an[2]" NET "an[3]"

LOC = "M12" ; LOC = "L13" ; LOC = "P12" ; LOC = "N11" ; LOC = "N14" ; LOC = "H12" ; LOC = "L14" ; LOC = "N13" ; LOC = "F12" LOC = "J12" LOC = "M13" LOC = "K14" ; ; ; ;

Diagrama de bloque

Diagrama de flujo

Recomendaciones Para mejorar este juego se puede usar como entrada los nmeros de un teclado y salidas de video. En la pantalla se tendran que registrar los valores introducidos y su comparacin. Se le puede poner diferentes niveles de juego, aumentando el nmero de dgitos a buscar, el presentado se buscan 3 dgitos otro nivel podra buscar 5 o 6 dgitos. over. Poner un limite de intentos y si pasa esos intentos poner game

Conclusiones Con esto pudimos observar el funcionamiento de la FPGA y que es una herramienta poderosa y simplifica el desarrollo de circuitos digitales.

Вам также может понравиться