3)真正双端口RAM模式
真正双端口RAM模型如图4-124所示,图中上边的端口A和下边的端口B都支持读写操作,WEA、WEB信号为高时进行写操作,低为读操作。同时它支持两个端口读写操作的任何组合:两个同时读操作、两个端口同时写操作或者在两个不同的时钟下一个端口执行写操作,另一个端口执行读操作。
图4-124 Xilinx真正双端口块RAM的示意模型 真正双端口RAM模式在很多应用中可以增加存储带宽。例如,在包含嵌入式处理器MiroBlaze和DMA控制器系统中,采用真正双端口RAM模式会很方便;相反,如果在这样的一个系统中,采用简单双端口RAM模式,当处理器和DMA控制器同时访问RAM时,就会出现问题。真正双端口RAM模式支持处理器和DMA控制器同时访问,这个特性避免了采用仲裁的麻烦,同时极大地提高了系统的带宽。
一般来讲,在单个块RAM实现的真正双端口RAM模式中,能达到的最宽数据位为36比特*512,但可以采用级联多个块RAM的方式实现更宽数据位的双端口RAM。当两个端口同时向同一个地址单元写入数据时,写冲突将会发生,这样存入该地址单元的信息将是未知的。要实现有效地向同一个地址单元写入数据,A 端口和B端口时钟上升沿的到来之间必须满足一个最小写周期时间间隔。因为在写时钟的下降沿,数据被写入块RAM中,所以A端口时钟的上升沿要比B端口时钟的上升沿晚到来1/2个最小写时钟周期,如果不满足这个时间要求,则存入此地址单元的数据无效。
4)ROM模式
块RAM还可以配置成ROM,可以使用存储器初始化文件(.coe)对ROM进行初始化,在上电后使其内部的内容保持不变,即实现了ROM功能。
5)FIFO模式
FIFO即先入先出,其模型如图4-125所示。在FIFO具体实现时,数据存储的部分是采用简单双端口模式操作的,一个端口只写数据而另一个端口只读数据,另外在RAM(块RAM和分布式RAM)周围加一些控制电路来输出指示信息。FIFO最重要的特征是具备“满(FULL)”和“空(EMPTY)”的指示信号,当FULL信号有效时(一般为高电平),就不能再往FIFO中写入数据,否则会造成数据丢失;当EMPTY信号有效时(一般为高电平),就不能再从FIFO中读取数据,此时输出端口处于高阻态。
图4-125 Xilinx FIFO模块的示意模型 2.块RAM IP Core的使用
块RAM已在本书第3章有过介绍,这里就不再赘述。
3.ROM存储器IP Core的使用
对于ROM模块,主要是生成相应的.coe文件。下面以一个实例介绍如何借助MATLAB生成ROM的.coe文件。
例4-8 生成定点正余弦波形数值,形成.coe文件并加载到块ROM中。
整体过程主要分为下面的3步。
首先,利用MATLAB计算出正余弦波形的浮点值,并量化16比特的定点波形数值:
x= linspace(0,6.28,1024); //在区间[0,6.28]之间等间隔地取1024个点
y1=cos(x); //计算相应的正余弦值
y2=sin(x);
//由于正余弦波形的值在[0,1]之间,需要量化成16比特,先将数值放大
y1=y1*32678;
y2=y2*32768;
//再将放大的浮点值量化,并写到存放在C盘的文本中
fid = fopen('c:/cos_coe.txt', 'wt');
fprintf(fid, '%16.0f\n', y1); //在写文件的时候量化成16比特
fclose(fid)
fid = fopen('c:/sin_coe.txt', 'wt');
fprintf(fid, '%16.0f\n', y2);
fclose(fid)
其次,生成coe文件。在C盘根目录下,将cos_coe.txt和sin_coe.txt的后缀改成.coe,打开文件,把每一行之间的空格用文本的替换功能换成逗号“,”,并在最后一行添加一个分号“;”。最后在文件的最开始添加下面两行:
memory_initialization_radix=10;
memory_initialization_vector =
然后保存文件退出。
最后,将coe文件加载到BLOCKROM所生成的ROM中。新建一个BLOCKRAM的IP core,其位置为“Memories & Storage Elements RAMs & ROMS Block Memory Generator v2.4”,在第一页选择single port rom,在第二页选择位宽为16、深度为1024,在第三页下载coe文件,如图4-126所示,然后双击“Finish”,完成IP core的生成。如果coe文件生成的不对,图中用椭圆标志之处是红色的,coe文件错误的类型主要有数据基数不对和数据的长度不对这两类。
图4-126 块ROM加载coe文件的用户配置界面 |