当我们调用RAMO的IP时,无论是单端口还是双端口模式,都会有个选项:
可能很多人都没注意过这个选项,记得毕业季去华为面试的时候,还问过我这个问题,当时也是没答上来。后来也发现很多面试官都喜欢问这个问题,今天我们就来讲一下。
在讲这三种模式具体的区别前,我们先把RAM
的接口说一下,对于单端口RAM
,有6个端口:
- clka: 时钟输入端口
- addra: 地址输入端口
- dina: 数据输出端口
- douta: 输出输出端口
- ena: RAM使能,高有效
- wea: 写使能,高有效
这三个选项是用来解决读写冲突时使用的,什么是读写冲突?就是对同一地址进行了读写。首先来回顾一下RAM最常被使用的方式,当需要写入数据时,将wea
拉高,并给出地址和数据;当需要读数据时,将wea
拉低,在地址的下一个周期输出数据。我们都知道,douta
端口受addra
的控制,它会输出对应地址的数据。那么问题就来了,当写数据的时候,此时douta
输出的,是当前地址刚刚写入的数据,还是写入前的数据,或者直接不输出?
- Write First Mode:
写优先模式,在该模式下,写使能有效时,当前时钟下写入的数据,在下一个时钟就会出现在douta
端口上。下图中,在时刻1时,将数据1111
写入RAM中,默认douta
的数据比地址晚一个周期,因此在时刻2时,1111
便会出现在douta
上。
- Read First Mode:
读优先模式,在该模式下,写使能有效时,当前时钟下写入的数据,不会在下一个时钟就会出现在douta
端口上。
下图中,假如地址aa
上的数据是0xaa
,地址bb
上的数据是0xbb
,地址cc
上的数据是0xcc
,在时刻1将数据1111
写入到RAM中,但在下一个时钟周期即时刻2时,RAM的输出douta
输出的是RAM原来的数据0xbb
,而不是上一个时刻写入的1111
.
- No Change Mode:
写优先模式,在该模式下,写使能有效时,输出数据端口douta
一直保持不变,不会根据地址的变化而变化。
没有回复内容