SDRAM 理论篇

--------------------------------------------转自小梅哥----------------------------------------

由于SDRAM本身就是一个比较复杂的东西,之前小墨在学这方面东西的时候感觉很是吃力,于是那时候便暂时放下了,知道年后这段时间,小墨又重新拾起这个知识点,想要一口气把它调通了,再往下看其他的东西。学SDRAM,理论要懂,代码设计,仿真调试,时序分析,时序约束,都很重要。之前由于只是把代码写好了,对时序分析和时序约束这方面的知识还只是空白,所以怎么调都调不通。开学以来,小墨仔仔细细的研究了一下时序,也看了不少的资料,对时序也算是有所见解,摸透了倒是不敢说,至少是懂了那些公式的由来,输入输出延时的计算,相位偏移的计算,以及源同步时序模型的理解等等,也做了不少的笔记,亲手将其数值计算过,然后再将其添加到我的SDRAM工程之中,经过好几天的调试,稳定不稳定倒是不敢说,因为同一个程序换到不同的开发板上,如果不经过重新的时序约束,是很难跑起来的,小墨这几天就亲身经历过,同一段代码在两块板子上不能同时跑,要换约束参数,当然这是受PCB板的布局,SDRAM和FPGA的型号的影响,所以这段代码的稳定性要具体情况具体分析。

代码的编写还是参考了启蒙老师特权老师的代码,感觉这段代码写的很经典,借助特权老师推荐的《高手进阶,终极内存技术》这一篇文章,可以很好的理解SDRAM的工作原理,我是这样学习这段代码的,首先将《高手进阶,终极内存技术》看一遍,当然第一遍不好看懂,然后结合代码再一遍一遍的去看工作原理,慢慢的就会明白特权老师为什么要这么处理了,然后再自己亲手将这段代码敲出来,遇到不懂得可以再去参考源代码,这样从头到尾敲完之后,工作原理这一块大体上就算是熟悉了,然后是仿真调试,这是一个漫长的过程,要有耐心,再然后就是学习时序,亲手将约束值算出来,再根据时序报告进行微调,直到有一天看到自己从头到尾做出来的工程,能后顺利的跑起来,心中便会产生极大的成就感,那么恭喜你,你在FPGA设计方面可以算是一个小高手了(和刚开始学的人相比)。

接下来的文章我打算这么安排,第一篇,也就是这一篇说一下理论,即SDRAM的工作原理和一些参数的含义,第二篇文章我要给SDRAM的设计做一个架构,就是用状态机的方式,描述每一个过程,给代码编写做一个清晰的思路,同时解读一下特权老师的代码和其中比较难懂的设计方法,最后一篇文章我们从静态时序分析写起,一直写到SDRAM的收敛,其中包括建立保持时间的余量问题,输入输出的延时的计算,SDRAM时钟相位的计算,以及timequest的使用,时序报告的查看方法等,大概在一两周的时间写完,也希望大家多多支持,你们的支持,更是我前进的最好动力!

一、从结构说起

先来说一下SDRAM的结构吧。当然没有人家讲的那么专业,只说说我的理解。

1、P-bank

SDRAM,也即我们的内存,我们的电脑,手机等设备都离不开我们的内存。一个设备运行速度的快慢,内存起到关键性的作用,就像我们的电脑,开机之后一般都是把一些应用程序加载到内存里运行,因为RAM的读写速度要远远大于ROM,而我们的SDRAM,即同步动态随机存储器,就是通过不断地刷新,充电,防止电容电量的丢失,从而保留住数据。与CPU交换数据,根据CPU位宽的不同,要相应选择不同的SDRAM芯片,SDRAM芯片的位宽不等,我们用的这片SDRAM是16位位宽,假设我们的CPU是64位的,那么我们要想与之匹配,就必须用到4片这样的SDRAM,才能构成64位的位宽,那么由这4片SDRAM 构成的芯片集合,我们称之为物理bank,即P-bank,CPU通过控制SDRAM的片选信号,控制相应的芯片

2、L-bank

再往芯片里面看,每一片SDRAM里面,有几个存储阵列,我们开发板上的都是4个存储阵列,这样的存储阵列,我们称它为逻辑bank,即L-bank。每个存储阵列里面有2^12行,2^8列,我们可以通过控制SDRAM的地址线,来选中相应的行与列,进而确定一个存储单元,每个存储单元里面就是我们的数据了,我们的芯片是16位的,所以我们的存储单元也就是16位的。

这样一来,CPU通过片选信号选中一片SDRAM,然后访问某一个L-bank,通过行列地址确定某一个存储单元,将存储单元里的数据读出来送到CPU。这样看来,芯片的位宽就是我们的存储单元的位宽,若是一同选中所有SDRAM芯片,那么输出的也就是16X4=64位的CPU位宽了。

3、芯片容量 与 内存容量

我们来算一下SDRAM的芯片容量,一片SDRAM芯片假设有4个L-bank,2^12行,2^8列,那么它就含有4 x 2^12 x 2^8个存储单元,又因为每个存储单元里面有16位数据,因此,我们的芯片容量为 4 x 2^12 x 2^8 x 16 = 64Mbit = 16MB,如果是一个P-bank里面是4片SDRAM的话,那么我们的内存容量就是4 x 16 = 64MB

我们再算一下,假如我们的SDRAM的芯片位宽是8位的但是芯片容量不变,即芯片位宽是8位,芯片容量是16MB,那么,要想与64位的CPU匹配,我们需要8片SDRAM,那么我们的内存容量就是8 x 16 = 128MB,由此可见,在芯片容量相同的情况下,位宽越小,内存容量越大。这就说明了,为什么我们的台式电脑要用位宽小的芯片,因为台式电脑空间大,位宽越小,用的芯片越多,内存也就越大,相反,我们的手机就必须用大位宽的芯片,从而节约空间,但是付出了内存容量小的代价,这也说明了为什么我们的手机或者笔记本电脑不如台式机运行速度快的原因,在内存方面差了一大截

下面是我用画图做的一个框架,帮助大家理解

二、工作原理其实不难

这部分我们就按照代码的顺序开始讲起

1、初始化

初始化开始,SDRAM需要经过一个200us的稳定延时,这部分在代码部分直接做一个计数器就好了,下面来讲一下预充电

预充电

官方解释是   L-Bank关闭现有工作行,准备打开新行的操作就是预充电。也就是说,我们发送了一个行地址,有发送了一个列地址,找到了相应的存储单元之后,如果我们想访问另一个地址,而这个地址不在这一行内,那么我们就需要先将这一工作行关闭,这个过程就是预充电,然而刚开始我们还没有发送行列地址,只是先做一下初始化,以后等我们要发送行列地址的时候,为了手动设置预充电麻烦,我们可以告诉SDRAM在每次寻址完之后自动进行预充电即可

自刷新

我们之所以叫DRAM,就是因为它是动态的,就是每隔一段时间进行一次刷新,确保那些没有被读写过的数据不会以为时间长导致电容漏电,从而导致数据丢失,因此,每隔一段时间要对存储单元进行一次自刷新,由于存储体中电容的数据有效保存期上限是64ms,因此,我们需要每64ms对所有的存储体进行一次刷新,又因为我们有2^12= 4096行,那么我们来算一下,每刷新一行所要的时间是64ms/4096  = 15us 也就是说,我们每15us需要发送一个自刷新命令

模式寄存器配置

模式寄存器的配置主要还是用于后面的读写操作的,我们先看上面,是地址总线,首先大家不要被他迷惑,我们的地址总线是12位的,行列共用,他前面的两位bank地址不属于地址总线范围,只是在配置的时候需要用到那两位,所以会将其加进来,下面来一一解释。

关于操作模式    :   操作模式可以分为突发读,突发写,单一写等,突发读就是我们在发送了行列地址后,找到了我们要的存储单元地址,对它进行读,如果设置了突发读的话,那么我们在读取第一个数据之后,如果想读取这个存储单元后面的一个存储单元的数据的话,就不必再次发送行列地址了,他会自动的读取接下来的数据,至于读几个存储单元,就涉及到突发长度,一般是2,4,8,全页的方式,全页就是将这一行上的数据一连串的全部读出或写入,同时还涉及到突发传输方式,分为顺序和交错传输,顺序传输就是依次读后面的几个存储单元,交错传输就是隔一个读一个。

关于潜伏期        :   潜伏期就是我们发送了行列地址后,数据并不是马上到达数据总线,而是要经过一段潜伏期,一般为2到3个时钟周期,注意潜伏期不是延迟,潜伏期是发送列地址后数据已经有效,只是还没有达到一定的高度,或者说是信号不够强,要经过一定的放大才能输出,所以说潜伏期不是延迟

2、工作状态

初始化结束以后,SDRAM就可以正常工作了,这个时候,如果收到读写信号,并且收到地址,那么SDRAM就会进行相应的寻址,并将数据作相应处理。

读状态

上面说了,SDRAM的地址是行列共用,也就是说行地址和列地址共用那条12位的地址线,假设某个时间我们要读一个数据,那么就先要发送12位地址线,就是行地址,当然也要接着发送的是P-bank的地址,但是这个时候还没有发送读信号,读信号要和列地址一起发送,我们称这个状态为行有效(RAS)

发送完行地址之后,就要发送列地址,但是不能马上发送,要经过一定的延时,这个延时我们叫做行有效到列有效的延时,即Trcd

经过Trcd之后,我们需要发送列地址,即列有效(CAS),这样我们就确定了我们逻辑单元所在的位置了,在发送列地址的同时,给SDRAM发送读命令。有人会问,既然地址线是行列共用,那么12位的地址线,列地址才占8位,其他的怎么用?没错,列地址是只占了8位,还有第8到11位地址线没用,这个时候我们就将其补零就好了,凑够12位地址发送给SDRAM,但是我们有一位地址很重要就是A10位,A10位置1的话,那么我们每次进行完一次读写,SDRAM就会自动预充电,因此,我们一般把地址总线的第8到11位赋值0100,然后与列地址合并,再发给SDRAM。

发送完列地址后,也就是读命令后,就要进入潜伏期Tcl,刚刚说了,数据在潜伏期里,要经过一定的放大驱动,达到一定的高度之后才会被输出,这个放大的过程是在一个叫做S-AMP的通道里完成的,每一个存储体都对应一个S-AMP通道 ,因此从数据I/O总线上有数据输出之前的一个时钟上升沿开始,数据即已传向S-AMP,也就是说此时数据已经被触发,经过一定的驱动时间最终传向数据总线进行输出,这段时间称之为tAC。在后面的时序分析中,我们会用到这个参数,即数据在SDRAM芯片中的传输时间Tco,数据输出到SDRAM数据总线上以后会有一个保持时间Toh,也是我们以后做时序分析要用到的参数,这两个参数告诉我们,数据从有效前的一个时钟周期开始算起,最大要经过Tac时间才会输出到数据总线,最慢需要Toh时间因此,在后面的时序分析中我们要计算,数据在SDRAM芯片的传输时间 Toh < Tco  < Tac

写状态

写状态跟读状态有一点不同,就是写状态没有潜伏期,即行有效之后,等待Trcd后发送写命令和列地址,数据直接会写到数据总线上,也就是说,写数据是零延时的,但是,即使写数据是零延时的,但是数据要进入SDRAM的存储体还是需要时间的,这个时间叫做写回延时Twr,试想,如果SDRAM工作在写回延时状态,突然来了一个预充电,那么数据是不是就不能正确的被写入了,因此,写回延时不能和预充电同时进行。

三、参数总结

好了,说了这么多,是不是感觉SDRAM的操作并不难,那么我们就来总结一下之前出现的一些参数吧,这些参数的消化,能够帮我们更好的理解SDRAM的工作原理

1、RAS  :  行有效

2、Trcd  :  行地址到列地址的延时时间,单位是周期数,一般为2到3个时钟周期

3、CAS  :  列有效,同时发送读写命令

4、 Tcl     :  潜伏期,发生在读状态,数据有效到出现在数据总线上的延时,单位为周期数

5、 Tac   :  数据从存储单元里出来之后,已经进入S-AMP通道进行驱动与放大,到出现在数据总线上的时间

6、 Toh   :  数据出现在数据总线上,并保持一段时间

7、 Trp    :  在发出预充电命令之后,要经过一段时间才能允许发送RAS行有效命令打开新的工作行

8 、Twr    : 写状态时的写回延时,写入的数据进入SDRAM存储单元的时间

那么理论部分就到这里吧,下一篇文章将会写一下整个操作SDRAM的架构图和代码解析,写了有好几个小时,谢谢大家~

以后小墨同学的文章将在EDNchina和北京至芯科技官方技术论坛同时更新,至芯科技的官方技术论坛也有很多的资料供大家下载,里面也有小墨的专题板块,希望广大网友和爱好者的大力支持~

[url]http://www.fpgaw.com/[/url]

小墨同学《零基础学FPGA》学习专版  一个大三学生学习之路的真实记录

[url]http://www.fpgaw.com/thread-78527-1-1.html[/url]

下面是至芯科技官方网站,夏宇闻教授和那里的老师都超好的~有意愿接受FPGA培训的可以找工作人员咨询

[url]http://www.zxopen.com/[/url]

以后小墨同学的教程会跟这款开发板配套,想跟小墨同学一起学习,一起进步的的可以考虑一下购买一块开发板,毕竟学习要舍得投资嘛,下面是开发板淘宝链接

[url]http://item.taobao.com/item.htm?spm=a230r.1.14.13.NZBxw3&id=42366952129&ns=1&abbucket=13#detail[/url]

时间: 2024-08-01 17:21:41

SDRAM 理论篇的相关文章

【SSH2(理论篇)】--Struts2配置详解

上篇博客讨论了SSH2框架模型,在开发过程中发现SSH2的开发模型其实类似于经典的三层模式,在每一层中分别添加了不同的框架,显示层使用的是Struts2进行配置的,业务逻辑层使用的是Spring配置,数据持久层则采用的是Hibernate,开发模式简单易懂,接下来将会分别从三层着手讨论每一层的运行内容. 一.Struts体系简介 struts,是Apache软件基金会(ASF)赞助的一个开源项目,它通过采用Java Servlet/JSP技术,实现了基于Java EE Web应用的Model-V

【机器学习】Logistic Regression 的前世今生(理论篇)

Logistic Regression 的前世今生(理论篇) 本博客仅为作者记录笔记之用,不免有非常多细节不正确之处. 还望各位看官能够见谅,欢迎批评指正. 博客虽水,然亦博主之苦劳也. 如需转载,请附上本文链接,不甚感激! http://blog.csdn.net/cyh_24/article/details/50359055 写这篇博客的动力是源于看到了以下这篇微博: 我在看到这篇微博的时候大为触动,由于,如果是rickjin来面试我.我想我会死的非常慘,由于他问的问题我基本都回答不上来.

Logistic Regression 的前世今生(理论篇)

[机器学习]Logistic Regression 的前世今生(理论篇) 本博客仅为作者记录笔记之用,不免有很多细节不对之处. 还望各位看官能够见谅,欢迎批评指正. 博客虽水,然亦博主之苦劳也. 如需转载,请附上本文链接,不甚感激! http://blog.csdn.net/cyh_24/article/details/50359055 写这篇博客的动力是源于看到了下面这篇微博: 我在看到这篇微博的时候大为触动,因为,如果是rickjin来面试我,我想我会死的很惨,因为他问的问题我基本都回答不上

三层学习------理论篇

学校放假了,刚回家的孩子就像个客人被父母招待着.在放假的前几天里,你尽管开口,想吃啥爸妈都会满足你,不过好景可不长!在我家,厨房是老妈的地盘,买菜.做饭.洗碗刷锅,一个人全包了.而在饭店吃饭呢,吃饭的人多了,顾客点的饭菜种类各不相同.前前后后,一个人忙乎,哪里顾得过来,所以饭店就有了分工.前台服务员负责将顾客点的菜上报给厨师和:厨师根据上报的菜单做菜:采购员负责柴米油盐酱醋茶.这样,大家各司其职,井井有条. 我们在家中吃饭比较简单,没有具体的分工.饭店就是一个复杂庞大的系统了,需要合理规划,分工

MySQL知识理论篇

此篇文件献给正在学习MySQL的同学们,如果希望探讨学习请加我QQ:402283866 [思维理论篇] MySQL的定义 MySQL就是一个存表格的仓库,用规范的语句可以操作这个表(我们称sql语句).这些表格的每一行为一个单位,被公司记录一些信息. MySQL的使用方法 MySQL中的表格,每一行在被调用的时候会使用一些标准的语句,语句可以完成增删改查等操作.这些语句有6类,常用的有3类,每一类只有3-5个总有固定的单词,反复练习很容易掌握. MySQL主从同步 因为两个原因要设置主从同步:1

小蚂蚁学习sphinx(1)--理论篇

网上有视频在讲php+mysql+sphinx,以前只是听说过,心想今天终于能够学习一下涨涨见识了,一个小时的理论篇讲完,并没有预想中那种汲取大量知识的满足感,一来讲的理论多一些,二来都是在linux下的操作,没办法实践,先把今天的小笔记写一下,以后慢慢钻研这块内容. sphinx生成索引数据,并为数据库提供更专业的搜索功能. 为什么要用sphinx?1.做搜索时当数据量很大单纯的mysql搜索比较慢(如果表进行了分表会更慢)2.搜索中文分词3.速度快 获取sphinx.http://sphin

二进制序列化与反序列化。Net理论篇上(一)

对于从事底层信息通信的同行而言,序列化及反序列化想必都是耳熟能详的.脱离很多书面的标准概念,就个人理解而言,序列化和反序列化的本质其实为了找到一种公共的通用的数据格式达到一个无界的境界,正如方言对于普通话,各国语言对于英语.而我们需要做的是去发现这么一种具体的格式,并且完成一个相对对称的特性,如同压缩跟解压缩. 常规的序列化和反序列化的格式通常有如下几种:binary,JSON, XML和SOAP等. 当然有其他的,这个只能恕我孤陋寡闻了.通常我们会选取短小精悍的JSON 和更具通用的XML,当

Oracle内存组件理论篇一

目标 1.SGA结构 2.PGA结构 1.SGA Shared pool 1).共享池是对SQL.PL/SQL程序进行语法分析.编译.执行的内存区域. 在执行SELECT * FROM emp语句时,会对sql语句进行语法分析->编译->生成执行计划->运行执行计划等,这些操作都在共享池中完成: 如果再次执行SELECT * FROM emp语句时,会在共享池中查找是否有相同的sql,如果存在则省去编译.生成执行计划操作步骤而是直接运行执行计划. 因此养成良好的编码习惯对于提高oracl

三层架构-------理论篇

概念: 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI).业务逻辑层(BLL).数据访问层(DAL).区分层次的目的即为了"高内聚,低耦合"的思想. 各层概念 1.表现层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得. 2.业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理. 3.数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增添.删除.修改.查找等. 注:应用三层离不开另一个重要的类:实体类,