一、SDRAM基本概念
SDRAM英文全称“Synchronous Dynamic Random Access Memory”,译为“同步动态随机存取内存”或“同步动态随机存储器”,是动态随机存储器(Dynamic Random Access Memory,简称DRAM)家族的一份子。同步、动态、随机是其性能特点的外在说明,也是其区别其他存储器的特色标签。这三个概念性的标签,我们要好好理解掌握。
同步(Synchronous):与通常的异步DRAM不同, SDRAM存在一个同步接口,其工作时钟的时钟频率与对应控制器(CPU/FPGA)的时钟频率相同,并且SDRAM内部的命令发送与数据传输均以此时钟为基准,实现指令或数据的同步操作;
动态(Dynamic): SDRAM需要不断的刷新来保证存储阵列内数据不丢失;
随机(Random):数据在SDRAM中并不是按照线性依次存储,而是可以自由指定地址进行数据的读写。
空间存储量大、读写速度快以及价格相对便宜等优点使其在存储界屹立不倒、经久不衰,广泛应用在计算机中。随着时代的不断发展、技术的不断更新,SDRAM使用至今已过数十载,产品更新历经五代,分别是:第一代SDR SDRAM,第二代DDR SDRAM,第三代DDR2 SDRAM,第四代DDR3 SDRAM,第五代,DDR4 SDRAM。
第一代SDR SDRAM采用单端时钟信号,SDRAM只在时钟的上升沿进行数据采样;而后面的四代SDRAM由于工作频率比较快,所以采用可降低干扰的差分时钟信号作为同步时钟,双沿采样,速度更快,且功耗更低。同时技术的不断发展、制造工艺的不断提高,使得五代SDRAM的更新过程中,集成度越来越高、内核电压越来越低(SDR:3.3V 、DDR:2.5V、DDR2:1.8V、DDR3:1.5V、DDR4:1.2V),这也是SDRAM速度提高、功耗降低的重要原因。
二、SDRAM数据存取原理
简单来说,SDRAM内部可以理解为一个存储阵列,这是SDRAM区别于管道式存储,实现随机地址存取的结构特点。为方便读者理解,我们将SDRAM内部存储阵列类比于一张表格,表格中的每一个单元格可以类比为存储阵列的单个存储单元。若想要实现存储阵列中的某一存储单元的数据读写操作,我们要通过行地址(Row Address)和列地址(Column Address)(先行后列)精确定位到这一存储单元,进而进行数据的读写操作,这就是所谓的随机地址存取。SDRAM存储阵列类比图,具体见图 53‑1。
对于SDRAM,我们将类比于单元格的存储空间称之为存储单元,N(行列个数乘积)个存储单元构成一个存储阵列,这个存储阵列我们称之为一个逻辑Bank(Logical Bank,简称L-Bank、Bank)。SDRAM内部并不是一个全容量的L-Bank,而是分割为若干个L- Bank,目前大多为4个。若干L-Bank的分割,原因有二,一是技术、成本等诸多因素;二是由于SDRAM的工作原理限制,单一L-Bank可能会造成非常严重的寻址冲突,大幅度降低内存效率。
这样一来,在对SDRAM进行数据存取时,要先确定L-Bank地址,定位到指定逻辑Bank,再依次确定行地址和列地址,选中存储单元,进而进行数据的存取操作,而且一次只能对一个L-Bank的一个存储单元进行操作。
SDRAM的基本存储单位是存储单元,而一个存储单元的容量为若干个Bit,对于SDRAM而言就是芯片的位宽,每个Bit存放于一个单独的存储体中,存储体是利用电容能够保持电荷以及可充放电的特性制成,主要由行选通三极管、列选通三极管、存储电容以及刷新放大器构成。电容所存储的电荷会随时间慢慢释放,这就需要不 断刷新为电容充电,以保证存储数据可靠性。存储体示意图,具体见图 53‑2。
将每个存储单元简化为单Bit的存储体,再将若干存储体排列为矩阵,同一行将行地址线相连,同一列将列地址线相连,就构成了一个存储阵列的简化模型。SDRAM内部存储阵列的简化模型,具体见图 53‑3。
三、SDRAM引脚功能描述
引脚 | 位宽 | 类型 | 功能描述 |
CLK | 1Bit | Input | 系统时钟:SDRAM由系统时钟驱动,所有SDRAM输入信号都在时钟上升沿采样,同时CLK还递增内部突发计数器并控制输出寄存器。 |
CKE | 1Bit | Input | 时钟使能:屏蔽系统时钟,冻结当前操作,高电平有效,信号有效时,所有信号才能被正确送入SDRAM。 |
CS#(CS_N) | 1Bit | Input | 片选信号:屏蔽和使能所有输入输出端口,CLK、CKE、DQM除外,低电平有效。为高电平时,屏蔽所有命令,但已经突发的读/写操作不受影响。 |
CAS#(CAS_N) | 1Bit | Input | 列选通信号:低电平有效,为低电平时,A[8:0]输入的为列地址。 |
RAS#(RAS_N) | 1Bit | Input | 行选通信号:低电平有效,为低电平时,A[12:0]输入的为行地址。 |
WE#(WE_N) | 1Bit | Input | 写使能信号,低电平有效,为低电平时,使能写操作和预充电。 {CS# 、CAS#、RAS#、WE#}构成SDRAM操作命令。 |
DQM[1:0] | 1Bit | Input | 数据掩码:DQML(H),低(高)字节掩码,若信号为高电平,在下一个时钟周期的时钟上升沿,数据总线的低(高)字节为高阻态。数据掩码分为写数据掩码和读数据掩码。这里需要强调的是,在读取时,被屏蔽的数据仍然会从存储体传出,只是在“掩码逻辑单元”处被屏蔽。SDRAM官方规定,在读取时DQM发出两个时钟周期后生效,而在写入时,DQM与写入命令一样是立即成效。 |
BA[1:0] | 2Bit | Input | L-Bank地址:选择不同的逻辑Bank进行相关数据操作。 |
A[12:0] | 13Bit | Input | 地址总线:不同命令下含义不同,后文中会有详细介绍。 |
DQ[15:0] | 16Bit | Inout | 数据总线:数据输入输出复用。 |
四、SDRAM内部功能框图
由图 53‑5可知,SDRAM内部包含一个逻辑控制单元,内部包含模式寄存器和命令解码器。外部通过CS_N、RAC_N、CAS_N、WE_N以及地址总线向逻辑控制单元输入命令,命令经过命令解码器进行译码后,将控制参数保存到模式寄存器中,逻辑控制单元进而控制逻辑运行。
外部通过地址总线输入地址信息,地址信息在逻辑控制单元进行逻辑控制时起到辅助作用,除此之外,复用的地址总线与Bank控制逻辑、行地址复用器、列地址计数锁存器、列地址解码器等内部器件共同作用,精确选定存储阵列中与行列地址相对应的存储单元,进而进行数据存取操作。
关于DQM的说明:
SDRAM官方规定,在读取时DQM发出两个时钟周期后生效,而在写入时,DQM与写入命令一样是立即成效。
读取时数据掩码操作,DQM在两个周期后生效,突发周期的第二笔数据被取消
写入时数据掩码操作,DQM立即生效,突发周期的第二笔数据被取消
五、SDRAM的存储容量与速度等级
图中列举了镁光公司的3款SDRAM芯片,我们挑选其中一款进行容量计数方法的介绍。例“MT48LC16M16A2”,由图可知,“Micron”“MT48LC16M16A2”分别表示此SDRAM芯片的生产商和产品型号。“4Meg × 16 × 4Banks”才是表示SDRAM存储容量的具体参数,其中“4Meg”表示单个L-Bank包含的存储单元的个数,计算方法为单个存储阵列行地址数和列地址数的乘积,以此芯片为例,行地址总线为A0-A12,行地址位宽为13位,行地址数为 8192 (2^13)行,列地址位宽为9位,列地址数为512(2^9)列,单个L-Bank中包含的存储单元个数为行地址数(8192)与列地址数(512)相乘,乘积为4M(8192 × 512 = 4194306); “16”表示数据位宽,即每个存储单元存储数据的bit数;4Meg与16相乘表示单个L- Bank中可存储的Bit数;“4BANKS”表示一片SDRAM中包含的L-Bank个数,此SDRAM芯片包含4个L-Bank;由此可得SDRAM芯片的存储容量为:256MBit(4Meg × 16 × 4BANKS)。
容量计算方法可简化为:
存储容量(Bit) = L-Bank存储单元数 ×数据位宽(Bit) × L-Bank个数
同理,读者可根据此计算方法计算其他SDRAM芯片的存储容量。
SDRAM存储容量的计算方法已经介绍完毕,接下来我们来说明一下SDRAM芯片的另一个概念:速度等级。SDRAM速度等级相关参数截图,具体见图 53‑7。
图 53‑7列举了包括速度等级在内的6个相关参数。时钟频率(Clock Frequency),单位MHz,所列举的具体参数为SDRAM正常工作的最高时钟频率,SDRAM工作时只能等于或低于这一时钟频率;tRCD表示写入自激活命令到开始进行数据读写,中间所需的等待时间,列举的数值表示等待时间的最小值,单位为ns; tRP表示自预充电指令写入到预充电完成所需的等待时间,列举的数值表示等待时间的最小值,单位为ns;CL(CAS(READ) latency)列选通潜伏期,表示自数据读指令写入到第一个有效数据输出所需等待时间,单位ns;Target tRCD-tRP-CL表示最大工作频率下,tRCD、tRP、CL等待的最小时钟周期数。
根据以上说明的诸多参数的不同,相同型号的SDRAM芯片被分为不同的速度等级,这与FPGA速度等级的划分颇为类似,读者在挑选或使用SDRAM芯片时,要注意这些参数,以免出现问题。
六、SDRAM的操作命令
在前文SDRAM的引脚功能介绍的表格中,我们提到CS_N、RAS_N、CAS_N、WE_N 四路控制信号构成SDRAM指令集。除构成指令集的4路信号之外,CKE、BA[1:0]、A[12:0]等信号,在SDRAM的操作中,也起到辅助作用。
接下来我们介绍一下常用的SDRAM操作指令。SDRAM操作指令集截图,具体见图 53‑8。
图 53‑8 SDRAM操作指令集
注:H表示高电平;L表示低电平;X表示无需关心。
根据图 53‑8,我们分条列举一下SDRAM常用的操作指令,并对各操作指令做详细说明,说明如下。
1、禁止命令(Command Inhibit)
禁止命令(Command Inhibit),其他数据手册也称为取消设备选择命令(Device Deselect),控制指令为{CS_N,RAS_N,CAS_N,WE_N} = 4’b1XXX。不论SDRAM处于何种状态,此命令均可被执行,无需顾及CKE是否有效,即CLK是否使能,无需关心DQM、ADDR、DQ的信号输入;执行此命令后,SDRAM芯片不被选择,新的命令无法写入,但已经执行的命令不受影响。
2、无操作命令(No-operation)
无操作命令(No-operation),也可称为空命令,简称为NOP命令,控制指令为{CS_N,RAS_N,CAS_N,WE_N} = 4’b0111。不论SDRAM处于何种状态,此命令均可被写入,该命令给被选中的SDRAM芯片传递一个空操作信息,目的是为了防止SDRAM处于空闲或等待状态时,其他命令被写入,此命令对正在执行的命令无影响。
3、配置模式寄存器命令(Load Mode Register)
配置模式寄存器命令(Load Mode Register),也被称为Mode Reigister Set,简称LMR命令,控制指令为{CS_N,RAS_N,CAS_N,WE_N} = 4’b0000,此命令只有所有L- Bank均处于空闲状态时才可被写入,否则配置出错,而且在执行此命令后,SDRAM必须等待相应的响应时间tRSC(Register Set Cycle),模式寄存器配置周期)后,才可写入新的命令。
在写入此命令对SDRAM进行模式寄存器配置时,需要地址总线A0-A11辅助寄存器的模式设置,A0-A11赋值不同对应寄存器配置不同模式,未使用的地址总线设置为低电平。下面我们来介绍一下A0-A11的不同赋值所对应的寄存器不同模式,具体见图 53‑9。
图 53‑9 模式寄存器配置参数
突发长度(Burst Length)
突发(Burst)是指在同一行中相邻的存储单元连续进行数据传输的方式,连续传输所涉及到存储单元(列)的数量就是突发长度(Burst Length,简称 BL)。
地址总线的低三位A0-A2是突发长度的控制位,SDRAM芯片的突发长度可设置为1、2、4、8和整页,单位为字节,整页表示一次突发传输一整行的数据量,具体数值视芯片而定。
若在数据读/写操作时不使用突发传输,此时可等效为突发长度为1字节,每次读/写数据时,都要对存储单元进行寻址,如果要实现连续的读/写操作,就要不断地发送列地址和读/写命令,这种方法控制资源占用极大,效率较低。非突发连续读操作时序图,具体见图 53‑10。
若使用突发传输,只要指定起始列地址和突发长度,内存就会依次地自动对后面相应数量的存储单元进行读/写操作而不再需要控制器连续地提供列地址,这样,除了第一笔数据传输需要若干个周期外,其后的每个数据只要一个周期即可获得。突发的数据长度一般是4或8,如果传输时实际需要的数据长度小于设定的BL值,则调用“突发 停止”命令结束传输。突发连续度操作时序图,具体见图 53‑11。
突发类型
突发类型的设置位为A3,可将突发类型设置为两类,顺序和隔行。一般将A3设置为低电平,选择顺序类型,但也要结合实际情况进行选择。不同突发类型所对应的情况,具体见图 53‑12。
列选通潜伏期(CAS Latency)
列选通潜伏期是指从读命令被寄存到数据总线上到出现第一个有效数据之间的时钟周期间隔,列选通潜伏期可被设置为2个或3个时钟周期,设置位为A6,A5,A4,当{ A6A5A4}=3’b010时,潜伏期为2个时钟周期;当{ A6A5A4}=3’b011时,潜伏期为3个时钟周期,时序图具体见图 53‑13。
运行模式(Operating Mode)
运行模式设置位为A7,A8,SDRAM存在标准模式、测试模式等多种模式,但对于普通用户,只开放了标准模式,在使用SDRAM时只需将A7,A8设置为低电平进入标准模式即可。
写模式
写模式设置位为A9,控制SDRAM的写模式。当A9为低电平时,SDRAM的读/写操作均采用突发方式,突发长度由突发长度寄存器(A0-A2)设定;当A9位高电平时,SDRAM的读操作依然采用突发方式,突发长度由突发长度寄存器(A0-A2)设定,但SDRAM的写操作不在使用突发方式,每一个写命令只能写入 一个数据。
A10-A12为保留位,对模式寄存器的配置不起作用,赋值为0即可。
4、预充电命令(Precharge)
预充电的作用就是关闭指定的L-Bank或者全部L-Bank中激活的行,预充电命令执行后,必须等待对应的等待时间tRP(tRP(Precharge command Period),预充电命令周期),相对应的L-Bank将可以被重新操作。
预充电命令(Precharge)命令包括两类:全部预充电(Precharge All)和指定L-Bank预充电(Precharge Bank),控制指令均为{CS_N,RAS_N,CAS_N,WE_N} = 4’b0010,通过地址总线中的A10和L-Bank地址线BA[1:0]辅助控制预充电类型, 当A10 为高电平时,执行全部预充电命令,对所有的L-Bank进行预充电,无需关心BA[1:0]信号的输入;当A10为低电平时,只对由BA[1:0]选定的L-Bank进行预充电。当某个L-Bank执行预充电操作后,该L-Bank处于空闲状态,在下次读写操作之前必须重新激活。
预充电命令示意图,具体见图 53‑14。
5、刷新命令(Refresh)
SDRAM只有通过刷新操作才能保证数据的可靠性,当然不能一直进行刷新,那将变得毫无意义,SDRAM的刷新操作是周期性的,在两次刷新的间隔可以进行数据的相关操作,那我们不禁要问,刷新周期是多少呢?
目前国际公认的标准是,存储体中电容的数据有效保存期上限是 64ms,也就是说每一行刷新的循环周期最大为 64ms,那么刷新速度就是:行数/64ms。我们在SDRAM的数据手册中经常会看到4096 Refresh Cycles/64ms 或 8192 Refresh Cycles/64ms的相关介绍,这里的4096 与 8192 就代表SDRAM芯片中单个 L-Bank 的行数。刷新命令一次对一行有效,发送间隔也是随总行数而变化, 当单个L-Bank为4096 行时,刷新间隔最大为 15.625μs, 单个L-Bank为8192 行时,刷新间隔最大为7.8125μs。
刷新命令(Refresh)分为两种:自动刷新命令(Auto Refresh)和自刷新(Self Refresh),控制指令相同,为{CS_N,RAS_N,CAS_N,WE_N} = 4’b0001,两种刷新方式均不需要外部提供地址信息。
当CKE为高电平时,写入刷新指令,执行自动刷新操作。在执行自动刷新命令前,必须先要执行预充电命令,将所有L-Bank关闭,SDRAM内部刷新计数器会依次自动生成行地址,刷新是针对一行中的所有存储单元,所以无需列寻址。由于刷新涉及到所有 L-Bank,因此在刷新过程中,所有 L-Bank 都停止工作,而每次刷新需要等待对应的时钟周期,之后就可进入正常的工作状态,在此期间,所有工作指令只能等待而无法执行。 64ms 之后则再次对同一行进行刷新,如此周而复始进行循环刷新。
当CKE为低电平时,写入刷新指令,执行自刷新操作。自刷新操作主要用于休眠模式低功耗状态下的数据保存,在发出刷新命令时,将 CKE 置于无效状态,就进入了自刷新模式,此时不再依靠系统时钟工作,而是根据内部的时钟进行刷新操作。在自刷新期间除了 CKE 之外的所有外部信号都是无效的,只有重新使 CKE 有效才能退出自刷新模式并进入正常操作状态。
6、激活命令(Bank Active)
激活命令(Bank Active),控制命令为{CS_N,RAS_N,CAS_N,WE_N} = 4’b0011,只有SDRAM处于空闲状态下才可被响应。激活命令是为后续操作激活某一特定L-Bank中的某一行,逻辑Bank地址线BA[1:0]和地址总线A0-A12选择要激活的特定L- Bank的特定行,激活该行后,该行一直保持激活状态,并可以进行后续读/写操作,操作完成后,只有执行一次预充电命令(Precharge)后,被激活的特定行被关闭。每次激活只能激活一个L-Bank,同一个L-Bank中每次只能激活一行,当需要对同一L-Bank中其他行进行操作时, 必须先执行一个预充电命令关闭当前行,再激活另一行进行操作。
激活命令示意图,具体见图 53‑15。
7、写命令(Write)
写命令(Write),控制命令为{CS_N,RAS_N,CAS_N,WE_N} = 4’b0100,用来实现对已激活的特定L-Bank的特定行的数据突发写入操作,
BA[1:0]指定需要写入数据的特定L-Bank,地址总线A0-A9指定需要写入存储单元的起始列地址
A10的电平变化控制突发写操作完成后是否立即执行自动预充电操作
若A10为高电平,突发写操作完成后,立即执行自动预充电操作,关闭当前行;
若A10为低电平,突发写操作完成后,当前行依然处于激活状态,以便对当前行执行新的读/写操作,想要关闭当前激活行,需写入预充电指令。
写命令示意图,具体见图 53‑16。
8、读命令(Read)
读命令(Read),控制命令为{CS_N,RAS_N,CAS_N,WE_N} = 4’b0101,用来实现对已激活的特定L-Bank的特定行的数据突发读取操作
BA[1:0]指定需要读取数据的特定L-Bank,地址总线A0-A9指定需要读取存储单元的起始列地址
A10的电平变化控制突发读操作完成后是否立即执行自动预充电操作;
若A10为高电平,突发读操作完成后,立即执行自动预充电操作,关闭当前行;
若A10为低电平,突发读操作完成后,当前行依然处于激活状态,以便对当前行执行新的读/写操作,想要关闭当前激活行,需写入预充电指令。
读命令示意图,具体见图 53‑17。
9、突发终止(Burst Terminate)
突发终止(Burst Terminate),也称为Burst Stop,控制命令为{CS_N,RAS_N,CAS_N,WE_N} = 4’b0110,SDRAM处于读/写操作过程中可被写入,突发停止操作被用来截断固定长度或者整页长度的突发,执行突发停止命令后,最近执行的数据读/写操作被终止,此命令操作并不会通过预充电关闭当前激活行,需通过预充电操作关闭被激活行。
七、参考文献
3. sdram读写控制器的设计与验证 — [野火]FPGA Verilog开发实战指南——基于Altera EP4CE10 征途Pro开发板 文档 (embedfire.com)