如何从SystemVerilog中的可用模块列表中动态实例化硬件?

时间:2016-11-22 17:58:23

标签: verilog system-verilog hardware-programming

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

我们希望我们的船能像用户想要的那样射出许多射弹,射弹只会从枪管中出现并向屏幕上移动。

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

  1. 暂停:
    • 如果用户想要开枪,请激活此模块
  2. 初始化:
    • 设置射弹位置以匹配枪管。将射弹运动设置为非零。
  3. 移动:
    • 如果我们的碰撞检测单元发现碰撞(与敌人或墙壁),请禁用模块并转到停止
    • 否则,只需将位置按预定量的像素步进
    • 即可
  4. 我已经正确编程了状态机,但是当前如果用户发射了一个镜头,则镜头一直持续到屏幕边缘,而另一个镜头在它存在时无法被发射。

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

    所以这个过程看起来像:

    1. 用户想发射射弹
    2. Something ...在我们的射弹阵列中找到一个未启用并启用它的元素
    3. 射击去,并禁止该模块进行另一次射击,直到当前的一个被摧毁。
    4. 我认为这样做的一种方法是从射出的射弹阵列中读出“启用”位,这将是目前正在触发的单热编码:

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

      然后我们取出那些位,对它们执行......某些东西,得到数字3,它对应于最小可用射弹模块的索引。输出数字3以供用户输入状态机索引到我们的射弹模块阵列中,然后发送“激活”信号。

1 个答案:

答案 0 :(得分:1)

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