一、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);

全部0条评论
快来发表一下你的评论吧 !