单片DDR3实现乒乓操作的方案

关于单片DDR3实现乒乓操作的方案设计

最近在实验室探索这个问题,对于某些项目设计中,在数据处理部分需要存储数据,如果用Block RAM资源,则会占用极多的RAM资源或者全部的Block RAM资源也不足以存放一批数据,这时就需要外挂DDR3存储器。

对于常见的DDR3乒乓处理,是用两组DDR3,两套指令控制线进行乒乓操作,这样的话程序部分也便于编写。但是多一组DDR3,布线将会增加难度,引脚的使用也会增加数量。一般来讲,DDR3的存储空间比较大,本文通过将一组DDR3的存储空间分为a,b两部分,对这两部分的控制进行数据的乒乓读写。
单片DDR3实现乒乓操作的方案
用户需要提供一下几个信号给DDR3控制逻辑:
data_in : 需要存储的数据。
data_valid : 需要存储的数据对应的valid,高为有效。
wr_mode_a : 为1表示写a空间。
rd_ mode_a : 为1表示读a空间。
wr_mode_b : 为1表示写b空间。
rd_mode_b : 为1表示读b空间。
rd_en :为1则DDR3读数据,设置这个信号时因为DDR3的速率太快,读出来处 理不过来,当rd_en为1时才读数据。
dout : DDR3读出并转换时钟域后的数据。
dout_valid : dout对应的数据valid。

单片DDR3实现乒乓操作的方案这是a,b两个空间的乒乓读写时序。

写数据:本文中,数据是240M×64bit,DDR3写数据接口是100M×512bit。DDR3的速率远高于数据来源的速率。有效的数据送进写FIFO中,FIFO选择一个合适的prog_full,当prog_full为1时,开始读出FIFO的数据送进DDR3,并且一批data_in全部写进FIFO时,FIFO中的数据也能紧接着读完。

读数据:当rd_mode_a为1时,读a空间的数据;当rd_mode_b为1时,读b空间的数据。由上图可以看到,rd_mode_a为1时,wr_mode_b也为1,但是只有一套地址命令线,所以使写数据优先于读数据,不写的时候读数据。

仿真图如下:
单片DDR3实现乒乓操作的方案

第一阶段:

此时wr_mode_a = 1, rd_mode_a = 0, wr_mode_ b = 0, rd_mode_b = 0;
需要进行的操作是写数据进a空间。din_data和din_valid是输入数据,由上图可知,输入数据写进FIFO,当写入一部分数据后开始读出数据并送到DDR3的a空间中,由于DDR3的速率远高于输入数据写进FIFO的速率,所以当一批输入数据全部写完,间隔较短的时间,能全部读出送进DDR3的a空间。

第二阶段:

此时wr_mode_a = 0,rd_mode_a = 1, wr_mode_ b = 1, rd_mode_b = 0;
需要进行的操作是写数据进b空间中,并读出a空间的数据。
由第一阶段的操作得知,输入数据需要写入到FIFO中一定的深度,才开始从FIFO中读送到DDR3,所以在开始rd_mode_a上升沿的时候,先从a空间中读出数据,等到FIFO读数据送进DDR3的b空间时,则停止从a空间读数据,直到FIFO中全部的数据都写进b空间时,再接着从a空间读数据。

第三阶段:

此时wr_mode_a = 1,rd_mode_a = 0, wr_mode_ b = 0, rd_mode_b = 1; 需要进行的操作是写数据进a空间中,并读出b空间的数据。

第四阶段:与第二阶段相反。

这样利用单片DDR3就能实现乒乓操作了,可以节省不少资源。