SDRAM基本操作
SDRAM内部框图:![](https://img-blog.csdnimg.cn/a25d3c9a7b0b4925850001860efa5ec1.png)
查阅W9825G6KH手册,总结了一些常用操作:
1、上电初始化
系统上电时,SDRAM芯片需一定时间进入工作状态。上电后,SDRAM需稳定200us,然后FPGA需发送所有Bank充电指令。在所有Bank充电指令发送完成后,还需要连续8次刷新操作,最后发送模式寄存器的参数。发送完模式寄存器的参数后,SDRAM就进入正常的工作状态。
2、模式寄存器
模式寄存器(Mode Register),主要设置SDRAM的写操作模式、CAS潜伏期、地址模式、突发长度。在设置完模式寄存器后,需要等待一段时间才可以发送新的指令,这段时间为tRSC(模式寄存器设置周期,Register Set Command)。
3、Bank与行激活
初始化完成后,无论是进行读还是写,都要先激活SDRAM中的Bank地址与行地址,激活之后才可以发送列地址。激活操作非常简单,其目的是指定读写操作的行数。行激活之后要间隔一段时间才可以发送列地址,这段时间为tRCD(RAS to CAS Delay)。tRCD是以时钟周期为单位,若tRCD等于3,则Bank与行激活后要等待3个周期才可以写入列地址。
4、列地址写入
行地址激活在之后,就要对列地址进行操作,输入列地址。在SDRAM中由于行地址和列地址有复用的地址线,因此在输入行地址时,RAS信号为低。在输入列地址时,CAS信号为低。列寻址信号与读写命令是同时发出的。使用WE信号控制是读还是写,如果WE为低则为写,反之为读。
5、突发读
在输入完列地址后,等待一个读潜伏期(CL)后,SDRAM输出读数据,读数据突发的个数与模式寄存器中设置的突发长度有关。读潜伏期CL以时钟周期为单位。
6、突发写
在输入完列地址后,可进行写操作。突发写写完多个字节的数据后,需等待一段时间,让数据成功保持。这段时间为tWR(Write Recovery Time),以时钟周期为单位,至少一个周期。
7、读数据时的读中断
在突发读数据时,可由另一条读指令打断。另一条指令生效后,将输出新指令的数据。
8、读数据时的写中断
在突发读数据时,可由另一条写指令打断。在打断时,需要控制DQM使DQ数据变为高阻态,防止端口驱动冲突。
9、写数据时的写中断
写数据时可由另一条写指令打断。
10、写数据时的读中断
写数据时可由另一条读指令打断。
11、突发停止
在突发操作时,可使用突发停止指令终止正在进行的突发操作。突发停止指令可用于整页的突发操作中。对于其他的突发长度,突发指令不可以使用。
12、顺序地址模式
在突发操作中,数据的写入或者读取地址是逐次递增的。
13、乱序地址模式
在突发操作中,数据的写入或者读取地址是乱序的,顺序可由A2 A1 A0控制。
14、预充电
预充电操作是对SDRAM中的存储电容进行刷新。当我们导通行控制三极管和列控制三极管后,会对电容中的存储的电荷量产生影响,从而导致存储的数据不稳定。因此在我们进行完读操作与写操作后,需要控制SDRAM中的刷新放大器对电容进行一次刷新。读写操作后的刷新操作,我们称它为预充电。
预充电分为两种类型。第一种是在读写操作完成后,发送预充电指令,SDRAM接收到此条指令后,开启一次刷新操作。第二种是在读写操作完成后,自动进行预充电,无需发送任何指令,SDRAM在执行完读写操作后,自动刷新一次。自动预充电课通过地址线A10控制,其中A10还可以控制对所有Bank进行预充电还是只对当前Bank进行预充电。在预充电结束后需要等待一段时间才可以进行下一行的操作,这段时间称为:预充电周期-tRP(Precharge command period)。
15、刷新
刷新操作与预充电类似,两者都是控制SDRAM中的刷新放大器,对存储电容进行刷新。与预充电不同的时,刷新操作是一个定时的操作,间隔一段时间后,必须执行一次。而预充电指令只在读写操作结束后才执行一次,刷新操作是防止SDRAM中的数据静置时间过长出现丢失。因此在定时刷新一次电容,加固存储电容中的数据。
目前SDRAM的存储电容的刷新周期最大为64ms,由于自刷新指令一次只能刷新一行,因此我们要在64ms内刷新完所有行。假设SDRAM的行数为4096,那么就需要在64ms内刷新4096次,我们在64ms内均匀的刷新4096行,那么自刷新的指令间隔:64ms/4096 = 15.6us。
SDRAM指令
DRAM的指令主要由:CKE、CS、RAS、CAS、WE、A10这几个引脚控制。通过输出不同的数值,SDRAM可以执行不同的指令,其中包含Bank行激活、预充电等等。指令表如图所示:
主要使用的指令如表格所示。
指令 | CKE | CS | RAS | CAS | WE | A10 |
初始化 | 0 | 1 | 1 | 1 | 1 | x |
空指令 | 1 | 0 | 1 | 1 | 1 | x |
行激活 | 1 | 0 | 0 | 1 | 1 | v |
读 (自动预充电) | 1 | 0 | 1 | 0 | 1 | 1 |
写 (自动预充电) | 1 | 0 | 1 | 0 | 0 | 1 |
突发停止 | 1 | 0 | 1 | 1 | 0 | x |
预充电 | 1 | 0 | 0 | 1 | 0 | 0/1 |
自动刷新 | 1 | 0 | 0 | 0 | 1 | x |
模式寄存器 | 1 | 0 | 0 | 0 | 0 | x |
SDRAM时序
SDRAM在操作时,每个操作之间有具体的时间要求。这些时间要求共同组成了SDRAM的时序。时序与SDRAM芯片的速度等级相关,具体的时序要求如图所示。
其中一些重要的时序参数:
- tRSC: 模式寄存器设置周期
- tRC: 刷新时间间隔
- tRCD:行激活与列地址输入直接的时间间隔 (RAS to CAS Delay)
- tRP: 预充电的指令周期
- tWR: 写数据的同步周期 - 2
- CL: 读数据的潜伏期 - 2
了解了SDRAM工作原理和操作之后,我们可以根据手册的时序图来构建状态转移图和总体的时序逻辑,然后根据整理的有效信息编写代码,可以很简单的完成SDRAM的驱动。