参考资料
摘录
In simple dual-port mode, port A can only write and
port B can only read、
分析
blockram资源有两种:
- RAMB8BWER:
DI(A|B) Data Input Bus 16位(A/B)
DIP(A|B) Data Input Parity Bus 2位(A/B) 校验
ADDR(A|B) Address Bus 13位(A/B)
WE(A|B) Byte-wide Write Enable
EN(A|B) When inactive no data is written to the block RAM and the
output bus remains in its previous state.
RST(A|B) Synchronous Set/Reset the output registers (DO_REG = 1).
CLK(A|B) Clock Input
DO(A|B) Data Output Bus 16位(A/B)
DOP(A|B) Data Output Parity Bus 2位(A/B) 校验
REGCE(A|B) Output Register Clock Enable
作为一个存储空间为8Kb的ram,它的类型(没有校验位)应该为数据[15:0]16bit乘以地址2^9 =16乘以512= 8192bit=8Kbit
也可以是:
数据[31:0]32bit乘以地址2^8 =32乘以256= 8192bit=8Kbit
数据[7:0]8bit乘以地址2^10 =8乘以1024= 8192bit=8Kbit
如果是4位的数据,意味着可以存2048个
参考表格:
举例子:生成一个数据为12位,地址为7位的single port rom:
则数据位是共用的(A端口6位,B端口6位),地址位是独立的(A端口7位[11:5],B端口7位[11:5],我猜它是按照上面256*32来的)
注:没有用完的地址空间一般是空着的,再增加rom逻辑的话,要重新占用一块新的RAMBLOCK了,因此,常常会不够用(MAP出错),抓信号占用的也是RAMBLOCK,如果不能充分利用好这些空间,会导致后期调试定点非常困难
因此,尽量让一个block发挥它尽量多的作用,比如coe文件的地址空间里分段放不同功能的数据,调用的时候通过逻辑控制地址起点进而控制其读出的数
从图中也可以看出A端口和B端口是对称的;
注:BLOCKRAM的调用是一定会用到时钟的,这是与分布式RAM(直接进地址,查找对应数据)(本质是LUT,对应底层资源为SLICEM)不同的地方,在逻辑资源很宽松,BLOCKRAM资源很紧张,又需要抓很多位信号的时候可以考虑用分布式资源生成存储空间(还没有搞过,ip核设置的时候有一个选项可以二选一),有时候好像也会减小延迟,因为前者是固定位置的,与需求的逻辑所在位置可能很远
参考:博主转载的分布式与块RAM的区别 (7系列) - RAMB16BWER:
DI(A|B) Data Input Bus 32位(A/B)
DIP(A|B) Data Input Parity Bus 4位(A/B) 校验
ADDR(A|B) Address Bus 14位(A/B)
WE(A|B) Byte-wide Write Enable
EN(A|B) When inactive no data is written to the block RAM and the
output bus remains in its previous state.
RST(A|B) Synchronous Set/Reset the output registers (DO_REG = 1).
CLK(A|B) Clock Input
DO(A|B) Data Output Bus 32位(A/B)
DOP(A|B) Data Output Parity Bus 4位(A/B) 校验
REGCE(A|B) Output Register Clock Enable