hushuitao 发表于 2011-9-22 00:24:28

如何在Altera的FPGA上使用DDR2(DDR3)存储器

近日,尝试着在Altera的FPGA上使用DDR2存储器。先是在互联网上down几个例子,无奈这些例子均是基于sopcbuilder的,存储器直接挂在nios cpu下,读写细节均不需要我们手动干预,若仅仅是简单的用来跑跑代码、存放临时数据等,体现不了DDR的优势。如果用户逻辑部分(相当于主设备)要以高带宽的占用和nios cpu共享的DDR,那么需要使用Avalon主动传输或者流模式。由于对这两种模式了解不多,因此先准备在Quartus下使用纯逻辑的方式操作DDR。

   在Quartus下使用向导生成IP后(HPC II或者是Uniphy核),以Uniphy为例,在10.0sp1版本下,使用half模式,Avalon最大突发长度设为64。根据IP的datasheet上面的时序图,写了一段控制代码,反复几次后,代码能够正常跑起来,读写数据也是正确的。但有一些疑问:

1.一次突发读/写过程中,不能连续操作,也就是不能一个时钟出/写一个数据。突发过程中,控制器的反馈信号local_ready偶尔会在我们的突发过程中被置低,这样我们只能保持地址,进行等待。控制器在我们启动突发后,间隔一定的时间,会输出数据,这个时间是不定的。但是,一旦其开始输出数据,它不像其他的DDR控制核那样,可以连续出数,而是会被随机打断。这种不确定性,导致我们使用的时候有诸多的不便。既然不能连续出数,还能称作突发吗?突发的真正含义是什么?

2.bank地址固定,一次突发过程中,读能够连续出64次数据,写不能。

3.根据其手册,在突发读过程中,此时只要local_ready信号有效,即使突发的数据还未到达,这个时候也可以直接就行突发写操作。这么繁琐的控制过程,在真正的产品中有用到吗?

      由于没有接触过那些真正使用DDR做大量数据传输的例子,对DDR的使用也是闭门造车,走的可能是歪路子,希望大家指正。不知道大家在FPGA中,是如何高效使用DDR存储器的?希望有这方面经验的网友给一些建议。

        另外,查询了Avalon总线的技术文档,资料的结论是,Avalon总线在主动传输时,确实是不能保证一个时钟出一次数据,仅能保证在一次突发开始后不被其他的主设备中断。假设一个从设备,比喻DDR,它仅支持突发传输,当它挂在总线上时,其它主设备只能以突发模式访问吗?或者是,以突发模式访问得到的访问带宽将会最大化?假如从设备仅原生支持16个突发长度,而主设备想一次突发24个长度,那么Avalon交换结构会不会自动转换,对从设备发起两次传输?对Avalon结构的一些仲裁细节,不甚理解,自定义主设备无法提高其性能。

youngman1987 发表于 2011-9-22 10:34:11

你好我是FPGA 初学者 ,一时间无所适从了,我买的是ALTERA公司CYCLONE III eval Board 开发本 ,一时间不知道如何操作,主要集中在NIOS 软核搭建上,我在sopc builder中添加DDR _SDRAM(DDR_SDRAM)和flash的时候出现很多问题,生成的的NIOS 系统中。进行引脚分配时,DDA_SDRAM中有些引脚 按照原理图是多余的,不知道这些引脚如何处理? 谢谢你,我真的需要你的指点,万分感谢,万分感谢,

hushuitao 发表于 2011-9-22 23:06:51

对于fpga我也是半桶水,很多不懂。至于如何在sopc builder下添加ddr,我想你买的评估板应该有现成的例子吧?ddr在sopc下的使用,官网的例子也比较多,建议你看看。

philoman 发表于 2011-9-22 23:14:05

老老实实在在用ip核吧,altera的不清楚,xilinx的用MIG

du520xi 发表于 2013-5-27 21:52:12

philoman 发表于 2011-9-22 23:14 static/image/common/back.gif
老老实实在在用ip核吧,altera的不清楚,xilinx的用MIG

http://group.chinaaet.com/109/75713

sky5566 发表于 2013-6-29 15:56:58

http://www.amobbs.com/thread-5519611-1-1.html
大家都轉移使用 XILINX 了
页: [1]
查看完整版本: 如何在Altera的FPGA上使用DDR2(DDR3)存储器