1、Primitives Output Registers读操作注意事项
在使用BRAM IP核时我们会发现有一个选项位Primitives Output Registers:
勾选它时需要注意的事项:
在锁存模式下,读操作使用一个时钟边。读地址在读端口上寄存,存储的数据在RAM访问时间之后加载到输出锁存器中。当使用输出寄存器时,读取操作需要一个额外的延迟周期。可以参考下面这篇文章,是一年多以前遇到的双口RAM数据丢失问题,当时给出了自己的猜想,没想到在这时候完成了闭环。
双口RAM输出数据丢失问题_双口ram读取不到最后一个数据-****博客
2.三种写数据模式
当端口向某一个地址写数据,此时这个地址下RAM的数据输出DOUT的结果会是新写的数据还是原来的数据呢?这就和端口的写模式有关系了。
(1)Write_First
写优先模式下,写入数据的将数据写入内存,并将数据传递到输出中。即读出的数据会是新写的数据,时序图如下:
可以发现,当向地址bb写入1111时,RAM在地址bb下的输出也会变为1111.
(2)Read_First
读优先模式下,输出会是原有的数据,时序图如下:
输出的内容是old mem(bb),即bb地址下的旧数据。
(3)No_change
No_change模式下,输出锁存器在写操作期间保持不变。
我们可以发现当检测到写使能为高时,输出一直保持MEM(aa)不变,直到检测到写使能为低,才会输出当前地址的数据,这种模式使用的功耗最低。
3.读写冲突
对于双端口RAM而言,当一个端口写另一个端口读时会存在读写冲突的可能,对于真双口RAM而言当两个端口同时写时还会出现写-写冲突的可能。
我们以读写时钟是否同步来分析:
(1)读写时钟同步
-
对于真双口RAM规定
两个端口不能同时写
两个端口可以同时读
可以一读一写
-
对于简单双口RAM无规定
(2)读写时钟异步
-
对于真双口RAM规定
两个端口不能同时写
两个端口可以同时读
不能一写一读
-
对于简单双口RAM
不能一写一读,读写需要分开