热度 16
2012-12-20 10:21
1927 次阅读|
3 个评论
一年前在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).预充电可以通过命令控制,也可以通过辅助设定让芯片在每次读写操作之后自动进行预充电。实际上预充电是一种对工作行中所有存储体进行数据重写,并对行地址进行复位。