Оглавление:

Игра на реакцию FPGA: 10 шагов
Игра на реакцию FPGA: 10 шагов

Видео: Игра на реакцию FPGA: 10 шагов

Видео: Игра на реакцию FPGA: 10 шагов
Видео: Mister FPGA Настройка системы 2024, Ноябрь
Anonim
Игра на реакцию FPGA
Игра на реакцию FPGA

Саммер Резерфорд и Регита Соетандар

Шаг 1. Введение

Для нашего последнего проекта для CPE 133 мы разработали игру на реакцию на VHDL для платы Basys3. Эту игру больше всего можно сравнить с аркадной игрой «Укладчик», где игроку нужно сбрасывать блоки в нужное время. Плата Basys3 подключается к макетной плате с чередующимися светодиодами. Эти светодиодные индикаторы будут чередоваться с определенной частотой в зависимости от уровня. В этой игре используется делитель часов и 4-значный 7-сегментный дисплей, а также конечный автомат. Когда игрок активирует правильный переключатель, когда загорается средний светодиод, игрок переходит на следующий уровень игры, увеличивая частоту чередования светодиодов. Это делает каждый последующий уровень сложнее, чем предыдущий. Когда игрок успешно преодолеет 7-й уровень, наивысший уровень, на сегментном дисплее отобразится сообщение, и все светодиоды будут одновременно включаться и выключаться.

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

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

Материалы, которые вам понадобятся:

  • Плата Digilent Basys3 с кабелем micro USB
  • Макетная плата
  • 5 светодиодов
  • 5 резисторов (мы использовали 220 Ом)
  • 11 перемычек
  • Компьютер с Вивадо

Шаг 3: Дизайн черного ящика диаграммы верхнего уровня

Схема верхнего уровня Дизайн черного ящика
Схема верхнего уровня Дизайн черного ящика
Схема верхнего уровня Дизайн черного ящика
Схема верхнего уровня Дизайн черного ящика

Как видите, наша блок-схема верхнего уровня начинается с получения необходимых тактовых импульсов из нашего подмодуля ClkDivide. Эти часы являются входами в различные блоки процесса. По сути, игра должна понимать, что, когда пользователь правильно включает переключатель, светодиоды должны начать чередоваться быстрее, а дисплей должен подняться на один уровень. Блок-схема может выглядеть немного сумасшедшей, но это потому, что есть много сигналов, которые устанавливаются в определенном процессе, и затем этот сигнал определяет другой сигнал в другом блоке процесса.

В конце концов, единственные входные данные, которые принимает игра, - это входные часы на плате Basys3, работающие на частоте 100 МГц, семь переключателей на плате Basys3 и кнопка сброса. На выходе получается анод для семисегментного дисплея, семь сегментов для дисплея и светодиоды.

Шаг 4: CLKDivide

CLKDivide
CLKDivide
CLKDivide
CLKDivide
CLKDivide
CLKDivide

Этот подмодуль делителя часов создал более медленные часы в зависимости от значения, которое мы сопоставили ему в нашем основном файле. Мы использовали этот подмодуль для определения Clk400, PushClk и newlck. Этот подмодуль принимает на вход часы и 32-битный делитель. Выводятся замедленные часы. Есть блок процесса для делителя и замедленных часов. В процессе используется временная переменная, которую мы назвали count, которая ведет счет на единицу каждый раз, когда срабатывает нарастающий фронт введенных часов. Как только он достигает числа делителя, замедленные часы переключаются, и счетчик сбрасывается на ноль.

Шаг 5: Блок процесса сдвига

Блок процесса сдвига
Блок процесса сдвига

Блок процесса Shift управляет попеременным движением и скоростью светодиодов. В списке чувствительности есть сигналы newclk и Stop. Стоп вызывает короткую задержку, когда пользователь проходит уровень. Если Stop не высокий, то светодиоды чередуются как обычно в зависимости от скорости newclk. Этот чередующийся паттерн контролируется двумя переменными: отслеживанием и подсчетом. Счетчик определяет, какой светодиод должен гореть, а Трек определяет, должен ли счет идти вверх или вниз. Есть еще один сигнал - «Финал», который применяется только тогда, когда уровень «111» означает, что игрок выиграл игру. Final чередует 0 и 1 на каждом фронте тактового сигнала, чтобы светодиоды постоянно включались и выключались. Это просто визуальный элемент для финальной демонстрации.

Этот процесс смены - идеальное место для начала этого проекта. Если вы можете заставить ваши светодиоды чередоваться правильно и последовательно, тогда вам просто нужно добавить поведение при повышении уровня!

Шаг 6: конечный автомат

Конечный автомат
Конечный автомат

Мы создали конечный автомат, чтобы определять поведение при нажатии переключателя ввода или кнопки сброса. Каждое состояние является «уровнем», и если переключатель включен в неправильное время или нажата кнопка сброса, уровень возвращается к «000». В противном случае, если переключатель включен правильно, уровень перемещается вверх, пока не достигнет конечного состояния, «111», и появится конечный дисплей. FSM основан на двух блоках процессов sync_proc и comb_proc. Sync_proc использует часы, которые мы назвали PushClk. Эти часы контролируют, насколько быстро следующее состояние становится текущим. Эти часы должны быть довольно быстрыми; мы выбрали скорость, которая была примерно в два раза быстрее, чем наша самая быстрая скорость светодиодов.

Мы реализовали этот код с помощью автомата для уровней; однако после этого проекта мы поняли, что более эффективное использование конечного автомата могло заключаться в наличии состояния подсчета, состояния сброса или состояния ожидания. Если ничего не нажимается, он находится в состоянии ожидания. Если была нажата кнопка сброса или проигрыватель не справился, он находится в состоянии сброса. При правильном нажатии он находится в состоянии подсчета. Есть много других способов использовать автомат в этой игре!

Шаг 7: Управление блоком процесса отображения с помощью уровня

Управление блоком процесса отображения с помощью уровня
Управление блоком процесса отображения с помощью уровня

Уровень управляет блоком процесса отображения. Переменные в списке чувствительности: Level, Reset и Clk400. 7-сегментный дисплей начинается с отображения «1» для первого уровня. Он считает до 7 каждый раз, когда пользователь проходит уровень, чтобы показать пользователю, на каком уровне он находится. После того, как пользователь прошел уровень 7, отображается «COOL», что означает, что игрок прошел игру. Этот «COOL» дисплей работает от тактовой частоты 400 Гц, которую мы назвали Clk400. Если нажать Reset, дисплей вернется к «1».

Шаг 8: Управление скоростью светодиода с помощью уровня

Управление скоростью светодиода с помощью уровня
Управление скоростью светодиода с помощью уровня

Наконец, уровень контролирует скорость светодиодов. Уровень - единственный сигнал в списке чувствительности. D1 - это сигнал, который поступает в процесс Clock Divider для получения newclk. Каждый раз, когда изменяется Уровень или состояние, блок процесса «Скорость». Этот процесс определяет значение D1. Есть 8 определенных значений D1, которые мы выбрали в зависимости от того, насколько быстро мы хотели, чтобы запускался каждый уровень. D1 становится меньше каждый раз, когда уровень увеличивается, поэтому newclk работает быстрее.

Шаг 9: Сборка оборудования

Сборка оборудования
Сборка оборудования

Мы подключили макетную плату к Basys3 с помощью одного из разъемов pmod. Шесть портов pmod использовались для подключения штекера к штекеру, один для заземления, а другие пять для 5 светодиодов. Мы также разместили резистор для каждого светодиода. Эти резисторы имеют сопротивление 220 Ом и предотвращают короткое замыкание и перегорание светодиодов. Хотя каждый светодиод имеет некоторое сопротивление, его недостаточно, чтобы препятствовать подаче напряжения от источника.

Шаг 10: получайте удовольствие

В эту игру очень легко играть. Игрок начинает с крайнего правого переключателя 1 на доске, V17. Когда горит средний светодиод, они должны перевернуть переключатель. Затем они перемещают один переключатель влево и делают то же самое! Если игрок дойдет до конца, он окажется на седьмом переключателе, W14. Если они пройдут игру, они увидят действительно забавную концовку!

Следует отметить, что при создании этой игры скорость полностью зависит от вас! Если выбранные нами скорости слишком низкие, не стесняйтесь увеличивать скорость и усложнять задачу! Также нет установленного количества уровней. Если вы хотите, чтобы в нем было еще больше уровней, необходимо внести изменения в конечный автомат и блоки процесса, определенные уровнем, но это очень простые изменения.

Мы также решили использовать переключатели на плате в качестве пользовательского ввода, но это также возможно с помощью кнопки на плате Basys3; кнопка избавит от необходимости сбрасывать переключатели каждый раз, когда пользователь начинает заново. Изначально мы использовали кнопку, однако это вызывало ошибки при определении уровня, потому что при нажатии кнопки два нарастающих фронта PushClk перескакивали на несколько уровней.

Ниже приведено видео, демонстрирующее, как играть, прохождение первых 4 уровней и отображение финального финала.

Ниже приведен основной файл этого проекта.

Источники

Справочное руководство Basys3

Вдохновение для проекта - игра Arduino Stop It

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