-5

我正在尝试为一个班级项目编写一个流行的太空射击游戏,并且遇到了模块实例化的问题。我们目前有一个模块,可以对射弹的运动进行编码,并创建了一组要“激活”的射弹。

我们希望我们的飞船发射用户想要的尽可能多的射弹,而射弹将简单地从枪管中出现并向上移动到屏幕上。

这转化为每个射弹的简单内部状态机:

  1. 停:
    • 如果用户想开枪,请激活此模块
  2. 在里面:
    • 设置弹丸位置以匹配枪管。将弹丸运动设置为非零。
  3. 移动:
    • 如果我们的碰撞检测单元发现碰撞(与敌人或墙壁),禁用模块并转到停止
    • 否则只需将位置步进一些预定数量的像素

我已经对状态机进行了正确编程,但目前如果用户开枪,枪会一直持续到屏幕边缘,并且在存在时无法再开枪。

理想情况下,我会有某种字典,我可以查看并找到要激活的“可用”射弹模块,当该模块可以再次发射时状态机会更新该模块。

所以这个过程看起来像:

  1. 用户想要发射弹丸
  2. 某事...在我们的射弹阵列中找到一个未启用的元素并启用它
  3. 射击开始,并禁止该模块进行另一次射击,直到当前的射击被摧毁。

我能想到的一种方法是从射弹阵列中读取“启用”位,这将是当前正在发射的单热编码:

0110 0011 - Projectiles 1, 2, 6, and 7 are in use

然后我们取出这些位,对它们执行……某些操作,并得到数字 3,它对应于最小的可用射弹模块的索引。数字 3 是用户输入状态机的输出,用于索引到我们的射弹模块阵列,然后将发送“激活”信号。

4

1 回答 1

1

您不能动态实例化硬件。您编写 Verilog/SystemVerilog 来描述应该如何构建硬件。如果您有需要在不同时间激活的功能,您需要将其合并到您的状态机中,或者使用在不同输出之间进行选择的多路复用器。

于 2016-11-22T21:57:19.330 回答