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 transitionfunction [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
→ Code sourcePS 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.