Xilinx 的 UltraRAM(简称 URAM)是一种高性能的片上存储资源,专为 UltraScale+ 架构设计,具有高带宽、低延迟和大容量的特点。它适用于需要大量数据存储和高速访问的应用,如图像处理、视频编解码、缓存和数据流处理等。


一、UltraRAM 概述

  • 容量:每个 URAM 模块提供 288 Kb 的存储容量,可通过级联多个模块构建更大的存储阵列。
  • 结构:URAM 是双端口、单时钟同步存储器,支持同时进行读写操作。
  • 级联方式:多个 URAM 模块可以在同一列中级联,形成一个大的存储阵列。
  • ECC 支持:URAM 提供可选的错误检测和纠正(ECC)功能,以提高数据的可靠性。

二、URAM 与 BRAM 的比较

特性URAMBRAM
容量288 Kb(可级联)36 Kb
端口数双端口(读写)双端口(读写)
时钟数单时钟单时钟
级联能力支持级联,形成大容量阵列支持级联,但容量有限
ECC 支持可选可选
适用场景高带宽、大容量存储需求一般存储需求

三、URAM 的使用方式

1. 使用 Xilinx 参数化宏(XPM)

XPM 是 Xilinx 提供的一种参数化存储器宏,可以在 RTL 代码中实例化 URAM。

示例代码

xpm_memory_tdpram #(
  .MEMORY_SIZE(288),    // 存储容量(Kb)
  .MEMORY_PRIMITIVE("ultra"), // 使用 URAM
  .WRITE_DATA_WIDTH(72), // 写数据宽度(bits)
  .READ_DATA_WIDTH(72),  // 读数据宽度(bits)
  .ADDR_WIDTH(9)         // 地址宽度
) uram_inst (
  .clka(clk),           // 时钟信号
  .wea(we),             // 写使能
  .addra(addr),         // 地址
  .dina(din),           // 写数据
  .douta(dout)          // 读数据
);

在 Vivado 中,可以通过选择工具 -> 语言模板来访问 XPM 模板。

2. 使用 RTL 代码实例化

可以直接在 RTL 代码中实例化 URAM 原语。

示例代码

URAM #(
  .C_ADDR_WIDTH(9),     // 地址宽度
  .C_DATA_WIDTH(72)     // 数据宽度
) uram_inst (
  .CLK(clk),            // 时钟信号
  .WE(we),              // 写使能
  .ADDR(addr),          // 地址
  .DIN(din),            // 写数据
  .DOUT(dout)           // 读数据
);

3. 使用 Vivado IP 核

在 Vivado 中,可以使用 Block Memory Generator IP 核来配置 URAM。

步骤

  1. 在 Vivado 中创建一个新的 Block Design。
  2. 添加 Block Memory Generator IP。
  3. 在 IP 配置中,选择 “UltraRAM” 作为存储类型。
  4. 配置其他参数,如数据宽度、地址宽度等。
  5. 生成 IP 核,并将其连接到设计中。

四、URAM 的级联配置

多个 URAM 模块可以在同一列中级联,形成一个大的存储阵列。

注意事项

  • 每个 URAM 模块的地址和数据线需要正确连接。
  • 需要使用级联寄存器(如 IREG_PRE 和 REG_CAS)来确保时序的正确性。
  • 在设计中,必须遵循 Xilinx 提供的级联规则,以确保 URAM 阵列的稳定性和性能。

五、URAM 的性能优化建议

  • 流水线设计:在 URAM 的读写操作中,使用流水线技术可以提高数据处理的效率。
  • 时钟区域划分:将 URAM 模块分布在不同的时钟区域,以提高时钟频率和数据吞吐量。
  • 数据宽度匹配:确保 URAM 的数据宽度与设计需求相匹配,避免资源浪费或性能瓶颈。
  • ECC 配置:根据应用的可靠性要求,选择是否启用 ECC 功能。

六、参考文档