在这个答案中,我假设 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 位端口之间映射地址位。