FPGA中memory的应用——多通道共享缓存
时间:10-02
整理:3721RD
点击:
FPGA应用于通信领域时,常常外接大容量memory器件用于缓存,常用的有DDR3 SDRAM、QDRII等。对于这些器件,如何提高它们的使用效率是值得深入研究的。本文侧重于讨论在一个memory被多通道共同使用时,如果提高memory的利用效率。
本文以一个四通道memory应用为例:一个FPGA中有四路独立的数据处理电路,但是共用同一个QDRII作为它们的数据缓存单元,用于应付数据突发。QDRII的接口总带宽能满足同时处理四路数据输入输出的带宽要求,但是QDRII的缓存容量是有限的,是将整个缓存容量平均的分配给四路(或称为四个通道)呢,还是采用动态共享的机制达到缓存容量灵活配置呢?
最简单也最容易想到的分配办法是将QDRII的总缓存容量平均的分配给四个通道,这样子简单,在FPGA中实现起来也比较容易。但是这种方法有一个弊端,就是两个通道之间无法共享缓存空间,即使其中一个通道缓存有大量剩余,也不能分配给其他的通道使用,造成缓存能力的大量浪费和缓存效果不佳。
所以,有必要实现多通道间的缓存空间共享,但控制逻辑又不能过于复杂,要便于在FPGA中以较少的资源来实现。下文中是我觉得比较理想的一种实现办法。
将整个QDRII的缓存空间分成若干份,以一个72M缓存容量的QDRII为例,可以将它分成72份,每份的容量是1M,每份为一个最小存储单元。也可以分的更细,最小存储单元的粒度越小,共享的效率越高,但是维护起来越复杂,存储时最小存储单元的切换也就越频繁,控制逻辑也更复杂。所以要根据实际需要选择合适的最小存储单元容量。下文中为描述方便起见,以存储颗粒来表示一个可以分配调度的最小存储单元。
整个缓存空间被分割成若干个独立的存储颗粒以后,首先需要有一个管理调度模块用来分配、调度、回收存储颗粒。管理模块根据各个通道的使用需求,动态的分配存储颗粒,并在通道释放该存储颗粒时将它回收,以供下一次分配使用。
每个存储颗粒有一个编号(ID),和它在QDRII中的地址段有一个对应关系,例如,ID=0,对应的是地址20'h0~20'hff;ID=1,对应的是地址20'h100~20'h1ff。也就是根据存储颗粒的大小,以及它的ID,可以知道它在QDRII中的位置。
各个通道根据自己的存储需求,动态的申请
原来这就是所谓的内存共享了把?
比较有道理! 学习了!
这个是内存共享的基本思路,很多相关的内存共享机制都是基于这个基本路线的。
多对列共享存储的方式:
将这个存储容量作成一个链式存储,分片共享;
其实就是一个内存管理问题,这可以无限参考操作系统中各种对内存的管理和使用方式。
学习了,,,
不错。学习 学习
lucien_1986大侠,在此发帖,小弟必须顶呀
受教了!
有道理,顶了!
比较有道理! 学习了!
挺好,思路非常具体,学习了!
有结构层次图么?
跟cache的内存管理方法很相似
看来很多东西是相同的
thank youu
小编的思维方法,早就被Xilinx的专家想到了解决方法,只要DDR3/QDRII 带宽足够能够容纳无限的数据通路。Xilinx 通过AXI 存储器接口, 外部能接受npi接口,或多个级联,实现多路数据的传输
学习了。挺好的话题。
比较常用啊
也可以考虑用FIFO实现,简单处理,地址管理也会增加资源利用率的
Thanks!
非常好的思路,以后可以借鉴下。谢谢分享
学习啦哈。。
thank you !
谢谢,受教了。
不错,学习了
谢谢三大诉讼法三翻四复
留名,学习了
It is similar with share with cache between multi-core. But in order to void share memory can't suit burst transferring, sometimes we still needed to exclusive memory for buffer data
