第九章、Tiny4412 U-BOOT移植九 DDR工作时序与原理 一

SPD DDR4的参数 DDR4颗粒使用的过程需要控制器在初始化的时候下发SPD的配置,根据实际的使用情况适当修改参数,文档中对每一个参数做了详细的解释,便于大家学习 立即下载

这一篇基本上也是我从网上各处整理来的,具体的转载位置我也不清楚了。


DDR SDRAM 全称为 Double Data Rate SDRAM,中文名为“双倍数据流 SDRAM”。DDR SDRAM 在原有的 SDRAM的基础上改进而来。下图9-1是DDR和SDRAM的数据传输对比图。


图9-1、DDR和SDRAM的数据传输对比图

上图8-1可以清楚的看到,DDR可在一个时钟周期内传送两次数据,上升沿传一次,下降沿传一次。

一、DDR的基本原理


图9-2、DDR读操作时序图

从中可以发现它多了两个信号:CLK#与DQS,CLK#与正常 CLK 时钟相位相反,形成差分时钟信号。而数据的传输在 CLK 与 CLK#的交叉点进行,可见在 CLK 的上升与下降沿(此时正好是 CLK#的上升沿)都有数据被触发,从而实现双倍数据传输,也就是DDR。下面来看DDR的内部结构图的SDRAM有什么不同。


图9-3、DDR内部结构图

上面的图是一颗 128Mbit 的内存芯片,标称规格为 32×4bit,右边红框区域就是DDR不同的地方:首先就是内部的L-Bank 规格。SDRAM 中L-Bank 存储单元的容量与芯片位宽相同,但在DDR SDRAM 中并不是这样,存储单元的容量是芯片位宽的一倍,所以在此不能再套用讲解 SDRAM时“芯片位宽=存储单元容量”的公式了。也因此,真正的行、列地址数量也与同规格 SDRAM 不一样了。 

以上图9-3芯片为例,在读取时,L-Bank 在内部时钟信号的触发下一次传送8bit 的数据给读取锁存器,再分成两路 4bit 数据传给复用器,由后者将它们合并为一路 4bit 数据流,然后由发送器在 DQS 的控制下在外部时钟上升与下降沿分两次传输 4bit 的数据给北桥的内存控制器(在ARM和现在的CPU中,内存控制器是集成在CPU中的,现在的PC机中北桥已无内存控制器)。这样,如果时钟频率为 100MHz,那么在 I/O 端口处,由于是上下沿触发,那么就是传输频率就是 200MHz。

现在大家基本明白 DDR SDRAM 的工作原理了吧,这种内部存储单元容量(也可以称为芯片内部总线位宽)=2×芯片位宽(也可称为芯片 I/O 总线位宽)的设计,就是所谓的两位预取(2-bit Prefetch)。  

二、DDR与SDRAM的异同

DDR SDRAM 与 SDRAM 一样,在开机时也要进行 MRS(ModeRegister Set,模式寄存器的设置),不过由于操作功能的增多,DDR SDRAM 在 MRS 之前还多了一 EMRS 阶段(Extended Mode Register Set,扩展模式寄存器设置),这个扩展模式寄存器控制着 DLL 的有效/禁止、输出驱动强度、QFC 有效/无效等。

三、差分时钟

CK#的作用,并不能理解为第二个触发时钟,而是起到触发时钟校准的作用。

由于数据是在 CK 的上下沿触发,造成传输周期缩短了一半,因此必须要保证传输周期的稳定以确保数据的正确传输,这就要求 CK 的上下沿间距要有精确的控制。但因为温度、电阻性能的改变等原因,CK 上下沿间距可能发生变化,此时与其反相的 CK#就起到纠正的作用(CK 上升快下降慢,CK#则是上升慢下降快)。而由于上下沿触发的原因,也使 CL=1.5 和 2.5 成为可能,并容易实现。


图9-4、DDR差分时钟

四、数据选取脉冲(DQS)

DQS 是 DDR SDRAM 中的重要功能,它的功能主要用来在一个时钟周期内准确的区分出每个传输周期,并便于接收方准确接收数据。每一颗芯片都有一个 DQS 信号线,它是双向的,在写入时它用来传送由内存控制器发来的 DQS 信号,读取时,则由DDR芯片生成 DQS 向内存控制器发送。完全可以说,它就是数据的同步信号。 

在读取时,DQS 与数据信号同时生成(也是在 CK 与 CK#的交叉点)。而 DDR 内存中的 CL 也就是从 CAS 发出到 DQS 生成的间隔,数据真正出现在数据 I/O总线上相对于 DQS 触发的时间间隔被称为tAC。实际上,DQS 生成时,芯片内部的预取已经完毕了,tAC 是指上文结构图中灰色部分的数据输出时间,由于预取的原因,实际的数据传出可能会提前于 DQS 发生(数据提前于 DQS 传出)。

DQS 在读取时与数据同步传输,那么接收时也是以 DQS 的上下沿为准吗?不,如果以 DQS 的上下沿区分数据周期的危险很大。由于芯片有预取的操作,所以输出时的同步很难控制,只能限制在一定的时间范围内,数据在各 I/O 端口的出现时间可能有快有慢,会与 DQS 有一定的间隔,这也就是为什么要有一个 tAC 规定的原因(DDR中的tAC是在DQS触发和数据真正出现在I/O总线上的间隔时间)。而在接收方,一切必须保证同步接收,不能有 tAC 之类的偏差。这样在写入时,芯片不再自己生成 DQS,而以发送方传来的 DQS 为基准,并相应延后一定的时间,在 DQS 的中部为数据周期的选取分割点(在读取时分割点就是上下沿),从这里分隔开两个传输周期。这样做的好处是,由于各数据信号都会有一个逻辑电平保持周期,即使发送时不同步,在 DQS 上下沿时都处于保持周期中,此时数据接收触发的准确性无疑是最高的。  


图9-5、DDR DQS 写入时序图

在写入时,以DQS 的高/低电平期中部为数据周期分割点,而不是上/下沿,但数据的接收触发仍为 DQS 的上/下沿。

五、写入延迟 

在上面8-5 DQS 写入时序图中,可以发现写入延迟已经不是0了,在发出写入命令后,DQS与写入数据要等一段时间才会送达。这个周期被称为 DQS 相对于写入命令的延迟时间(tDQSS,WRITE Command to the firstcorresponding rising edge of DQS)。 

为什么要有这样的延迟设计呢?原因也在于同步,毕竟一个时钟周期两次传送,需要很高的控制精度,它必须要等接收方做好充分的准备才行。tDQSS 是 DDR 内存写入操作的一个重要参数,太短的话恐怕接受有误,太长则会造成总线空闲。tDQSS 最短不能小于 0.75 个时钟周期,最长不能超过 1.25 个时钟周期。

正常情况下,tDQSS 是一个时钟周期,但写入时接受方的时钟只用来控制命令信号的同步,而数据的接受则完全依靠 DQS 进行同步,所以 DQS 与时钟不同步也无所谓。不过,tDQSS产生了一个不利影响— — 读后写操作延迟的增加,如果 CL=2.5,还要在 tDQSS 基础上加入半个时钟周期,因为命令都要在 CK的上升沿发出。下图9-6中,当 CL=2.5 时,读后写的延迟将为 tDQSS+0.5 个时钟周期(图中 BL=2)。 


图9-6、DDR读取时序图

另外,DDR 内存的数据真正写入由于要经过更多步骤的处理,所以写回时间(tWR)也明显延长,一般在3个时钟周期左右,而在 DDR-II规范中更是将 tWR 列为模式寄存器的一项,可见它的重要性。 

六、突发长度

在 DDR SDRAM 中,突发长度只有 2、4、8 三种选择,没有了随机存取的操作(突发长度为 1)和全页式突发。这是为什么呢?因为 L-Bank一次就存取两倍于芯片位宽的数据,所以芯片至少也要进行两次传输才可以,否则内部多出来的数据怎么处理?但是,突发长度的定义也与 SDRAM 的不一样了,它不再指所连续寻址的存储单元数量,而是指连续的传输周期数,每次是一个芯片位宽的数据。

七、延迟锁定回路(DLL) 

DDR SDRAM 对时钟的精确性有着很高的要求,而 DDR SDRAM 有两个时钟,一个是外部的总线时钟,一个是内部的工作时钟,在理论上 DDR SDRAM 这两个时钟应该是同步的,但由于种种原因,如温度、电压波动而产生延迟使两者很难同步,更何况时钟频率本身也有不稳定的情况(SDRAM 也有内部时钟,不过因为它的工作/传输频率较低,所以内外同步问题并不突出)。

DDR SDRAM 的 tAC 就是因为内部时钟与外部时钟有偏差而引起的,它很可能造成因数据不同步而产生错误的恶果。实际上,不同步就是一种正/负延迟,如果延迟不可避免,那么若是设定一个延迟值,如一个时钟周期,那么内外时钟的上升与下降沿还是同步的。鉴于外部时钟周期也不会绝对统一,所以需要根据外部时钟动态修正内部时钟的延迟来实现与外部时钟的同步,这就是 DLL 的任务。 

DLL 不同于主板上的 PLL,它不涉及频率与电压转换,而是生成一个延迟量给内部时钟。目前 DLL 有两种实现方法,一个是时钟频率测量法(CFM,Clock Frequency Measurement),一个是时钟比较法(CC,Clock Comparator)。 

CFM 是测量外部时钟的频率周期,然后以此周期为延迟值控制内部时钟,这样内外时钟正好就相差了一个时钟周期,从而实现同步。DLL 就这样反复测量反复控制延迟值,使内部时钟与外部时钟保持同步。

CC的方法则是比较内外部时钟的长短,如果内部时钟周期短了,就将所少的延迟加到下一个内部时钟周期里,然后再与外部时钟做比较,若是内部时钟周期长了,就将多出的延迟从下一个内部时钟中刨除,如此往复,最终使内外时钟同步。


图9-7、CFM 式 DLL 工作示意图

 

下图9-8所示为CC 式 DLL 工作示意图  。


图9-8、CC 式 DLL 工作示意图 

CFM 与 CC 各有优缺点,CFM 的校正速度快,仅用两个时钟周期,但容易受到噪音干扰,并且如果测量失误,则内部的延迟就永远错下去了。CC 的优点则是更稳定可靠,如果比较失败,延迟受影响的只是一个数据(而且不会太严重),不会涉及到后面的延迟修正,但它的修正时间要比 CFM 长。DLL 功能在 DDR SDRAM 中可以被禁止,但仅限于除错与评估操作,正常工作状态是自动有效的。 



海思3531的uboot移植(含DDR3参数配置修改).pdf 海思Hi3531芯片的uboot移植,含uboot移植、DDR3参数配置、uboot镜像下载和网络测试等4部分构成,内容包括SDK中的uboot源码解压到最终下载和测试全流程,实测可用。 立即下载

相关推荐

告别“静态组件”:Adobe XD的堆栈+状态,打造“活”的响应式UI

今天,我想分享一套能彻底告别这种“笨方法”的、Adobe XD中的进阶技巧,通过组合使用“堆栈”、“内边距”和“组件状态”,去构建一个能自动适应内容、真正“活”起来的智能响应式组件。

Kingsdesigner的博客 762

通过uboot降cpu,DDR频率测试

降频测试方法: 【1】修改uboot配置uboot-imx\include\configs\mx51_bbg_android.h,添加宏,编译: #define CONFIG_CMD_CLOCK #define CONFIG_REF_CLK_FREQ CONFIG_MX51_HCLK_FREQ 【2】烧这个uboot: fastboot flash bootloader u-bo

yihui8的专栏 8031

基于Arduino UNO的OLED显示器使用方法x2(Arduino系列五)

Arduino使用OLED显示模块可以实现串口数据显示,还可以与其他模块联合使用,实现实时显示开发板实时数据。

LNN0212的博客 4171

Uboot中lpddr4的初始化(i.MX8M)

1、ddr时序的写入 spl阶段将时序写入ddr寄存器。一般来说自己移植ddr的时候就需要干两件事:(1)使用ddr工具获取稳定的ddr时序,(2)修改uboot中定义的ddr各个bank的 大小。 spl_dram_init //board/freescale/imx8mp_evk/spl.c ->ddr_init //drivers/ddr/imx/imx8m/ddr_init.c 2、ddr bank的初始化dram_init_banksize 从芯片手册可知,i.MX8MP共分为两个dd

Muggle的博客 2783

从零构建边缘AI数据管道:K230+ESP8266的物联网实践指南

本文详细介绍了如何利用K230开发板和ESP8266模块构建高可靠性的边缘AI数据管道,特别针对智能农业监测场景。通过完整的系统架构设计、AI模型部署、低功耗通信优化和云端集成方案,为开发者提供了一套可落地的物联网实践指南,重点解决了边缘计算环境下的数据传输稳定性和能效管理问题。

j2k3l4的博客 874

2026 最新实战教程:AI 重构开发全流程(从需求→上线→运维)

1)做什么系统2)技术栈3)功能模块4)部署要求plaintext我要做一个:待办事项(Todo)全栈应用技术栈:前端:React + TypeScript + Tailwind后端:Node.js + Express + MongoDB部署:Docker + 本地运行(后续可上云)功能:- 增删改查任务- 任务状态切换(完成/未完成)- 简单错误处理请按企业级标准生成:架构设计 + 全部代码 + 接口文档 + 启动命令。

qq_35779316的博客 1699

DDR3详解(以Micron MT41J128M8 1Gb DDR3 SDRAM为例)

首先,我们先了解一下内存的大体结构工作流程,这样会比较容量理解这些参数在其中所起到的作用。这部分的讲述运用DDR3的简化时序图。    DDR3的内部是一个存储阵列,将数据“填”进去,你可以它想象成一张表格。和表格的检索原理一样,先指定一个行(Row),再指定一个列(Column),我们就可以准确地找到所需要的单元格,这就是内存芯片寻址的基本原理。对于内存,这个单元格可称为存储单元,那么这个表格

嵌入空间 3万+

Detector-Free SfM 项目复现完整指南:从环境搭建到代码解析与可视化

本文提供了Detector-Free SfM项目的完整复现指南,涵盖技术背景、环境配置、代码解析和可视化方案。重点包括: 技术背景:Detector-Free SfM通过两阶段策略(粗重建+迭代精化)解决了传统SfM在弱纹理区域的瓶颈问题,采用深度学习匹配器替代传统特征点检测。 环境配置: 详细硬件要求与推荐配置(GPU/CPU/内存) 完整的Ubuntu系统设置步骤 Conda环境创建与依赖安装流程 关键组件安装指南(PyTorch、COLMAP等) 常见错误解决方案 项目特点: 支持多种Detector

huanghm88的专栏 121

UBOOT//DDR内存原理及时序

这里使用的是2012.10版本的uboot ,来看一下如何将uboot 改为自己开发板可以使用的 Uboot的异常向量表,V210的启动机制原理 上图是启动uboot的一段汇编指令,其中ldr pc,XXX //表示把XX寄存器中的地址值给pc指针 CPU启动过程,首先运行IROM(里面主要是配置时钟,看门狗等),然后把flash/SD卡中的头4K代码(BL1)放到CPU里运行,然后将flash/SD卡中剩下的内容加载到SDRAM中运行,然后通过调节指针最终运行OS 不同板子启动步骤不一样,有的是将BL

CNMNMSL1的博客 1942

【教程4>第4章>第12节】通过FPGA实现基于FFT变换的频偏估计和补偿

基于FFT变换的频偏估计和补偿,其基本原理如下:而频偏补偿的目的是将频偏后的信号频谱移回原来的位置。

FPGA/MATLAB学习教程/源码/项目合作开发 882

YOLO26涨点改进 | 全网独家,注意力创新改进篇 | Arxiv2025 | YOLO26引入MSLA多尺度线性注意力模块,高效提取多尺度特征和建模长程依赖,含多种创新改进,助力有效涨点

本文提出了一种多尺度线性注意力模块(MSLA)来优化YOLO26模型。MSLA通过并行使用不同尺寸的深度可分离卷积(3×3至9×9)提取多尺度特征,并结合线性注意力机制高效建模全局依赖关系。该模块显著提升了模型对多尺度目标的检测能力,同时保持了轻量化特性。实验表明,MSLA能有效增强小目标检测和复杂场景下的分割精度。文章详细介绍了MSLA的网络结构、核心优势及实现代码,并提供了两种集成MSLA的YOLO26改进方案,为实时目标检测任务提供了高效解决方案。

Ai缝合怪、助力小伙伴高效发论文 299

uboot源码学习(6)DDR内存基本原理

DRAM位存储原理:Word Line表示行地址,Bit Line表示列地址。当Word Line有效时,整行被选中。Bit Line有效时,再选中特定的列,将1位数据保存在Data In/Out Buffers中。Word Line和Bit Line组成一个Memory Array。 ×2 DRAM:一个BANK由2个Memory Array组成; ×4 DRAM:一个BANK由4个Memory Array组成; ×8 DRAM:一个BANK由8个Memory Array组成; 如上图所示:其中×4.

weixin_44837631的博客 1943

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

SoC上电四大阶段,软件分别对DDR做了什么?

【嵌入式开发必知:SoC启动各阶段DDR操作全解析】 嵌入式系统启动过程中,DDR的初始化与管理严格分阶段进行: BootROM:仅解除DDR硬件复位,不进行初始化,代码运行在片内SRAM; SPL阶段(核心):唯一完整初始化DDR的环节,包括供电配置、PHY训练、时序校准等,将主Uboot加载至DDR; 主Uboot:复用SPL配置,仅做内存检测、分区和镜像搬运,不重复底层初始化; Linux内核:动态管理内存资源,维持SPL的硬件参数,仅处理调度、功耗等高层操作。 关键结论: 冷启动后,DDR仅由SPL

luiyarch的博客 471

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【Xilinx】MPSOC启动流程(四)- Uboot

Xilinx开发,ARM开发,嵌入式,Linux开发

顶级小学生 1816

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

系统移植---uboot

uboot移植需要熟悉它的启动流程,以及每一步的工作,为什么要做这步工作

Smile仓鼠 907

uboot ddr配置

2014.4版本uboot启动至命令行几个重要函数为:_start,_main,board_init_f,relocate_code,board_init_r。 一 _start 对于任何程序,入口函数是在链接时决定的,uboot的入口是由链接脚本决定的。uboot下armv7链接脚本默认目录为arch/arm/cpu/u-boot.lds。这个可以在配置文件中与CONFIG_SYS_LD

q123456789098的专栏 1万+

uboot DDR 配置 修改

1.修改.h头文件的配置 2.修改MMU映射 还有lowlevel_init.S

1万+

u-boot详解

Uboot获取: 首先就是uboot官网。缺点就是支持少,比如某一款具体芯片驱动等不完善。uboot官网下载地址 SOC厂商会从uboot官网下载某一个版本的uboot,然后在这个版本的uboot上加入相应的SOC以及驱动。这就是SOC厂商定制版的uboot。NXP官方的I.MX6ULL EVK板子, 做开发板的厂商,开发板会参考SOC厂商的板子。开发板必然会和官方的板子不一样。因此开发板厂商又会去修改SOC厂商做好的uboot,以适应自己的板子。 ......

chengcao123的博客 1万+

fclk if总线_超详细分析Bootloader到内核的启动流程(万字长文)

@[TOC]Bootloader启动流程分析Bootloader的启动过程可以分为单阶段、多阶段两种。通常多阶段的 Bootloader能提供更为复杂的功能以及更好的可移植性。从固态存储设备上启动的 Bootloader大多都是两阶段的启动过程。第一阶段使用汇编来实现,它完成一些依赖于CPU体系结构的初始化,并调用第二阶段的代码;第二阶段则通常使用C语言来实现,这样可以实现更复杂的功能,而且代码会...

weixin_39529903的博客 580

tiny4412之内存控制器(DDR3 SDRAM)(一)

Table of Contents 一、原理图解析 1.1、jz2440 1.1.1、jz2440引脚说明 1.1.2、地址(ADDR)引脚说明 1.1.3、Bank引脚说明 1.1.4、DQM引脚说明 1.1.5、片选(CS)说明(决定寻址起始地址) 1.1.2、jz2440内存大小计算方法 1.2、tiny4412 1.2.1、tiny4412引脚说明 1.2.2、D...

shenlong1356的博客 2016

u-boot分析之 DDR配置

继上篇文章介绍u-boot分析之u-boot.lds脚本分析之后,我们接着需要了解下关于DDR初始化方面的,以方便后续的对z-turnkaU-boot移植工作. 大家都知道,uboot启动至命令行几个重要函数为:_start,_main,board_init_f,relocate_code,board_init_r,下面我们进行一一分析。 一 _start    

wendellluntan的博客 5226

uboot源码学习(8)DDR内存时序参数

t_refi:64ms/8k = 7.8us。8k:总共有16行,每次刷新2行。64ms表示每行至少64ms刷新一次。 t_rfc:Refresh Cycle Time,自刷新周期。现在自刷新一般会同时刷新两行,再加上额外的处理时间。两次刷新指令之间的间隔≥t_rfc。自刷新参数示例图如下, t_rrd:Row Activiation to Row Activiation Delay ,表示同一device的不同bank之间行和行打开时间延迟,下一个bank在上一个bank Precharge阶段开始打.

weixin_44837631的博客 1478
上一篇: 第八章、Tiny4412 U-BOOT移植八 SDRAM工作时序与原理
下一篇: 第十章、Tiny4412 U-BOOT移植十 DDR工作时序与原理二
eshing
博客等级 码龄18年 146粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值