我一直试图找出一种使用块ram(或类似)在VHDL中转换大量数据的好方法。
使用矢量矢量它相对容易,但是对于大量数据它会变得很笨拙。
我想使用双通道块ram,这样我就可以写入一个块并读出另一个块。写入8位std_logic_vectors,读出32位std_logic_vectors,其中32位(至少第一次旋转)输入向量0-31的MSB,然后32-63一直到294911,然后是MSB-1等。
上述情况是我的理想情景。这甚至可能吗?我似乎找不到这样做的好方法。
答案 0 :(得分:1)
在这个答案中,我假设是18kbit Xilinx风格的BRAM。我对Virtex-4最熟悉,所以我指的是以下UG070。答案将简单地映射到其他Xilinx FPGA,也可能是其他供应商的部分。
首先要注意的是,Virtex-4 BRAM可用于双端口模式,每个端口具有不同的几何形状。但是,对于1位宽的端口,这些RAM的奇偶校验位无用。因此,18kbit BRAM在这里只有16kbits。
接下来,考虑一下您需要存储的BRAM数量(无论您的设计如何).294912x8位映射到144个BRAM,这是一个非常大的资源承诺。吞吐量,设计复杂性和资源需求之间始终存在平衡;如果你需要从设计中挤出每MBit /秒,也许基于BRAM的方法是理想的。如果没有,您应该考虑您的吞吐量和延迟要求是否允许您使用片外RAM而不是BRAM。
如果你做计划使用BRAM,那么你应该考虑一个18x8 BRAM阵列。每列8列存储一个输入位。每个BRAM通过1位端口写入,并使用32位端口读出。
每个8位写入映射到8个一位写入(每列写入一个BRAM。)
每个32位读取都映射到单个 32位读取单个 BRAM。
你需要很少的排序逻辑(围绕一个RAMB16原语)来实现这个目的。主要的复杂性是如何在1位端口和32位端口之间映射地址位。
答案 1 :(得分:0)
经过一番研究,我想,这是我对这个问题的回答:
由于块ram寻址的性质,OP中提到的理想场景对于当前块ram寻址实现是不可能的。为了以所述方式执行按位矩阵转置,块ram寻址将需要能够在水平和垂直之间切换。也就是说,ram必须可以逐行和按列访问,并且寻址模式必须是可实时切换的。由于逐位数据转置实际上不是特别“有用”的转换,因此实际上没有理由实现这种转换方案。特别是因为块ram的整个点是存储超过1位的数据块,并且这样的转换会扰乱数据。
我发现了一种改变我的设计的方法,这样294911 x 8位不需要一次转换,而是使用一个过程分阶段完成。这不依赖于块ram来执行转换。