前言

文章会讲 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的使用打下基础。

如果这篇文章对你有帮助,请一键三连!

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐