在VHDL中将3D RAM合成为BRAM阵列

在VHDL中将3D RAM合成为BRAM阵列,vhdl,vivado,synthesis,Vhdl,Vivado,Synthesis,在过去,我编写了Vivado成功地将VHDL中的2D数组合成为BRAM的代码。比如: 输入MY_2D_ARR IS STD_LOGIC_VECTOR(SLV_LEN-1向下到0)的数组(0到ARR_LEN-1) 在我的代码中,我已经调整了该类型的大小,使其适合单个BRAM,并且该工具将其映射为单个BRAM(在使用RAM_样式属性之后) 我想要一个BRAM数组,每个BRAM都可以在for循环中进行索引。这就是我尝试过的: 键入MY_3D_ARR是MY_2D_数组的数组(0到NUM_BRAMS-1)

在过去,我编写了Vivado成功地将VHDL中的2D数组合成为BRAM的代码。比如:

输入MY_2D_ARR IS STD_LOGIC_VECTOR(SLV_LEN-1向下到0)的数组(0到ARR_LEN-1)

在我的代码中,我已经调整了该类型的大小,使其适合单个BRAM,并且该工具将其映射为单个BRAM(在使用RAM_样式属性之后)

我想要一个BRAM数组,每个BRAM都可以在for循环中进行索引。这就是我尝试过的:

键入MY_3D_ARR是MY_2D_数组的数组(0到NUM_BRAMS-1)

我通过以下方式访问它,当然,除了在我的实际代码中使用更有用的方式

PROCESS(clk)
BEGIN
  IF rising_edge(clk) THEN
    IF wr_en = '1' THEN
      FOR i IN 0 TO NUM_BRAMS-1 LOOP
        my_3d_array(i)(wr_address) <= wr_data(i);
      END LOOP;
    END IF;
  END IF;
END PROCESS;

PROCESS(clk)
BEGIN
  IF rising_edge(clk) THEN
    FOR i IN 0 TO NUM_BRAMS-1 LOOP
      data_out(i) <= my_3d_array(i)(rd_address);
    END LOOP;
  END IF;
END PROCESS;
过程(clk)
开始
如果上升沿(clk),则
如果wr_en='1',则
对于0到NUM_BRAMS-1循环中的i

我的3d数组(i)(wr_地址)我认为花时间思考2D、3d、4D。。。底层硬件为1D(线性索引)时的RAM。VHDL越复杂,合成工具成功推断RAM的可能性就越小。如果您真的想使用多维索引,那么我建议显式地转换为线性索引来寻址RAM。Matlab的文档提供了关于如何做到这一点的很好的细节(用图表)。好的,底层硬件应该是我想要的多个物理RAM,每个RAM完全单独访问。然而,我从来没有想过在我的代码中尝试将其作为一个单独的数组进行展平-我会尝试一下,看看它是否有效。我以前在其他应用程序中使用过线性索引(主要是从宽总线中获取数据值),它应该足够简单。谢谢你的建议!在这种情况下,我可能会画一个我想要推断的硬件的示意图,并用它来指导我的VHDL。如果您想要独立地寻址多个物理RAM,那么。。。生成
循环当然值得考虑。仅使用一个3D信号(或数组中的数组),我可以想象合成工具将很难推断出多个独立的RAM。看起来您正在尝试编写Xilinx所称的简单双端口RAM。因此,对于每个RAM,您需要输入:
wr_en
wr_data
wr_address
rd_address
和输出:
data_out
。因此,对于其中的每一个,您都可以创建一个数组类型的信号(元素的数量等于您想要推断的ram的数量)。在生成循环中,只需索引每个数组并将信号插入RAM实例中即可。Vivado不喜欢RAM数组。我很抱歉地尝试了你所尝试的。最后,我使用了for..generate,其中ram数组在generate中声明,写入和读取数据连接在for generate外部声明为数组。使用2008类型时效果非常好。