Оглавление:

Игра вдохновителя на VHDL: 3 шага
Игра вдохновителя на VHDL: 3 шага

Видео: Игра вдохновителя на VHDL: 3 шага

Видео: Игра вдохновителя на VHDL: 3 шага
Видео: "Що я хотів знати на своєму першому проекті" - Дмитро Беседа 2024, Июль
Anonim
Игра вдохновителя в VHDL
Игра вдохновителя в VHDL
Игра вдохновителя в VHDL
Игра вдохновителя в VHDL

Для нашего проекта мы создали игру Mastermind на VHDL, в которую можно играть на доске Basys3. Mastermind - это игра с взломом кода, в которую традиционно играют с помощью колышков и игровой доски. Первый игрок кладет колышки разных цветов в ряд по 4, скрытые от второго игрока. После этого у второго игрока есть «x» предположений, которые кладут колышки на доску в ряд, видимый первому игроку. После каждого предположения второй игрок получает 2 числа: сколько колышков правильного цвета и сколько колышков находится в правильном положении в ряду. Используя эти подсказки, второй игрок должен угадать правильную последовательность кеглей, которую первый игрок поместил в назначенное число.

В нашей реализации игра однопользовательская. Программа генерирует случайную комбинацию колышков, и игрок должен использовать доску Basys3, чтобы угадать правильную последовательность. Есть четыре «цвета», представленные двоичными значениями. На 7-сегментном дисплее отображаются три значения: оставшиеся витки, количество выводов в правильном положении и число выводов правильного цвета в неправильном положении (эти значения начинаются с 9, 0 и 0). Игрок использует переключатели на доске, чтобы выбрать двоичные значения для своего предположения, и щелкает другим переключателем, чтобы отправить предположение. Если они верны, игра заканчивается и на 7-сегментном дисплее отображается «GG». В противном случае счетчик хода уменьшается на 1, и игрок получает обратную связь, основанную на том, сколько кеглей в его предположении соответствует цвету или положению кеглей в комбинации. Если игрок выбегает из ходов, не угадав правильно, на дисплее отображается «GO» (что означает окончание игры). Игрок также может щелкнуть переключателем сброса, чтобы начать все сначала.

Шаг 1: материалы

Материалы
Материалы
Материалы
Материалы
Материалы
Материалы

Поскольку всю игру можно воспроизводить на самой плате, единственными необходимыми материалами являются плата Basys3, кабель micro-USB для подключения к плате и компьютер / ноутбук, который можно использовать для программирования!

Шаг 2: Код

Код
Код
Код
Код

Чтобы эта игра работала на ПЛИС, простейшим способом ее написания было бы создание конечного автомата. Наличие конечного автомата позволяет последовательному и интерактивному опыту, необходимому для реальной работы игры. Чтобы все работало гладко, конечный автомат будет основан на внутреннем тактовом сигнале ПЛИС, обеспечивая синхронизацию всего. Главный модуль - это конечный автомат с четырьмя состояниями; Начальное состояние (начальное), состояние SubmitAnswer (SubAns), состояние отображения (Dis) и состояние CheckEndGame (CheckEnd). Наряду с конечным автоматом у основного модуля есть два подмодуля, 4-значный семисегментный дисплей (который имеет свой собственный подмодуль ClkDivider) и генератор случайных чисел (фактически генератор псевдослучайных чисел). Существует также базовый блок процесса, при котором светодиоды над каждым переключателем включаются при включении, чтобы людям было легче видеть, что они вводят. Базовый обзор кода можно увидеть на изображенной интеллект-карте.

Первый компонент, на который стоит обратить внимание, - это генератор случайных чисел (randomgen). Поскольку технически невозможно получить истинные случайные числа, сгенерированные аппаратными средствами, самым простым решением было сделать randomgen на самом деле регистром сдвига с линейной обратной связью (LFSR). LFSR имеет вход clk и выход «a» (12-битное число). Каждый такт генерируется новое 12-битное число, начиная с «000000000001», в конечном итоге проходя через все комбинации 12-битных единиц и нулей перед повторением. Выход «a» выдается каждый такт, поэтому он работает постоянно. Clk отображается в Clk из основного модуля, а «a» отображается в сигнал RandNum в основном модуле.

Второй подмодуль - это 4-значный семисегментный дисплей. Это довольно простой способ демонстрации 4-значного семисегментного дисплея. Отображение устанавливается на Clk из основного модуля, но у этого подмодуля есть собственный подмодуль ClkDivider. ClkDivider (установлен на 1298 Гц) используется для ускорения тактовой частоты для семи сегментов, так что все цифры кажутся включенными одновременно (поскольку на самом деле одновременно может быть только одна цифра). Переменная «цифра» используется для циклического перехода между точками на дисплее, и с каждой цифрой приходят условия базового 4-битного дисплея ввода с опциями для отображения цифр от 0 до 9, а также ничего. Самая дальняя левая цифра на дисплее не имеет значения, так как в этой игре она не используется.

Главный модуль состоит из конечного автомата. Четыре состояния в этом процессе: Initial, SubAns, Dis и CheckEnd. В исходном состоянии, если SubmitBtn (переключатель, используемый для отправки вашего ответа на проверку) установлен на «1», то машина переходит в состояние SubAns. Каждый раз, когда Rbtn (переключатель, используемый для сброса машины) устанавливается на «1», машина возвращается в исходное состояние. В состоянии SubAns, когда SubmitBtn снова = «0», он переходит в состояние Dis. Находясь в состоянии Dis, если Countdown = 0 (количество оборотов, оставшихся для угадывания, упадет до 0) или если RSpotCount = 4 (что означает, что игрок показывает все правильные цвета в правильных местах), автомат переходит в состояние CheckEnd. Если ничего из этого не происходит, тогда, когда SubmitBtn = ‘1’ снова, он возвращается в состояние SubAns, чтобы разрешить другое предположение. Находясь в состоянии CheckEnd, это конец игры, и единственный выход - выполнить сброс, вернув его в исходное состояние. Это легко увидеть на диаграмме конечного автомата. В поведении начальное состояние инициализирует все обратно в исходное положение. Обратный отсчет (сигнал, который сохраняет, сколько оборотов осталось у игрока) установлен на 9, RSpotCount (сигнал, который сохраняет, сколько цветов, которые вы угадали, находятся в правильном месте) установлен на 0, RColorCount (сигнал, который сохраняет, сколько из цвета, которые вы догадались, правильные, но в неправильном месте) установлен на 0, а smallcountdown (сигнал, который в конечном итоге отображается на Обратный отсчет, который фактически изменяет каждый ход в более поздних состояниях) установлен на 9. Кроме того, в Начальном состоянии RandNum (псевдослучайно сгенерированное число) разделяется на четыре различных проверки (по одной для каждого 3-битного цвета) и сохраняется в сигналах check1, check2, check3, check4. Эти проверки - это то, с чем на самом деле сравнивается ваше предположение, поэтому, хотя LFSR всегда заставляет RandNum изменять каждый цикл, как только вы выйдете из исходного состояния, проверки останутся прежними, позволяя сохраненному значению сравнивать ваш ответ с. Это также означает, что каждый раз, когда автомат перезагружается, игроку нужно угадать новое значение.

Состояние SubmitAnswer (SubAns) изменяет активатор обратного отсчета (сигнал «изменение») на «1». Это понадобится позже, чтобы сработало отслеживание поворота. После этого состояние сравнивает входные данные игрока от переключателей с проверками, выполненными в указанном выше состоянии. Сигнал rs1, rs2, rs3, rs4 и сигналы rc1, rc2, rc3, rc4 являются целочисленными типами, которые в зависимости от операторов If установлены в 1 или 0. Сигнал rs предназначен для правого пятна, а rc - для правильного цвета. Например, если предположение игрока цвета 1 равно check1 RandNum, то rs1 = 1, поскольку это означает, что правильный цвет находится в правильном месте. Если цвет 1 не равен проверке 1, но равен одной из других проверок, тогда rc = 1. Это делается для каждого цвета и каждой проверки.

Состояние дисплея (Dis) сначала ищет активатор обратного отсчета. Если он равен «1», тогда smallcountdown понижается на 1 (так что на первом ходу он идет от 9 до 8 и т. Д.). В противном случае поворот не меняется. Независимо от этого включения, все значения rs, указанные выше, суммируются и назначаются сигналу RSpotCounter. Также все значения rc добавляются и назначаются RColorCounter. Наконец, обратному отсчету присваивается значение smallcountdown. Все сигналы RSpotCounter, RColorCounter и Countdown преобразуются в 4-битные std_logic_vectors вне процесса и передаются в подмодуль отображения семи сегментов через карту портов. Таким образом, на дисплее будет отображаться то, что нужно, до тех пор, пока вы не отправите новый ответ.

Состояние CheckEnd определяет, выиграли вы или проиграли. Если вы выиграли (все 4 цвета находятся в нужном месте, иначе известное как RSpotCounter = 4), то «GG» (технически обозначается как 66) отображается в Семи сегменте, чтобы показать, что вы выиграли. Если вы проиграли (обратный отсчет достиг 0), тогда на дисплее отображается «GO» (технически обозначается как 60) для Game Over. В любом случае нажатие переключателя сброса в положение «включено» вернет автомат в исходное состояние для повторного воспроизведения.

Исходный код можно найти здесь.

Шаг 3: Заключение

Завершение этого проекта научило нас многому в построении более сложных схем. Наш первоначальный проект не был конечным автоматом. Нам было трудно отлаживать, и мы несколько раз переписывали код, используя разные методы (включая автомат). По совету инструктора мы остановились на подходе FSM и смогли закончить игру. Мы узнали, что гораздо эффективнее разрабатывать код на основе оборудования, чем при традиционном подходе к программированию. Мы также столкнулись с рядом проблем, связанных с семисегментным дисплеем. Заставить его отображать несколько чисел без «ореолов» было сложно, и для этого нам пришлось использовать делитель часов. Если бы мы продолжали развивать этот проект, мы бы подключили цветные светодиоды к Basys3, чтобы пользователь мог видеть цвета (как в традиционной игре), а не числовые представления цветов. В конечном итоге мы получили лучшее понимание сложных схем, реальных приложений и проблем использования оборудования, а не моделирования в идеальных условиях.

Рекомендуемые: