Vhdl Xilinx True双端口RAM,在两个端口上具有不同的纵横比

Vhdl Xilinx True双端口RAM,在两个端口上具有不同的纵横比,vhdl,verilog,ram,fpga,xilinx,Vhdl,Verilog,Ram,Fpga,Xilinx,我正在尝试使用以下配置在Verilog中构建RAM块: 端口A:128位宽,带有clk_A,将RAM块视为128位宽乘以128行深 端口B:32位宽,带有clk_B,将RAM块视为32位宽乘以512行深 不要担心读写序列化和互斥,我将在上面的一层处理它 基本上,生成128位乘以128行的代码如下所示: reg [DATA_WIDTH-1:0] mem [0:2**ADDRESS_WIDTH-1]; 现在,如果我想让它看起来像32位乘以512的深度,我该如何

我正在尝试使用以下配置在Verilog中构建RAM块:

  • 端口A:128位宽,带有clk_A,将RAM块视为128位宽乘以128行深
  • 端口B:32位宽,带有clk_B,将RAM块视为32位宽乘以512行深
不要担心读写序列化和互斥,我将在上面的一层处理它

基本上,生成128位乘以128行的代码如下所示:

reg [DATA_WIDTH-1:0]                 mem  [0:2**ADDRESS_WIDTH-1];
现在,如果我想让它看起来像32位乘以512的深度,我该如何重构这个内存使其看起来不同(有点像C中的重铸)?我知道我可能可以使用32位字启用来实现这一点,但我正在尝试看看是否有更干净的方法来实现这一点

让我知道你的想法

RRS


更正:我指的是Xilinx BRAM(BRAM不能有512深)。但这本质上是一个内存块,其胶水逻辑链接多个BRAM。谢谢你指出

有关如何执行此操作的详细说明,请参阅Xilinx文档。例如,从第217页开始,给出了明确的VHDL和Verilog示例,说明如何满足您的要求。

我是这样解决的:

在ISE中,我能够在其中一个菜单中找到“语言模板”,其中包含实际的代码示例。有一个带有“文件I/O”,它工作得很好


您还可以围绕双端口RAM构建一个包装器模块,它将改变另一端的数据宽度。在较小的数据宽度端口(即更多的地址线)上,您可以使用较低的地址位作为字选择系统,允许您写入内存线的一部分。这对我来说是正确的合成(检查你的合成工具)

你知道Xilinx BRAM不能少于512个字吗?换句话说,128位宽的RAM至少需要ceil(128/36)=4个内存。我称之为Xilinx BRAM(但它本质上是一个推断内存块)。我会让XST找出粘合逻辑。我对这些定义不满意:-(不用担心,我并没有试图更正您的定义!我只是指出,您不可能神奇地在32x512相同的资源占用空间中获得128x128 RAM。当然,占用空间会有所不同。在这一点上,我并不太担心面积,我担心的是功能和清洁度。我有点不清楚您是否真的想要使用嵌入式BlockRam块,Xilinx可能已经改变了ISE 13中的功能,但至少在ISE 12中,无法推断具有不同纵横比的真正双端口BlockRam-您需要通过例如CoreGen来实例化它们。参考: