一种高带宽下提高DDRRAM接口带宽的FPGA实现方法与流程

文档序号:11386874阅读:625来源:国知局
一种高带宽下提高DDR RAM接口带宽的FPGA实现方法与流程

本发明涉及通信技术领域,具体的说,是一种高带宽下提高ddrram接口带宽的fpga实现方法。



背景技术:

fpga(field-programmablegatearray),即现场可编程门阵列,它是在pal、gal、cpld等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(asic)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。fpga是由存放在片内ram中的程序来设置其工作状态的,因此,工作时需要对片内的ram进行编程。用户可以根据不同的配置模式,采用不同的编程方式。加电时,fpga芯片将eprom中数据读入片内编程ram中,配置完成后,fpga进入工作状态。掉电后,fpga恢复成白片,内部逻辑关系消失,因此,fpga能够反复使用。fpga的编程无须专用的fpga编程器,只须用通用的eprom、prom编程器即可。当需要修改fpga功能时,只需换一片eprom即可。这样,同一片fpga,不同的编程数据,可以产生不同的电路功能。因此,fpga的使用非常灵活。fpga与外部存储器建立数据通道,可以方便灵活的利用软件程序编程实现对数据的处理,但是由于目前的fpga和外部ddrram(ddr2/ddr3等等)建立数据通道时,fpga的ddr控制器ip只能管理一个ddr,因此只能一组或多组数据经过调度存储于同一个ddr内,当数据突发带宽超过单个ddr的有效带宽时,就会造成数据丢失。因此如何与外部存储器建立快速高效的数据传输通道,在高带宽下提高ddrram的接口带宽,成为fpga急需解决的难题。



技术实现要素:

本发明的目的在于提供一种高带宽下提高ddrram接口带宽的fpga实现方法,用于解决现有技术中,fpga的ddr控制器ip只能管理和调度存储于同一个ddrram一组或多组数据,当数据突发带宽超过单个ddr的有效带宽时,就会造成数据丢失的问题。

为了达到上述目的,本发明通过下述技术方案实现:

一种高带宽下提高ddrram接口带宽的fpga实现方法,包括以下步骤:

1)根据输入数据的位宽,计算需要并行级联的ddrram数量x:当输入数据的位宽为m比特,单个ddrmig的数据位宽为n比特,其中m>n,ddr的数量x的计算方法为:

m/n可以整除,x=m/n;

m/n不可以整除,x=m/n+1;

2)采用fpga设计用于提高ddrram的接口带宽的mcontroller,包括:

2.1)生成刷新zq模块generaterefreshzq,用于多个ddrram之间周期刷新和zq同步;

2.2)生成写命令模块generatewritecommand,生成ddrram写命令,用于对x个ddrram并行级联的写地址统一管理;

2.3)生成读命令模块generatereadcommand,生成ddrram读命令,用于对x个ddr并行级联的读地址统一管理;

2.4)读同步判断模块readsynchronousjudge,用来同步对齐x个ddrram返回的x组数据,对齐后组合成一组数据输出。

当与fpga通信的外部存储器输入的数据的位宽,高于单个ddrmig的位宽时,需要并行级联多个ddrram来建立高速的数据传输通道时,计算出需要并行级联的ddrram的数量x,并将x个ddrram并行级联。对fpga的ram进行软件编程实现mcontroller,用于提高并行级联ddrram的接口带宽,mcontroller包括生成刷新zq模块、生成写命令模块、生成读命令模块和读同步判断模块,其中生成刷新zq模块:用于周期性生成自刷新请求信号和zq校准请求信号,所有ddrmig接收相同的请求信号,保证每个ddrram刷新和校准路径延迟相同;生成写命令模块generatewritecommand:该模块用来生成ddr写命令,对x个ddrram并行级联的写入地址wr_address{bank,row,col}统一管理;生成读命令模块:该模块用来产生ddr读命令,x个ddr并行级联的读地址统一管理。所述读地址为rd_address{bank,row,col};读同步判断模块readsynchronous该模块用来对齐x个ddr返回的x组数据,对齐后合成一组数据输出。这样,当外部存储器输入的数据位宽大于单个ddrram的位宽时,通过ddrram并行级联,并由mcontroller对输入数据进行拆分,分别写入不同的ddrram,通过写命令模块与读命令模块,使被拆分的数据在写入和读出过程中,保持不变并且数据延迟相同。通过读同步判断模块将拆分的数据重新组合成一组数据,并保证数据输出的完整。mcontroller通过以上四个模块,对并行级联的多个ddrram进行控制与协调,提高了并行级联的ddrram的接口带宽。

进一步的优选,所述步骤2.1)具体包括:所述生成刷新zq模块周期性生成自刷新请求信号和zq校准请求信号,为x个ddrram提供zq周期的刷新。

zq是一个ddr3新增的脚,这个引脚通过片上校准引擎odce来自动校验数据输出驱动器导通电阻与odt的终结电阻值。当生成刷新zq模块系统发出自刷新请求信号和zq校准请求信号时,将用时钟周期对导通电阻和odt电阻进行重新校准。

进一步的优选,所述步骤2.2)具体包括:

2.2.1)所述生成写命令模块generatewritecommand在写入数据时,仅产生一个写地址wr_address{bank,row,col},用于控制x个ddrram的写同步;

2.2.2)把输入数据分为x组新数据,din1[n-1:0],din2[2×n-1:n].....,dinx[m-1:(x-1)×n];

2.2.3)将x组新数据中的每一组数据连同写地址wr_address{bank,row,col}同步压入对应的写命令fifo存储器wr*_cmd_fifo;

2.2.4)当任意一个fifo存储器将满时,暂停产生新的写命令。

生成写命令模块generatewritecommand仅产生一个写地址wr_address{bank,row,col},将拆分后的数据din1[n-1:0],din2[2×n-1:n].....,dinx[m-1:(x-1)×n]连通写地址wr_address{bank,row,col},同步写入不同的ddrram中的写命令fifo存储器wr*_cmd_fifo。

进一步的优选,所述步骤2.3)具体包括:

所述生成读命令模块generatereadcommand,同一次产生的读命令,序号相等,后续且产生的读命令的序号依次递增,在将该读命令压入对应的读命令fifo存储器rd*_cmd_fifo的同时,把序号压入到读同步判断模块readsynchronousjudge对应的数据恢复fifo存储器rd*_rec_fifo里面。

生成读命令模块generatereadcommand可以产生多个读命令,可以进行数据的多次读取。每次产生的读命令附带递增的序号,用于识别和区分不同批次的读命令。

进一步的优选,所述步骤2.4)具体包括:

2.4.1)每个ddrram返回的读数据先压入各自对应的读数据fifo存储器rd*_dat_fifo,当x个读数据fifo存储器都非空时,数据恢复fifo存储器rd*_rec_fifo弹出该数据对应的读命令的序号且x个序号相等时,即x个数据已经对齐,同时把x个读数据fifo存储器rd*_dat_fifo的数据弹出,并且组成一个新的输出数据。

2.4.2)当rd*_rec_fifo全部非空,并且fifo输出口同时弹出相应读命令的x个序号不相等时,返回信号至生成读命令generatereadcommand模块里暂停产生读请求,当读命令fifo存储器rd*_cmd_fifo都被清空后,重复步骤2.3)和步骤2.4)。

在将数据读出时,将每个ddrram返回的数据以及读命令压入读数据fifo存储器rd*_dat_fifo,,判断读命令的序号是否为相同,若相同则说明是同一次读取,则将读数据fifo存储器rd*_dat_fifo中的数据对齐,弹出,重新组合成新的数据输出。当x个序号不相等时,说明同步机制出错,返回信号的generatereadcommand模块里暂停产生读请求,当rd*_cmd_fifo都被清空后,重新发起读请求,进行新一轮同步,避免锁死状态。

进一步的优选,所述步骤2)中还包括命令仲裁模块commandfsm,用于仲裁读写命令的优先顺序。

因为每个ddrmig只有一个命令通道,需要把读写命令仲裁在一起。当需要支持高突发时,写优先仲裁;当需要支持低延迟时读优先仲裁。

本发明与现有技术相比,具有以下优点及有益效果:

fpga与外部存储器建立数据通道,可以方便灵活的利用软件程序编程实现对数据的处理,并且通过mcontroller控制将拆分后的数据写入并行级联的外部存储器,并控制数据的同步写入和同步读出,并将数据整合成新的数据输出,提高了高带宽下ddrram的接口带宽,大于单个ddrram位宽的输入数据也能够被ddrram缓存,建立了高速的数据传输通道。

附图说明

图1为本发明的原理框图;

图2为mcontroller的工作原理图。

具体实施方式

首先在对本发明的具体实施例详细介绍之前,对本申请中涉及的技术名词给予解释:

片上校准引擎odce(on-diecalibrationengine,)

mig:ddrram的ip核。

下面结合实施例对本发明作进一步地详细说明,但本发明的实施方式不限于此。

实施例1:

结合附图1和图2所示,一种高带宽下提高ddrram接口带宽的fpga实现方法,包括以下步骤:

1)根据输入数据的位宽,计算需要并行级联的ddrram数量x:当输入数据的位宽为m比特,单个ddrmig的数据位宽为n比特,其中m>n,ddr的数量x的计算方法为:

m/n可以整除,x=m/n;

m/n不可以整除,x=m/n+1;

2)采用fpga设计用于提高ddrram的接口带宽的mcontroller,包括:

2.1)生成刷新zq模块generaterefreshzq,用于多个ddrram之间周期刷新和zq同步;

2.2)生成写命令模块generatewritecommand,生成ddrram写命令,用于对x个ddrram并行级联的写地址统一管理;

2.3)生成读命令模块generatereadcommand,生成ddrram读命令,用于对x个ddr并行级联的读地址统一管理;

2.4)读同步判断模块readsynchronousjudge,用来同步对齐x个ddrram返回的x组数据,对齐后组合成一组数据输出。

当与fpga通信的外部存储器输入的数据的位宽,高于单个ddrmig的位宽时,需要并行级联多个ddrram来建立高速的数据传输通道时,计算出需要并行级联的ddrram的数量x,并将x个ddrram并行级联。对fpga的ram进行软件编程实现mcontroller,用于提高并行级联ddrram的接口带宽,mcontroller包括生成刷新zq模块、生成写命令模块、生成读命令模块和读同步判断模块,其中生成刷新zq模块:用于周期性生成自刷新请求信号和zq校准请求信号,所有ddrmig接收相同的请求信号,保证每个ddrram刷新和校准路径延迟相同;生成写命令模块generatewritecommand:该模块用来生成ddr写命令,对x个ddrram并行级联的写入地址wr_address{bank,row,col}统一管理;生成读命令模块:该模块用来产生ddr读命令,x个ddr并行级联的读地址统一管理。所述读地址为rd_address{bank,row,col};读同步判断模块readsynchronous该模块用来对齐x个ddr返回的x组数据,对齐后合成一组数据输出。这样,当外部存储器输入的数据位宽大于单个ddrram的位宽时,通过ddrram并行级联,并由mcontroller对输入数据进行拆分,分别写入不同的ddrram,通过写命令模块与读命令模块,使被拆分的数据在写入和读出过程中,保持不变并且数据延迟相同。通过读同步判断模块将拆分的数据重新组合成一组数据,并保证数据输出的完整。mcontroller通过以上四个模块,对并行级联的多个ddrram进行控制与协调,提高了并行级联的ddrram的接口带宽。

实施例2:

在实施例1的基础上,结合附图1和图2所示,所述步骤2.1)具体包括:所述生成刷新zq模块周期性生成自刷新请求信号和zq校准请求信号,为x个ddrram提供zq周期的刷新。zq是一个ddr3新增的脚,这个引脚通过片上校准引擎odce来自动校验数据输出驱动器导通电阻与odt的终结电阻值。当生成刷新zq模块系统发出自刷新请求信号和zq校准请求信号时,将用时钟周期对导通电阻和odt电阻进行重新校准。

进一步的优选,所述步骤2.2)具体包括:

2.2.1)所述生成写命令模块generatewritecommand在写入数据时,仅产生一个写地址wr_address{bank,row,col},用于控制x个ddrram的写同步;

2.2.2)把输入数据分为x组新数据,din1[n-1:0],din2[2×n-1:n].....,dinx[m-1:(x-1)×n];

2.2.3)将x组新数据中的每一组数据连同写地址wr_address{bank,row,col}同步压入对应的写命令fifo存储器wr*_cmd_fifo;

2.2.4)当任意一个fifo存储器将满时,暂停产生新的写命令。

生成写命令模块generatewritecommand仅产生一个写地址wr_address{bank,row,col},将拆分后的数据din1[n-1:0],din2[2×n-1:n].....,dinx[m-1:(x-1)×n]连通写地址wr_address{bank,row,col},同步写入不同的ddrram中的写命令fifo存储器wr*_cmd_fifo。

进一步的优选,所述步骤2.3)具体包括:

所述生成读命令模块generatereadcommand,同一次产生的读命令,序号相等,后续且产生的读命令的序号依次递增,在将该读命令压入对应的读命令fifo存储器rd*_cmd_fifo的同时,把序号压入到读同步判断模块readsynchronousjudge对应的数据恢复fifo存储器rd*_rec_fifo里面。

生成读命令模块generatereadcommand可以产生多个读命令,可以进行数据的多次读取。每次产生的读命令附带递增的序号,用于识别和区分不同批次的读命令。

进一步的优选,所述步骤2.4)具体包括:

2.4.1)每个ddrram返回的读数据先压入各自对应的读数据fifo存储器rd*_dat_fifo,当x个读数据fifo存储器都非空时,数据恢复fifo存储器rd*_rec_fifo弹出该数据对应的读命令的序号且x个序号相等时,即x个数据已经对齐,同时把x个读数据fifo存储器rd*_dat_fifo的数据弹出,并且组成一个新的输出数据。

2.4.2)当rd*_rec_fifo全部非空,并且fifo输出口同时弹出相应读命令的x个序号不相等时,返回信号至生成读命令generatereadcommand模块里暂停产生读请求,当读命令fifo存储器rd*_cmd_fifo都被清空后,重复步骤2.3)和步骤2.4)。

在将数据读出时,将每个ddrram返回的数据以及读命令压入读数据fifo存储器rd*_dat_fifo,,判断读命令的序号是否为相同,若相同则说明是同一次读取,则将读数据fifo存储器rd*_dat_fifo中的数据对齐,弹出,重新组合成新的数据输出。当x个序号不相等时,说明同步机制出错,返回信号的generatereadcommand模块里暂停产生读请求,当rd*_cmd_fifo都被清空后,重新发起读请求,进行新一轮同步,避免锁死状态。

实施例3:

在以上实施例的基础上,结合附图1和图2所示,所述步骤2)中还包括命令仲裁模块commandfsm,用于仲裁读写命令的优先顺序。

因为每个ddrmig只有一个命令通道,需要把读写命令仲裁在一起。当需要支持高突发时,写优先仲裁;当需要支持低延迟时读优先仲裁。

以上所述,仅是本发明的较佳实施例,并非对本发明做任何形式上的限制,凡是依据本发明的技术实质对以上实施例所作的任何简单修改、等同变化,均落入本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1