一、从SDRAM到DDR3

  • SDRAM内部结构
  • SDRAM操作时序

要想知道DDR3 SDRAM,我们首先来说一下什么是SDRAM,因为DDR SDRAM 是在 SDRAM 技术的基础上发展改进而来的。
SDRAM:(Synchronous Dynamic Random Access Memory),同步动态随机存储器。同步是指其时钟频率与CPU前端总线的系统时钟频率相同,并且内部的命令的发送与数据的传输都以它为基准;动态是指存储阵列需要不断的刷新来保证数据不丢失随机是指数据不是线性依次存储,而是自由指定地址进行数据的读写。
下面简单介绍以下CPU/FPGA与SDRAM通信的基本常识:
**物理 Bank:传统内存系统为了保证 CPU 的正常工作,必须一次传输完 CPU 在一个传输周期内所需要的数据。而CPU 在一个传输周期能接受的数据容量就是 CPU 数据总线的位宽,单位是 bit(位)。当时控制内存与 CPU之间数据交换的北桥芯片也因此将内存总线的数据位宽等同于 CPU 数据总线的位宽,**而这个位宽就称之为物理 Bank(Physical Bank)的位宽。物理位宽简称芯片位宽。
**芯片位宽:**每一片SDRAM缓存芯片本身的位宽。
当物理bank(p_bank)的位宽为64位而SDRAM的芯片位宽位16位时怎么办呢?可以将四个SDRAM放在一起使用。 只要总的芯片位宽等于cpu位宽相同就可以正常工作。

SDRAM内部结构:

逻辑 Bank:( Logical Bank,下文简称 L-Bank )SDRAM内部存储空间划分的片区。

dmabuff CPU等GPU 同步机制_数据


这里我们假设手机拿到的SDRAM的容量为32M8bit,那么一般SDRAM分为4个BANK,所以每个BANK大小为8M8bit,其中的8bit指的就是大矩阵中每一个小方格代表的容量大小,也即芯片位宽。

下图给出了每个小方格内部结构的示意图:

dmabuff CPU等GPU 同步机制_数据_02


当我们想选中某行某列的位置进行读取或写入,那么我们就打开他的行列地址线进行充电或者放电,充电为写入,放电为读出。写入直接从行地址线那里进行写入,读出则经过刷新放大器将电容中的信号进行放大通过下面的位线进行读出。

刷新放大器还有个功能,叫数据回写,可以在读完数据之后在写入,不会使得数据读完之后就丢失。同时数据存储时间过长,电容容易放电,还起到一个刷新充电的作用。

dmabuff CPU等GPU 同步机制_内存结构_03


**bank0-3存储阵列:**就是四个存储矩阵。

**控制时钟:**是一对差分时钟,

**控制命令:**有CS、WE、CAS、RAS四个:这四个信号放在之后进行讲解。

**模式寄存器:**上面两个信号都接入到模式寄存器中,此模式寄存器称为逻辑控制单元,在SDRAM上电稳定之后,需要通过控制命令对模式寄存器进行控制,从而控制SDRAM采用哪一种模式去工作。

刷新计数器:控制SDRAM进行刷新

**行地址复用器:**我们有4个BANK,每一个BANK都有很多行,每一行都引出一根线较为浪费,所以我们的4个BANK共用一个行地址总线。具体多少根取决于容量大小。

**控制逻辑(L-BANK):**主要是配合行列地址线,在指定的BANK进行读取或写入数据。

**地址线:**是一个12位地址寄存器,BA0、BA1控制BANK选择。

**列地址计数与锁存器、列地址解码器:**主要控制列地址选择。

**I\O门控:**选择好写入或读取的数据要经过这里来输入、输出,这里有一个数据掩码,其功能是掩盖那些我们不想读、写进去的数据,比如要写进去4个数据,但是其中一个我们不想要,可以通过数据掩码进行操作,其阻止写的原理是控制I\O门控进行的,而阻止读是在数据输出寄存器进行的。

SDRAM操作时序:

dmabuff CPU等GPU 同步机制_数据_04


如上图就是一个SDRAM的原理图,下表分析了各个引脚的类型及描述:

dmabuff CPU等GPU 同步机制_数据_05


下图为SDRAM操作时序:

dmabuff CPU等GPU 同步机制_sdram_06


**NOP:**不需要进行任何操作,第一个NOP对应没有初始化时候的NOP指令,第二个是初始化之后没有操作的指令。

**ACTIVE:**激活指令,用来激活行与BANK,注意CS#\CAS#\RAS#\WE#均为低电平有效。

**READ:**读指令,注意读读指令是与列激活指令一起发送的。此时也要发送BANK。

**WRITE:**写指令,注意读写指令是与列激活指令一起发送的。此时也要发送BANK。

**BURST TERMINATE:**指令停止,可以打断读写。

**PRECHARGE:**预充电,与刷新一起使用,读写完成之后要开启下一行,中间要对指定行进行预充电。A10为高,对所有BANK的该行进行充电,A10为低,对指定BANK的改行进行充电(由BA0、BA1指定)。

**AUTO REFRESH:**自刷新,自刷新有一定的周期性。在CKE为高时。

**SELF REFRESH:**自刷新,自刷新有一定的周期性。在CKE为低时。

**LOAD MODE REGISTER:**模式寄存器加载。

**Write enable\output enable:**信号屏蔽

**Write inhibit\output High-Z:**信号屏蔽

Tips:

1、CKE是高电平使能信号,他使能SDRAM才能正常工作。

2、A10为高的时候为自动预充电,这时候不需要手写代码去刷新,A10为低电平仅仅只会对指定bank的行进行预充电。

3、A[-:-]既提供行地址,也提供列地址。

4、BURST TERMINATE指令打断读写之后不会再进行了,被打断即停止。可以配合页写,从而生成任意长度突发。

5、向SDRAM写入数据时候几乎无延迟,读数据有一定的延迟。

下面具体介绍SDRAM的操作指令:

ACTIVE:

dmabuff CPU等GPU 同步机制_fpga_07


READ:

dmabuff CPU等GPU 同步机制_内存结构_08


A10最好为高电平,自动与刷新

WRITE:

dmabuff CPU等GPU 同步机制_fpga_09


PRECHARGE:

当不使用自动预充电时候(A10为低电平)则需要手动预充电,手动预充电指令如下:

dmabuff CPU等GPU 同步机制_ddr_10


初始化时序:

dmabuff CPU等GPU 同步机制_ddr_11


模式寄存器配置方法:

dmabuff CPU等GPU 同步机制_fpga_12


**Burst length:**配置突发长度

**Burst type:**突发类型

**CAS Letency:**简称CL,只在读数据时候有,此处配置读数据延迟,单位是周期。

其他配置按默认来,基本功能是用不到的。

下图主要意思是在发送激活指令之后,需要等待一个tRCD,再去发送读写指令。

dmabuff CPU等GPU 同步机制_ddr_13


下图意为突发连续4读指令时序:

dmabuff CPU等GPU 同步机制_ddr_14


下图意为连续一个一个读指令。

dmabuff CPU等GPU 同步机制_ddr_15


下图意为连续写(长度为2):

dmabuff CPU等GPU 同步机制_ddr_16


可以看到,写是没有延迟的,写信号一旦给出,数据线上就有了写信号。

下图意为随机写:

dmabuff CPU等GPU 同步机制_内存结构_17


以上即为基本的SDRAM指令时序。