【FPGA】Verilog编程实现SDRAM读写(一) ----- 初识SDRAM

一. 存储器及SDRAM分类

1. 存储器分类

在这里插入图片描述

2. 半导体存储器分类

在这里插入图片描述

3. SDRAM分类

在这里插入图片描述

二. 什么是SDRAM?

1. SDRAM基本概念

SDRAM(Synchronous Dynamic Random Access Memory),同步动态随机存储器。同步、动态、随机是其性能特点的外在说明:

  • 同步(Synchronous )是指内存工作需要同步时钟,内部的命令的发送与数据的传输都以它为基准
  • 动态(Dynamic )是指存储阵列 需要不断的刷新来保证数据不丢失
  • 随机(Random )是指数据不是线性依次存储,而是自由指定地址进行 数据读写

随着时代的不断发展、技术的不断更新,SDRAM使用至今已过数十载,产品更新历经五代,分别是:

  • 第一代 SDR SDRAM
  • 第二代 DDR SDRAM
  • 第三代 DDR2 SDRAM
  • 第四代 DDR3 SDRAM
  • 第五代 DDR4 SDRAM

SDRAM具有空间存储量大、读写速度快、价格相对便宜等优点。然而由于SDRAM内部利用电容来存储数据,为保证数据不丢失,需要持续对各存储电容进行刷新操作;同时在读写过程中 需要考虑行列管理、各种操作延时等,由此导致了其控制逻辑复杂的特点。

2. SDRAM存储阵列

SDRAM内部是一个存储阵列,我们可以把它想象成一张表格,我们在向这个表格中写入数据的时候,需要先指定一个行(Row),再指定一个列(Column),就可以准确地找到所需要的“单元格”,每一个单元格就是一个存储单元,这就是SDRAM寻址的基本原理。
在这里插入图片描述
SDRAM具有空间存储量大、读写速度快、价格相对便宜等优点。然而由于SDRAM内部利用电容来存储数据,为保证数据不丢失,需要持续对各存储电容进行刷新操作;同时在读写过程中需要考虑行列管理、各种操作延时等,由此导致了其控制逻辑复杂的特点。

3. SDRAM基本存储单元

SDRAM存储数据是利用了电容的充放电特性以及能够保持电荷的能力。一个大小为1bit的存储单元的结构如下图所示,它主要由行列选通三极管,存储电容,刷新放大器组成。行地址与列地址选通使得存储电容与数据线导通,从而可进行放电(读取)与充电(写入)操作。
在这里插入图片描述
将每个存储单元简化为单Bit的存储体,再将若干存储体排列为矩阵,同一行将行地址线相连,同一列将列地址线相连,就构成了一个存储阵列的简化模型。SDRAM内部存储阵列的简化模型。简化模型示意图如下:
在这里插入图片描述

4. BANK概念

逻辑 Bank(Logical Bank,简称L-Bank、Bank):单个的存储空间称之为存储单元,N(行列个数乘积)个存储单元构成一个存储阵列,这个存储阵列我们就称之为一个逻辑Bank。
通常SDRAM的存储空间被划分为4个L-Bank,在寻址时需要先指定其中一个L-Bank,然后在这个选定的L-Bank中选择相应的行与列进行寻址,确定需要读写的存储单元。

5. SDRAM容量计算

容量计算:对SDRAM的读写是针对存储单元进行的,一个存储单元的容量等于数据总线的位宽,单位是bit。
SDRAM芯片的总存储容量我们就可以通过下面的公式计算SDRAM总存储容量=L-Bank的数量×行数×列数×存储单元的容量(数据线的位宽)

6. SDRAM功能框图

SDRAM内部有一个逻辑控制单元,并且有一个模式寄存器为其提供控制参数。SDRAM接收外部输入的控制命令,并在逻辑控制单元的控制下进行寻址、读写、刷新、预充电等操作。
在这里插入图片描述

7. SDRAM信号引脚

下面以海力士Synchronous DRAM Memory 256Mbit
HY57V561620F(L)T(P)Series系列为例:
在这里插入图片描述
管脚功能描述如下:
在这里插入图片描述
下图与本文使用的SDRAM型号不一样,仅供参考引脚功能:
在这里插入图片描述

8. SDRAM操作命令

8.1 禁止命令( INHIBIT)

信号组成:{cs_n,ras_n,cas_n,we_n}= 4’b1xxx

禁止命令 (Command Inhibit) ,其他数据手册也称为取消设备选择命令 (Device Deselect)。不论 SDRAM 处于何种状态,此命令均可被执行;执行此命令后,SDRAM 芯片不被选择,新的命令无法写入,但已经执行的命令不受影响。

8.2 空操作命令( NOP)

信号组成:{cs_n,ras_n,cas_n,we_n}= 4’b0111

无操作命令(No-operation),也可称为空命令、NOP命令。不论 SDRAM 处于何种状态,此命令均可被写 入,该命令给被选中的 SDRAM 芯片传递一个空操作信息,目的是为了防止 SDRAM 处于空闲或等待状态时,其他命令被写入。

8.3 加载模式寄存器命令( LOAD MODE REGISTER)

信号组成:{cs_n,ras_n,cas_n,we_n}= 4’b0000

配置模式寄存器命令(Load Mode Register),也被称为 Mode Reigister Set。此命令只有所有 Bank 均处于空闲状态时才可被写入,否则配置出错,而且在执行此命令后,SDRAM 必须等待相应的响应时间 tRSC(Register Set Cycle),称为模式寄存器配置周期后,才可写入新的命令。

在写入此命令对 SDRAM 进行模式寄存器配置时,需要地址总线 A0-A12 辅助寄存器的模式设置,A0-A12 赋值不同对应寄存器配置不同模式,未使用的地址总线设置为低电平。 A0-A12 的不同赋值所对应的寄存器不同模式,具体见下图:
在这里插入图片描述
下图与本文使用的SDRAM型号不一样,可以作为模式寄存器配置参考:
在这里插入图片描述

8.3.1 突发长度(Burst Length)

突发(Burst)是指在同一行中相邻的存储单元连续进行数据传输的方式,连续传输所涉及到存储单元(列)的数量就是突发长度(Burst Length,简称 BL)。地址总线的低三位 A0-A2 是突发长度的控制位,SDRAM 芯片的突发长度可设置为 1、2、4、8 和整页,单位为字节,整页表示一次突发传输一整行的数据量。

8.3.2 突发类型(Burst TYPE)

突发类型的设置位为 A3,可将突发类型设置为两类,顺序突发和交错突发。一般将 A3 设置为低电平,选择顺序突发类型。

8.3.3 列选通潜伏期(CAS Latency)

列选通潜伏期是指从读命令被寄存到数据总线上到出现第一个有效数据之间的时钟周 期间隔,列选通潜伏期可被设置为 2 个或 3 个时钟周期,设置位为 A6,A5,A4。

8.3.4 运行模式(Operating Mode)

运行模式设置位为 A7,A8,SDRAM 存在标准模式、测试模式等多种模式,但对于普通用户,只开放了标准模式,在使用 SDRAM 时只需将 A7,A8 设置为低电平进入标准模式。

8.3.5 写模式(Operating Mode)

写模式设置位为 A9,控制 SDRAM 的写模式。当 A9 为低电平时,SDRAM 的读/写操 作均采用突发方式,突发长度由突发长度寄存器(A0-A2)设定;当 A9 位高电平时, SDRAM 的读操作依然采用突发方式,突发长度由突发长度寄存器(A0-A2)设定,但 SDRAM 的写操作不在使用突发方式,每一个写命令只能写入一个数据。

8.3.6 A10 ~ A12

A10-A12为保留位,对模式寄存器的配置不起作用,赋值为 0 即可。

8.3.7 BA0 ~ BA1

BANK地址。

8.4 激活命令(ACTIVE)

信号组成:{cs_n,ras_n,cas_n,we_n}= 4’b0011

激活命令(ACTIVE)是用来为后续的操作打开(或者叫激活)一个特定的 BANK和行。BA0和 BA1用来选择需要操作的BANK,地址线A0-A12选择指定的行(ROW)。该行会一直保持激活状态并可以进行读写,只有执行一个预充电命令(PRECHARGE)后,该行才会被关闭。同一个BANK中,每次只能激活一行。在某行已经激活的状态下,当需要对该 BANK中的另一行进行操作时,必须首先执行一个预充电命令来关闭当前行,然后才能激活另一行。

8.5 读命令(READ)

信号组成:{cs_n,ras_n,cas_n,we_n}= 4’b0101

读命令(READ)用来启动对一个已经激活行的突发读取操作。BA0和 BA1指定需要读取的 BANK,地址线上某些位A0- A9,A11(x4) ,A0-A9(x8),A0-A8(x16)指定需要读取的数据起始列地址,A10控制是否在突发读取完成之后立即执行预充电,即关闭当前行操作。若为高电平则在读取完当前行以后立即自动执行预充电操作(关闭当前行),若为低电平则不关闭该行,使其继续处于激活状态,以便于紧接着对该行执行新的读写操作。DQM 控制该位对应的数据是否被正常的读出,(例如,16位的 SDRAM芯片,DQM0对应控制 DQ[7:0],DQM1对应控制 DQ[15:8]),若DQM为高电平,则数据总线上对应字节的状态会变为三态,即该字节数据被屏蔽。从DQM 有效到数据总线状态对应发生变化,有两个时钟周期的延迟。

8.6 写命令(WRITE)

信号组成:{cs_n,ras_n,cas_n,we_n}= 4’b0100
写命令(WRTE)用来启动对一个已经激活行的突发写入操作, BA0和 BA1指定需要写入的 BANK,地址线上某些位(AO-A9,A11 (x4) ,A0- A9(x8),A0-A8(x16))指定需要写入的数据起始列地址,A10控制是否在突发写完成之后立即执行预充电,即关闭当前行操作。若为高电平则在写完当前行以后立即自动执行预充电操作(关闭当前行),若为低电平则不关闭该行,使其继续处于激活状态,以便于紧接着对该行执行新的读写操作。DQM控制该位对应的字节是否被写入新的数据(例如,16位的 SDRAM芯片,DQM对应控制 DQ[7.0)],DQM1对应控制DQ[15:8)),若DQM为高电平,则数据总线上对应字节的数据不会被写入到SDRAM中。

8.7 预充电命令(PRECHARGE)

信号组成:{cs_n,ras_n,cas_n,we_n}= 4’b0010

预充电命令(PRECHARGE)的作用就是关闭在指定BANK或者全部BANK(具体是单一或者全部 BANK 由A10 状态选择)中已经打开的行,在预充电命令执行并经过 tRP(PRECHARGE command period)时间后,对应的 BANK将可以重新被操作,即从执行预充电命令到下一次能够对该 BANK 执行新的命令,需要等待tRP的时间。A10为高电平,则对所有BANK行进行预充电,若 A10为低电平,则只对 BAO和 BA1 指定的 BANK中的行进行预充电。当某个BANK行被执行了预充电命令后,该BANK将处于空闲状态,在下次读写操作之前必须重新激活。

8.8 自动预充电命令(AUTO PRECHARGE)

信号组成:{cs_n,ras_n,cas_n,we_n}= 4’bxxxx

自动预充电(AUTO PRECHARGE)是指在不额外增加执行指令的前提下,达到使用预充电指令一样的效果。该功能是在对SDRAM发出读写命令时,使用A10 指明是否在突发读写完成后立即自动执行预充电操作来实现的。自动预充电命令在突发长度为整页突发时是无效的。自动预充电命令每次操作只一次有效,即如果在下次执行读写时,希望继续使用自动预充电方式,则需要使用A10重新指明。

8.9 突发中断命令(BURST TERMINATE)

信号组成:{cs_n,ras_n,cas_n,we_n}= 4’b0110

突发中断命令(BURST TERMINATE)用来截断固定长度或者整页长度的突发。当突发中断命令被执行时,离该命令最近的一次被SDRAM寄存的读或者写命令被截断,突发中断命令并不会对对应行进行预充电,即执行了突发中断操作后,该行仍然处于被激活状态,除非预充电命令被执行,该BANK才会被关闭。

8.10 自动刷新命令(AUTO REFRESH)

信号组成:{cs_n,ras_n,cas_n,we_n}= 4’b0001

自动刷新(AUTO REFRESH)一般用于对SDRAM进行常规操作的过程中。该命令是非持续性的,即每次需要时,都需要发送此命令。在执行自动刷新命令之前,所有的BANK必须被预充电(关闭)。在自动刷新和预充电命令之间,必须间隔最少tRP时间。自动刷新时,行地址由 SDRAM芯片内部的刷新控制器自动更新,因此,在执行自动刷新命令时,用户不需要关心地址总线上的值。不管器件的数据位宽是多少,对于256Mbit的SDRAM,在商业和工业级的器件中,每64ms 内需要执行 8192次自动刷新操作,即每7.813us 执行一次。在汽车级的器件中,每 16ms 内执行8192次自动刷新操作,即每 1.953us 执行一次。另外,自动刷新操作也可以采用突发的方式执行,即每 64ms (商业和工业级)/16ms (汽车级)都连续不间断的执行 8192次自动刷新命令,然后其他时间再执行读写或者其他命令。

8.11 自刷新命令(SELF REFRESH)

信号组成:{cs_n,ras_n,cas_n,we_n}= 4’b0001

自刷新命令(SELF REFRESH)能够用来保持SDRAM中的数据,即使系统中其他部分已经掉电。在自刷新模式下,SDRAM不需要外部的时钟信号就能够保持数据。发起自刷新命令和发起自动刷新非常类似,只是自刷新命令时CKE被置为低电平(自动刷新命令时CKE 被置为高电平)。当自刷新命令被寄存到SDRAM中去后,SDRAM除 CKE 以外的所有管脚状态都将被忽略,CKE信号继续有作用,且只能为低电平。当自刷新模式开启后,SDRAM内部自己产生时钟,用来作为自动剧新的周期。SDRAM进入自刷新模式后,最少需要保持在自刷新模式下tRAS(ACTVE-to-PRECHARGEcommand)的时间,当然,对于运行在自刷新模式下的最大时间并没有任何限制。退出自刷新模式需要执行一串命令,首先,在 CKE 信号恢复到高电平之前,时钟信号CLK必须稳定(稳定的时钟可由对应的时钟引脚经过约束后的时钟提供)。当CKE信号恢复到高电平后,必须保持NOP命令最低2个时钟周期,因为必须保证内部可能正在执行的刷新操作已完成。在退出自刷新模式后,就需要每64ms 内执行 8192次自动刷新操作(自刷新和自动刷新都是利用了内部的行刷新计数器)。注:汽车级器件不支持自刷新功能。

三. SDRAM操作

1. 芯片初始化

SDRAM芯片上电之后需要一个初始化的过程,以保证芯片能够按照预期方式正常工作;SDRAM上电后要有200us的输入稳定期,在这个时间内不可以对SDRAM的接口做任何操作;200us结束以后给所有L-Bank预充电,然后是连续8次刷新操作;最后设置模式寄存器。初始化最关键的阶段就在于模式寄存器(MR,Mode Register)的设置,简称MRS(MR Set)。
在这里插入图片描述
SDRAM通过配置模式寄存器来确定芯片的工作方式,包括突发长度(Burst Length)、潜伏期(CAS Latency)以及操作模式等,配置模式寄存器的参数由地址线提供。
需要注意的是,在模式寄存器设置指令发出之后,需要等待一段时间才能够发送新的指令,这个时间我们称之为模式寄存器设置周期tRSC (Register Set Cycle)。

在这里插入图片描述

2. 行激活

初始化完成后,无论是读操作还是写操作,都要先激活(Active) SDRAM中的一行,使之处于活动状态(又称行有效)。在此之前还要进行SDRAM芯片的片选和L-Bank的定址,不过它们与行激活可以同时进行。
在这里插入图片描述
从上图可以看出,在片选CS#(#表示低电平有效)、L-Bank定址的同时,RAS (Row Address Strobe,行地址选通脉冲)也处于有效状态。此时An地址线则发送具体的行地址。如图中是A0-A11,共有12个地址线,由于是二进制表示法,所以共有4096个行(2^12=4096) ,A0-A11的不同数值就确定了具体的行地址。由于行激活的同时也是相应L-Bank有效,所以行激活也可称为L-Bank有效。

3. 列读写

行地址激活之后,就要对列地址进行寻址了。由于在SDRAM中,地址线是行列共用的,因此列寻址时地址线仍然是A0-A11。在寻址时,利用RAS(Row Address Strobe,行地址选通脉冲)与CAS (Column Address Strobe,列地址选通脉冲)来区分行寻址与列寻址。

一般来说,在SDRAM中存储阵列(L-Bank)的列数小于行数,即列地址位宽小于行地址,因此在列地址选通时地址线高位可能未用到,如下图中的A9、A11。
在这里插入图片描述
另外,列寻址信号与读写命令是同时发出的,读/写命令是通过WE信号来控制的,WE为低时是写命令,为高时是读命令。然而,在发送列读写命令时必须要与行激活命令有一个时间间隔,这个间隔被定义为tRCD,即RAS to CAS Delay(RAS至CAS延迟)。这是因为在行激活命令发出之后,芯片存储阵列电子元件响应需要一定的时间。tRCD是SDRAM的一个重要时序参数,广义的tRCD以时钟周期(tCK,Clock Time)数为单位,比如tRCD=3,就代表RAS至CAS延迟为三个时钟周期。具体到确切的时间,则要根据时钟频率而定。

4. 数据读出

在选定列地址后,就已经确定了真体的存储单元,剩下的事情就是数据通过数据IO通道(DQ)输出到内存总线上了。但是在CAS发出之后,仍要经过一定的时间才能有数据输出,从CAS与读取命令发出到第一笔数据输出的这段时间,被定义为CL(CAS Latency,CAS潜伏期)。CL时间越短,读数据时SDRAM响应就越快。由于CL只在读取时出现,所以CL又被称为读取潜伏期(RL,ReadLatency)。CL的单位与tRCD一样,为时钟周期数,具体耗时由时钟频率决定。
在这里插入图片描述

5. 数据写入

数据写入的操作也是在tRCD之后进行,但此时没有CL(注意:CL只出现在读取操作中),行寻址与列寻址的时序图和前文一样,只是在列寻址时,WE_N为有效状态。从图中可见,数据与写指令同时发送。不过,数据并不是即
时地写入存储单元,数据的真正写入需要一定的周期。为了保证数据的可靠写入,都会留出足够的写恢复时间(tWR, Write Recovery Time)。

在这里插入图片描述

6. 预充电

在对SDRAM某一存储地址进行读写操作结束后,如果要对同一L-Bank的另一行进行寻址,就要将原来有效(工作)的行关闭,重新发送行/列地址。L-Bank关闭现有工作行,准备打开新行的操作就是预充电(Precharge)。在读写过程中,工作行内的存储体由于“行激活”而使存储电容受到干扰,因此在关闭工作行前需要对本行所有存储体进行重写。预充电实际上就是对工作行中所有存储体进行数据重写,并对行地址进行复位,以准备新行工作的过程。

预充电可以通过命令控制,可以便用单独的预充电命令,也可以通过使用带预充电的读或带预充电的写命令完成预充电操作。在单独的预充电命令中,A10则控制着是对指定的L-Bank还是所有的L-Bank预充电,前者需要提供L-Bank的地址,后者只需将A10信号置于高电平。

在发出预充电命令之后,要经过一段时间才能发送行激活命令打开新的工作行,这个间隔被称为tRP (Precharge command Period,预充电有效周期),和tRCD、CL一样,tRP的单位也是时钟周期数,具体值视时钟频率而定。

注意:写操作时,由于每笔数据的真正写入需要一个足够的周期来保证,这段时间就是写回周期(tWR)。所以预充电不能与写操作同时进行,必须要在tWR之后才能发出预充电命令,以确保数据的可靠写入,否则重写的数据可能出错。

写数据时预充电时序图:
在这里插入图片描述
读数据时预充电时序图:
在这里插入图片描述

7. 刷新

SDRAM之所以称为同步“动态”随机存储器,就是因为它要不断进行刷新(Refresh)才能保留住数据,因此刷新是SDRAM最重要的操作。刷新操作与预充电类似,都是重写存储体中的数据。但为什么有预充电操作还要进行刷新呢?因为预充电是对一个或所有LBank中的工作行(处于激活状态的行)操作,并且是不定期的;而刷新则是有固定的周期,并依次对所有行进行操作,以保留那些久久没经历重写的存储体中的数据。但与所有L-Bank预充电不同的是,这里的行是指所有L-Bank中地址相同的行,而预充电中各L-Bank中的工作行地址并不是一定是相同的。

那么要隔多长时间重复一次刷新呢?目前公认的标准是,存储体中电容的数据有效保存期上限是64ms,也就是说每一行刷新的循环周期是64ms。我们在看SDRAM芯片参数时,经常会看到4096 Refresh Cycles/64ms或8192 Refresh Cycles/64ms的标识,这里的4096与8192就代表这个芯片中每个L-Bank的行数。刷新命令一次仅对一行有效,也就是说在64ms内这两种规格的芯片分别需要完成4096次和8192次刷新操作。因此,L-Bank为4096行时刷新命令的发送间隔为15.625us (64ms/4096) ,8192行时为7.8125us (64ms/8192)。

刷新操作分为两种:自动刷新(Auto Refresh,简称AR)与自刷新(SelfRefresh,简称SR)。不论是何种刷新方式,都不需要外部提供行地址信息,因为这是一个内部的自动操作。对于自动刷新(AR),SDRAM内部有一个行地址生成器(也称刷新计数器)用来自动生成行地址。由于刷新是针对一行中的所有存储体进行,所以无需列寻址,或者说CAS在RAS之前有效。所以,AR又称CBR(CASBefore RAS,列提前于行定位)式刷新。

8. 数据掩码

通过DQM数据掩码,内存可以控制I/O端口取消哪些输出或输入的数据。为了精确屏蔽一个数据总线位宽中的每个字节,每个DQM信号线对应一个字节(8bit)。因此,对于数据总线为16bit的SDRAM芯片,就需要两个DQM引脚。
SDRAM协议规定,在读取时DQM发出两个时钟周期后生效。而在写入时,DQM与写入命令一样是立即生效。

写数据时DQM时序图:
在这里插入图片描述
读数据时DQM时序图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值