Оглавление:

Соревновательная игра на двоих против тайминга: 4 шага
Соревновательная игра на двоих против тайминга: 4 шага

Видео: Соревновательная игра на двоих против тайминга: 4 шага

Видео: Соревновательная игра на двоих против тайминга: 4 шага
Видео: КАК ВЫИГРЫВАТЬ КАЖДУЮ ИГРУ В СОЮЗНИКАХ?🤔 ФИШКИ ОТ БОТАНИКА!🤯 | Standoff 2 2024, Июль
Anonim
Соревнование на двоих против игры на время
Соревнование на двоих против игры на время

Тебе понадобится:

1. Digilent Basys 3, плата FPGA (или любая другая FPGA)

2. Относительно свежая версия Vivado или другой среды VHDL.

3. Компьютер, на котором можно запустить указанную программу.

Шаг 1. Сама игра

Сама игра
Сама игра

Как автомат взаимодействует с модулями.

Как играть

Для начала вы нажимаете среднюю кнопку. В результате на семисегментном индикаторе отобразится «99», обозначающее здоровье второго игрока. Затем светодиоды загорятся последовательно справа налево. Это формирует шкалу мощности. Как только шкала мощности заполнится, она сбрасывается. Задача первого игрока - щелкнуть выключателем, когда планка будет как можно выше. Чем больше светодиодов загорается, тем больше урона игрок первый наносит второму. После того, как игрок 1 щелкает переключателем, нанесенный урон вычитается из здоровья игрока 2. Затем наступает ход второго игрока. Теперь отображаемое число представляет здоровье первого игрока, а шкала мощности заполняется слева направо. Как только второй игрок делает свой ход, урон вычитается, и он снова возвращается к ходу первого игрока. Это повторяется, пока один из игроков не достигнет 0 здоровья. Видео этой работы прилагается.

Шаг 2: автомат

FSM
FSM
FSM
FSM
FSM
FSM
FSM
FSM

Эта игра, по сути, представляет собой один большой конечный автомат, в котором происходит некоторая сложная логика, основанная на состоянии, в котором находится автомат.

Состояние 1: Меню Первое состояние - это экран меню, которое является одним из самых простых состояний. Он включает в себя семисегментный дисплей со словом «ИГРАТЬ» и кнопку, запускающую игру. Баттон, BTN, ведет нас к следующему состоянию - ходу первого игрока.

Состояние 2: ход первого игрока

Ход первого игрока активирует сигнал, который заставляет семисегментный дисплей отображать здоровье второго игрока. Другой сигнал включается для активации сдвигового регистра, импортированного из другого созданного нами модуля (Pone.vhd). Этот регистр сдвига заставляет светодиоды загораться, как индикатор увеличения мощности в других играх, и затем он сбрасывается на 0, когда достигает максимального количества светодиодов, которые могут гореть. Он обновляет нарастающий фронт часов, полученный из barclock.vhd, который изменен из заимствованного лабораторного файла. Полоса первого игрока начиналась справа и заполнялась слева, потому что переключатель первого игрока также находится слева (для интуитивно понятного взаимодействия с пользователем). После того, как переключатель повернут, состояние переходит к вычитанию первого игрока, и количество активных светодиодов сохраняется в сигнале.

Состояние 3: вычитание первого игрока. Сигнал с количеством горящих светодиодов определяет количество здоровья, которое вычитается. Это достигается за счет наличия другого сдвигового регистра (deductor1.vhd), который не увеличивает значения светодиодов, а уменьшает их. Это уменьшает нарастающий фронт одного из модулей div часов, которые мы позаимствовали и модифицировали (downcounterclock.vhd). Как только один индикатор погаснет, из общего здоровья второго игрока вычитается одно очко здоровья. Если во время этого процесса у второго игрока заканчивается здоровье, мы останавливаемся и сразу переходим в состояние «Игра окончена». В противном случае, когда вектор светодиода достигает «0000000000000000», мы переходим к ходу второго игрока.

Состояние 4: ход второго игрока Ход второго игрока точно такой же, как и ход первого игрока, за исключением того, что регистр сдвига для него (Ptwo.bhd) идет слева направо, а переключатель находится на правой стороне доски. Активируется сигнал, отображающий здоровье Игрока 1. Когда переключатель 2 становится активным, наступает очередь вычитания второго игрока.

Этап 5: Вычитание второго игрока Как и ход второго игрока, вычитание второго игрока очень похоже на вычитание первого игрока. Основное отличие состоит в том, что сдвиговый регистр, который управляет выключением светодиода, работает в противоположном направлении, что легко изменить, если вычитание первого игрока работает правильно.

Этап 6: Игра окончена. Если в какой-то момент у любого из игроков заканчивается здоровье, игра переключается в это состояние. Ничего особенного не отображает. Если нажать BTN one, то здоровье сбрасывается до 99, и состояние возвращается в меню, фактически начиная игру.

Шаг 3: модули

Модули
Модули

Схема черного ящика для игры

Downcounterclock (на основе модуля clk_div.vhd Брайана Мили):

Это часы, которые обрабатывают время дедукторов. Константа с именем max_count в 3 раза больше, чем константа max_count barclock. Это сделает дедукторы в 3 раза медленнее, чем скорость штанги.

Barclock - (на основе модуля clk_div.vhd Брайана Мили):

Эти часы управляют синхронизацией индикаторов мощности, которые мы быстро увеличили, чтобы усложнить игру. Это время можно отрегулировать по своему усмотрению, увеличив скорость, увеличив значение константы max_count, или уменьшив ее, сделав max_count меньшим числом. Sseg_dec - (Написано Брайаном Мили): этот модуль принимает на вход 8-битное число, которое он декодирует, преобразует число в его десятичный эквивалент, а затем выводит на семисегментный дисплей. Чтобы этот файл работал, вам необходимо убедиться, что ваши ограничения совпадают с нашими.

Pone:

Это сдвиговый регистр, который сдвигает биты влево, добавляя один горячий бит, чтобы было похоже, что индикатор мощности увеличивается. Когда все биты горячие, все биты сбрасываются в «0», и цикл начинается заново.

Ptwo:

Это перевернутая версия модуля P1.

Deductor1:

Это комбинация сдвигового регистра и вычитателя. Сдвиговый регистр движется в направлении, противоположном сдвиговому регистру P1, что указывает на вычитание. Это также вычитает 1 из здоровья Игрока 2 за каждый такт, поэтому при сочетании этих двух функций будет выглядеть, как будто здоровье противника уменьшается на 1 для каждого индикатора полоски здоровья, который опускается.

Deductor2: это перевернутая версия модуля Deductor1.

PlayDecoder (заимствован и слегка изменен из ekchen35649 его 133 инструктируемых): он используется в состоянии меню для отображения слова «PLAY» на семисегментном декодере.

Шаг 4: Тест

Эта игра изначально была вдохновлена одной из мини-игр от Кирби. Это простая игра для двух игроков, в которую можно играть на плате Basys 3 или любой FPGA.

Шаг 1. Необходимые материалы

Вам понадобятся: Digilent Basys 3, плата FPGA (или любая другая). Относительно последняя версия Vivado или другая среда vhdl. Компьютер, на котором можно запустить указанную программу. Мозг.

Шаг 2: Сама игра

Как играть

Для начала вы нажимаете среднюю кнопку. В результате на семисегментном индикаторе отобразится «99», обозначающее здоровье второго игрока. Затем светодиоды загорятся последовательно справа налево. Это формирует шкалу мощности. Как только шкала мощности заполнится, она сбрасывается. Задача первого игрока - щелкнуть выключателем, когда планка будет как можно выше. Чем больше светодиодов загорается, тем больше урона игрок первый наносит второму. После того, как игрок 1 щелкает переключателем, нанесенный урон вычитается из здоровья игрока 2. Затем наступает ход второго игрока. Теперь отображаемое число представляет здоровье первого игрока, а шкала мощности заполняется слева направо. Как только второй игрок делает свой ход, урон вычитается, и он снова возвращается к первому игроку. Это повторяется, пока один из игроков не достигнет 0 здоровья. Видео этой работы прилагается.

Чтобы начать игру, загрузите ее на игровую доску и нажмите среднюю кнопку. Попробуйте щелкнуть выключателем, чтобы как можно больше светодиодов загорелось, а затем подождите и наблюдайте, как доска вычитает эти очки из здоровья вашего оппонента. Затем передайте его своему другу и

Шаг 3: автомат

Эта игра, по сути, представляет собой один большой конечный автомат, в котором происходит некоторая сложная логика, основанная на состоянии, в котором находится конечный автомат.

(Диаграмма состояний)

Состояние 1: Меню

Первое состояние - это экран меню, которое является одним из самых простых состояний. Он включает в себя семисегментный дисплей со словом «ИГРАТЬ» и кнопку, запускающую игру. Баттон, BTN, ведет нас к следующему состоянию - ходу первого игрока.

Состояние 2: ход первого игрока

Ход первого игрока активирует сигнал, который заставляет семисегментный дисплей отображать здоровье второго игрока. Другой сигнал включается для активации сдвигового регистра, импортированного из другого созданного нами модуля (Pone.vhd). Этот регистр сдвига заставляет светодиоды загораться, как индикатор увеличения мощности в других играх, и затем он сбрасывается на 0, когда достигает максимального количества светодиодов, которые могут гореть. Он обновляет нарастающий фронт часов, полученный из barclock.vhd, который изменен из заимствованного лабораторного файла. Полоса первого игрока начиналась справа и заполнялась слева, потому что переключатель первого игрока также находится слева (для интуитивно понятного взаимодействия с пользователем). После того, как переключатель повернут, состояние переходит к вычитанию первого игрока, и количество активных светодиодов сохраняется в сигнале.

Состояние 3: вычитание первого игрока

Сигнал с количеством активных светодиодов определяет количество вычитаемого здоровья. Это достигается за счет наличия другого сдвигового регистра (deductor1.vhd), который не увеличивает значения светодиодов, а уменьшает их. Это уменьшает нарастающий фронт одного из модулей div часов, которые мы позаимствовали и модифицировали (downcounterclock.vhd). Как только один индикатор погаснет, из общего здоровья второго игрока вычитается одно очко здоровья. Если во время этого процесса у второго игрока заканчивается здоровье, мы останавливаемся и сразу переходим в состояние «Игра окончена». В противном случае, когда вектор светодиода достигает «0000000000000000», мы переходим к ходу второго игрока.

Состояние 4: ход второго игрока

Ход второго игрока точно такой же, как ход первого игрока, за исключением того, что его сдвиговый регистр (Ptwo.bhd) идет слева направо, а переключатель находится на правой стороне доски. Активируется сигнал, отображающий здоровье Игрока 1. Как только переключатель 2 активен, наступает очередь вычитания второго игрока.

Этап 5: Удержание второго игрока

Как и ход второго игрока, вычитание второго игрока очень похоже на вычитание первого игрока. Основное отличие состоит в том, что сдвиговый регистр, который управляет выключением светодиода, работает в противоположном направлении, что легко изменить, если вычитание первого игрока работает правильно.

Этап 6: Игра окончена. Если в какой-то момент у любого из игроков заканчивается здоровье, игра переключается в это состояние. Ничего особенного не отображает. Если нажать BTN one, то здоровье сбрасывается до 99, и состояние возвращается в меню, фактически начиная игру.

Черный ящик

Шаг 4: модули

Downcounterclock (на основе модуля clk_div.vhd Брайана Мили):

Это часы, которые обрабатывают время дедукторов. Константа с именем max_count в 3 раза больше, чем константа max_count barclock. Это сделает дедукторы в 3 раза медленнее, чем скорость штанги.

Barclock - (на основе модуля clk_div.vhd Брайана Мили): эти часы обрабатывают синхронизацию индикаторов мощности, которые мы быстро увеличили, чтобы добавить сложности игре. Это время можно отрегулировать по своему усмотрению, увеличив скорость, увеличив значение константы max_count, или уменьшив ее, сделав max_count меньшим числом. Sseg_dec - (Написано Брайаном Мили): этот модуль принимает на вход 8-битное число, которое он декодирует, преобразует число в его десятичный эквивалент, а затем выводит на семисегментный дисплей. Чтобы этот файл работал, вам необходимо убедиться, что ваши ограничения совпадают с нашими.

Pone: это сдвиговый регистр, который сдвигает биты влево, добавляя один горячий бит, чтобы он выглядел так, как будто индикатор мощности увеличивается. Когда все биты горячие, все биты сбрасываются в «0», и цикл начинается заново.

Ptwo: это перевернутая версия модуля P1.

Deductor1: это комбинация регистра сдвига и вычитателя. Сдвиговый регистр движется в направлении, противоположном сдвиговому регистру P1, что указывает на вычитание. Это также вычитает 1 из здоровья Игрока 2 за каждый такт, поэтому при сочетании этих двух функций будет выглядеть так, как будто здоровье противника уменьшается на 1 для каждого опускающегося индикатора полоски здоровья.

Deductor2: это перевернутая версия модуля Deductor1.

PlayDecoder (позаимствован и немного изменен из ekchen35649 его 133 инструктируемых):

Используется в состоянии меню для отображения слова «PLAY» на семисегментном декодере.

Сделать: картинки, видео

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