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