首先我们需要了解BRAM的相关知识,可以参考下面两篇文章:
Xinlinx FPGA内的存储器BRAM全解-CSDN博客
为何有时简单双口RAM是真双口RAM资源的一半-CSDN博客
本问题的背景是:
每个36Kb块RAM也可以配置成深度×宽度为64K × 1(当与相邻的36KB块RAM级联时)、32K × 1、16K × 2、8K × 4、4K × 9、2K × 18、1K × 36或512 × 72的简单双端口模式。
每个18Kb块RAM可以配置成深度×宽度为16K × 1、8K × 2、4K × 4、2K × 9、1K × 18或512 × 36的简单双端口模式。
一、RAMB36E1结构
首先看下RAMB36E1结构:
对其中部分信号给出下面的说明:
信号名 | 描述 |
---|---|
DIADI[31:0] | 端口A数据输入 |
DIPADIP[3:0] | 端口A奇偶校验输入 |
DIBDI[31:0] | 端口B数据输入 |
DIPBDIP[3:0] | 端口B奇偶校验输入 |
ADDRARDADDR [15:0] | A通道地址 |
ADDRBRDADDR [15:0] | B通道地址 |
WEA[3:0] | 端口A字节写使能,简单双端口RAM中不启用 |
WEBWE[7:0] | 端口B字节写使能,简单双端口RAM中启用 |
二、原因分析
地址总线选择要读或写的存储单元。在SDP(单端口)模式下,ADDRA端口为RDADDR,** ADDRB端口为WRADDR**。接口的数据位宽度决定了单个RAMB18E1或RAMB36E1所需的地址总线宽度。
我们以RAMB36E1举例:
对于36Kb的RAM,之所以会造成配置成32K × 1、16K × 2、8K × 4不满足36Kb的情况,是因为地址总线和位宽决定了这一关系。
36Kb如果以1bit位宽配置,那么深度为36K,而2的16次方为65536,2的15次方为32768,36K处于其中,因此Xinlinx选择采用15bit位宽的地址,也就是地址深度为32768=32K。我们反向推算一下:如果将36Kb的容量配置到深度为32768的RAM中,每个地址对应的数据位宽为36k/32768=1.125,因此舍弃掉后面的0.125,只保留了1bit。
而36K/16384=2.25,36K/8192=4.5,36K/4096=9,知道地址宽度为12,深度为4096时才使得所有空间被完全利用。这也就是为什么在位宽为9之前的三种情况里会出现不满足36Kb的情况。
但是感觉也可以在位宽为1bit的时候,将数据配置满整个RAMB36E1,只是地址不以2的15次方为截至地址,可能Xinlinx这样做有别的什么原因。