| |
程序设计过程中常用到缓存,利用 IP core生成ram 或自己动手编写ram 进行仿真就具有着非常重要的地位,以下几点需要注意。
1.实时缓存既可用两个ram进行乒乓操作,也可以利用bolck ram 或distributed ram生成tual dual ports ram(真双端口ram),A口只进B口只出,同样可以达到实时缓存的效果。
2.在用真双端口RAM进行实时缓存时,必须使读数据地址慢于写数据地址两个或两个以上的同期,即同一个地址上写两个或两个以上时钟之后再读,否刚造成地址冲突时钟之后的所有时钟都将出现读写数据错误,以下两图将说明该情况:
图1 读与写的地址相差两个周期以内写不进,读不出数据
图2 相差两个以上写和读就没有问题
3.在仿真的时候对ram读地址的激励不同会造成不同的仿真结果(写地址激励不同不会造成影响,原因见后文),如果读地址寄存器是在设计程序(非仿真程序)中变化,当然是非阻塞赋值,那么仿真读出数据将会滞后于读地址的变化一个时钟,而若读地址在仿真程序(test bench)中变化的话,当然是阻塞赋值,仿真读出的数据是随地址立即变化的,不存在滞后。图2和图3分别代表
图3 相对于图2,读出的数据滞后一个时钟
4.对于上述访问地址在设计程序中非阻塞赋值的情况,为什么读出数据出滞后而写入数据时没有滞后呢?这是因为写入的数据可以持续一个时钟周期,这样它足可以等到地址左式更新后把数据赋给相应的地址。而对于读数据时ram检测到地址后左式再更新,ram检测到的地址是左式更新前的值,而下一个时钟ram检测到的地址才是本次要读出数据的地址,故读出数据要滞后一个时钟。
对于图1,2,3,第一行,第三行分别为写地址和读地址。第二行和第四行分别为写入的数据和读出的数据。