一 SDRAM简述
1.1什么是sdram
SDRAM(Synchronous Dynamic Random Access Memory),同步动态随机存储器。同步是指内存工作需要同步时钟,内部的命令的发送与数据的传输都以它为基准;动态是指存储阵列需要不断的刷新来保证数据不丢失(比如使用电容存储数据时);随机是指数据不是线性依次存储,而是自由指定地址进行数据读写。
1.2sdram功能框图
这里以我使用的这款板子的型号作为介绍,SK Hynix的H57V2562GTR芯片,这款芯片的存储容量为256M bit,下面这张图是这款芯片的功能框图
观察上图,右上角部分:存储阵列,在这款芯片中,存储区域被分为了4个bank,一个bank区域容量为4M bit,一个bank里,又以行和列为基准,分成了很多个单元格,在后面会详细介绍。
左上角部分:方框内的部分:分别为时钟(clk),时钟使能(CKE),片选(CS),行地址选通(RAS),列地址选通(CAS),写使能(WE),数据掩码(DQM),在后面会详细介绍各自的作用。通过控制这些信号,改变逻辑控制单元中的配置寄存器,从而激活不同的命令。
左下角部分:地址线,行地址以及列地址共同使用,节约引脚。
右中部分:数据线,双向。输入输出接口
中间部分:包括一些寄存器,以及计数器,通过接口配置完成后,由内部自己调用。
1.3sdram存储阵列结构
前面提到,这款sdram芯片的存储区域分为4个bank,而一个bank里,可以把他理解为一个A4纸,通过行列将其分割成大小相同的区域,也就是存储单元,这一个存储单元里最多可以存储16bit的数据(具体多少根据数据位的位宽进行判断),
所以,这款芯片存储最大容量为:bank数量 * 行 *列 * 存储单元的大小。
1.4sdram引脚介绍
1.5sdram操作命令
主要介绍使用sdram时的一些常用命令,通过改变 片选,行选通过,列选通,写使能的值,从而激活不同的命令,
1.6sdram 驱动流程
1.6.1上电初始化
sdram上电后,有一段初始化过程,上电后,需要200us的稳定时间,在这个期间,不允许任何操作,稳定器结束后,需要给所有bank 预充电,随后是8个刷新周期。最后是模式寄存器的设置。
由1.2sdram 功能框图可知,模式寄存器的设置主要是由地址总线和bank地址进行配置,具体如何配置,请看下图:
- A0~A2:突发长度(1/2/4/8/全页)
- A3:突发传输方式(0=顺序,1=交错)
- A4~A6:CAS 潜伏期(如 010→CL=2,011→CL=3)
- A7 及高位:操作模式(通常置 0 = 标准操作)
需要注意的是,在模式寄存器设置指令发出之后,需要等待一段时间才能够向SDRAM发送新的指令,这个时间我们称之为模式寄存器设置周期tRSC(Register Set Cycle)。
1.6.2行激活
初始化完成以后,进行读写操作之前,首先得确定读写的区域,那么,第一步操作就是行激活,也就是让某一个bank区域中的某一行处于活动状态(行有效),同时拉低片选(CS_n)与行选通(RAS_n),拉高写使能(WE),也就是 ACTIVE 命令。
时序图如下
1.6.3 列读写
行激活以后,就需要确定列地址,由于行列地址总线共用同一个地址线,就需要通过拉高RAS_n,拉低CAS_n(列选通)来完成确认列地址的操作。
列寻址的操作是与读写操作同时进行的,WE拉高表示读,拉低表示写。
在发送列读写之前,必须等待一段时间,tRCD,表示行激活与列读写之间的时间间隔(RAS to CAS DELAY),因为在发送行激活命令后,内部电子元件需要一定的响应时间,一般以时钟周期为单位。
列读写时序图:
tRCD==3时序图
1.6.4 数据输出操作(发送读命令后)
确定列地址后,就已经确定了具体的存储单元,随后存储的数据就会输出到内存总线上了。但是在CAS发出之后,仍要经过一定的时间才能有数据输出,从CAS与读取命令发出到第一笔数据输出的这段时间,被定义为CL(CAS Latency,CAS潜伏期)。CL时间越短,读数据时SDRAM响应就越快。由于CL只在读取时出现,所以CL又被称为读取潜伏期(RL,Read Latency)。CL的单位与tRCD一样,为时钟周期数,具体耗时由时钟频率决定。
读操作时序:
1.6.5 写操作
写操作时,数据写入的操作也是在tRCD之后进行,但此时没有了CL(记住,CL只出现在读取操作中),行寻址与列寻址的时序图和上文一样,只是在列寻址时,WE拉低。不过,数据并不是即时地写入存储单元,数据的真正写入需要一定的周期。为了保证数据的可靠写入,都会留出足够的写入/校正时间(tWR,Write Recovery Time),这个操作也被称作写回(Write Back)。tWR至少占用一个时钟周期或再多一点(时钟频率越高,tWR占用周期越多)。
1.6.6突发长度 (BL)
突发(Burst)是指在同一行中相邻的存储单元连续进行数据传输的方式,连续传输所涉及到存储单元(列)的数量就是突发长度(Burst Lengths,简称BL)。
读/写操作,都是一次对一个存储单元进行寻址。然而在现实中很少只对SDRAM 中的单个存储空间进行读写,一般都需要完成连续存储空间中的数据传输。在连续读/写操作时,为了对当前存储单元的下一个单元进行寻址,需要不断的发送列地址与读/写命令(行地址不变,所以不用再对行寻址)。
1.6.7数据掩码(DQM)
在讲述读/写操作时,我们谈到了突发长度。如果BL=4,那么也就是说一次就传送4笔数据。但是,如果其中的第二笔数据是不需要的,怎么办?还要传输吗?为了屏蔽不需要的数据,人们采用了数据掩码(Data I/O Mask,简称DQM)技术。通过DQM,内存可以控制I/O端口取消哪些输出或输入的数据。为了精确屏蔽一个数据总线位宽中的每个字节,每个DQM信号线对应一个字节(8bit)。因此,对于数据总线为16bit的SDRAM芯片,就需要两个DQM引脚。
SDRAM官方规定,在读取时DQM发出两个时钟周期后生效,如图所示。而在写入时,
DQM与写入命令一样是立即成效,
数据掩码拉高表示屏蔽数据,为低时表示数据有效。
读取时DQM==2时时序:
写入时DQM==2时时序:
1.6.8 刷新,预充电
暂时不作叙述。
二 如何调用sdram ip核简化系统设计
2.1 SDRAM ip核是什么
根据前面的描述可以发现,如果单独去写一个sdram芯片的驱动会很麻烦,为了方便和简化设计,sdram ip核把 SDRAM 芯片所有繁琐的时序全部封装掉,对外只暴露两个口 —— 一组简单的 Avalon-MM 接口口,一组直接连芯片的引脚(mem_*)(只需要连接给芯片)。不需要自己写初始化状态机、不需要算刷新周期、不需要关心 RAS/CAS/WE 怎么组合,这些全在 IP 内部。但是在调用IP时,需要设置一些参数,根据芯片的不同,参数不同。
我使用的这款板子的sdram 芯片参数如下:
2.2 sdram ip核使用
这里只展示了用户侧接口,通过去驱动这些接口来完成IP核的使用。
下面将一一介绍上述接口具体的作用(代表的含义)
avs_address:读写地址24位,包括 bank,行地址,列地址,构成为:bank[1],行地址(13位),bank[0],列地址(9位)。
asv_byteenable:_n:字节使能,两位位宽,低有效,控制 16bit 数据中哪些字节参与本次传输,例如00,表示两个字节都参与。01:表示高字节参与,低字节不参与。
avs_chipselect:片选信号。
avs_writedata:输入数据(写的数据),16位位宽。
avs_read_n:读请求,低有效。
avs_write_n:写请求,低有效。
avs_readdata:数据输出(读数据)。16位位宽
avs_readdatavalid:数据输出有效,
avs_waitrequest:从机忙标志(1),必须等待不忙时(0),才能进行其他操作。
2.3sdram ip核读写操作:
写事务:主端拉低 write_n,同时给出 address、writedata(及 byteenable_n);若 waitrequest为高则保持信号不变,直到 waitrequest 拉低,本次写完成。
读事务:主端拉低 read_n`并给出 address;waitrequest 拉低表示读请求被接受;此后若干周期(从机内部延迟),从机输出 readdata并拉高 readdatavalid,主端在该拍采样读数据。