| сохранено
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 управляющими пинами. Из-за ограничений дисплея картинка отображается по рядам с непрерывной сменой отображаемого ряда.
Модуль ввода представляет собой три кнопки — обновления экрана и переключатель режимов. В режиме настройки активны все три кнопки — выбор активной клетки, смена состояния активной клетки и обновление экрана. В режиме симуляции активна только кнопка обновления экрана.
Пример работы
→ Исходный код
P.S. Эта статья является одним из требований к студенческому исследованию, просим сильно тапками не кидаться, не виноватые мы.
комментарии (6)