Jeu "Life" sur FPGA Altera Cyclone IV

Le jeu "Life" est un automate cellulaire bien connu inventé par John Conway en 1970. L'essence du jeu est de simuler "l'univers", dans notre cas, implémenté sur une matrice carrée 8x8 à bords fermés.

Gameplay


Dans notre cas, le jeu est implémenté sur le FPGA Altera Cyclone IV à l'aide des boutons et commutateurs intégrés. L'ensemble du processus est divisé conditionnellement en deux modes de fonctionnement - le choix de la configuration de la première génération et la simulation réelle.

Implémentation


Le jeu est implémenté dans le langage de conception Verilog et se compose de quatre modules de base: modules d'entrée, sortie, algorithmique et de base, reliant le reste.

Algorithme de transition

Le terrain de jeu du code se présente sous la forme d'un registre de 64 éléments. Le passage à la génération suivante se fait à l'aide d'une logique séquentielle.

Fonction de transition
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 


Modules d'entrées / sorties

Le module de sortie fonctionne avec une matrice LED 8x8 standard avec 16 broches de contrôle. En raison des limitations d'affichage, l'image est affichée en lignes avec un changement continu de la ligne affichée.

Le module d'entrée se compose de trois boutons - mises à jour d'écran et un commutateur de mode. Dans le mode de configuration, les trois boutons sont actifs - sélection de la cellule active, modification de l'état de la cellule active et mise à jour de l'écran. En mode simulation, seul le bouton d'actualisation de l'écran est actif.

Exemple de travail

image

Code source

PS Cet article est l'une des exigences de la recherche étudiante, nous vous demandons fortement de ne pas jeter de chaussons, nous ne sommes pas à blâmer.

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


All Articles