天天看点

SDRAM设计之初始化(一)

SDRAM设计之初始化(一)

       在我学习FPGA设计之初,就在各种各样的学习开发板上见到过各个厂家的SDRAM,几乎每种开发板上都会板载一片甚至多片SDRAM,最近又重温了一下SDRAM的控制过程,当然我指的是使用VerilogHDL语言搭建一个SDRAM的接口控制逻辑,当然也可以使用别人写好的现成模块,但是作为一个学习的过程来说,虽然设计不大,但这样一个接口的设计还是需要很多设计技巧在里面的,真正自己写一遍对自己的设计能力来说还是一种磨练,比如我们如何能在SDRAM的一直刷新中,完成大量数据无误的写入与读出等等,都需要在设计之初去全面考虑。

       在这篇笔记之前计划写一篇关于SDRAM的原理性的简介的,但至今没想好要写点什么,也是自己原理性知识储备不够,因此就先直奔主题,先来记录下对SDRAM进行操作的第一个步骤------初始化。

       以美光的一款SDRAM MT48LC16M16A2为例,其实大部分的SDRAM操作基本都是类似(以我浅薄的认知而言),可能就是速度不大一样,导致不同的SDRAM在一些细节上有一些区别。

       初始化是SDRAM上电完成后必须要进行的一项步骤,否则是无法进行后面的一系列操作的,而初始化当中需要进行的一项重要操作,便是模式寄存器设置(LOAD MODE REGISTER),该寄存器通过不同的bit位设置了SDRAM各种不同的工作模式,我们先来看下整体的时序图:

SDRAM设计之初始化(一)

将初始化过程总结如下:

  1. SDRAM上电;
  2. 给SDRAM提供一个稳定的时钟CLK,同时CKE时钟使能端需要打开;
  3. 等待100us,在这100us内需要给SDRAM NOP命令,NOP命令可以在这100us中的任意时间内给出,且需要持续到100us结束,且至少需要执行一次NOP命令,一般我习惯于一直执行NOP命令在这期间,毕竟使用FPGA控制这点很容易实现(命令列表将在下面给出);
  4. 100us结束后,执行一次PRECHARGE 命令,对所有bank进行操作;
  5. 至少 等待 tRP时间,在此期间需要执行NOP命令,所有的bank将会进入idle state;
  6. 执行一次ATUTO REFRESH 命令;
  7. 至少等待tRFC时间,在此期间需要执行NOP命令;
  8. 执行一次ATUTO REFRESH 命令;
  9. 至少等待tRFC时间,在此期间需要执行NOP命令;
  10. 模式寄存器设置:此时SDRAM已经可以进行模式寄存器的设置了,上电之后该模式寄存器处于不定状态,因此,每次上电都需要进行模式寄存器的设置 ;
  11. 至少等待tMRD时间,在此期间需要执行NOP命令;
  12. 至此SDRAM的初始化已经完成,可以进行后续的各种命令操作。

由时序图可以看出,模式寄存器复用了SDRAM的地址位(A0~A12),每一位含义如下图所示:

SDRAM设计之初始化(一)

模式寄存器都设置些什么呢:

(1)写突发模式(Write Burst Mode):单个写入/可编程的突发写入长度(就是执行一次写命令可以写入多个数据);

(2)数据潜伏周期(CAS Latency):就是在收到有效的读命令的时候,数据会在几个时钟之后被放置到数据总线上;

SDRAM设计之初始化(一)

(3)突发类型(Burst Type):Sequential/Interleaved(见下表);

SDRAM设计之初始化(一)

(4)突发长度(Burst Length):标识一次写入/读出几个数据;

补充一个命令列表,SDRAM各种控制命令是通过控制几个引脚配合来完成的:

SDRAM设计之初始化(一)

       SDRAM的初始化就介绍到这里了,之后会陆续介绍关于刷新、读、写等操作…