三种write mode,你真的理解吗?

无论是用xpm_memory还是ip core的方式调用各种类型的ram(单端口、简单双端口或真双端口),都会遇到这样一个参数:write mode。该参数有三个可选值,分别为write_first、read_first和no_change。那么这三个值到底有什么区别呢?应用场景又如何?本质上,这个参数是用来解决读写冲突即同时对同一地址进行读写操作时,写入该地址的数据是什么,读出该地址的数据是什么。
write_first
首先看write_first(又称为read after write,即先写后读或写优先),如图1所示,相应的读写时序如图2所示。不难看出,当写使能wea有效时(高有效),此时读依然有效,故该模式下从地址bb和cc读出的是新写入的数据1111和2222,也意味着写入地址bb和cc的数据分别为1111和2222。
图1
图2
read_first
再看read_first(又称为read before write,即先读后写或读优先),如图3所示,相应的读写时序如图4所示。此时,从时序图中可以看出读出的是该地址上的原有数据,同时会把新数据写入该地址。
图3
图4
no_change
最后我们看看no_change(no read on write,保持模式),如图5所示,相应的读写时序如图6所示。可以看出,一旦写操作有效,读操作即无效,此时输出端口保持写操作之前读出的数据不变。
图5
图6
三种模式让很多初学者觉得困惑。实际上,这并没有什么神秘感,我们可以通过rtl代码实现这三种功能,如图7~图9所示。可以看到write_first由if else语句完成,we有效时写入新数据,同时输出等于输入,无效时输出等于该地址原有数据。read_first由if语句完成,写法类似于移位寄存器,这就是为什么写有效时读出的是该地址上的原有数据。no_change由if else语句完成,dout在if分支上没有被赋值,故保持不变,这是实现no_change的关键点。
write_fisrt verilog代码:
图7
read_fisrt verilog代码:
图8
no_change verilog代码:
图9
从代码风格的角度而言,实现这三种功能是非常容易的。这也进一步验证了rtl代码风格对设计的影响。因此,对于初学者而言,可以多花些时间研究代码风格,很可能会有事半功倍的效果。
思考一下:
对于一个单端口ram,采用rtl代码描述,如何在同一个模块中实现如下功能:
(1)宽度可配置
(2)深度可配置
(3)写模式可配置

基于LINUX的嵌入式浏览器的设计与实现
华为史上最好看手机今天发布 叫板iPhone7
带鱼屏+升降镜头?颜值超高,但看到处理器?再见?
适用于传输少量数据的蓝牙低能耗技术
IBM助力客户斩获多项IDC中国未来企业大奖
三种write mode,你真的理解吗?
欧胜推出业界首款四核高清音频处理器SoC
全面屏小米6C强势来袭,将搭载澎湃处理器或年底前发布
苹果13有银色吗 苹果13都有哪些颜色
努比亚Z17、一加5区别对比评测:努比亚Z17线上全平台开售,跟一加5相比谁更值得入手?
主动红外入侵探测器的安装环境_主动红外探测器的安装注意事项
联通上线5G升级包 9.9元即可畅享5G流量
嵌入式状态监测与故障诊断装置设计
智能硬件创新设计行业走势及战略布局
基于LINUX的嵌入式浏览器的设计与实现
华为史上最好看手机今天发布 叫板iPhone7
带鱼屏+升降镜头?颜值超高,但看到处理器?再见?
适用于传输少量数据的蓝牙低能耗技术
IBM助力客户斩获多项IDC中国未来企业大奖
三种write mode,你真的理解吗?