7系列FPGA、UltraScale或UltraScale Plus系列FPGA包括块内存(URAM ),但只有UltraScale Plus芯片是UltraRAM (我们所说的UltraRAM ) BRAM和URAM都是重要的片上存储资源,但两者有明显的差异。
容量
BRAM的容量为36Kb,可以作为两个独立的18Kb BRAM使用。 对于36Kb的BRAM,最大位宽为72位。
URAM的容量为288Kb,一个URAM的深度为4k(41024 ),宽度为72bit。
时钟
BRAM有两个时钟,在RAMB36E2的Primitive声明中可以看到CLKARDCLK和CLKBWRCLK。
URAM中只有一个时钟。 URAM288的Primitive声明显示此时钟CLK。 使用XPM_MEMORY实例化URAM时,将显示CLKa和clkb,但这两个端口最终都连接到URAM的物理端口clk。
初始值
可以设置BRAM的初始值,并且可以在COE文件中设置初始值,无论BRAM是单端口、简单双端口还是真正的双端口。 URAM的初始值只有0,不能更改。 也就是说,不能设定初始值。 这意味着可以在ROM中配置BRAM,但不能配置URAM。
工作模式
BRAM可以配置为单端口、简单双端口和真正的双端口,但对于URAM,这三种模式不能简单地映射。 动作如下图所示。 可见A/B端口并不独立。 例如,a端口读取,b端口写入同一地址,读取该地址的原始数据。 a端口写入,b端口读取相同的地址,读取新写入的数据。
图片来源: Table 2-6、ug573
实例化方式
BRAM可以通过原语、XPM_MEMORY、RTL代码或IP Core的方式实例化。
但是,URAM目前只支持原语、XPM_MEMORY和RTL代码的方式。 相比之下,XPM_MEMORY的方式更快,也是Xilinx提出的方式。
级联方式
BRAM和URAM可以级联,但级联的方式不同。 使用BRAM时,只需设置宽度和深度,并根据时钟频率合理选择延迟。 也就是说,选择是否需要使用BRAM附带的输出寄存器或Slice寄存器。 另一方面,URAM提供了专用的级联寄存器,并且同样需要根据时钟频率合理地选择延迟,这会影响级联寄存器的使用。 如下图所示,是4个URAM的级联连接的情况。