BRAM IP核write first/read first/no change模式的区别

无论是用 XPM_MEMORY 还是 IP Core 的方式调用各种类型的 RAM(单端口、简单双端口或真双端口),都会遇到这样一个参数:Write Mode;该参数有三个可选值,分别为 write_first、read_first 和 no_change;那么这三个值到底有什么区别呢?应用场景又如何?

本质上,这个参数是用来解决读写冲突即同时对同一地址进行读写操作时,写入该地址的数据是什么,读出该地址的数据是什么;下面就分别解释一下这三种模式的区别。

一、Write First

首先看 write_first(又称为Read after Write,即先写后读或写优先),相应的读写时序如图 1 所示。不难看出,当写使能 WEA 有效时(高有效),此时读依然有效,故该模式下从地址 bb 和 cc 读出的是新写入的数据 1111 和 2222,也意味着写入地址 bb 和 cc 的数据分别为 1111 和 2222 ;

BRAM IP核write first/read first/no change模式的区别
图 1 write first 模式电路结构及时序图

对于 write first 模式的功能,我们可以用 RTL 代码实现:

always @(posedge elk)
begin
  if (en)
  begin
    if (we)
    begin
      RAM[addr] <= di;
      dout <= di;
    end
    else
      dout <= RAM[addr];
  end
end

可以看到 write_first 由 if else 语句完成,we 有效时写入新数据,同时输出等于输入,无效时输出等于该地址原有数据。

二、Read First

再看 read_first(又称为Read before Write,即先读后写或读优先),相应的读写时序如图 2 所示。此时,从时序图中可以看出读出的是该地址上的原有数据,同时会把新数据写入该地址 ;

BRAM IP核write first/read first/no change模式的区别
图 2 read first 模式电路结构及时序图

对于 read first 模式的功能,我们可以用 RTL 代码实现:

always @(posedge elk)
begin
  if (en)
  begin
    if (we)
    begin
      RAM[addr] <= di;
      dout <= RAM[addr];
    end
  end
end

read_first 由 if 语句完成,写法类似于移位寄存器,这就是为什么写有效时读出的是该地址上的原有数据。

三、No Change

最后我们看看 no_change(No Read on Write,保持模式),相应的读写时序如图 3 所示。可以看出,一旦写操作有效,读操作即无效,此时输出端口保持写操作之前读出的数据不变; 

BRAM IP核write first/read first/no change模式的区别
图 3 no change 模式电路结构及时序图

对于 no change 模式的功能,我们可以用 RTL 代码实现:

always @(posedge elk)
begin
  if (en)
  begin
    if (we)
    begin
      RAM[addr] <= di;
    end
    else
      dout <= RAM[addr];
  end
end

no_change 由 if else 语句完成,dout 在 if 分支上没有被赋值,故保持不变,这是实现 no_change 的关键点。

上述三种模式让很多初学者觉得困惑,其实,根据上面给出的 RTL 代码,可以发现这三种模式并没有那么神秘。甚至,从代码风格的角度而言,实现这三种功能是非常容易的。这也进一步验证了 RTL 代码风格对设计的影响。因此,对于初学者而言,可以多花些时间研究代码风格,很可能会有事半功倍的效果。 

扫码关注尚为网微信公众号

尚为网微信公众号
每天学习电路设计嵌入式系统的专业知识,关注一波,没准就用上了。

原创文章,作者:sunev,如若转载,请注明出处:https://www.sunev.cn/embedded/1225.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022年6月15日 21:20
下一篇 2022年6月20日 20:27

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注