【问题标题】:bit-wise matrix transposition in VHDL using blockram使用块 ram 在 VHDL 中的按位矩阵转置
【发布时间】:2012-10-26 15:27:45
【问题描述】:

我一直在尝试找出一种使用块 ram(或类似的)在 VHDL 中转置大量数据的好方法。

使用向量组成的向量相对容易,但对于大量数据来说会很麻烦。

我想使用双通道块内存,以便我可以写入一个块并读出另一个块。写入 8 位 std_logic_vectors,读出 32 位 std_logic_vectors,其中 32 位是(至少对于第一次旋转)输入向量 0 - 31 的 MSB,然后是 32 - 63 一直到 294911,然后是 MSB-1,等等。

上述案例是我的理想情况。这甚至可能吗?我似乎找不到这样做的好方法。

【问题讨论】:

    标签: vhdl


    【解决方案1】:

    在这个答案中,我假设是 18kbit Xilinx 风格的 BRAM。我对 Virtex-4 最为熟悉,所以以下我指的是 UG070。答案将与赛灵思的其他 FPGA 以及可能其他供应商的部件相对应。

    首先要注意的是,Virtex-4 BRAM 可用于双端口模式,每个端口具有不同的几何形状。然而,对于 1 位宽的端口,这些 RAM 的奇偶校验位没有用处。因此,18kbit BRAM 在这里实际上只有 16kbits。

    接下来,考虑仅用于存储的 BRAM 数量(无论您的设计如何)。294912x8 位映射到 144 个 BRAM,这是一个相当大的资源承诺。吞吐量、设计复杂性和资源需求之间始终存在平衡;如果您需要从设计中挤出每 MBit/sec,那么基于 BRAM 的方法可能是理想的选择。如果没有,您应该考虑您的吞吐量和延迟要求是否允许您使用片外 RAM 而不是 BRAM。

    如果您确实计划使用 BRAM,那么您应该考虑使用 18x8 BRAM 阵列。 8 列各存储一个输入位。每个 BRAM 通过 1 位端口写入,并通过 32 位端口读出。

    每个 8 位写入映射到 8 个 1 位写入(每列写入一个 BRAM。)

    每个 32 位读取都映射到 single 来自 single BRAM 的 32 位读取。

    您应该需要很少的排序逻辑(围绕 RAMB16 原语)才能使其正常工作。主要的复杂性在于如何在 1 位端口和 32 位端口之间映射地址位。

    【讨论】:

    • 这是一个比我之前想的更好的解决方案:8 位写入和 1 位读取,但我认为我没有足够的 ccs 来处理每位 1 cc。在仔细考虑之后,我意识到这个问题是硬件固有的,因为由于 RAM 的设计方式,寻址实际上只会是逐行或逐列,而不是两者兼而有之。所以我很确定我的理想情况是不可能的。对于 ram 制造商来说,将 ram 寻址设计为垂直/水平切换是没有意义的,除非是为了解决这个特定问题。回到绘图板上。
    【解决方案2】:

    经过一番研究和思考,这是我对这个问题的回答:

    由于块 ram 寻址的性质,OP 中提到的理想方案对于当前的块 ram 寻址实现是不可能的。为了以所述方式执行按位矩阵转置,块 ram 寻址将需要能够在水平和垂直之间切换。也就是说,ram 必须可以按行和按列访问,并且寻址模式必须是可实时切换的。由于按位数据转置并不是真正“有用”的变换,因此没有真正的理由来实施这种切换方案。特别是因为 block ram 的重点是将数据存储在超过 1 位的块中,这样的转换会打乱数据。

    我发现了一种改变我的设计的方法,这样 294911 x 8 位不需要一次转换,而是使用一个进程分阶段完成。这不依赖于块 ram 来执行转换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-28
      • 2012-10-30
      相关资源
      最近更新 更多