На сайте habrhabr.ru мы натолкнулись на статью Minesweeper на FPGA, в которой рассказывается о создании игры сапер для FPGA фирмы Xilinx. Истоки Сапёра (Minesweeper) берут начало в 1960-х годов, когда его ранние версии устанавливались на компьютерах типа мейнфреймов. Игра Сапёр стала популярной благодаря включению его в качестве стандартного элемента в операционную систему Windows. Думаю найдется мало людей, которые не знакомы с этой игрой. Для тех кто по какой то причине прошел мимо этой игры, напомню ее суть. Плоское или объёмное игровое поле разделено на смежные ячейки (квадраты, шестиугольники, кубы и т. п.), некоторые из которых «заминированы»; количество «заминированных» ячеек известно. Целью игры является открытие всех ячеек, не содержащих мины.
Основная концепция игры
Правила для игры:
Управление с клавиатуры:
- "WSAD" — кнопки-стрелки для перемещения по экрану;
- "Enter" — проверка поля на наличие/отсутствие мины;
- "Space" — начать новую игру;
- "Esc" — завершить текущую игру;
- "Y/N" — для начала новой игры;
Поле 8х8, всего 8 мин на поле;
Остальные правила как в обычной игре сапёр;
Язык программирования ПЛИС: VHDL.
Иерархия проекта:
На одном из первых этапов проектирования необходимо прикинуть, а как же будет выглядеть проект и сколькими компонентами его удобнее описать. Я придумал следующую структуру:
- --> Верхний уровень
- ----> Контроллер PS/2
- ----> Контроллер VGA 640x480
- ----> Контроллер игры
- -------> Блок отрисовки границ прямоугольника,
- -------> Блок для отрисовки закрашенных полей 8х8
- -------> Блок для отрисовки мин и цифр на поле
- -----------> Память для расстановки мин
- -----------> Память для символов
- -------> Блок для отрисовки текста и диалоговых сообщений
- -----------> Память для символов
Верхний уровень
Он описывает основные порты ввода-вывода, содержит блок синтеза частоты DCM для преобразования входной частоты с 50 МГц в 25 МГц. Код верхнего уровня выглядит следующим образом:
VHDL Code:
entity top_minesweeper is port( -- PS/2 IO -- PS2_CLK : in std_logic; -- CLK from PS/2 keyboard PS2_DATA : in std_logic; -- DATA from PS/2 keyboard -- CLOCK 50 MHz -- CLK : in std_logic; -- MAIN CLOCK 50 MHz -- VGA SYNC -- VGA_HSYNC : out std_logic; -- Horizontal sync VGA_VSYNC : out std_logic; -- Vertical sync VGA_R : out std_logic; -- RED VGA_G : out std_logic; -- GREEN VGA_B : out std_logic; -- BLUE -- SWITCHES -- RESET : in std_logic -- Asynchronous reset: SW(0) ); end top_minesweeper;
Для переноса проекта на нашу плату VE-XC6SLX9, в принципе достаточно переопределить сигналы описанные в модуле top_minesweeper. В оригинальной статье неплохо описана вся логика работы проекта. Поэтому мы ограничимся видео работы и исходниками:
Проект игры Сапер: minesweeper.zip