片上系统设计思想与源代码分析
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第5章 SDRAM控制器

本章主要内容

嵌入式系统和PC的“内存”基本上都采用同步动态随机存取存储器(SDRAM),目前SDRAM包括单速率(SDR)、双速率(DDR)和四倍速率(QDR),其基本工作原理都是一样的。本章将详细介绍SDRAM的基本原理,并将给出SDRAM控制器的源代码及其分析。

5.1 SDRAM器件介绍

5.1.1 SDRAM存储单元的工作原理

随机存取存储器(RAM)分为静态RAM和动态RAM两种。静态RAM的每个存储单元需要6个晶体管,如图5-1所示;而动态RAM每个存储单元只有一个晶体管加一个电容,因此静态RAM的存储容量小于动态RAM。静态RAM的优点是接口简单,存取速度较快,适合容量要求不高的场合,而动态RAM适合复杂系统如PC和中高端嵌入式系统中。由于集成电路技术的迅速发展,嵌入式处理器功能越来越强大,因此,更多的需要动态RAM与之配合。简言之,静态RAM和动态RAM两种RAM相比较,静态RAM具有低密度高速度的特点,而动态RAM具有高密度低速度的特点。动态RAM本质上并非为了高速应用而设计,为了改善其访问速度,人们发明了DDR SDRAM和QDR SDRAM,即使如此,读取一个存储单元所需要的预操作也导致SDRAM的CPW(Cycles Per Word)小于SRAM。

图5-1 静态RAM的存储单元结构

如图5-2所示,DRAM依赖于一个由晶体管电容来存储数据。SDRAM的存储单元被安排成二维阵列结构,在读写数据时,首选输入目标存储单元所在的行打开行选通开关,然后输入目标存储单元所在的列从而选中一个字线(Word Line)。在读取时,感知放大器(Sense AMP)将读取的数据放大后输出。在写入时,数据通过另外一端输入,给电容充电或彻底放电。电容充电后的逻辑值为1,放电后的逻辑值为0。每次读取一次,当前逻辑值为1的存储节点的电容就会损失一部分,而在不进行读取时也会自然损失。因此,SDRAM需要进行定时刷新和读取后对刚刚读取的单元的充电,这就是“动态”这两个字的由来。刚刚读取的单元的充电称作预充电。

图5-2 SDRAM存储单元示意图

5.1.2 SDRAM的结构

下面以三星K4S6416 SDRAM为例讲述SDRAM。K4S6416为64M比特,16位宽,即64M/16=4M Words SDRAM。顾名思义,SDRAM是DRAM的一种,因此SDRAM本质上也并非为高速应用设计,而是为满足大容量存储而设计。所以,访问三星K4S6416 SDRAM的4M Words本需要22比特地址,但是这些地址被复用为12比特行地址,10比特列地址。在进行一次SDRAM访问时,先送入行地址,在送入列地址。SDRAM需要进行定时刷新和读取后对刚刚读取的单元的充电。如果将一个大SDRAM分割为若干独立的子部分,这些子部分可以同时进行刷新,从而大大减少定时刷新对SDRAM的数据正常读取的影响。在K4S6416中,将SDRAM分为4个独立的部分,这些部分称作Bank,如图5-3所示。4个Bank的设计将定时刷新所需时间减少到没有Bank的1/4。SDRAM的所有信号与时钟同步,这是“同步”(Synchronus)的由来。

图5-3 三星K4S6416 SDRAM的功能结构图

5.1.3 内存条

通常一个个人计算机系统需要的内存远远大于一个SDRAM的容量,因此,许多SDRAM被组织成内存条,如图5-4所示为Kingston PC133 SDRAM DIMM内存条的图片。该内存有128条数据线。DIMM的英文全文为Double In-line Memory Module,是指内存条电路板与主板插槽的接口有两列引脚,模组电路板两侧的金手指每一侧都对应一列有效引脚。另外还有一种SIMM(Single In-line Memory Module)内存条,虽然电路板两侧都有金手指,但是只有一侧是有用引脚。

图5-4 Kingston PC133 SDRAM DIMM内存条

5.1.4 SDRAM的预充电

每次读、写SDRAM都会打开SDRAM的一行的存储单元,K4S6416的一行为1024×16比特。行选通会使存储的电容受到干扰,从而发生电容的电量的变化,必须及时补充电量才能维持存储数据的正确性。具体而言,就是将Sense AMP中的数据回写,即使是没有工作过的存储体也会因行选通而使存储电容受到干扰,所以也需要Sense AMP进行读后重写。此时,电容的电量(或者说其产生的电压)将是判断逻辑状态的依据(读取时也需要),为此要设定一个临界值,一般为电容电量的1/2,超过它的为逻辑1,进行重写,否则为逻辑0,不进行重写(等于放电)。为此,现在基本都将电容的另一端接入一个指定的电压(即1/2电容电压),而不是接地,以帮助重写时的比较与判断。

预充电是一种对工作行中所有存储体进行数据重写,并对行地址进行复位,同时释放S-AMP(重新加入比较电压,一般是电容电压的1/2,以帮助判断读取数据的逻辑电平,因为S-AMP是通过一个参考电压与存储体位线电压的比较来判断逻辑值的),以准备新行的工作。对于用户而言,预充电可以简单地理解为将原来工作的行关闭准备打开新行的预备工作。预充电可以通过命令控制,也可以通过辅助设定让芯片在每次读写操作之后自动进行预充电。在一般的SDRAM控制器设计中,都采用每次读写操作之后自动进行预充电。

在SDRAM中,包括预充电命令和自动预充电命令。自动预充电命令用于每次读写操作之后自动进行预充电,SDRAM内部自己产生预充电时序。

5.1.5 SDRAM的刷新

除读写操作对存储单元的影响外,存储电容也会自然放电。因此,SDRAM需要定期刷新存储单元,每个自动刷新命令刷新SDRAM的一行。对于K4S6416,每个存储单元都要每64ms刷新一次,等价于每15.6us送入一个自动刷新命令。

SDRAM还有一种自己刷新命令,不同于自动刷新。在自己刷新状态下,SDRAM不接收时钟使能信号以外的任何信号,因此自己刷新只能在系统不访问SDRAM,保持SDRAM在低功耗状态下使用。一旦开始恢复对SDRAM的正常访问,必须从自己刷新状态切换到自动刷新状态。

5.1.6 SDRAM的模式设置寄存器

从前面的介绍中读者大致可以知道,读写一次SDRAM需要先送入行地址,这一步骤同时也选中了一个Bank,因此对应的SDRAM命令为Bank Activation,中文常常称作行激活。然后等待SDRAM行激活完成后,输入读/写命令以及列地址,再等待一定的周期后才能在SDRAM的总线上读到数据或将数据送入SDRAM的存储单元。在这一步骤后,还要进行预充电关闭打开的行,读写操作才真正完成。因此,SDRAM的一次完整的读写操作通常需要5个以上时钟周期才能完成。根据SDRAM的器件原理,实际上每次可以最多读取一行的所有数据。在SDRAM中,一行的长度称作Full page length。为了提高SDRAM的访问效率,SDRAM允许用户设置每次读写的突发长度包括1、4、8和Full page length。

在进行数据读取时,有时用户希望顺序读写,如DMA操作,有时希望先读写当前地址的值,然后读写当前地址后面和前面一定范围内的值,如处理器Cache更新,这种读写方式称作交织读写(Interleaved Access)。SDRAM允许用户指定工作模式,选择顺序读取或交织读写。

SDRAM本身的设计参数是固定的,比如行激活到列选择的延迟,比如列选择后到第一比特数据的延迟。因此,当系统时钟频率不同时,用户应设置不同的延迟周期数以满足SDRAM的要求。

综上所述,SDRAM内部必须设计一个寄存器,允许用户选择不同的工作模式。实际上正是如此,SDRAM内部设计了工作模式寄存并通过LOAD MODE REGISTER命令对工作模式寄存器进行设置来选择,可设置的参数包括Write Burst Mode(WB,写突发模式)、Operation Mode(Op Mode,工作模式)、CAS Latency(列地址选通延迟)、Burst Type(BT,突发类型)、Burst Length(突发长度),如图5-5所示。各个参数的具体含义如图5-6、图5-7、图5-8所示。

图5-5 SDRAM工作模式寄存器

图5-6 SDRAM工作模式寄存器的具体参数含义

图5-7 突发长度为4时的写突发模式的具体含义

图5-8 突发长度为8时的写突发模式的具体含义

5.1.7 SDRAM的输入输出信号

K4S6416是一个典型的SDRAM,其控制信号主要有CSn(片选信号),CKE(时钟使能信号),DQM(输入、输出使能信号),CASn(Column Address Strobe)、RASn(Row Address Strobe)WEn(读写控制命令字)。通过CASn、RASn、WEn的各种逻辑组合,可产生各种控制命令。

地址信号有BA0和BA1页地址选择信号,A0~A12地址信号,行、列地址选择信号。通过分时复用决定地址是行地址还是列地址。在读写操作中,在地线上依次给出页地址、行地址、列地址,最终确定存储单元地址。

数据信号有DQ0~DQ15,双向数据。其使能受DQM控制。DQM共2比特,高电平有效,分别对应高字节和低字节。当DQM高电平时,相应的输入输出数据信号被屏蔽。这样做是为了实现对单个字节的操作。

5.1.8 SDRAM的基本读写操作

如前所述,SDRAM的基本读操作需要控制线和地址线相配合地发出一系列命令来完成。先发出Bank Activation命令,并锁存相应的Bank地址(BA0、BA1给出)和行地址(A0~A12给出)。Bank激活命令后必须等待大于tRCD(DRAM的RASn到CASn的延迟指标)时间后,发出读命令字。CL(CAS延迟值)个工作时钟后,读出数据依次出现在数据总线上。在读操作的最后,要向SDRAM发出预充电(Precharge)命令,以关闭已经激活的行,并等待tRP时间(Precharge)命令,以等待关闭已经激活的行完成。等待tRP时间(Prechareg命令后,相隔tRP时间,才可再次访问该行)后,可以开始下一次的读、写操作。

SDRAM的基本写操作也需要控制线和地址线相配合地发出一系列命令来完成。先发出Bank激活命令(Active),并锁存相应的Bank地址(BA0、BA1给出)和行地址(A0~A12给出)。Bank激活命令后必须等待大于tRCD的时间后,发出写命令字。写命令可以立即写入,需写入数据依次送到DQ(数据线)上。在最后一个数据写入后延迟tWR时间。发出预充电命令,关闭已经激活的页。等待tRP时间后,可以展开下一次操作。

Bank Activation激活一个行,一个行处于激活状态的最长时间由tRAS(MAX)束。在tRAS(MAX)到达之前,必须对该行执行一个Precharge或Auto Precharge命令,以关闭该行。

5.1.9 SDRAM的初始化

SDRAM在上电以后必须对其进行初始化操作,具体操作如下:

(1)系统在上电后要等待200μs以上。在待时间到了以后至少执行一条空操作或指令禁止操作;

(2)对所有芯片执行Precharge命令,完成预充电;

(3)向每组内存芯片发出两条Auto Refresh命令,使SDRAM芯片内部的刷新计数器可以进入正常运行状态;

(4)执行Load Mode Register命令,完成对SDRAM工作模式的设定。

完成以上步骤后,SDRAM进入正常工作状态,等待控制器对其进行读、写和刷新等操作。