分类: 嵌入式
2014-05-14 16:41:53
1. SDRAM的工作原理
1.1 SDRAM概述
SDRAM:Synchronous Dynamic Random Access Memory,同步动态随机存储器。同步是指其时钟频率(CLK)与CPU的AHB总线时钟频率(HCLK)相同,并且内部的命令的发送于数据的传输都以 它为基准;动态是指存储阵列需要不断的刷新来保证数据不丢失;随机是指数据不是线性依次存储,而是自由指定地址进行数据的读写。
1.2 SDRAM的相关概念
⑴bank
一个SDRAM芯片一般由4个bank组成,下图是K4M51163-BG75功能结构图的关于bank的部分
上图中间可见K4M51163-BG75有4个bank,一个bank的大小是8M*16bite,8M表示这个bank有8M个存储单元,而每个单元可以存储16bit的数据。SDRAM的基本存储单位就是存储单元,最小的存储单位就是bit。
⑵位宽
上面提到一个存储单元包含16bit,这就是bank的位宽,也是一个SDRAM芯片的位宽,位宽表示每个传输周期(在这里是指送进CLK端的时钟的一个周期)传送的数据量(16bit)。
⑶SDRAM的容量
SDRAM的容量就是指存储单元的数量,计算公式如下
SDRAM的容量=bank的数量*(行数*列数)
在这里bank的数量是4个,而行数及列数的相关说明见下图
可以行数是用A0~A12总共13根地址线表示,可表达的行数达2的13次方(8192);列数是用A0~A9总共10根地址线来表示,可表达的列数达2的10次方(1024),同时看出行和列地址线是分时复用的。
1.3 SDRAM的寻址原理
SDRAM的内部是一个存储阵列,阵列就如何表格一样,和表格的检索原理一样,先指定一个行row,再指定一个列column,这样我们就可以准确 找到所需要的单元格了,这就是SDRAM芯片寻址的基本原理。对于内存,这个单元格被称为存储单元,那么这个表格(存储阵列)叫什么呢?它就是bank。 我们的系统是采用两片K4M51163-BG75,那么这两片K4M51163-BG75是如何工作的呢?见下图
通过nSCS0来选择当前是哪个SDRAM芯片在工作,选定了指定的SDRAM芯片之后,通过BA0和BA1来选择特定的bank,选择了特定的bank,接着就选择特定行,然后在选择列,这样就可以找到特定的存储单元了。
注:SDRAM一次传输一个存储单元的数据,也就是16bit的数据,通过DQ0~DQ15读出或写入数据,这里的读出就是存储电容的放电,而写入就是存储电容的充电,每一位对应的数据保存在存储电容中,也就是一位能表示的高低电平,下图是有助于理解这点
2 K4M51163PG-BG75
2.1 SDRAM的引脚
SDRAM要想工作,必须要于内存控制器有所联系,同时对于一个电气元件,电源供应也是必不可少的,而且数据的传输要有一个时钟来同步数据的传送。因此电源与时钟引脚是必须的,那么还需要哪些控制引脚呢?
I:首先,我们知道内存控制器要先确定选择系统使用的两个SDRAM芯片的哪一个,然后才能对被选定的芯片进行寻址操作。因此要有一个片选的信号,它一次选择一个SDRAM芯片。
II:接下来就是对所选择的芯片进行bank的寻址,目前SDRAM中bank的数量最高为4个,所以需要两个bank的地址信号。
III:然后就是要对被选择的bank进行行和列(存储单元)寻址,其中所需要的地址线数量根据SDRAM芯片容量大小及组织结构分别设计了,但在相同容量下,行数不变,只有列数会根据位宽的变化而变化,位宽越大,列数越小,因为所需的存储单元减少了。
IV:找到存储单元后,就要把这个单元的数据读出或者写入,那么肯定要有与位宽相同的数据I/O通道才行,所以要有相应数量的数据引线。
2.1 K4M51163PG-BG75的功能结构图
2.2 K4M51163PG-BG75的引脚
引脚图如下
下面详细描述这些pin
CLK
系统时钟,S3C2443的mobile控制器的SDRAM时钟引脚连接这个引脚,这个clock引脚的作用就是用于同步数据传输,就是以这个时钟信号作为数据传输的触发参考。K4M51163PG-BG75关于CLK周期时间的要求如下图所示
又结合下图
而S3C2443是通过HCLK给SDRAM芯片提供时钟信号的,见下图
我们系统HCLK=400Mhz/3=133Mhz,所以应该去CAS latency=3,从而知道对一个CLK周期时间的要求就是>=7.5ns,有HCLK=133Mhz,可以算出HCLK的一个时钟周期时 间=1/133Mhz=7.5188ns>7.5ns,可知当前的HCLK可以提供满足K4M51163PG-BG7的CLK。
/CS
片选信号,在使用多个SDRAM芯片时使用,用于选择某个时间哪个SDRAM芯片工作,S3C2443的nSCS0和这个引脚连接,mobie控制器功过控制这根信号线来选择我们系统采用两片SDRAM中的任何一片。
CKE
时钟有效信号线,和S3C2443的SCKE连接,mobile控制器功过这个信号线来使CLK有效。
A0~A12
行地址线,用于选择每个bank的行,也即行激活。
A0~A9
列地址线,用于选择每个bank的列,也即选择存储单元格,行和列地址是复用的。
BA0~BA1
Bank的选择地址,因为此SDRAM芯片有4个bank,所以需要两位的bank地址线才能选择到这4个bank。
/RAS
行地址选通,在这个信号线为低电平时,地址线A0~A12送出来的具体的行地址才有实际的意义,也就是才能选通具体的行
/CAS
列地址选择,在这个信号线为低电平时,地址线A0~A9送出来的具体的列地址才有实际的意义,也就是才能选通具体的列,也及存储单元格。
/WE
写使能,为高电平时,可以读取数据;为低电平时,可以写入数据。
L(U)DQM
数据输入/输出屏蔽,用于在突发传输时。
DQ0~15
数据输入/输出端
2.3 SDRAM的内部基本操作与工作时序
2.3.1 SDRAM芯片的初始化
SDRAM在上电以后必须先对其进行初始化操作,而后才能对其进行其他操作,初始化的操作具体步骤如下:
⑴SDRAM在上电以后至少要等待200us,在等待时间结束后还至少要执行一条空操作指令。
⑵SDRAM执行一条预充电命令后,要执行一条空操作命令,这两个操作会使所有的存储单元进行一次预充电,从而使所有阵列中的器件处于待机状态。
⑶SDRAM至少要执行两条自刷新命令,每一条刷新命令之后,都要执行一条空操作命令,这些操作可使SDRAM芯片内部的刷新及计数器进入正常运行状态,以便SDRAM为模式寄存器编程做好准备。
⑷执行一个MRS(mode register set)命令去初始化mode register(模式寄存器)。
⑸在normal MRS之后,可以执行一个EMRS(extended mode register)命令来实现想要的操作模式。
下图是K4M51163PG-BG75上电之后的操作要求
下面的图是SDRAM初始化过程的大概描述,有助于加强理解
2.3.2 SDRAM行有效
初始化完成后,要像对一个bank中的存储单元进行寻址,首先就要确定行,也即行选通,使之处于激活状态(Active),然后再确定列。我们知道 要确定行,首先要进行片选和bank的定址,这两个动作和行选通可以同时进行,下图是K4M51163PG-BG75的bank和行选通的真值表,也即时 序图
从上图可以看出,在/CS和bank定址的同时,/RAS(行地址选通)也处于有效状态(低电平有效),此时,A0~A12地址线则发送具体的行地 址,共有13个地址线,由于是二进制表示法,所以共有8192个行(2^13=8192),A0~A12的不同二进制数值就确定了具体ideas行地址。 由于行有效的同时也是相应的bank有效,所以行有效也可称为bank有效,根据上图这个表,也可转化为下面类似的时序图,下面这个图可以加强这方面的理 解。
2.3.3 列读写
行地址确定之后,就要对列地址进行寻址了。但是,地址线仍然是行地址所用的A0~A9,在SDRAM中,行地址于列地址是复用的。不过,读/写的命 令是怎么发出来的呢?其实没有一个信号是发送读或写的明确命令的,而是通过芯片的可写状态(/WE)的控制来达到读/写的目的。/WE信号就是一个关键, 在/WE为高低电平时,是读取命令;/WE为低电平时,是写入命令。下图是K4M51163PG-BG75关于列读取的真值表
从上图可知,列寻址信号与读取命令是同时发出的,虽然列地址线与行寻址共用,但CAS(Column Address Strobe,列地址选通)信号则可以区分开行与列寻址的不同,再配合A0~A9来确定具体的列地址,请注意行有效和列寻址命令时RAS和CAS的电平变 化,上图可以转化为类似下面的时序图,可以加强理解
我们知道,在发送列读取命令时必须要有与行有效命令有一个间隔,这个间隔被定义为tRCD,即RAS to CAS Delay(RAS 至CAS延迟),也可以理解为行选通周期,这应该是根据芯片存储阵列电子元件响应时间(从一种状态到另一种状态变化的过程)所制定的延迟,下图是 K4M51163PG-BG75对这个参数的要求
tRCD是SDRAM的一个重要时序参数。广义的tRCD以时钟周期数为单位,比如Trcd=2,就代表延迟周期为两个时钟周期,具体到确切的时 间,则要根据时钟频率CLK(也即S3C2440A送过来的HCLK)而定,又上图可看出tRCD要满足tRCD>=22.5ns,已知 HCLK=400/3Mhz,可算出HCLK的一个时钟周期时间=1/133Mhz=7.5188ns,所以tRCD的时间要求是至少为3个clock, 根据S3C2440A内存控制器相关寄存器BANKCONn的下图描述
可以看出,只要BANKCONn[3:2]位等于01或10,都可以满足tRCD的要求,下图有助于理解tRCD
2.4 数据输出(读取)
在选定列地址后,就已经确定了具体的存储单元,接下来的事情就是数据通过数据I/O通道(DQ0~DQ15)输出到内存总线 (SDATA0~SDATA31,两片SDRAM)上。但是在CAS发出之后,仍要经过一定的时间才能有数据输出,从CAS与读取命令发出到第一笔数据输 出的这段时间,被定义为CL(CAS Latency,CAS潜伏期)。由于CL只在读取时出现,所以CL又被成为读取潜伏期(RL,Read Latency)。CL的单位与tRCD一样,为时钟周期数,具体耗时由时钟频率决定。CL是SDRAM及其重要的一个参数,如果这个参数设置不对,很有 可能使bootloader的eboot不能更新NK,关于这个话题,我打算另外写篇文章来共享我所遇到的问题及解决的办法,下面接下来还是看看 S3C2440A的寄存器MRSR中关于CL的设置
在结合K4M51163PG-BG75 datasheet中相关部分,见下图
可以看出,CL的值应该是选择3,因为我们的HCLK=133Mhz,所以寄存器MRSR[6:4]=011。
请注意,CAS并不是经过CL周期之后才送达存储单元。实际上CAS与RAS一样时瞬间到达的,但CAS的响应时间要更快一些。为什么呢?现在我们 采用的SDRAM芯片位宽是16bit,列数为1024(2^10),那么一个行地址要选通(就是一行中所有的存储体选通,在这里一个存储单元有16个存 储体)16*1024个存储体,而一个列地址值需要选通16个存储体。但存储体中晶体管的反应时间仍会造成数据不可能与CAS在同一个上升沿触发,肯定要 延后至少一个时钟周期。
由于芯片体积的原因,存储单元中的电容容量很小,所以信号要经过放大来保证其有效的识别性,这个放大/驱动工作由Sense AMP负责,一个存储体对应一个Sens AMP通道。
见下图
但它(Sense AMP)要有一个准备时间才能保证信号的发送强度(事前还要进行电压比较以进行逻辑电平的判断),因此从数据I/O总线上有数据输出之前的一个时钟上升沿 开始,数据即已传向Sense AMP,也就是说此时数据已经被触发,经过一定的驱动时间最终传向数据I/O总线进行输出,这段时间称之为tAC (Access Time from CLK,时钟触发后的访问时间)。tAC的单位是ns,对于不同的频率各有不同的明确规定,但必须要小于一个时钟周期,否则会因访问时间过长而使效率降 低。K4M51163PG-BG75对这个参数定义为tSAC,下图
从上图可以知道K4M51163PG-BG75的时钟周期最小为7.5ns,而tSAC的最大值为6ns,这个值小于7.5ns。需要强调的是,每 个数据在读取时都有tAC,包括在连续读取中,只是在进行第一个数据传输的同时就开始了第二个数据的tAC。下图有助于对tAC参数的理解
CL的数值不能超出芯片的设计规范,否则会导致内存的不稳定,甚至不能更新NK和不能正常启动系统,而且它也不能在数据读取前临时更改。CL周期在开机初始化过程中的MRS阶段设置。
2.5 数据输入(写)
数据写入的操作也是在tRCD之后进行的,但此时没有了CL(记住,CL只出现在读取操作中),下图时数据输入和输出的真值表
从图可以看出,数据输入和数据输出的唯一区别就是,在数据输入时,/WE信号有效(低电平有效)。数据信号由SDRAM控制器发出,输入时只需要直 接传到数据输入寄存器(Data input register),然后再由写入驱动器进行对存储电容的充电操作,因此数据可以与CAS同时发送,也就是说写入延迟为0。不过,数据并不是即时地写入存 储电容,因为选通三极管(就如读取时一样)与电容的充电必须要有一段时间,所以数据的真正写入需要一定的周期。
2.6 突发长度
突发(Burst)是指在同一行中相邻的存储单元连续进行数据传输的方式,连续传输所涉及到存储单元(列)的数量就是突发长度(Burst Lengths,简称BL),下图是S3C2440A的关于BL的类型及长度的描述
从上图可看出S3C2440A的内存控制器只支持sequential的BT类型,及只支持1个字节的突发长度,下图是K4M51163PG-BG75支持的BT类型及长度
从上图可知在A3=0且A0~A2均为1时,支持的突发长度是full page(全页),全页突发传输是指bank里的一行中所有存储单元(2^10=1024)从头至尾进行连续传输,不过这种针对芯片的页定义是狭义的,我 们常用的则是广义上的页,我们知道内存系统的每次传输都是以一个SDRAM芯片位宽为单位的(K4M51163PG-BG75的位宽为16bit),而我 们系统是采用两片K4M51163PG-BG75。在每次寻址时,每个SDRAM芯片所得到的bank地址与行地址都是相同的。这样在全页操作中,就等于 对内存系统中这两个SDRAM芯片内同一个bank同一行的所有存储单元读/写,那就是2*2^10=2048个存储单元,这就是广义上的页。
突发传输技术,只要指定其实列地址与突发长度,内存就会一次地自动对后面相应数量的存储单元进行读/写而不需要内存控制器连续地提供列地址。这样, 除了第一笔数据的传输需要若干个周期(主要是之前的延迟,一般是tRC + CL)外,其后每个数据只需要一个周期即可获得,下图有助于理解突出传输
2.7 预充电
由于SDRAM的寻址具有独占性,所以在进行完读写操作后,如果要对同一个bank的另一行进行寻址,就要将原来有效(工作)的行关闭,重新发送行 /列地址。Bank关闭现有工作行,准备打开新行的操作就是预充电(Precharge)。预充电可以通过命令控制,也可以通过辅助设定让SDRAM在每 次读写操作之后自动进行预先充电。实际上,预充电是一种对工作行中的所有存储体进行数据重写,并对行地址进行复位,同时释放sense –AMP,下图是关于预充电的控制真值表图
从上图可看出地址线A10控制着是否进行在读写之后对当前bank自动进行预充电,这就是上文所说的“辅助设定”。而在单独的预充电命令中,A10则控制着是对指定的bank还是所有的bank进行预先充电,前者需要提供bank的地址,后者只需将A10信号置于高电平。
在发出预充电命令之后,要经过一段时间才能允许发送RAS行有效命令打开新的工作行,这个间隔被称为tRP(Precharge command Period,预充电有效周期)。和tRCD、CL一样,tRP的单位也是时钟周期数,K4M51163PG-BG75对这个参数见下图
从上图可看出tPR的最小值是22.5ns,S3C2440A的内存控制器相关部分见下图
为了满足tPR>=22.5ns,而每个clock周期是7.5ns,所以至少需要3个clock,那么只要Trp位的值是01或10都可以提供满足要求的tPR给SDRAM芯片。
2.8 刷新
之所以成为SDRAM,就是因为它要不断进行刷新(Refresh)才能保留住数据,因此它是SDRAM最重要的操作。刷新操作与预充电中重写的操 作一样,都是用sense-AMP先读后写。但为什么有预充电操作还要进行刷新呢?因为预充电是对一个或所有bank中的工作行操作,并且是不定期的,而 刷新则是有固定的周期,依次对所有行进行操作,以保留那些久久没经历重写的存储体中的数据。但与所有bank预充电不同的是,这里的行是指所有bank中 地址相同的行,而预充电中各bank中的工作行地址并不是一定是相同的。
那么要隔多长时间重复一次刷新呢?目前公认的标准是,存储体中电容的数据有效保存期上限是64ms,也就是说每一行刷新的循环周期是64ms。这样的刷新速度就是:行数量/64ms。
K4M51163PG-BG75对这个参数的描述如下图所示
这里的8K实际就是8192(2^13),8k就代表这个芯片中每个bank的行数。刷新命令一次对一行有效,发送间隔也是随着行总数而变化,8192行时就是64ms/80192=7.8125us。
刷新操作分为两种:自动刷新(auto refresh,简称AR)与自刷新(self refresh,简称SR)。不论是何种刷新方式,都不需要外部提供行地址信息,因为这是一个内部的自动操作。对于AR,SDRAM内部有一个行地址生成 器(也称刷新计时器)用来自动的依次生成行地址。由于刷新是针对一行中的所有存储体进行,所以无需列寻址,或则会说CAS在RAS之前有效。所以,AR又 称CBR(CAS Before RAS,列提前于行定位)式刷新。由于刷新涉及到所有的bank,因此在刷新过程中,所有的bank都停止工作,而每次刷新所占用的时间对于不同的 SDRAM芯片的值不同,K4M51163PG-BG75对这个参数描述如下图所示:
可以看出在11(80ns/7.5ns=10)个时钟周期内,所有的工作指令只能等待而无法执行,我们知道每个7.8125us发送一次行刷新命令,也就是说在1041(7.8125us/7.5ns)个时钟周期内,有11个时钟周期是用于等待一行的刷新。
SR则主要用于休眠模式低功耗状态下的数据保存,这方面最著名的应用就是STR(Suspend to RAM,休眠挂起于内存)。在发出AR命令时,将CKE置于无效状态,就进入了SR模式,下图是K4M51163PG-BG75的相关描述
可以看出,当发出AR命令后,如果将CKE置为电平(无效状态),就进入了SR模式,此时不再依靠系统时钟工作,而是根据内部的时钟进行刷新操作, 这部分和系统进入睡眠时的应用有紧密的联系,后面深入学习系统进入睡眠部分时再做总结。在SR期间除了CKE之外的所有外部信号都是无效的(无需外部提供 刷新命令)。