RAM模式:双口RAM
1.条件:单一时钟,输入位宽:8,输出位宽:32;
图1.1 仿真总体波形图
图1.2 8位写入32位读出
图1.3和图1.4 从wren为0之后读出的数据才不会产生读出数据不定或者出错的情况
仿真出的一些注意点:
(1)如上图1.2,当8位写入,32位读出时,从ram中读出的数据的顺序跟ram中存入的数据的顺序是相反的。例如,在ram中的地址0,1,2,3中的存入的内容是2a,2b,2c,2d,则在读出时从地址0中读出的内容是2d2c2b2a;
(2)如上图1.3、图1.4,当从ram中读出数据时,在无其他限定条件的情况下,读取地址会与写入地址一起产生,但实际q的输出得滞后一个总长度的读取地址的时间延迟之后才开始按地址读取并输出ram中存的数据,但在wren使能的情况下,即使有读取地址产生,此时读出的数据仍然是会产生不确定的错误的,只有在wren为0之后,重新从地址0开始读取出的数据才是稳定可靠的。(注:至于这种情况发生的原因,可能因为读和写共用同一时钟,所以,在写数据时读出的话,发生了争用的情况,不过这只是猜想,有待验证)
2.条件:读、写时钟分开(读时钟是写时钟的1/2分频),输入位宽:8,输出位宽:32;
图2.1 总体仿真时序图
图2.2 在wren有效时,从ram中读出的q数据会出错,特别是在最后一个读出地址处
综上所述,如果要使用简单双口ram ip(即一写入端口一读出端口),无论是在单时钟,还是在读写分别为独立时钟的情况下,进行数据读取,都必须要放在wren为0之后才开始读取才稳妥,否则,读出的数据可能就是出错的数据,而非自己预期想要的数据。