FPGA读写DDR如何实现优化?

摘要:title: FPGA读写DDR date: 20241227 11:52:25 img: https:img2024.cnblogs.comblog37632212026023763221-2026021901051765
补档声明 由于我的博客服务器和备案到期,所以选择转移到博客园平台来进行保存和记录。以后也有可能会在上面不定期更新一些技术类博客。 前言 今年博客产出不多,由于平时还是挺忙的,中间的一段时间部署博客的环境也出了点问题,所以用另一款笔记软件来做知识点记录,趁着年底有空将笔记转移开源一部分到博客上。这一篇是关于FPGA和DDR的,作为工程上的一个实践的记录。希望能帮到有缘人。 对于FPGA来说,内部的存储资源如BRAM、LutRAM是十分金贵的,对于k7-325t这种在性能、资源、价格三者的制衡下取得了良好折中的主流产品来说,也只有16Mb的BRAM。也就是大概440个36K的block。而在FPGA的主要应用方向,网络帧处理、图像处理、数据采样的时候,很多时候都不可避免的需要用到存储资源,如跨时钟域所需要用到的异步FIFO,调用复杂IP核的开销,需要快速读取的查表操作,这些情况下使用BRAM几乎是唯一的选择。在一个项目的评估阶段,如果最后发现是BRAM或者LUT不够了,那一般就只能使用更多资源的片子。 但是,若是算法可以容忍一些存储-读取延迟,或者只是单纯的需要一个存储池,例如网络帧交换中的暂存队列,是一种典型的只关心存储容量,可以容忍一定的延时的场景。因为帧可以在交换机中停留一定时间,只要保证帧的正确性和出队间隔满足IFS。那么此时就可以使用片外的DDR,来大大提升FPGA的数据吞吐能力,来满足我们的需要。例如更深的队列来提升交换机对突发的处理能力、让每个端口都可以有自己独立的队列、不同优先级的队列等。 对于我的一个有关网络帧处理的项目来说。会在一个PC机上插很多张FPGA板卡,板卡会收到很多网络帧,并使用PCIE通道和PC机进行数据的传输。在8张板卡全部插满,流量很大的时候,电脑的PCIE通道速率无法满足实时上传所有的网络包,此时便可以使用每张板卡上的DDR内存,将所有的帧全部暂存到DDR中,然后等到测试结束流量空闲时,使用PCIE依次读取所有板卡的数据包,并保存到电脑上。 理论知识 有关DDR的前置知识 板级知识 这里讨论的都是FPGA与DDR颗粒的一些基础知识,让我们能更好的用起来。挂一漏万。 我之前画过ZYNQ+DDR的PCB板,其中还是有一些门道的,例如在PCB板的摆放位置需要靠近SOC、做好电源去耦、蛇形走线来保证等长、DQ的差分、50欧阻抗控制、端接电阻、多片Fly-by拓扑。在此就不赘述,可以总结为"这就是高速+大容量的代价"。板级工程师秃头.jpg(笑) 对于使用FPGA编写逻辑层的人来说,可以先形成一个这样的基础感性认知-"1片或多片DDR颗粒通过许多根等长的走线连接到了FPGA的特殊管脚上,这些走线中有地址线和数据线" 物理特性 而关于DDR的物理特性和操作方法,例如需要预充电,行列选通、每步都需要一定的延迟等,只需要了解,毕竟我们也不是设计DDR的,这些特性对于我们编写FPGA逻辑来说,最后的体现就是- 从发起写请求到能够开始写入有挺大的延迟(相比于片内逻辑),在200M时钟下大概十几拍。读亦然 在读取或写入了一页的大小后,需要等待一段时间(AXI的ready会拉低) 在写入或者读取的时候地址最好是连续的(完美契合AXI的突发特性) 和FPGA的关系 DDR内存并不好驾驭,从DDR1一直到DDR5,内存控制器一直是现代SOC设计的重要部分,频率和带宽也越来越高。其中有很多门道。而FPGA能够使用自己的内部逻辑资源,来实现内存控制器,目前最高支持到DDR4,网上也有一些开源的Verilog编写的DDR控制器的源码。例如 GitHub - ultraembedded/core_ddr3_controller: A DDR3 memory controller in Verilog for various FPGAs A DDR3 memory controller in Verilog for various FPGAs - ultraembedded/core_ddr3_controller https://github.com/ultraembedded/core_ddr3_controller 不过赛灵思官方有MIG这个IP核,它实现了比较完备的DDR控制器的功能,目前支持了DDR2,DDR3,并且提供了原生接口或者AXI4接口供用户逻辑使用。7系列和UltraScale系列都能使用。用户需要做的就是和MIG进行交互,而无需直接过多的关注DDR本身的机制。 AXI总线协议 为了编写FPGA用户侧逻辑与DDR交互,我们需要使用MIG这个IP核,并且使用AXI接口。下面狠狠的介绍一下AXI4。
阅读全文