Визуальная электроника

На сайте 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:
  1. entity top_minesweeper is
  2. port(
  3. -- PS/2 IO --
  4. PS2_CLK : in std_logic; -- CLK from PS/2 keyboard
  5. PS2_DATA : in std_logic; -- DATA from PS/2 keyboard
  6. -- CLOCK 50 MHz --
  7. CLK : in std_logic; -- MAIN CLOCK 50 MHz
  8. -- VGA SYNC --
  9. VGA_HSYNC : out std_logic; -- Horizontal sync
  10. VGA_VSYNC : out std_logic; -- Vertical sync
  11. VGA_R : out std_logic; -- RED
  12. VGA_G : out std_logic; -- GREEN
  13. VGA_B : out std_logic; -- BLUE
  14. -- SWITCHES --
  15. RESET : in std_logic -- Asynchronous reset: SW(0)
  16. );
  17. end top_minesweeper;

Для переноса проекта на нашу плату VE-XC6SLX9, в принципе достаточно переопределить сигналы описанные в модуле top_minesweeper. В оригинальной статье неплохо описана вся логика работы проекта. Поэтому мы ограничимся видео работы и исходниками:

Проект игры Сапер: minesweeper.zip

Добавить комментарий