原创 sdram的学习心得——与初学者共勉

2012-12-20 10:21 1916 13 16 分类: FPGA/CPLD

一年前在EDN博客上发表的博文,后来由于改版,帐号丢失,最近又在别人分享里发现,粘贴过来,希望对有用的人有点帮助。


 

最近刚走出校园,走向工作的岗位,哎,说实话,这个难啊,其实我还有一年半才能研究生毕业呢,不过早点走出来也是为了更好的学习,学校的环境太安逸啦,好了,废话少说还是进入正题吧。

    关于SDRAM熟悉的人可能都知道,sdram是随即的动态的存储器,关于它的基本构架组成以及等等参数也不需要我更多的解释,网上的资料很多,但是我建议大家下载文章或者代码时一定要注意,好的文章和代码可以让你很顺利的走上sdram的学习研究之路,而不好的则会让你事倍功半,关于这一点我也是深有体会。

   由于项目需要,接触SDRAM也有一月有余,最先接触SDRAM的介绍和代码是特权同学《深入浅出》那本书中介绍的,而后不断断续续下载过好几个不同版本的SDRAM,其中也有一俩个是仿照特权同学的代码改编,还有些根本就是官方代码,详细,但逻辑关系复杂。因为每套代码都有作者自己的思维,很难完全凭代码理解作者的意图,所以建议初学者确定一到两个方案,深入研究,免得做无用功。

   目前为止我研究SDRAM碰见先后几个不同的问题,或者说是心得,和大家分享一下,特别的新手,大侠们就不要见笑,绕路而行喽。首先SDRAM内部有极其复杂的时序关系,所以一些大公司如ALTERA,XILINX公司等都有自己的SDRAM controller代码,sdram controller就是一个模块,这个模块把复杂的时序封装在模块内部,我们只需控制输入就能得到想要的输出,不过controller编写也是相当麻烦,一般都是从前人那里改编,其次利用状态机分别描述SDRAM的初始化状态和工作状态是个不错的选择。另外SDRAM的时序延时参数的设定也让人大伤脑筋,另外让我感到最头疼的就是sdram的仿真测试,在这上面花费的时间已远远大于研究代码的时间,目前思绪比较乱,后续我会把做仿真的整体思路整理一下发到网上和新手分享,今天这篇文章比较仓促,过不久我会重新整理一次,希望真能把自己碰到的问题和大家分享出来。

 

附:几个重要的延时参数


1, tRCD(即RAS to CAS Delay) 可以理解为行选通周期,也就是发行地址后要过几个时钟才能发列地址。

 

   2,CL(CAS Latency,CAS潜伏期)在发送CAS之后,仍要经过一定时间才能使数据通过I/O通道(DQ)输出到内存总线上,才能读数据(CL延时里面已经包括了tAC),切忌这个CL延时是在读操作的时候才有,在写操作的时候没有这个。

 

   3,在写操作的时候数据可以和CAS同时发出,但电容充电需要一定的时间。为了保证数据的可靠写入都会留一点时间(tWR,Write Recovery Time),这个操作也被称为写回(Write Back).

 

  4,tRP(Precharge command period) 预充电有效周期,也就是说在发出预充电命令之后,要经过一段时间才允许发送RAS行有效或则是其他的命令。

 

  5刷新,预充电是对一个BANK或则是全部BANK中的工作行进行操作,并且是不定期的,而刷新时有固定周期的,依次对所有行进行操作,以保留那些久久没有经历重写的存储体中的数据。但与所有L-BANK预充电不同的是,这里的行是指所有L-BANK中地址相同的行,而预充电中各L-BANK中的工作行地址并不一定是相同的。公认的刷新周期是64ms每行,如果一个存储体有N行,那你就要每隔64ms/N发一次刷新命令。刷新命令一次只对一行有效,发送间隔也总是随着行数的变化而变化。刷新的操作分为两种:自动刷新(Auto Refresh,简称AR)与自刷新(Self Refresh,简称SR),无论哪种刷新方式,都不需要外部提供行地址信息,因为这是一个内部的自动操作。

  对于AR,SDRAM内部有行地址生成器,不需要列地址因为它是对一行中所有的都刷新。由于刷新涉及到所有的BANK,所以在刷新过程中,所有BANK 都停止工作,而每次刷新的周期是9个时钟周期,在此期间所有的工作指令自能等待。SR则主要用于休眠模式低功耗状态下的数据保存。

 

  6,预充电:由于SDRAM的寻址具有独占性,所以在进行完读操作后,如果要对同一L-BANK的另一行进行寻址,就要关闭原来的工作行,重新发送行/列地址。L-BANK关闭现有工作行,准备打开新行的操作就是预充电(precharge).预充电可以通过命令控制,也可以通过辅助设定让芯片在每次读写操作之后自动进行预充电。实际上预充电是一种对工作行中所有存储体进行数据重写,并对行地址进行复位。

文章评论3条评论)

登录后参与讨论

用户612978 2012-12-20 10:23

最开始写的时候是这么想的,N/64ms,是每64ms处理这么多行数,其实也就是64/N得出时间,不过我那句话有点歧义,在这里解释一下。

用户612978 2012-12-20 10:20

对对,这个是失误,这段时间找工作,刚看到,积极改正,另外,多谢

用户377235 2012-10-19 10:03

那你就要每隔N/64ms发一次刷新命令?? 应该是64/N ms 吧!

相关推荐阅读
用户612978 2012-08-25 10:48
SDRAM相关有用文档
SDRAM相关有用文档,整理如下,希望能帮助一些人 常用两款SDRAM基本芯片 1.k4s641632.pdf 2.HY57V561620.pdf 介绍SDRAM时序操作文档 ...
用户612978 2012-08-24 13:43
sdram的学习心得--与初学者共勉(二)
    基于FPGA和SDRAM的大容量异步FIFO缓存设计,这是在公司实习了一个月后的实习总结大会上我想到的我的项目名称,其实这个名字有人用过,这个思路也有很多人想到过,但是在中国这个东西就是财...
用户612978 2012-08-18 10:20
做个工科男
        公元2012年、8月、哈尔滨、理工新主楼,最近内心有些浮躁,不只是对自己前一段学习状态的满足还是因为毕业的临近……        记得以前是喜欢文学的,自从报考理科,我每一天都试着去爱...
我要评论
3
13
关闭 站长推荐上一条 /2 下一条