FPGA DDR 地址映射-黄金法则

       FPGA 中 DDR 控制器的地址映射顺序(Address Mapping Order) 是优化设计速度(带宽和效率) 的关键。

       简单来说,地址映射顺序决定了线性地址如何映射到 DDR 芯片内部的物理结构(Bank、Row、Column)。正确的映射可以最大化访问的局部性,从而减少耗时严重的 行激活(Row Activate) 命令,显著提升有效带宽。

一、核心概念:DDR 的内部结构

       要理解地址映射,必须先了解 DDR SDRAM 的物理结构。你可以把它想象成一个有很多本书的图书馆:

  • Bank: 相当于图书馆的楼层 (例如,Bank 0, Bank 1, ...)。DDR3/4 通常有 8个 Banks。

  • Row: 相当于一层楼里的一个书架。一个 Bank 里有很多个 Rows。

  • Column: 相当于一个书架上的某一本书。一个 Row 里有很多个 Columns。

访问数据的流程:

  1. 激活(Activate): 告诉 DDR,“我要去第 X 层楼(Bank)的第 Y 个书架(Row)”。这是一个高延迟的操作。

  2. 读/写(Read/Write): “请把那个书架上的第 Z 本书(Column)给我”。在同一个“书架”(Row)上连续取多本书(Burst Length)是非常快的。

  3. 预充电(Precharge): 关闭当前的书架(Row),为打开另一个书架做准备。

关键点: 最耗时的操作是 Activate。因此,优化的目标就是尽可能让连续的内存访问发生在同一个 Bank 和同一个 Row 内,从而最大限度地减少 Activate 命令。


二、地址映射顺序的作用

地址映射顺序决定了用户发出的线性地址 如何被解码成 BankRowColumn 这三个物理地址。

  • 用户逻辑看到的地址: addr[31:0] (一个长长的、连续的地址空间)

  • MIG (Memory IP) 做的事情: 将 addr[31:0] 切分成 rank_addr、bank_addr、row_addr、col_addr

      映射顺序就是定义 addr[] 的哪几位被分配给 bank_addr,哪几位给 row_addr,哪几位给 col_addr


三、DDR地址映射配置

最常见的两种预设模式是:

a. ROW_COLUMN_BANK (或类似名称)
  • 含义: 线性地址的高位映射到 Row中间位映射到 Column低位映射到 Bank

  • 访问模式: 连续地址访问会在不同的 Bank、相同的 Row 之间跳转。

  • 优点: 非常适合连续 burst 访问(例如,DMA 传输大块数据)。因为连续访问总是在同一个 Row 内,只需要一次 Activate,后续都是快速的 Read/Write 命令,效率极高。

  • 缺点: 如果访问模式是稀疏的、随机跨越大地址范围的,效果一般。

b. BANK_ROW_COLUMN (或类似名称)
  • 含义: 线性地址的高位映射到 Bank中间位映射到 Row低位映射到 Column

  • 访问模式: 连续地址访问会在同一个 Bank、不同的 Row 之间跳转。

  • 优点: 对于某些特定的访问模式可能有用,但通常性能较差。因为连续访问每次都会切换到新的 Row,导致每次访问都需要先 Precharge 再 Activate,产生大量延迟,带宽利用率极低。

  • 缺点: 几乎不用于需要高带宽的场景。

简单对比:
假设你顺序读取 0x0, 0x4, 0x8, 0xC ...(Cache line 大小访问)

  • 使用 ROW_COLUMN_BANK: 这些地址很可能落在 同一个 Row,不同的 Bank。只需要一次 Activate,然后可以连续发出读命令,速度飞快。 ✅

  • 使用 BANK_ROW_COLUMN: 这些地址很可能落在 同一个 Bank,不同的 Row。每读一次,都需要先关闭当前 Row (Precharge),再打开新 Row (Activate),然后才能读,速度极慢。 ❌


四、如何选择以实现“速度快”?

     黄金法则:让你的内存访问模式与地址映射顺序相匹配。

  1. 绝大多数情况下的最佳选择: ROW_COLUMN_BANK

    • 为什么? 大多数高性能数据传输(如视频帧处理、网络包处理、科学计算)都是通过 DMA 进行连续块传输ROW_COLUMN_BANK 映射正是为这种顺序访问模式而优化的,它能最大化利用 Banks 的并行性和 Row 的局部性。

  2. 何时选择其他映射?

    • 如果你的访问模式是极其特殊的“跨步(Stride)”访问,并且你通过分析发现默认映射导致 Bank Conflict 率很高,才需要考虑自定义映射。

    • 例如,如果你总是以固定的、很大的步长访问内存(访问地址 0, N, 2N, 3N...),并且 N 的值恰好导致所有访问都命中同一个 Bank 的不同 Row,那么性能就会很差。这时可能需要调整映射顺序,将这些访问“打散”到不同的 Bank 上。但这种分析非常复杂,通常需要仿真

  3. 对于 UltraScale+ MIG:

    • MIG 提供了更灵活的选项,例如 R-B-C, B-R-C 等。同样的原则适用:R-B-C (Row-Bank-Column) 通常是顺序访问的最佳选择

五、结论

        为了获得最快的速度,尤其是在进行顺序访问时,在 Xilinx MIP IP 中应优先选择ROW_COLUMN_BANK 或 ROW_BANK_COLUMN 这样的地址映射顺序。 这是提升 DDR 带宽利用率和系统性能的最简单、最重要的配置之一。如下图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/97661.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/97661.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络安全设备监控指标

网络安全设备监控指标 近日看到一篇设备情况汇报,内容写得有些欠缺,因此我特意问了一下AI,整理了一下思路。以下是监控需要关注的性能指标。权当抛砖引玉。根据指标可以做监控,也可以做调研指标。 业务承载能力 吞吐量&#xff08…

JSP程序设计之JSP指令

1、JSP指令概念与分类 (1)概念 JSP指令相当于在编译期间的命令,用来设置与整个JSP页面相关的属性,它并不直接产生任何可见的输出,用来设置全局变量、声明类、要实现的方法和输出内容的类型等。在JSP文件被解析为Java…

Generative Art with p5.js: Creating Beauty from Code

Are you ready to make something truly beautiful with p5.js? Forget about boring bar charts and sales data—let’s create art that moves, breathes, and responds to your touch. We’re going to explore generative art, where code becomes your paintbrush and a…

Wi-Fi技术——网络安全

一、数据帧的安全 1、无线网络安全的发展 理论上无线电波范围内的任何一个站点都可以监听并登录无线网络,所有发送或接收的数据,都有可能被截取,因此无线网络安全十分重要。 原始802.11的安全策略为WEP,其存在根本性的漏洞&#x…

Java提供高效后端支撑,Vue呈现直观交互界面,共同打造的MES管理系统,含完整可运行源码,实现生产计划、执行、追溯一站式管理,提升制造执行效率

前言在当今竞争激烈的制造业环境中,企业面临着提高生产效率、降低成本、保证产品质量以及快速响应市场变化等多重挑战。制造执行系统(MES,Manufacturing Execution System)作为连接企业上层计划管理系统(如ERP&#xf…

【macOS】垃圾箱中文件无法清理的常规方法

【macOS】垃圾箱中文件无法清理的方法如果外接 SSD 移动盘上的垃圾文件无法删除, 可能是由于文件系统格式不兼容、文件被占用、权限不足等原因导致的, 以下是一些常见的解决方法:检查移动硬盘文件系统格式:如果移动硬盘是 NTFS 格…

鸿蒙ArkTS 核心篇-15-条件渲染(组件)

目录 根据逻辑条件结果,渲染不同的 UI 内容 DevEco Studio代码实战 预览效果 总结 根据逻辑条件结果,渲染不同的 UI 内容 DevEco Studio代码实战 let num: number 20Entry Component struct Index {build() {Column() {if (num 1) {Text(文本 1)} …

大模型微调显存内存节约方法

大模型微调时节约显存和内存是一个至关重要的话题,尤其是在消费级GPU(如RTX 3090/4090)或资源有限的云实例上。下面我将从显存(GPU Memory) 和内存(CPU Memory) 两个方面,为你系统地…

Linux笔记12——shell编程基础-6

字符截取命令一、cut命令功能:用于从文件或标准输入中提取指定字段或列语法:cut [选项] 文件名-f:列号,提取第几列,默认识别制表符分割出来的列(列号之间用,隔开)-d:分隔符&#xff…

高效浏览器标签页管理:Chrome扩展开发完全指南

Hi,我是前端人类学(之前叫布兰妮甜)! 在信息过载的时代,浏览器标签页管理已成为提高工作效率的关键技能。本文将介绍如何开发一个功能完整的Chrome扩展,帮助用户高效管理浏览器标签页,并探讨其实…

从 WPF 到 Avalonia 的迁移系列实战篇3:ResourceDictionary资源与样式的差异与迁移技巧

从 WPF 到 Avalonia 的迁移系列实战篇3:ResourceDictionary资源与样式的差异与迁移技巧 我的GitHub仓库Avalonia学习项目包含完整的Avalonia实践案例与代码对比。 我的gitcode仓库是Avalonia学习项目。 文中主要示例代码均可在仓库中查看,涵盖核心功能实现与优化方案…

基于Springboot的音乐媒体播放及周边产品运营平台(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的音乐媒体播放及周边产品运营平台(有报告)。Javaee项目,springboot项目。项目介绍: 采用M(model)V(view)C(controller&#xff09…

【项目思维】嵌入式产业链与技术生态

这篇文章深入解析嵌入式产业链与技术生态上下游关系,辅助建立嵌入式工程师职业发展认知。嵌入式行业并不是“写单片机程序”那么简单,而是一个 从芯片设计到系统集成再到最终产品落地 的复杂生态链。理解上下游价值链,有助于你成为系统型工程…

机器学习(讲解)

一、引言:什么是监督学习?监督学习(Supervised Learning)是机器学习中最基础且应用最广泛的范式之一。其核心思想是利用已标记的数据(即输入-输出对)训练模型,使其能够对新的、未标记的数据进行…

使用 Bright Data Web Scraper API + Python 高效抓取 Glassdoor 数据:从配置到结构化输出全流程实战

使用 Bright Data Web Scraper API Python 高效抓取 Glassdoor 数据:从配置到结构化输出全流程实战 摘要 本文详细介绍了如何使用 Bright Data 的 Web Scraper API 搭配 Python,实现对 Glassdoor 平台信息的高效抓取。通过 API 请求构建器、反爬机制集成…

Burgan Bank Türkiye 如何借助 Elastic 改造可观测性和安全性

作者:来自 Elastic Jon Ashley, Ido Friedman, Burak Dz Burgan Bank Trkiye Burgan Bank K.P.S.C. 是科威特项目公司 (KIPCO) 集团的子公司,成立于 1977 年,是中东和北非 (MENA) 地区最大的控股集团和重要银行集团之一。 该银行作为客户的解…

LeetCode 165. 比较版本号 - 优雅Java解决方案

文章目录LeetCode 165. 比较版本号 - 优雅Java解决方案题目描述示例分析示例 1示例 2示例 3算法思路Java实现方案方案一:双指针法(推荐)方案二:优化的单次遍历法可视化执行过程示例:compareVersion("1.2", &…

基于Kubernetes StatefulSet的有状态微服务部署与持久化存储实践经验分享

基于Kubernetes StatefulSet的有状态微服务部署与持久化存储实践经验分享 在传统微服务架构中,大多数服务都是无状态的(Stateless),可以通过 Deployment、ReplicaSet 等控制器实现水平自动扩缩容。但在生产环境中,仍有…

MySQL编程开发

变量系统变量:MySQL内置变量#查看所有系统变量show variables \G;#通过模糊查询筛选变量show variables like “%path%”;全局变量:在所有终端中都生效;会话变量:在当前会话(本次登录);#可以通过…

20250830_Oracle 19c CDB+PDB(QMS)默认表空间、临时表空间、归档日志、闪回恢复区巡检手册

PDB 关业务,CDB 管底层;每天紧盯 PDB,必要时看 CDB。 一、CDB 与 PDB 的关系 Oracle 12c 以后引入 多租户架构(Multitenant),分成两类容器: 层级 名称 作用 存储内容 典型操作 CDB CDB$ROOT(容器数据库) 数据库实例的根容器 Oracle 元数据、系统表字典、公共用户、PDB…