深度解读DDR3存储器的基础知识

描述

一、RAM和ROM

首先先了解下RAM和ROM

RAM: 是与 CPU 直接交换数据的内部存储器,也叫主存(内存)。它可以随时读写,而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储媒介,但是它的特点就是掉电数据就丢失了,目前主流的发展有:SDRAM,DRAM,DDR

ROM:一般是装入整机前事先写好ROM 所存数据的整机工作过程中只能读出,而不像随机存储器那样能快速地、方便地加以改写,掉电数据不会丢失,目前主流的发展有:FLASH,HDD,SSD

二、DDR3基础知识

DDR3 全称第三代双倍速率同步动态随机存储器

特点:

①掉电无法保存数据,需要周期性的刷新。

②时钟上升沿和下降沿都会传输数据。

③突发传输,突发长度 Burst Length 一般为 8。

2.1、 DDR3 的存储:bank、行地址和列地址

DDR3其实跟我们这个excel表格一样的,行就是行地址,列就是列地址,一个格子就是一个最小存储单元,这个单元的容量可以是16bit,8bit,或者4bit,一个表格就是一个bank,所以先要指定bank的地址,再指定行地址和列地址

内存

2.2、DDR3的容量计算

Bank的数量行数量列数量*数据位宽

比如以以镁光公司的 DDR3 为例子:MT41J 64M16 -125

内存

内存

比如说64M*16我们可以看到bank的数量是8个,行的数量是8K,这个8K怎么来的

就是2的13次方除以1024,为啥是1024,因为2¹⁰ = 1,024。 我们发现1,024非常接近1,000(10³),所以早期工程师就用 1 Kilobyte (KB) 来表示 1,024 字节,而不是严格的1,000字节。计算机在底层使用二进制来工作(只有0和1)。因此,用2的幂次方来表示数据量对计算机来说更加自然和高效。

以此类推所以列的数量就是1K,后面的x16就是数据位宽,就是我们原理图上看到的数据线,地址线越多通常表示这个容量比较大,

内存

内存

内存

2.3、DDR3的速度

基本规格书也给出了时钟频率规定

内存

-125的时钟周期是1.25个ns,那么时钟频率就是1/1.25ns=800MHz,这就是DDR3的IO时钟频率,,前面讲PCIE的时候我们定义,带宽就是总线的数据传输能力我们叫做带宽,所以DDR3的带宽=时钟频率x数据位宽x2(上升沿和下降沿都传输数据)

所以对于上述-125的带宽就是800x2x16=1600Mbit/s*16=3200MB/s=3200除以1000等于3.2GB/s,当然这还有效率问题,理论值是这样,可能实际只有2.88GB/S,按90%效率算

注意:我们在算容量的时候是用1024算,算速率用1000算的,这个要注意区分

核心区别:数据传输 vs. 数据存储

数据存储容量(Storage Capacity)

这里我们说的是“你的硬盘有多大”、“内存条是8GB的”。

在这个上下文中,因为计算机是二进制系统,所以通常使用2的10次方(1024)作为进制。

1 KiB = 1024 Bytes

1 MiB = 1024 KiB = 1,048,576 Bytes

1 GiB = 1024 MiB = 1,073,741,824 Bytes

这就是您想到的“除以1024”的情况。 我们平时口语中说“GB”,往往指的是GiB(以1024为进制)的概念。

数据传输速率(Data Transfer Rate)

这里我们说的是“网络速度是100Mbps”、“内存带宽是25GB/s”。

在这个上下文中,标准国际单位制(SI)规定,用于表示速率时,进制是1000。

1 kbit/s = 1,000 bit/s

1 Mbit/s = 1,000 kbit/s = 1,000,000 bit/s

1 Gbit/s = 1,000 Mbit/s = 1,000,000,000 bit/s

同样,字节也是:

1 kB/s = 1,000 Byte/s

1 MB/s = 1,000 kB/s = 1,000,000 Byte/s

1 GB/s = 1,000 MB/s = 1,000,000,000 Byte/s

让我们一步步重算一遍内存带宽

我们就以 DDR4-3200 为例:

计算每秒传输的比特数(位,bit)

传输速率:3200 MT/s = 每秒传输32亿次

每次传输数据量:64位

总比特率 = 3200 × 10⁶ × 64 位/秒 = 204,800 × 10⁶ 位/秒 = 204,800 Mbit/s

将比特(bit)转换为字节(Byte)

这是关键一步:1 Byte = 8 bit。这是一个固定的数学换算,与1024无关。

带宽(字节/秒)= 204,800 Mbit/s ÷ 8 bit/Byte = 25,600 MByte/s

将 MB/s 转换为 GB/s

这里再次用到速率单位换算:1 GB/s = 1,000 MB/s

带宽 = 25,600 MB/s ÷ 1,000 MB/GB = 25.6 GB/s

所以,整个计算链条是:

带宽 = (频率 × 位宽) → 换算单位(比特到字节) → 换算单位(兆到千兆)

简单记忆口诀:

算带宽速度时,用 1000 进制(k=10³, M=10⁶, G=10⁹)。

算存储容量时,用 1024 进制(Ki=2¹⁰, Mi=2²⁰, Gi=2³⁰)。

比特(bit)和字节(Byte)之间,永远用 8 来换算。

2.4、DDR3的突发长度

突发长度 Burst Length 一般为 8,DDR的突发长度,你可以理解为内存一次“批量处理”的数据量,突发长度 指的是,当内存控制器(通常是CPU的一部分)向内存发送一个列地址 和一个读取/写入命令后,内存会一次性连续传输 的数据包的大小。

这个大小不是以“字节”为单位,而是以“传输次数”为单位。每次传输的数据量取决于内存的位宽(通常是64位)。所以,突发长度的计算公式为:

总传输数据量 = 突发长度(BL) x 64位,

如果 BL = 8: 内存会一次性连续传输 8 次。总数据量 = 8 x 64位 = 512位 = 64字节。也就是说:内存能一次连续传输64个字节

为什么需要突发模式,主要是为了提高数据传输效率,降低延迟的影响。

减少命令开销: 访问内存中的一个数据,需要先发送行地址(激活对应的行),再发送列地址(定位行中的具体位置)。这个过程有延迟(称为时序,如tRCD,tCAS)。如果每次只读一个数据,那么每次都要重复发送命令和等待延迟,效率极低。突发传输模式下,只需要发送一次行和列地址,就能连续获取一整块相邻的数据,分摊了初始延迟的开销。

符合程序的“空间局部性”原理: 这是关键原因。当CPU需要访问内存中某个位置的数据时,它极有可能会在短时间内访问其相邻位置的数据(例如,遍历一个数组)。因此,通过一次突发传输,把目标数据及其相邻数据一次性预取过来,可以很好地满足CPU后续的请求,这些数据会先被存放在CPU的高速缓存中。

突发长度跟DDR的带宽有什么关系

传输速率(频率)是带宽的“发动机”,决定了最大潜力。

突发长度是带宽的“变速箱”,决定了效率,影响了实际能达到的性能。

比如,DDR4-3200的单通道理论带宽是:

3200 MT/s × 64 bit = 204,800 Mb/s ≈ 25.6 GB/s

(换算:204,800 Mb/s ÷ 8 = 25,600 MB/s = 25.6 GB/s)

注意: 这个公式计算的是“理论上”一秒钟内能传输的最大数据量。但它假设内存每时每刻都在以最高效率工作,即“100%时间都在传输有效数据”。而突发长度正是影响这个“效率”的关键因素,前面我们不是介绍了吗,突发长度是一次性能连续传输多少,带宽公式关注的是“速率”,而突发长度解决的是“效率”问题。它通过减少“浪费”的时间来帮助实际带宽接近理论峰值。

一个重要的现代发展:为什么BL=8是主流?

你可能会问:“既然BL长了好,为什么不做成BL=16或32?”

这是因为BL过长也会带来问题:如果CPU只需要一个特定数据,却强迫它接收一大块不相关的数据,会浪费功耗并可能挤出缓存中有用的数据。

因此,BL=8 在DDR3/4/5时代成为了一个经过权衡的“甜点”值。它既能有效分摊延迟,又不会造成太大的数据浪费,很好地匹配了CPU缓存行的大小(通常是64字节),从而在效率和灵活性之间取得了最佳平衡。

三、DDR3引脚介绍

我们找一个H5TC4G63EFR-RDAR,带L的是低功耗版本,

内存

内存

我们可以分为几个模块来划分,更清楚一点

各个版本的供电电压

内存

3.1、电源管脚

内存

3.2、时钟和复位

内存

内存

CK和CKN:差分时钟输入,在走线的时候要按照100Ω阻抗来进行走线,不同CPU可能不同

3.3、数据组

内存

这里走线也非常有讲究,要分组,(低8位和LDQS,LDQS#,LDM),这11根,分成一组走线,同组同层,另外就是(高八位和UDQS,UDQS#和UDM),分成一组同组同层

3.4、地址,控制,命令

内存

剩下的地址线和命令控制这些线,一般和时钟CK,CK#,一样做等长,

A7-XILIXN习惯于(BANK34、35)DDR_AO-14、BA[O-2]、CSN、RASN、CASN、WEN、

ODT、CKE上拉到VTT。(上拉电阻一般为49.9欧姆)DDR3的CLK终端电阻需要串一个1OO欧姆。

比如以以镁光公司的 DDR3 为例子:MT41J 64M16 -125为例子,我们可以来画一下子,把我们的地址和控制,命令接出来,有手就行,然后全都给它上拉掉,端接电阻是49.9,也就是50,时钟线端接100欧姆,一般单端50,差分100

内存

内存

内存

四、DDR3硬件设计

4.1 FPGA第一次用到DDR3时要注意哪些问题

①FPGAbank的选择,在你选择这个IP核的时候,是用到一个MIG的IP核,用HP bank里面的

②特殊功能引脚的选择,时钟输入,一定要设置在MRCC引脚的P引脚,还有差分对一定要PN对应

③DDR是多少V供电的,对应的BANK要用同样的电平,比如DDR3是1.5V

内存

DDR3由于速度高且是双倍速率采样,所以硬件设计时需要严格考虑信号完整性,开发板在原理

图设计、PCB布线和PCB加工时候就充分考虑了匹配电阻/终端电阻,走线阻抗控制,走线等长控制,保证DDR3的高速稳定的工作

需要使用HP Bank来驱动板载DDR存储器芯片,以Micron DDR3芯片为例,ddr3芯片IO接口电压标准和外部参考电压通常为1.5V,故FPGA对应HP Bank供电电压值需要设定为1.5V。

输入时钟:DDR3芯片采用差分输入时钟,可以由外部有源晶振直接提供,还可以由源端FPGA提供,采用后者更灵活。

例如: -125速率等级的DDR3芯片上限工作频率为1600M T/s,用户可以使其工作在1200M,1000M, 800M等等。故采用FPGA提供DDR3的工作时钟。

注意:工作频率1600M T/s ≠ ≠ 1600Mb/s,因为在FPGA的MIG控制器中,会写成Mb/s,造成初学者的误解。因为如果当前DDR3芯片的DQ数据管脚位宽为x16,工作频率为1600M T/s,那么该DDR3芯片极限带宽为:1600x16Mb/s,所以二者是不相等的单位。

当使用高速IO接口时,在接收端通常需要匹配的端接电阻,有利于高低电平的转换和提高信号的完整性,且端接电阻尽可能的放置在接收端。

通常需要在差分输入端并行端接100Ω的电阻,FPGA在差分输入接收器提前内置了端接电阻,其阻值R为100Ω

4.1、DDR3 SRAM接口驱动

FPGA驱动DDR3 SRAM芯片时,FPGA作为输出源端,SRAM芯片作为终端,故FPGA需要配置output driver 的相关属性参数attributes。SRAM作为input receiver,需要进行端接电阻匹配,由于没有内置片上端接电阻,故需要在SRAM输入管脚外接匹配电阻,由于数据端口是双向端口,故输入端是高阻状态,无需匹配。而地址总线接口和差分时钟输入接口需要匹配对应阻值的电阻。

(a)FPGA输出端IO Standard在UCF文件中参数配置如下:

NET “mcb3_dram_dq[*]” IOSTANDARD = SSTL15_II | IN_TERM = NONE | OUT_TERM = UNTUNED_50;

压摆率和上下拉采用默认参数,SLOW slew rate, 12mA output drive。

(b)SRAM输入端IO standard,地址管脚和数据管脚尽可能均匀分配在某一个或多个Bank中。

地址总线输入端(单端接口)需匹配50Ω端接电阻,差分时钟输入端(差分接口)需要匹配100Ω的端接电阻,见下图所示。

内存

内存

说明: 1. SRAM输入管脚的端接电阻尽可能靠近管脚,以保证信号的完整性;

2. 每一组bank均有独立的Vcco和Vref,便于配置variable IO standard;

3. 为减少SSO(simultaneous switching output)的大量输出管脚电平同一方向切换的干扰,可以增加virtual

VCC/GND pins,即将该bank未用到的管脚在FPGA程序中设置为GND或VCC;

阻抗匹配原理:

信号从信号源出发,内部都会有寄生的电阻电容电感,都会有阻抗,如果相邻部分的阻抗不一致,信号就会在接触点发生反射,跟走线的长度没有关系,跟层数,铜厚,板厚有关系

4.2、DDR3的功耗

内存

可以看下各版本的DDR,最常用的是DDR3,除了VDDQ和VDD,1.5V,上拉的端接电阻也是非常耗电的,你可以看到,地址,命令,控制,有21~24根线之多,每根线50Ω电阻,那么(0.75/50)24=0.36A,所以我们设计的时候,0.75V这个电压一般用500mA来进行设计,一般用DC-DC,你按照0.315A来设计的话,没有一点余量,满载跑一个是发热问题,一个是纹波会变大,还有一个是效率问题,纹波控制在50mV,问题不大。跟手册里面算的是一样的算法,如果是1.5V,0.5VDDQ=0.75,如果是34.3的导通电阻的话,0.75/34.3=21.86mA≈21.9mA,

内存

内存

以镁光的DDR为例,芯片手册里面也是明确了,我们可以看一下

内存

我们以X16,16位宽的芯片为例,其实也差不了多少mA的,把这两页算完就基本差不多了,一个是J版本的,一个是G版本,我们以-J为例,位宽是16的DDR-1600,算完大概是965mA,差不多是1A了,所以对于VDDQ或者VDD,通常他们是连在一起的,所以按照1.5A余量设计

内存

内存

内存

所以

① 0.75V是实打实的静态功耗,因为你不管是电流是正还是负,都经过电阻了所以0.5A是合理的

② 对于VDDQ/VDD,实际工作时,信号切换,有交流效应1.5V/1A,1.5W不一定能跑满的,所以按照1A来设计是没什么大问题的

五、PCB设计

等长和阻抗匹配

① 同组的走线,要做等长处理,数据线20mil以内,地址线50mil以内

② 数据线必须同组同层,这是我们经常听到的概念,同组同层是针对数据线的,意思就是说走在同一层,它的传播路径是一样的,相同的长度,所对应的传播时间是一样的,有人就会反问,如果我走在不同的层,它的传播环境也一样,能不能走在不同层,当然可以,但是你能保证不同的层,传播环境能一样吗?数据线的传输速率比较高,允许的长度差值比较小,所以我们要同组同层。

③ 地址线也最好同组同层,由于地址线允许的长度差值较大,你走在不同的层,由于传播环境所带来的影响,带来的时序差值,也会在我们的范围内,所以等长的时候做的好一点,就可以满足我们的要求,由于地址线飞线很多,你在同一层,很多时候,客观原因没有空间,你也没有办法连上,所以我们的地址线就可以走在不同的层,第一个是允许的范围较大,第二个原因,你想在同一层你也没有空间

④ 匹配好终端电阻:单端50欧姆差分100欧姆

⑤ 3W原则,最长的线

⑥ 差分线要做包地处理

内存

数据组(DQ, DQS, DM):这是最关键的组。每个字节(Byte Lane,包含8位DQ、1位DM和1对DQS)内的所有信号线必须在同一层布线,组内等长要求极为严格,通常建议误差控制在±5mil(约±0.8ps)以内。DQS是数据选通信号,组内所有DQ和DM信号都要以它为时序参考。

地址/命令/控制组:这些信号由FPGA发出,DDR3颗粒接收,通常采用 Fly-by拓扑进行布线(而非简单的T型或星型),以减少stub(分支短线)的影响并改善多负载情况下的信号质量。这些信号需要以CK(时钟)为参考进行等长,误差控制可放宽,例如±25mil以内。务必确保CK信号在末端通过电阻(通常100Ω差分)端接。

端接(Termination)

ODT(片内终端):DDR3支持ODT,在写操作时由DDR3颗粒启用,在读操作时由FPGA控制器启用(如Xilinx的DCI技术),能有效抑制反射。

VTT端接:地址、命令、控制线在Fly-by拓扑的最远端需要使用VTT(约为VDDQ的一半,即0.75V)电源进行端接,端接电阻值通常为40Ω到60Ω。VTT电源需要强大的去耦(如每4个端接电阻一个1μF电容)。

参考平面与跨分割:确保所有高速信号线下方有完整的参考平面(优选GND)。严禁信号线跨电源平面分割区域,否则会导致回流路径不连续,严重破坏信号完整性

内存

六、DDR3布线类型

DDR布线类型:

T型拓扑(适合新手入门)

优点:

布线对称性强,时钟/地址信号同时到达所有颗粒;

无需主控支持读写平衡,调试简单;

适合低频场景(≤1GHz)和颗粒少(≤4片)的板子。

缺点:

绕等长耗时!分支多→布线空间要求高;

高频信号衰减快,1GHz以上性能暴跌;

颗粒多了?直接劝退。

内存

Fly-BY拓扑(高频大神首选)

优点:

布线灵活!主干串联,省空间;

支持高频(轻松跑1.6GHz+;

颗粒再多也不怕,堆8片照样稳。

缺点:

信号到达时间不一致→需主控支持Write Leveling;

末端必须加端接电阻(50Ω上拉Vtt);

内存

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分