Spiel "Life" auf FPGA Altera Cyclone IV

    Das Spiel "Life" ist ein bekannter zellulärer Automat, der 1970 von John Conway erfunden wurde. Das Wesentliche des Spiels liegt in der Simulation des "Universums", in unserem Fall auf einer 8x8-Quadratmatrix mit geschlossenen Kanten.

    Spielablauf


    In unserem Fall wird das Spiel auf dem Altera Cyclone IV FPGA mit den integrierten Schaltflächen und Schaltern implementiert. Der gesamte Prozess ist herkömmlicherweise in zwei Betriebsmodi unterteilt - die Wahl der Konfiguration der ersten Generation und die tatsächliche Simulation.

    Umsetzung


    Das Spiel ist in der Verilog-Designsprache implementiert und besteht aus vier Basismodulen: Eingabemodule, Output, Algorithmus und Basic, die den Rest verbinden.

    Übergangsalgorithmus

    Das Spielfeld im Code wird in Form eines Registers mit 64 Elementen dargestellt. Der Übergang zur nächsten Generation erfolgt mit sequentieller Logik.

    Übergangsfunktion
    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
    


    E / A-Module

    Das Ausgangsmodul arbeitet mit einer Standard-8x8-LED-Matrix mit 16 Steuerpins. Aufgrund der Einschränkungen der Anzeige wird das Bild in Zeilen angezeigt, wobei sich die angezeigte Zeile kontinuierlich ändert.

    Das Eingabemodul besteht aus drei Schaltflächen - Bildschirmaktualisierung und Modusumschaltung. Im Setup-Modus sind alle drei Schaltflächen aktiv: Wählen Sie die aktive Zelle aus, ändern Sie den Status der aktiven Zelle und aktualisieren Sie den Bildschirm. Im Simulationsmodus ist nur die Schaltfläche zum Aktualisieren des Bildschirms aktiv.

    Arbeitsbeispiel

    Bild



    P.S.- Quellcode Dieser Artikel ist eine der Voraussetzungen für Studentenforschung, wir bitten Sie, nicht zu viele Hausschuhe zu werfen, wir sind nicht schuldig.

    Jetzt auch beliebt: