• DDR3 multi-controller on ML605


    http://xilinx.eetop.cn/viewthread-340405

    大家好! 我现在在使用MIG IPCore控制DDR3,板子是赛灵思公司的Virtex-6 ML605,我发现IP核的GUI提供multi-controller选项,如下图所示,用户手册(UG406 March 1, 2011)上没详细介绍这个选项,我想知道这个multi-controller有什么作用? 我现在想使用板子上的DDR3做乒乓操作,但是板子上只有一块DDR3芯片,我不知道是否可行,和这个multi-controller有没有关系。麻烦各位大侠指点!小女子先谢过啦!


    QQ截图20120710091400.png

    tiangua (2012-7-10 22:09:27)
    这个multi core应该是 一次 生成 多个ddr3 ipcore。跟乒乓 操作 没有关系 。 一个ddr3做乒乓 操作?是做bank间的乒乓?
    recorner (2012-7-11 11:26:33)
    回复 2# tiangua 那multi-controller生成的多个控制器控制的是一块DDR芯片呢还是多块DDR芯片,一般板子上只集成一块芯片呢。 可以划分bank做乒乓么?还是地址复用什么的。。在内存这一块我还是菜鸟。。导师是要求求证可不可以做乒乓以提高速度,但我觉得可行性似乎不大。
    catcat_2 (2012-7-11 17:08:27)
    那个选项是指生成多少个内存控制器的。 ML605板子上的DDR3是 SODIMM封装的吧,是标准的SO-DIMM接口哦,貌似只能用一个控制器去控制。 你要做乒乓,要看看你的写入和读出的带宽是多少哦,这个其实就是DDR3恨重要的一个读写效率问题。因为DDR内存的读写是按命令操作的,控制命令是一个一个被内存颗粒执行的。如果一直写,或者一直读的情况下,DDR3内存效率是很高的,但是读写要不停的切换的话,效率会降低非常多。大概想象下一个 V 字形,左右两边是单纯写或者单纯读的时候的效率,中间就是读写频繁切换时候的效率,很低的。你可以去MICRON查查资料,看看他们家DDR3的效率曲线图就知道。 用DDR乒乓,其实读写也是串行进行的,只不过如果相对于你的设计要求来说DDR效率足够高,你可以看做是并行的。其实就是看你的设计对读写效率有多高的要求。如果不高,倒是可行。
    tiangua (2012-7-12 22:05:26)
    楼上说的比较清楚,
    recorner (2012-7-14 17:12:03)
    回复 4# catcat_2 之前在另一个关于MIG控制器的帖子了看到你,久仰大名啊~ 你说写入和读出的带宽,这个是可以改变的么,DDR3的数据线是64位宽,是可以分开使用么? 如果做bank的乒乓,bank该怎么选择分配呢? 我已将数据写入DDR3中,但是UI的地址app_addr和DDR3的ddr3_ba和ddr3_addr是怎样对应的呢?我写入数据后ddr3_ba的值始终是3'b000,是因为我写入数据不多所以只用到bank0么?什么时候会用到bank1,bank2……呢?
    recorner (2012-7-14 17:15:48)
    回复 5# tiangua 谢谢!同样的问题也问问你: 写入和读出的带宽,这个是可以改变的么,DDR3的数据线是64位宽,是可以分开使用么? 如果做bank的乒乓,bank该怎么选择分配呢? 我已将数据写入DDR3中,但是UI的地址app_addr和DDR3的ddr3_ba和ddr3_addr是怎样对应的呢?我写入数据后ddr3_ba的值始终是3'b000,是因为我写入数据不多所以只用到bank0么?什么时候会用到bank1,bank2……呢?
    tiangua (2012-7-15 19:41:42)
    可以参考一下DDRIII的内部状态机。这个状态机的跳转一定要了解 。 DDRIII的数据位宽是64bit,这个应该是多个颗粒拼位宽的。然后需要看一下DDRIII的控制线和地址线是独立的还是共用的。 如果是独立的,就可以生成多组控制器,在控制器之间做乒乓。这个时间比较简单,不过需要注意控制器数据之间的同步。 如果是公用的,那就只能在不同bank之间做乒乓操作。参考DDRIII的状态机,就可以知道,bank与bank之间的状态是不冲突的(除了REFRESH ALL指令,当然这个指令也可以用其他的方法实现,比较复杂,一搬用不到),在设计指令调度过程中只需要注意指令总线的占用和数据总线的占用就可以了。这种方法实现起来比较复杂。需要自己实现DDRIII控制器,最好使用厂家带的PHY。 BANK乒乓就是利用了BANK之间状态机可以独立运行。在一个BANK等待的过程操作另外一个BANK。 你的bank比较少,只用到了bank0,那你可以把你的数据分成两半,一半在bank0,一半在bank1啊。 这样你就可以在两个bank间乒乓了。
    catcat_2 (2012-7-16 09:09:49)
    回复 6# recorner 你说写入和读出的带宽,这个是可以改变的么,DDR3的数据线是64位宽,是可以分开使用么? 带宽,不是数据线的位宽。概念要分清楚。是数据线的采样时钟X数据线位宽,这个是要知道你写入、读出数据的速率。DDR3的数据线位宽64bit,是不能分开使用的。 如果做bank的乒乓,bank该怎么选择分配呢? 如果你真的是要用ML605,那这块板子上的DDR3是SODIMM封装的,就是跟笔记本内存条那样的,标准的SODIMM接口。所以,你用多个控制器去乒乓,和用一个控制器去做BANK乒乓,其实最后操作的对象都是同一块内存条。意思就是,不管你怎控制器UI接口那边怎么操作,最后你的读写命令在DDR3 SDRAM这侧都是串行执行的,跟一个控制器去BANK乒乓是一个效果。而且,你只有一个SODIMM接口,你的多个控制器怎么连到一个SODIMM上面?按我的理解应该是不行的。多控制器乒乓,应该是多个控制器分别操作不同的片外DDR3 SDRAM,控制器到DDR3的物理连线都是分开的,这样才可行。所以,你可能只能考虑考虑BANK乒乓。 BANK乒乓的时候,你要访问不同的BANK,只需要变化一下ddr3_addr里面的BANK地址那一段就可以了。但是有一点,你必须要考虑到。DDR3 SDRAM在做BANK激活的时候,它是每8个BANK轮询激活的,也就是说任意时刻,都有8个BANK是被激活的。然后,问题就出来了,你在做BANK乒乓的时候,BANK切换如果发生在已经被激活的两个BANK之间,那是没有问题的,切换时间也相对较短,效率降低不大。但是如果发生在一个已经激活和一个没有被激活的BANK之间,那就麻烦了,激活和预加电一个BANK需要的时间是很长的,宏观来看就会造成读写效率大幅降低。 说了半天,其实就是让你仔细考虑你自己的设计在做乒乓的时候,对DDR3的效率要求是怎么样的。你可以自己算一下,你在UI侧写入效率和读出的效率。然后在算下,读写切换的频率。最后计算下你的DDR3的理论效率。如果在50%-60%,是可以的,如果到70%以上,你就要仔细掂量掂量了。如果到90%。。。 姑娘,放弃吧。90%只有在一直写入(或者一直读出),没有命令切换,然后依次访问ddr3 每个column, 每个raw,每个bank的时候才达得到。这个效率测试,我在ML605上面做过。 我猜你的导师让你做这个实验,就是让你搞清楚DDR3的效率问题。这个几乎是每个用到DDR3的场合都要考虑,但都不容易考虑清楚的问题,也就是做项目的时候大家扯皮的地方之一。 我已将数据写入DDR3中,但是UI的地址app_addr和DDR3的ddr3_ba和ddr3_addr是怎样对应的呢?我写入数据后ddr3_ba的值始终是3'b000,是因为我写入数据不多所以只用到bank0么?什么时候会用到bank1,bank2……呢? UI的app_addr的地址编排模式在你生成MIG的时候会让你自己设置的,是RANK+BANK+RAW+COL还是RANK+RAW+BANK+COL,你要自己去看一下。你用的是SODIMM,你在MIG里面是要选SODIMM的封装模式的,然后你可以看到自己的地址是怎么分配的。 ddr3_ba,这个是bank address吧,是mig顶层分出来的,就是app_addr对应的那几位。bank切换,你只要改变对应的BANK地址就可以了。
    lemondavid (2012-11-29 18:32:30)
    楼上说的比较清楚,
    ee_top_guojz (2014-6-13 10:07:09)
    讲的真好,受益匪浅
    CoCo3646 (2014-11-18 21:57:28)
    Gooooooooooooooooooooooooooooooood
    bird2 (2014-11-24 20:06:58)
    mark mark
    Y.R.Wan (2015-3-30 20:46:59)
    回复 9# catcat_2 大侠你好!我现在也在使用ddr3做项目。不过现在遇到了地址位宽方面的问题。麻烦您指导下小弟!是这样,我用的是4G的条子,addr_width=rank_width(1)+bank_width(3)+row_width(16)+col_width(10)=30; 我的疑问如下: 1.我的ddr3是双面的,就是说两面都是8个bank,共16个bank。但是,rank=1能否表明说这是双面,16bank? 2.由于我使用了axi4总线进行设计,其要求的地址总线的宽度只能是32位的。我通过生成mig的ip核看example_design.发现地址变化 的流程是:产生地址宽度为32位---》进入axi总线为32位-----》进入MIG---》结果输出的就是ddr3_addr,宽度是row_width(16)位,那还 有一个参数是ddr3_ba,是3位的对应的是bank的选择,那么剩下的col_width去哪儿了呢?我往ddr3中写数据的地址是如何变化的? 谢谢!请帮帮忙!
    brain789 (2015-3-31 14:39:54)
    DDR3做乒乓操作,但是板子上只有一块DDR3
    skylikeme (2015-4-14 19:06:47)
    看完帖子,收获很大啊
  • 相关阅读:
    Masonry代码自动布局的简单使用。
    iOS app 如何添加引导页。
    iOS应用程序发布AppStore及更新流程
    AFN的简单二次封装
    自定义tabbar(纯代码)
    自定义tabbar(storyBoard)
    GitHub tag的使用
    cvGetSize与cvSize的区别
    越界访问,调试真的很头疼
    Hadoop对文本文件的快速全局排序
  • 原文地址:https://www.cnblogs.com/agllero/p/5057199.html
Copyright © 2020-2023  润新知