例化5种RAM IP core
(1)单端口RAM Single-port RAM
RAM参数设置如上图所示,输入输出位宽都为8位,深度为16,采用一级输出寄存器,读写模式为no-change,用COE文件对RAM进行初始化,关于COE文件的制作,前面的帖子有专门提及,这里不再赘述;
可以看出输出延时为2个周期,在wea有效时读操作挂起,写操作运行,即在同一时刻只能对一个地址进行写操作或者读操作!
改为write-first模式:
此时读和写操作可以同时进行,且是对同一地址进行操作,读出的数总是该地址最新写入的数据而不是原来就存在的!
改为read-first模式:
此时可以看出读取的是该地址原来存在的数,并将当前的输入数据存入该地址 !
增加核输出寄存器的情况:
可以看出,输出增加了一级延时;
验证复位的优先级,设置复位时的默认数据为FF,首先设置SR复位优先,行为级仿真如下所示:
设置CE复位优先的情况:
好像并没有看出有什么区别,这个地方还没弄明白!!
设置不同的输入输出位宽比,写入位宽为8,读取位宽为4,操作模式为write-first,这里其实存在一个问题,写地址和读地址共用一根地址线,但是读写地址所用到的地址线位宽不同,这好像会存在问题?行为级仿真如下:
当wea=0时,读取COE文件中的初始数据,低位在低地址,高位在高地址;
当wea使能时,由于是write-first模式,读出刚写入的数据,可以注意到写入b5用了两个周期同时占用了两个地址20和21,因为每个地址只有4位,先写入5再写入b,这导致b6并没有写入,而是直接写入了b7、b9 ;这样理解好像存在问题?继续看下面
改成read-first模式,行为级仿真如下所示:
改成no-change模式,行为级仿真如下所示:
比较上面两图可知,在写操作时,只用到了地址线的两位,而且是高两位,最低位为任意,所以对于上图1所示的地址7和6,这两个地址对于写地址来说都是3,所以进行了覆盖写入即写入的都是1235;但是对于读地址来说这两个地址分别对应1个4位数据的地址,故读出的分别是35和12;
(2)单端口ROM Single-port ROM
对于ROM,读写模式只能是write-first ,ROM参数设置如上图所示,输入输出位宽都为8位,深度为16,采用一级输出寄存器;
可以看出,输出延时为2;
加上使能信号ena,行为级仿真如上图所示;
(3)双端口ROM Dual-port ROM
COE文件初始化ROM,位宽为8位,深度为16,portA的读位宽为8,portB的读位宽为4,行为级仿真如下:
(4)简单双端口RAM Simple Dual-port RAM
portA的参数设置如上图所示,操作模式为no-change,由于是写入端口,无法选择输出寄存器也无法复位,写入深度为16,宽度为8;
portB的参数设置如上图所示,操作模式只能是write-first,可以设置输出寄存器核复位,读位宽为8,深度为16;
读写采用不同的时钟,在wea使能时portA开始写入,行为级仿真如上图所示;
将portA改为write-first模式,效果似乎没变如上图所示;
将portA改为read-first模式,效果似乎也没变如上图所示;
读写时钟换成同一个,造成读写地址冲突,由于portB的操作是write-first,所以写入的数据总是最先读出;
(5)真双端口RAM Dual-port RAM
portA读写位宽都为8,深度为16,操作模式为no-change;
portB的写入位宽为8,读取位宽为4,深度分别为16和32,操作模式为write-first;
行为级仿真如上图,由于portA为no-change模式,所以在wea使能时,就只能进行写入,故输出为00;同时,由于portB写入位宽为8,读取位宽为4,地址码位宽为5,这里涉及到一个问题,读地址和写地址的位宽应该是不同的,这不会存在问题吗??真双端口RAM其实就是两个单端口RAM,只不过这两个单端口共用一块存储RAM!!
将portA改成write-first模式,行为级仿真如下: