Juego "Life" en FPGA Altera Cyclone IV

El juego "Life" es un conocido autómata celular inventado por John Conway en 1970. La esencia del juego es simular el "universo", en nuestro caso, implementado en una matriz cuadrada de 8x8 con bordes cerrados.

Jugabilidad


En nuestro caso, el juego se implementa en el FPGA Altera Cyclone IV utilizando los botones e interruptores incorporados. Todo el proceso se divide condicionalmente en dos modos de operación: la elección de la configuración de la primera generación y la simulación real.

Implementación


El juego se implementa en el lenguaje de diseño Verilog y consta de cuatro módulos básicos: módulos de entrada, salida, algorítmicos y básicos, que conectan el resto.

Algoritmo de transición

El campo de juego en el código se presenta en forma de un registro de 64 elementos. La transición a la próxima generación se lleva a cabo utilizando lógica secuencial.

Función de transición
function [63:0]step; input [63:0]field; reg [63:0]new_field; reg [7:0]position; reg [7:0]count; integer x; integer y; begin new_field = field; for(x = 0; x < 8; x = x + 1 ) begin: iloop for(y = 0; y < 8; y = y + 1) begin: jloop count = neighbour_count(field,x,y); position = to_1d(x,y); if (count == 3) new_field[position] = 1; else if ((count < 2) || (count > 3)) new_field[position] = 0; end end step = new_field; end endfunction function [7:0]neighbour_count; input [63:0]field; input [7:0]x; input [7:0]y; reg [7:0]count; reg [7:0]position; begin count = 0; position = to_1d(x-1,y-1); count = count + field[position]; position = to_1d(x,y-1); count = count + field[position]; position = to_1d(x + 1, y - 1); count = count + field[position]; position = to_1d(x - 1, y); count = count + field[position]; position = to_1d(x + 1, y); count = count + field[position]; position = to_1d(x - 1, y + 1); count = count + field[position]; position = to_1d(x, y + 1); count = count + field[position]; position = to_1d(x + 1, y + 1); count = count + field[position]; neighbour_count = count; end endfunction function [7:0]to_1d; input [7:0]x; input [7:0]y; begin if (x >= 8'b11111111) x = x + 8'd8; else if (x >= 8'd8) x = x - 8'd8; if (y >= 8'b11111111) y = y + 8'd8; else if (y >= 8'd8) y = y - 8'd8; to_1d = x + y * 8'd8; end endfunction 


Módulos de entrada / salida

El módulo de salida funciona con una matriz LED estándar de 8x8 con 16 pines de control. Debido a las limitaciones de visualización, la imagen se muestra en filas con un cambio continuo de la fila mostrada.

El módulo de entrada consta de tres botones: actualizaciones de pantalla y un interruptor de modo. En el modo de configuración, los tres botones están activos: seleccionar la celda activa, cambiar el estado de la celda activa y actualizar la pantalla. En el modo de simulación, solo el botón de actualización de pantalla está activo.

Ejemplo de trabajo

imagen

Código fuente

PD: Este artículo es uno de los requisitos para la investigación de los estudiantes, le pedimos encarecidamente que no arroje zapatillas, no tenemos la culpa.

Source: https://habr.com/ru/post/es429764/


All Articles