Xilinx 的 UltraRAM(简称 URAM)是一种高性能的片上存储资源,专为 UltraScale+ 架构设计,具有高带宽、低延迟和大容量的特点。它适用于需要大量数据存储和高速访问的应用,如图像处理、视频编解码、缓存和数据流处理等。
一、UltraRAM 概述
- 容量:每个 URAM 模块提供 288 Kb 的存储容量,可通过级联多个模块构建更大的存储阵列。
- 结构:URAM 是双端口、单时钟同步存储器,支持同时进行读写操作。
- 级联方式:多个 URAM 模块可以在同一列中级联,形成一个大的存储阵列。
- ECC 支持:URAM 提供可选的错误检测和纠正(ECC)功能,以提高数据的可靠性。
二、URAM 与 BRAM 的比较
特性 | URAM | BRAM |
---|---|---|
容量 | 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。
步骤:
- 在 Vivado 中创建一个新的 Block Design。
- 添加 Block Memory Generator IP。
- 在 IP 配置中,选择 “UltraRAM” 作为存储类型。
- 配置其他参数,如数据宽度、地址宽度等。
- 生成 IP 核,并将其连接到设计中。
四、URAM 的级联配置
多个 URAM 模块可以在同一列中级联,形成一个大的存储阵列。
注意事项:
- 每个 URAM 模块的地址和数据线需要正确连接。
- 需要使用级联寄存器(如 IREG_PRE 和 REG_CAS)来确保时序的正确性。
- 在设计中,必须遵循 Xilinx 提供的级联规则,以确保 URAM 阵列的稳定性和性能。
五、URAM 的性能优化建议
- 流水线设计:在 URAM 的读写操作中,使用流水线技术可以提高数据处理的效率。
- 时钟区域划分:将 URAM 模块分布在不同的时钟区域,以提高时钟频率和数据吞吐量。
- 数据宽度匹配:确保 URAM 的数据宽度与设计需求相匹配,避免资源浪费或性能瓶颈。
- ECC 配置:根据应用的可靠性要求,选择是否启用 ECC 功能。
发表回复