1

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

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

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

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

4

2 回答 2

1

在这个答案中,我假设 18kbit Xilinx 风格的 BRAM。我对 Virtex-4 最为熟悉,所以以下我指的是 UG070。答案将微不足道地映射到其他 Xilinx 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 位读取都映射到来自单个BRAM的单个32 位读取。

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

于 2012-10-26T18:09:04.320 回答
0

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

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

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

于 2012-10-31T17:33:59.953 回答