Jogo "Life" no FPGA Altera Cyclone IV

O jogo "Life" é um conhecido autômato celular inventado por John Conway em 1970. A essência do jogo é simular o "universo", no nosso caso, implementado em uma matriz quadrada 8x8 com bordas fechadas.

Jogabilidade


No nosso caso, o jogo é implementado no FPGA do Altera Cyclone IV usando os botões e interruptores integrados. Todo o processo é dividido condicionalmente em dois modos de operação - a escolha da configuração da primeira geração e a simulação real.

Implementação


O jogo é implementado na linguagem de design Verilog e consiste em quatro módulos básicos: módulos de entrada, saída, algorítmica e básica, conectando o restante.

Algoritmo de transição

O campo de jogo no código é apresentado na forma de um registro de 64 elementos. A transição para a próxima geração é realizada usando lógica sequencial.

Função de transição
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 / saída

O módulo de saída funciona com uma matriz de LED 8x8 padrão com 16 pinos de controle. Devido a limitações de exibição, a imagem é exibida em linhas com alteração contínua da linha exibida.

O módulo de entrada consiste em três botões - atualizações de tela e uma chave de modo. No modo de configuração, todos os três botões estão ativos - selecionando a célula ativa, alterando o estado da célula ativa e atualizando a tela. No modo de simulação, apenas o botão de atualização da tela está ativo.

Exemplo de trabalho

imagem

Código Fonte

PS Este artigo é um dos requisitos para a pesquisa de estudantes; pedimos que não jogue chinelos; não temos culpa.

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


All Articles