Как динамически создать экземпляр оборудования из списка доступных модулей в SystemVerilog?
Я пытаюсь запрограммировать популярную космическую съемку для классного проекта и столкнулся с проблемой создания экземпляров модуля. В настоящее время у нас есть модуль, который кодирует движение снаряда и создал их массив для "активации".
Мы хотим, чтобы наш корабль выпустил столько снарядов, сколько хочет пользователь, и эти снаряды просто появятся из ствола орудия и пойдут вверх по экрану.
Это означает простой внутренний конечный автомат для каждого снаряда:
- Останов:
- Если пользователь хочет сделать выстрел, активируйте этот модуль
- В этом:
- Установите позицию снаряда, чтобы соответствовать стволу оружия. Установите движение снаряда, чтобы быть отличным от нуля.
- Переехать:
- Если наш блок обнаружения столкновений видит столкновение (с врагом или стеной), отключите модуль и перейдите к Стоп
- В противном случае просто измените положение на определенное количество пикселей.
Я запрограммировал конечный автомат правильно, но в настоящее время, если пользователь делает выстрел, выстрел идет до края экрана, и другой выстрел не может быть выполнен, пока он существует.
В идеале, у меня был бы какой-то словарь, в который я мог бы посмотреть и найти "доступный" модуль снаряда для активации, который конечный автомат обновляет, когда этот модуль становится доступным для повторного запуска.
Так что процесс будет выглядеть так:
- Пользователь хочет выстрелить снарядом
- Что-то... находит элемент в нашем массиве снарядов, который не включен, и включает его
- Выстрел идет, и запрещает этому модулю делать еще один выстрел, пока текущий не будет уничтожен.
Один из способов, которым я могу подумать, - это считать "включенные" биты из массива снарядов, который будет представлять собой горячее кодирование, которое в настоящее время запускается:
0110 0011 - Projectiles 1, 2, 6, and 7 are in use
Затем мы берем эти биты, выполняем... что-то... на них и получаем номер 3, который соответствует индексу наименьшего доступного модуля снаряда. Число 3 выводится для конечного автомата пользовательского ввода для индексации в нашем массиве модулей снарядов, которым затем будет отправлен сигнал "активировать".
1 ответ
Вы не можете динамически создавать экземпляры оборудования. Вы пишете Verilog/SystemVerilog, чтобы описать, как должно быть построено оборудование. Если у вас есть функциональность, которая должна быть активна в разное время, вам нужно либо включить ее в свой конечный автомат, либо использовать мультиплексоры, которые выбирают между различными выходами.