vivado 学习(3.2)--RAM(单口、简单双口、真双口,统行)
文章摘要 本文详细对比了三种RAM(单口RAM、简单双口RAM、真双口RAM)的IP核配置与仿真结果。单口RAM采用写优先模式,读写冲突时优先写入;简单双口RAM的复位信号仅影响输出数据而非存储内容;真双口RAM在nochange模式下读写冲突时暂停操作。最后提出统一化方案:通过参数化配置真双口RAM来模拟单口和简单双口RAM的功能,只需对未使用端口进行适当处理(输入置零/输出悬空)。所有仿真验证
文章目录
前言
文章会讲 3种RAM(单口、简单双口、真双口),最后会描述怎么只用一个ram,通过修改参数的方式统行前面的三种ram。
一、单口RAM
1.1 IP核配置
在3.1的写rom的时候说过ip是哪一个了,就不贴图了。


1.2 代码设计
1.3仿真结果

ip核配置里我选了写优先,地址的配置为 addra = (wr_en ? wr_cnt : rd_cnt);
可以看到,读写使能同时拉高的情况下由于设置了写优先,因此,这里的地址继续跟着wr_cnt增加,直到写使能拉低,读使能仍然高的时候,地址才会跟着写计数器走,如下图。

写使能拉低的这个周期,地址立刻变成了读计数器的值(并没有打一拍,因为上面写的地址逻辑是组合逻辑)反观douta 的值,可以清晰的看到,由于是时序逻辑,写使能拉低后的下一拍,douta的数据才能从addra中读一个数出来。如下图

读到最后一个数,结束。
二、简单双口RAM
支持边读边写;一写多读。但读端口只能读,写端口只能写。
2.1 IP核配置
主要展示ram ip核的复位效果,直接给出结论:需要复位的时候,勾选复位信号是没有用的,他只能将doutb在复位期间的信号清除,而不能将ram中的数据清除。
正确的复位是,把所有地址都写入0。



2.2 代码设计
2.3 仿真结果

可以看到,咋rstb拉高一个周期后,下一个周期的doutb数据清零了,也就是说,勾选的复位的作用仅仅是用来使读出数据复位,并不改变ram内的数据。
值得一提的是,一般使用复位时,我们最好保持三个周期以上。
三、真双口RAM
AB两个端口,都可以读和写。
两个单口ram的“拼接”,这里有个需要注意的点是,addra和addrb这两个端口的地址是共用同一片存储的。
以512位宽举例,addra用了256,addrb赋值时+256即可。
3.1 ip核配置
这次我设置的是no change 模式,对比上面的写优先模式,可以对比一下波形的变化。
给出结论,nochange 模式在读写冲突时,不读也不写,直到不冲突时才开始读,读的位置就是当前位置,冲突的时间段内的数据不读。


3.2 代码设计
3.3 仿真结果

可以很清晰的看到,波形符合我们给出的结论:nochange 模式在读写冲突时,不读也不写,直到不冲突时才开始读,读的位置就是当前位置,冲突的时间段内的数据不读
再看一下全局试图,两个端口波形都正常。

四、统行RAM
意义是,以后调用ram的时候我们都只用选择真双口ram,通过修改例化时候的参数来实现单口和简单双口ram。
特别需要说明的是,在例化的时候,不用的输入必须要给值,但输出可以悬空。
利用这点,我们对真双口ram的例化进行配置来获得单口和简单双口ram。
4.1 单口配置

b端口的输入全部置零,输出浮空。
4.2 简单双口

a端口的读浮空,b端口的使能和写入都置零即可。
总结
本文主要讲了,多种ram的各自配置和简单仿真,所有仿真仅仅为了显示我们配置的效果,为后面ram的使用打下基础。
如果这篇文章对你有帮助,请一键三连!
更多推荐
所有评论(0)