СоХабр закрыт.

С 13.05.2019 изменения постов больше не отслеживаются, и новые посты не сохраняются.

| сохранено

H Игра «Жизнь» на FPGA Altera Cyclone IV в черновиках

Игра «Жизнь» — всем известный клеточный автомат, изобретенный Джоном Конвеем в 1970 году. Суть игры заключается в симуляции «вселенной», в нашем случае реализованной на квадратной матрице 8х8 с замкнутыми краями.


Игровой процесс


В нашем случае игра реализована на ПЛИС Altera Cyclone IV с использованием встроенных кнопок и переключателей. Весь процесс условно разделен на два режима функционирования — выбор конфигурации первого поколения и собственно симуляция.

Реализация



Игра реализована на языке проектирования Verilog и состоит из четырех базовых модулей: модули ввода, вывод, алгоритмический и основной, соединяющий остальные.

Алгоритм перехода

Игровое поле в коде представлено в виде регистра на 64 элемента. Переход к следующему поколению осуществляется с помощью последовательной логики.
Функция перехода
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



Модули ввода-вывода

Модуль вывода работает со стандартной светодиодной матрицей 8х8 с 16 управляющими пинами. Из-за ограничений дисплея картинка отображается по рядам с непрерывной сменой отображаемого ряда.
Модуль ввода представляет собой три кнопки — обновления экрана и переключатель режимов. В режиме настройки активны все три кнопки — выбор активной клетки, смена состояния активной клетки и обновление экрана. В режиме симуляции активна только кнопка обновления экрана.

Пример работы

image

Исходный код

P.S. Эта статья является одним из требований к студенческому исследованию, просим сильно тапками не кидаться, не виноватые мы.

комментарии (6)

+2
proton17 ,  
Это хитрая реклама Atlassian?
+1
slaFFik ,  

Ага, с "Access denied" забавно вышло :)

0
KarlKremen ,  

Отнюдь. Просто случайно закрыл репозиторий.

+1
AlexanderS ,  
В тематическом блоге, тем более про железячное программирование хотелось бы видеть нормальную статью, а не твиттероподобный огрызок с замаскированной под спойлер ссылкой, ведущей на bitbucket.org, которая потом конвертируется в atlassian.com. Автор, у вас совесть есть? )
0
KarlKremen ,  

Я искренне извиняюсь за такой огрызок, статью писал не по своей воле, только следовал регламенту исследования.

0
AlexanderS ,  
статью писал не по своей воле

Ок. Тогда понятно)