作者:刘洪涛,华清远见嵌入式学院讲师。
SDRAM的工作原理、控制时序、及相关控制器的配置方法一直是嵌入式系统学习、开发过程中的一个难点。掌握SDRAM的知识对硬件设计、编写系统启动代码、提高系统存取效率、电源管理都有一定的意义。本文想通过:
1.SDRAM的工作原理。
2.HY57V561620 SDRAM介绍。
3.S3C2410和HY57V561620的接线方法。
4.S3C2410 SDRAM控制器的配置方法。
5.SDRAM控制时序分析
这5个方面来帮助初学者了解SDRAM。文章分为2篇,第1篇讲解前3个知识点,第2篇讲解后2个。
一、SDRAM的工作原理
SDRAM之所以成为DRARM就是因为它要不断进行刷新(Refresh)才能保留住数据,因此它是DRAM最重要的操作。
那么要隔多长时间重复一次刷新呢?目前公认的标准是,存储体中电容的数据有效保存期上限是64ms(毫秒,1/1000秒),也就是说每一行刷新的循环周期是64ms。这样刷新速度就是:行数量/64ms。我们在看内存规格时,经常会看到4096 Refresh Cycles/64ms或8192 Refresh Cycles/64ms的标识,这里的4096与8192就代表这个芯片中每个Bank的行数。刷新命令一次对一行有效,发送间隔也是随总行数而变化,4096行时为15.625μs(微秒,1/1000毫秒),8192行时就为7.8125μs。HY57V561620为8192 refresh cycles / 64ms。
SDRAM是多Bank结构,例如在一个具有两个Bank的SDRAM的模组中,其中一个Bank在进行预充电期间,另一个Bank却马上可以被读取,这样当进行一次读取后,又马上去读取已经预充电Bank的数据时,就无需等待而是可以直接读取了,这也就大大提高了存储器的访问速度。
为了实现这个功能,SDRAM需要增加对多个Bank的管理,实现控制其中的Bank进行预充电。在一个具有2个以上Bank的SDRAM中,一般会多一根叫做BAn的引脚,用来实现在多个Bank之间的选择。
SDRAM具有多种工作模式,内部操作是一个复杂的状态机。SDRAM器件的引脚分为以下几类。
(1)控制信号:包括片选、时钟、时钟使能、行列地址选择、读写有效及数据有效。
(2)地址信号:时分复用引脚,根据行列地址选择引脚,控制输入的地址为行地址或列地址。。
(3)数据信号:双向引脚,受数据有效控制。
SDRAM的所有操作都同步于时钟。根据时钟上升沿控制管脚和地址输入的状态,可以产生多种输入命令。
模式寄存器设置命令。
激活命令。
预充命令。
读命令。
写命令。
带预充的读命令。
带预充的写命令。
自动刷新命令。
自我刷新命令。
突发停命令。
空操作命令。
根据输入命令,SDRAM状态在内部状态间转移。内部状态包括模式寄存器设置状态、激活状态、预充状态、写状态、读状态、预充读状态、预充写状态、自动刷新状态及自我刷新状态。
SDRAM支持的操作命令有初始化配置、预充电、行激活、读操作、写操作、自动刷新、自刷新等。所有的操作命令通过控制线CS#、RAS#、CAS#、WE#和地址线、体选地址BA输入。
1、行激活
行激活命令选择处于空闲状态存储体的任意一个行,使之进入准备读/写状态。从体激活到允许输入读/写命令的间隔时钟节拍数取决于内部特征延时和时钟频率。HY57V561620内部有4个体,为了减少器件门数,4个体之间的部分电路是公用的,因此它们不能同时被激活,而且从一个体的激活过渡到另一个体的激活也必须保证有一定的时间间隔。
2、预充电
预充电命令用于对已激活的行进行预充电即结束活动状态。预充电命令可以作用于单个体,也可以同时作用于所有体(通过所有体预充电命令)。对于猝发写操作必须保证在写入预充电命令前写操作已经完成,并使用DQM禁止继续写入数据。预充电结束后回到空闲状态,也可以再次被激活,此时也可以输入进入低功耗、自动刷新、自刷新和模式设置等操作命令。
预充电中重写的操作与刷新操作一样,只不过预充电不是定期的,而只是在读操作以后执行的。因为读取操作会破坏内存中的电荷。因此,内存不但要每64ms刷新一次,而且每次读操作之后还要刷新一次。
3、自动预充电
如果在猝发读或猝发写命令中,A10/AP位置为“1”,在读写操作完成后自动附加一个预充电动作。操作行结束活动状态,但在内部状态机回到空闲态之前不能给器件发送新的操作命令。
4、猝发读
猝发读命令允许某个体中的一行被激活后,连续读出若干个数据。第一个数据在经过指定的CAS延时节拍后呈现在数据线上,以后每个时钟节拍都会读出一个新的数据。猝发读操作可以被同体或不同体的新的猝发读/写命令或同一体的预充电命令及猝发停止命令中止。
5、猝发写
猝发写命令与猝发读命令类似,允许某个体中的一行被激活后,连续写入若干个数据。第一个写数据与猝发写命令同时在数据线上给出,以后每个时钟节拍给出一个新的数据,输入缓冲在猝发数据量满足要求后停止接受数据。猝发写操作可以被猝发读/写命令或DQM数据输入屏蔽命令和预充电命令或猝发停止命令中止。
6、自动刷新
由于动态存储器存储单元存在漏电现象,为了保持每个存储单元数据的正确性,HY57V561620必须保证在64ms内对所有的存储单元刷新一遍。一个自动刷新周期只能刷新存储单元的一个行,每次刷新操作后内部刷新地址计数器自动加“1”。只有在所有体都空闲(因为4个体的对应行同时刷新)并且未处于低功耗模式时才能启动自动刷新操作,刷新操作执行期间只能输入空操作,刷新操作执行完毕后所有体都进入空闲状态。该器件可以每间隔7.8μs执行一次自动刷新命令,也可以在64ms内的某个时间段对所有单元集中刷新一遍。
7、自刷新
自刷新是动态存储器的另一种刷新方式,通常用于在低功耗模式下保持SDRAM的数据。在自刷新方式下,SDRAM禁止所有的内部时钟和输入缓冲(CKE除外)。为了降低功耗,刷新地址和刷新时间全部由器件内部产生。一旦进入自刷新方式只有通过CKE变低才能激活,其他的任何输入都将不起作用。给出退出自刷新方式命令后必须保持一定节拍的空操作输入,以保证器件完成从自刷新方式的退出。如果在正常工作期间采用集中式自动刷新方式,则在退出自刷新模式后必须进行一遍(对于HY57V561620来说,8192个)集中的自动刷新操作。
8、时钟和时钟屏蔽
时钟信号是所有操作的同步信号,上升沿有效。时钟屏蔽信号CKE决定是否把时钟输入施加到内部电路。在读写操作期间,CKE变低后的下一个节拍冻结输出状态和猝发地址,直到CKE变高为止。在所有的体都处于空闲状态时,CKE变低后的下一个节拍SDRAM进入低功耗模式并一直保持到CKE变高为止。
9、DQM操作
DQM用于屏蔽输入输出操作,对于输出相当于开门信号,对于输入禁止把总线上的数据写入存储单元。对读操作DQM延迟2个时钟周期开始起作用,对写操作则是当拍有效。
HY57V561620命令表如下图所示:
二、HY57V561620 SDRAM介绍
1、HY57V561620的结构
HY57V561620存储容量为4M×4bank×16位(32M字节),工作电压为3.3V,常见封装为54脚TSOP,兼容LVTTL接口,支持自动刷新(Auto-Refresh)和自刷新(Self-Refresh),16位数据宽度。
HY57V561620引脚分布如图2-1所示。
HY57V561620引脚信号描述
更具体的内容可参考HY57V561620的用户手册。
三、S3C2410和HY57V561620的接线方法
华清远见教学用的S3C2410开发板上使用的SDRAM的型号是HY57561620。规格是:
4Banks*4M*16Bit。采用两片SDRAM组成32位64M的内存空间。
1、确定BA0、BA1的接线
在S3C2410的Table 5-2. SDRAM Bank Address Configuration给出了SDRAM接线的参考方法。
上表中各段含义及和我们平台的对应:
Bank Size: 每个Bank的大小 (HY57561620是4M*16=64MB)Bus Width: 总线宽度 (两颗HY57561620,32位)
Base Component:个体容量 (256Mb)
Memory Configration:内存配置 ((4M*16*4banks)*2ea )
所以Bank Address对应A[25:24],此处确定了HY57561620的BA0和BA1和S3C2410之间的接线。
2、确定其它接线
上图是S3C2410手册中给出的参考接线,通过这个图可以确定HY57561620和S3C2410之间除BA0、BA1的所有其它接线。本例中,详细的接线方法如“接线原理图”小节。
本人注:这个截图应该错了,BA0和BA1对应的应该是A24和A25!
3、接线原理图
引脚描述如下:
nSRAS:SDRAM行地址选通信号
nSCAS:SDRAM列地址选通信号
nGCS6:SDRAM芯片选择信号(选用Bank6作为sdram空间,也可以选择Bank7)(本人注:2440手册用的是nGCS0)
nWBE[3:0]:SDRAM数据屏蔽信号
SCLK0[1]:SDRAM时钟信号
SCKE:SDRAM时钟允许信号
DA
ADDR[2:14]:行列地址信号
ADDR[25:24]:bank选择线
四、S3C2410 SDRAM控制器的配置方法
在系统使用SDRAM之前,需要对S3C2410X的存储器控制器进行初始化。其中对与SDRAM(Bank6)相关的寄存器进行了特殊的设置,以使SDRAM能够正常工作。由于C语言程序使用的数据空间和堆栈空间都定位在SDRAM上,因此,如果没有对SDRAM(Bank6)的正确初始化,系统就无法正确启动。下面介绍与SDRAM相关的寄存器设置。
1、BWSCON寄存器
BWSCON寄存器主要用来设置外接存储器的总线宽度和等待状态。在BWSCON中,除了Bank0,其他7个bank都各对应4个相关位的设置,分别为STn,WSn和DWn。这里只需要对DWn进行设置,例如SDRAM(Bank6)采用32位总线宽度,因此,DW6=10,其他2位采用缺省值。BWSCON寄存器在Bank6上的位定义如表4-1所示。
表4-1 BWSCON寄存器在Bank6上的位定义
BWSCON | 位 | 描述 | 初始化状态 |
ST6 | 27 | 这个位决定SRAM在Bank6上是否采用UB/LB | 0 |
WS6 | 26 | 这个位决定Bank6的WAIT状态 | 0 |
DW6 | 25~24 | 这2位决定Bank6的数据总线宽度 | 0 |
2、BANKCONn寄存器的设置
S3C2410X有8个BANKCONn寄存器,分别对应着Bank0~Bank7。由于Bank6~Bank7可以作为FP/EDO/SDRAM等类型存储器的映射空间,因此与其他bank的相应寄存器有所不同,其中MT位定义了存储器的类型。BANKCONn寄存器在Bank6和Bank7上的位定义如表4-2所示。
表4-2 BANKCONn寄存器在Bank6和Bank7上的位定义
BANKCONn | 位 | 描述 | 起始状态 |
MT | 16~15 | 这2位决定了Bank6和Bank7的存储器类型 | 11 |
MT的取值又定义该寄存器余下几位的作用。当MT=11(即SDRAM型存储器)时,BANKCONn寄存器余下的几位定义如表4-3所示。
表4-3 BANKCONn寄存器在MT=11时的相关位定义
本人注:原截图无法显示,此处为本人注解。
Memory Type = SDRAM [MT=11](4-bit)
Trcd [3:2] RAS to CAS delay 00=2clocks 01=3clocks 10=4clocks 初始值:10
SCAN [1:0] Column address number 00=8-bit 01=9-bit 10=10-bit 初始值:00
Trcd是从行使能到列使能的延迟,根据S3C2410X的HCLK频率(100M)及HY57V561620T-H的特性(见下图),此项取01,即3CLKS。SCAN为列地址线数量,此项根据HY57V561620特性取01,即9位(A0~A8)。
3、REFRESH寄存器
REFRESH寄存器是DRAM/SDRAM的刷新控制器。位定义如表4-4所示。
表4-4 REFRESH寄存器位定义
4.BANKSIZE寄存器
表4-5 BANKSIZE寄存器定义
BANKSIZE | 位 | 描述 | 初始状态 |
BURST_EN | [7] | ARM 内核猝发操作使能 | 0 |
保留 | [6] | 不使用 | 0 |
SCKE_EN | [5] | SCKE 使能控制 | 0 |
SCLK_EN | [4] | 只有在SDRAM访问周期期间,SCLK才使能,这样 | 0 |
保留 | [3] | 未用 | 0 |
BK76MAP | [2:0] | BANK6/7的存储空间分布 | 010 |
初始化时,BURST_EN可以取0或1,为了提高效率,最好设置为1。SCKE_EN设置为1。SCLK_EN设置为1。BK76MAP设置为2。
5、MRSR寄存器
MRSR寄存器有2个,分别对应MRSRB6和MRSRB7,对应着Bank6和Bank7。见表4-6。
表4-6 MRSRn寄存器定义
此寄存器S3C2410只允许CL可以设置,参照HY57V561620T-H手册,取011,即3CLKs。
猝发长度的具体值在程序中没有给出,根据后面触发时序猜测应该是8,HY57V561620T支持1、2、4、8、page猝发长度。
参照前面的HY57V561620命令表,写Mode寄存器用的是Mode register命令。其中的OP CO
注意:当代码在SDRAM中运行时,绝不能够重新配置MRSR寄存器。
五、SDRAM的控制时序分析
下面列出SDRAM的状态机及几种SDARM控制命令的时序。大家掌握了以后可以试着分析其它的命令时序。
1、SDRAM的状态机
SDRAM的完整状态机由多个状态构成,且状态转移是非随机的(如图5-1所示)。
正是如此众多的状态及其复杂的转换关系,导致SDRAM的控制较为复杂。通常FPGA开发人员在设计SDRAM控制器IP时需要详细了解这些状态机的过程。而一般开发人员以了解为主。
图5-1 SDRAM状态机
下面将结合上图及SDRAM的指令来分析SDRAM的控制时序
2、SDRAM single模式读时序
SDRAM初始化主要是由设置S3C2410 SDRAM控制器的模式寄存器(MRSR)完成的。主要设定了SDRAM的burst长度、CAS延时时间、突发类型等。然后就可以进行读写操作了。
下图是S3C2410以single方式读SDRAM时的时序。
对照HY57V5620的命令表,列出single read 命令实现过程。
CLK | SCKE | A10/AP | nGCSx | nSRAS | nSCAS | nWE | 命令 | 备注 |
1 | 1 | X | 1 | 1 | 1 | 1 | 空操作(NOP) |
|
2 | 1 | 0 | 0 | 0 | 1 | 0 | 预充电选定bank(PRE) | Trp=2 |
3 | 1 | X | 1 | 1 | 1 | 1 | 空操作 |
|
4 | 1 | X | 0 | 0 | 1 | 1 | Bank激活命令(ACT) | Trcd=2 |
5 | 1 | X | 1 | 1 | 1 | 1 | 空操作 |
|
6 | 1 | 0 | 0 | 1 | 0 | 1 | 读操作(READ) | Tcl=3 |
7 | 1 | X | 1 | 1 | 1 | 1 | 空操作 |
|
8 | 1 | X | 1 | 1 | 1 | 1 | 空操作 |
|
9 | 1 | X | 1 | 1 | 1 | 1 | 空操作 | 数据有效 |
3、SDRAM burst模式读时序
对照HY57V5620的命令表,列出burst read 命令实现过程。
CLK | SCKE | A10/AP | nGCSx | nSRAS | nSCAS | nWE | 命令 | 备注 |
1 | 1 | X | 1 | 1 | 1 | 1 | 空操作(NOP) |
|
2 | 1 | 0 | 0 | 0 | 1 | 0 | 预充电选定bank(PRE) | Trp=2 |
3 | 1 | X | 1 | 1 | 1 | 1 | 空操作 |
|
4 | 1 | X | 0 | 0 | 1 | 1 | Bank激活命令(ACT) | Trcd=2 |
5 | 1 | X | 1 | 1 | 1 | 1 | 空操作 |
|
6 | 1 | 0 | 0 | 1 | 0 | 1 | 读操作(READ) | Tcl=2 |
7 | 1 | 0 | 0 | 1 | 0 | 1 | 读操作(READ) |
|
8~13 | 1 | 0 | 0 | 1 | 0 | 1 | 读操作(READ) | 数据有效 |
14~15 | 1 | X | 1 | 1 | 1 | 1 | 空操作 | 数据有效 |
4、SDRAM Self Refresh时序
SDRAM 的Self Refresh功能在电源电源管理时经常使用,如:在主控器进入sleep状态时,会先让SDRAM工作在Self Refresh状态。下图为S3C2410发出Self Refresh命令时的时序图。
对照HY57V5620的命令表,列出进入Self Refresh的过程。
CLK | SCKE | A10/AP | nGCSx | nSRAS | nSCAS | nWE | 命令 | 备注 |
1 | 1 | X | 1 | 1 | 1 | 1 | 空操作(NOP) |
|
2 | 1 | 1 | 0 | 0 | 1 | 0 | 预充电所有bank(PRE) | Trp=2 |
3 | 1 | X | 1 | 1 | 1 | 1 | 空操作 |
|
4 | 0 | X | 0 | 0 | 0 | 1 | Self Refresh命令(REFS) | 结合CKE的真值表 |
5 | 1 | X | 1 | 1 | 1 | 1 | 空操作 |
|
5、S3C2410 BUS Request时SDRAM控制时序
我以前在做一个项目时涉及到两个主控器共享一个SDRAM的情况。现象是另一个主控器可以通过BUS Request功能获取到总线的控制权。当S3C2410的总线控制权被获取后,SDRAM控制不会再发出控制时钟信号。但SDRAM并没有因为失去时钟而丢失数据。猜想一定是S3C2410在BUS Request时让SDRAM进入自刷新状态(就和S3C2410睡眠前要让SDRAM进入自刷新状态一样)、POWER DOWN状态、或者SUSPEND状态。下面就根据S3C2410 BUS Request时SDRAM控制时序图去确认一下到底是哪种。
对照HY57V5620的命令表,列出S3C2410 BUS Request时SDRAM时序过程。
CLK | SCKE | A10/AP | nGCSx | nSRAS | nSCAS | nWE | 命令 | 备注 |
1 | 1 | X | 1 | 1 | 1 | 1 | 空操作(NOP) |
|
2 | 1 | 0 | 0 | 0 | 1 | 0 | 预充电(PRE) | Trp=2 |
3 | 1 | X | 1 | 1 | 1 | 1 | 空操作 |
|
4 | 1 | X | 0 | 0 | 1 | 1 | Bank激活命令(ACT) | Trcd=2 |
5 | 1 | X | 1 | 1 | 1 | 1 | 空操作 |
|
6 | 1 | 0 | 0 | 1 | 0 | 1 | 读操作(READ) | Tcl=2 |
7 | 1 | X | 1 | 1 | 1 | 1 | 空操作 |
|
8 | 1 | X | 1 | 1 | 1 | 1 | 空操作 |
|
9 | 1 | X | 1 | 1 | 1 | 1 | 空操作 |
|
10 | HZ | HZ | HZ | HZ | HZ | HZ | 进入Clock suspend | Note 1 |
Note1:在第10个时钟周期时,SKE从1变为’HZ’(高阻)。我想此时SCKE从1变为高阻对于SDRAM来说相当于从1->0吧,看了一遍HY57V5620手册,这个想法没有得到确认。但也只能这么理解了,不然后面都说不通了。我想之所以变为高阻而不是低电平,是因为S3C2410要放弃自己对总线控制。
结合HY57V5620手册分析一下此时SDRAM会进入什么状态。
下图是CKE Enable(CKE) 真值表。
在第10个时钟周期时,SDRAM处于行激活状态。此时SCKE由1->0, 根据真值表可以得出系统会进入Clock suspend状态
六、总结
本文分析了SDRAM的工作原理、介绍了HY57V561620及其与S3C2410的接线原理、S3C2410 SDRAM控制器的配置方法、及部分SDRAM的控制时序分析。有些地方理解的不够深刻,欢迎大家指正。