SDRAM理论篇之基础知识及操作时序讲解(转载)

这个星期在进行SDRAM的学习,当然关于SDRAM的理论知识,在上周讲了一部分,而这周主要的还是写代码及调试。如果有朋友在这之前没有接触过内存的话,可以看下业内写的比较好的扫盲文章《高手进阶 终极内存技术指南》(点击进入下载),虽然Kevin在这之前也曾经看过这篇文章,但是看完之后对于写代码还是毫无头绪,所以Kevin在这里建议大家,如果是完全不知道内存是神马的朋友可以看下这篇文章,对于一些有基础但是不了解SDRAM操作时序的朋友可以直接看SDRAM厂商的官方文档,虽然Kevin也会在这篇博文中会根据自己对官方手册的理解来讲解SDRAM操作时序,但还是建议大家多看英文文档,这样才能体会原汁原味的知识,这也是为了避免所谓的“权威”中文版给大家带来某些误导,毕竟也是会有一些朋友在看着“权威”的中文翻译版本却在不停的骂娘,哈哈。所以大家也不要轻信所谓的中文翻译版手册,因为每个人对于手册中的英文意思的理解都有可能有区别,所以大家要相信厂商的手册才是最权威的。

接下来,咱们正式开始讲解SDRAM的有关知识。

在这里插入图片描述

关于SDRAM的内部结构

我们借用《高手进阶 终极内存技术指南》中的部分文字来进行讲解:

在这里插入图片描述

看到这里,大家应该不难想象,我们对SDRAM进行寻址的方式为:先确定Bank的地址,再确定行和列的地址。

SDRAM内存容量计算方式

在这里插入图片描述
图中的128Mb表示SDRAM的总容量,2M:表示1个Bank共有2M个地址,也就是说一个bank有2M个存储单元;4Bank表示有4个Bank;16 I/O表示位宽为16位,数据总线用的是16位的,1个存储单元能存储的最大的数为2^16-1=65535。然后再根据各个参数算下容量:2M x 4 x 16b = 128Mb .

SDRAM芯片引脚介绍

第一个图是SDRAM的引脚图,第二图是各个引脚信号的描述信息
在这里插入图片描述
在这里插入图片描述
上面的两个图在SDRAM芯片的手册上都是可以找到的,下面Kevin来简单的介绍下我们做FPGA开发需要重点关注的信号

CLK:SDRAM工作的时钟,并且所有的输入信号都是在CLK的上升沿进行检测的,也就是说我们给SDRAM给的任何命令,一定要在CLK的上升沿保持稳定,以免SDRAM获取我们给出的命令时出现错误。

CKE:时钟使能信号,是用来控制SDRAM内部时钟是否工作的一个信号(在SDRAM内部也是有时钟的哦)

CS:片选信号,这里需要注意的是,如果要对SDRAM进行操作,必须要将片选信号拉低

BA0,BA1:Bank地址线,用来给bank的地址,可以控制SDRAM的4个bank

A0~A11:地址线,当我们选择SDRAM某个Bank的Row地址的时候,需要到12根地址线(A0~A11);当选择Col地址的时候,只用A0~A8这9根线;A10这个信号可以用来控制Auto-precharge

RAS、CAS、WE:这三根线就是用来给SDRAM发命令的,包括初始化、读、写、自动充电等命令。

UDQM、LDQM:数据输入/输出掩码。

DQ0~DQ15:SDRAM的数据线,为双向的,向SDRAM写数据或者从SDRAM中读出来的数据都是在DQ上进行传输的

大家看到上面的A0~A11这根地址总线既可以来控制row也可以控制col,而且控制col地址与控制row地址用到的线的数量又不一样,可能会有些疑问,下面Kevin向大家解释一下:
在这里插入图片描述
另外一个的话,可能大家不太明白掩码(UDQM、LDQM)的作用,下面请您耐着性子听Kevin的解释:

在这里插入图片描述

SDRAM的相关操作时序

前面铺垫了这么多SDRAM的相关知识,相信大家已经迫不及待想知道怎么来操作SDRAM了,各位看官且听Kevin详细道来。

在这里插入图片描述
上图是SDRAM内部的状态跳转图,粗黑线表示在该状态下会自动跳转到另一个状态,细黑线表示需要给命令才会跳转。

SDRAM初始化

我们先找到SDRAM最开始的状态“POWER ON”,这是刚上电的状态。在“POWER ON”状态给‘Precharge’命令之后就会跳转到“Precharge”状态,然后自动跳转至“IDLE”状态。在“IDLE”状态下,我们需要给SDRAM两次Auto-refresh命令,然后接着需要进行模式寄存器设置,对模式寄存器设计完毕之后,我们的初始化过程也就结束了。说了这么多,我们还是不知道怎么给SDRAM进行初始化,当时Kevin看过《高手进阶 终极内存技术指南》之后也是依然不知道怎么写代码对SDRAM进行初始化。在这篇博文里边,Kevin暂时不会讲如何写代码,我只会把初始化这个过程相关的时序及原理给大家讲清楚,原理理解透彻了,相信大家对于代码如何进行书写也是会有一定的想法的,关于代码如何书写,也可以参考Kevin的另一篇博文。

我们继续上一张官方文档中的图片,这次来的可以波形图哦,各位看官要看仔细咯,对于你写代码是很有帮助的:
在这里插入图片描述
可能大家第一次接触到这种时序图的时候会有点头疼,不过没关系,请听Kevin给大家慢慢解释,在看文档解释的同时,与上边的状态图结合起来会更容易理解一点,对于图中出现的每一个指令,我们都是可以在我们所使用的器件手册中找到:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

SDRAM写操作

在状态转移图中,我们可以发现在初始化完成之后,对SDRAM进行读或者写操作之前,我们还需要有一个命令”ACT”(这个命令在我们的初始化时序图中也出现了,只是我们是拿到了这里来讲),这个命令的意思说成大白话就是”行有效”命令,就是让SDRAM中的某一行活动起来,以便我们进行读或写。

在正式讲写操作之前,还有一点希望大家能注意一下,可能细心的朋友已经发现了,在我们的状态转移图中有”WRITE”和”WRITEA”这两个状态,处于这两个状态时,我们都可以对SDRAM进行写操作,只是说在”WRITEA”状态,我们每写完一个突发长度的数据之后,SDRAM会自动跳出这个状态进行刷新,而在”WRITE”状态,是需要给相应的指令之后才会跳出”WRITE”状态的,所以为了提高SDRAM的运行速度,我们一般采用不让SDRAM进入”WRITEA”状态来提高速度。当然”READ”和”READA”这两个状态的区别也是这样的。

下面我们继续上一张写操作的时序图,这个时序图是不进入”WRITEA”状态的:

在这里插入图片描述
按照老套路,Kevin继续和大家一起来分析写操作的时序:
在这里插入图片描述

SDRAM读操作

下面来说说我们的读操作,其实读操作和写操作是类似的,相信大家有了写操作的基础,对于SDRAM的读操作理解起来还是会比较轻松的,咱们继续上图:
在这里插入图片描述
在这里插入图片描述

SDRAM的自动刷新操作

Kevin已经在前面多次提到了SDRAM的自动刷新,SDRAM为什么要自动刷新,相信大家通过前面的介绍已经知道原因了,可以说如果SDRAM到了该刷新的时间没有进行刷新,那不管我们给SDRAM写进去了多少数据都是白搭,所以大家一定要高度重视SDRAM的刷新操作,到了该刷新的时候就一定要给刷新的命令。SDRAM内部电容保存数据的最长时间是64ms,而我们一个BANK有4096行,64ms/4096~=15us,也就是说为了保证SDRAM内部的数据不被丢失,两次刷新之间的最大时间间隔为15us,所以为了能让SDRAM有更多的时间进行读或者写,我们就设定SDRAM刷新的周期为15us.

在这里Kevin还想补充一个小知识,SDRAM每进行一次刷新,是对每一行进行操作的,并不是单独针对每一个电容进行充电,所以每进行一次刷新,该行中的电容进行充电我们可以理解为是同步发生的。
在这里插入图片描述
这就是SDRAM进行自动刷新的时序图了,相信大家有了前面的基础,对于这个图应该不会害怕了吧。

在这里插入图片描述
好了,对于SDRAM的初始化、读、写以及自动刷新,Kevin在这里根据自己的理解已经全部讲完了,如果在这篇文章中出现了某些错误,还希望您及时批评指出。另外,Kevin也会在接下来的一篇博文中分享怎么来写SDRAM的控制器,也就是怎么来把这篇文章中的这些操作用代码写出来。

参考书籍:

1.《高手进阶 终极内存技术指南》

  1. 厂商官方手册

转载请注明:邓堪文博客 » SDRAM理论篇之基础知识及操作时序讲解

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值