vivado中bram的种类与使用

vivado中bram的分类

在vivado中打开IP catalog,在其中搜索“block memory”即可找到bram的相关IP。bram共有以下几类:
在这里插入图片描述
前三项分别是:单端口ram、简化版双端口ram和真正的双端口ram。

那么我们分别例化看一下它们的工作时序。

单端口ram

初始化

vivado给出了一种比较方便的给ram赋初值的方式:通过load一个.coe文件给ram赋初值,我在这里使用的.coe文件内容如下:
在这里插入图片描述
文件里一共存储了16个16位的16进制数,所以在设置IP的时候将位宽(每个位置多少位)和深度(一共有多少个位置)都设置成16。

工作时序

单端口ram的工作时序如下图所示:

在这里插入图片描述
对于某一个周期读到的地址,在下一个周期将该地址所存储的数据通过output口输出出来。由于单端口ram只有一个端口,这个端口既要负责读数,还要负责写数,因此用WEA信号(write enable A)来做区分,当WEA=0时,只读不写,在下一个周期将地址对应的数输出;当WEA=1时,执行的操作将是把DinA的内容写入地址对应的地方,但是本次输出依然是该地址原来的值(不过从此就被DinA的内容替换掉了)。

仿真验证

写一个testbench来验证一下,仿真波形如下:
在这里插入图片描述
其中addr就从0到F一直遍历,WEA一直为1,所以第一次遍历时虽然已经将16’h4399写到了每一个角落,但是读的时候依然是各个位置原来的值,第二次再遍历的时候读到的才是16’h4399。

简化的双端口RAM

初始化

同单端口RAM的初始化,这里连用的.coe文件都是一样的。

端口定义

该IP的端口定义如下图所示:
在这里插入图片描述
可见这种RAM有A和B两个端口,A口负责写,B口负责读,两个端口各自有各自的clk,addr和enable。A口多了一个wea作为写使能、一个dina作为写数据的输入,B口多了一个doutb作为读数据的输出。值得注意的是,和单端口RAM有一个明显的区别,改写某地址的数据时,RAM的输出不是该地址的原来的数据,而是写入的数据。这一点会在后面的仿真中得到验证。

仿真结果

仿真结果如下所示:
在这里插入图片描述
第一次遍历地址时,WEA信号为0,RAM只读不写,output输出的就是RAM里存储的内容。第二次遍历地址时,WEA信号为1,从此output输出的就不再是RAM原有的内容,而是即将写入的内容,这也是单端口RAM和简易双端口RAM的区别。

双端口RAM

初始化

同单端口RAM的初始化,这里连用的.coe文件都是一样的。

端口定义

该IP的端口定义如下图所示:
在这里插入图片描述
如上图所示是真正的双端口bram的IP端口定义。两个端口各自有clk信号、addr信号、端口使能、写使能、写数输入、读数输出。也就是说两个端口都能读数、都能写数。那么就依次仿真它的各种功能。

功能仿真

单端口读数

先仿真单端口读数,分别将enB和enA置为0,仅让一个端口发挥作用。
在这里插入图片描述
在这里插入图片描述
这和单端口RAM读数是一样的,没被使能的端口输出0,使能的端口读出RAM所存储的内容。

双端口读数

将addrb设置成addra的下一个数,可以利用双端口同时读两个数。
在这里插入图片描述

双端口一读一写

首先令读写操作的地址不同,接着上边的addrb比addra多1的设定,让B口读,A口写。这样第一次遍历将读到RAM存储的原值,第二次遍历将读到A写入的值,我令A口写入16位的16进制数16’h4399,下面用仿真来验证猜想。
在这里插入图片描述
观察B端口的输出,猜想得到证实。观察A端口的输出可以得到另一个结论,当某端口的写使能激活时,该端口的输出是写入的数据。下面仿真一下双端口读写操作同一地址会怎样。
在这里插入图片描述
在这里插入图片描述
由仿真波形可知,A口写B口读并且读写地址为同一地址时,B口无法读到RAM原有的值,而是输出即将写的内容(也就是A口的写输入,在本例中是16’h4399);但A口读B口写则不同,A口依然能读出RAM原有的值,而在第二次遍历时才输出B口写入的值,即16’h2200(当然B口的输出一直是16’h2200),因此猜想A口和B口并不是完全一致的端口,这个猜想有待参考文档来证实。

双端口写数据

在这里插入图片描述
如图所示,在写阶段双端口均写入数据,A口将所有偶地址写入16’h4399,B口将所有奇地址写入16’h2200。后面的读数据读出的结果是16’h4399和16’h2200交替,证实了这一点。双端口可以同时写,大大提高了数据传输效率。那么如果双端口同时写一个地址会发生什么呢?下面用仿真来验证。
在这里插入图片描述
如图,在写数阶段,A口和B口输出各自的写输入,即分别是16’h4399和16’h2200,但是不可能两个数写入同一个地址因为根本写不下。从读阶段的波形可以看出,写进去的是16’h2200,也就是B口的内容。从仿真得出的结论是:A口和B口对同一地址进行写操作时,写入的是B口的数据。但仿真未必是连板时真实发生的,所以连板实验时未必如此。

  • 18
    点赞
  • 115
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值