在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 21590|回复: 53

[求助] DDR2 controller求助

[复制链接]
发表于 2012-2-29 14:12:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
小弟在使用altera DDR2 controller的时候遇到一个问题,就是讲在进行burst传输的时候,local_be必须是全部有效,不能使部分有效,否则,在进行burst传输时就会出现地址紊乱的情况,我现在不知道这是IP固有的问题呢?还是我IP用错了呢?但是,按我想Altera再设计这个IP的时候不可能这么傻,估计是我哪块设得不对,望大虾指教!
发表于 2012-2-29 17:06:45 | 显示全部楼层
你为什么要屏蔽掉一些,你可以把它读出来,然后不要嘛!
发表于 2012-2-29 21:26:59 | 显示全部楼层
本帖最后由 sdwsh 于 2012-3-1 14:07 编辑

回复 1# l2002924700


请问我自己写的DDR2控制器读出的数据是高阻太,或者说没有读出数据,是怎么回事啊,能不能看看你的源代码啊,谢谢,不甚感激!
 楼主| 发表于 2012-3-1 09:01:32 | 显示全部楼层
回复 3# zhh880419

不好意思,我用的是IP核,自己写controller难度太大!
发表于 2012-3-1 14:04:48 | 显示全部楼层
altera 的ddr2 ip吗?local_be ? 我的仿真过啊了,altera 自带的testbench有仿真带local_be 的情况,是可以的,不是Ip 固有的问题。我用的是altera ddr2 high performance controller II. 不过就算是一代,也应该没有这个问题的。

不过,其实我个人觉得这个local byte enable,几乎起不了多大作用。举个例子,先假设你的local wdata 宽度是16bit,窄一点,少打些字:
比如:
       local_wdata = 16'h64AB;
       local_be       = 2'b01;
       local_address = 0;
       这个时候其实你希望只写进去AB,64就会被ddr2的dm信号mask住,写到地址0去。然后,读地址0, 你会读出来00AB。似乎好像是没有问题。但如果是这样:
       local_wdata = 16'h00AB
       local_be       = 2'b01;
       local_address = 0;
       这样,你写进去00AB,读出来也是00AB,你都不知道前面的00到底是不是有效数据。换句话说,就是你在altera提供的ddr2 ip,读ddr2数据输出这一边,你找不到相应的byte valid指示位。
       所以,你单纯用local_be去依靠altera的ddr2 ip去实现读写一个byte是要悲剧的。你只能在自己的设计里面想想办法,怎么在读出的时候也能知道哪个byte是真正有效的,可以动动脑筋
       综上所诉,altera ddr2 ip的这个local_be比较山寨的,建议就全部有效吧。
 楼主| 发表于 2012-3-2 13:47:16 | 显示全部楼层
回复 6# catcat_2


    看了你的回复,有点明白了,不过还有几个问题需要请教一下:
    1、你所说的仿真没问题是指的BURST传输还是single传输?
    2、在执行向DDR2写操作的时候,我们该如何发送地址?我在看altera的文档emi_ddr_ug中的figure8-4的时候,发现本地接口(local_interface)的地址local_address每次递增4,而memory接口的地址mem_addr每次加8,这我可以理解,因为mem_dq是8bit的数据线,而本地接口的数据总线是16bit宽的数据线,所以mem_addr的地增量是local_addr地增量的两倍。但是还是有个问题我不太理解就是local_address为啥每次要递增4呢?因为本地接口的数据线的位宽是存储器接口数据线位宽的两倍,那应该加2就可以了呀!因为一次burst传输只是传输2个16bit的数据,那映射到mem interface应该就是4个8为数据,也就是说local地址只需递增2,存储器一边的递增地址就可以是4了,那也就满足了存储器不会覆盖之前存储数据的要求,为何地址要跳跃呢?
    3、在对DDR2进行写操作的时候,如果只是发出写命令而dqs不是有效,那这样进行的是何操作呢?谢谢!
发表于 2012-3-2 16:24:58 | 显示全部楼层
本帖最后由 catcat_2 于 2012-3-2 16:37 编辑

回复 7# l2002924700


    1.当然是burst传输。local_size=2 和local_size=1 都是burst 传输,DDR没有single传输的,概念上你要清楚。每一次读写都是double data rate,访问好几个地址的。
    2.先告诉你,emi_ddr_ug上面8--4这张图是有问题的,各个local信号的相互位置,跟仿真出来的波形不一样,非常坑爹,还好我用它自带的testbench仿了一下。具体你说的这张图,你说的是对的,其实只要跳2就可以了。它只有一根dps线,说明外面只接了一个ddr2 sdram 颗粒,颗粒的位宽是8bit。你可以理解为它是跳着写的,先写了sdram 的0 1 2 3地址,然后跳到8 9 10 11去了。。 对了,你去下一个external memory interface handbook吧,这个比UG详细。
    3.操作ddr2的时候,是先发写命令的。顺序是先ACT,然后发WR命令,过一定的LATENCY之后才有DQS,DM 和DATA。这个跟sram是不一样的,不是对齐的。这个latency 就是WL write latency,WL = AL + CL - 1,AL叫posted CAS additive latency,CL叫CAS latency。这个你可以参考ddr2 sdram 颗粒的data sheet。说多了就啰嗦了。
 楼主| 发表于 2012-3-2 16:33:56 | 显示全部楼层
回复 8# catcat_2


    嗯,十分感谢!
 楼主| 发表于 2012-3-6 11:10:39 | 显示全部楼层
回复 8# catcat_2


    还有个问题想要请教一下,就是emi_ddr_ug上面8--3这张图在local_size=2时,在地址连续发送的时候,数据的发出是连续的,每一个输出数据仅占一个时钟周期。但是我在仿真local_size=1的时候,发现数据的发出不是连续的,前一个从IP里输出的数据要隔一个时钟周期才能从IP里再输出,这张图是否在这里画的不对,望指教!
发表于 2012-3-6 12:38:12 | 显示全部楼层
回复 10# l2002924700


    8--3这张图是读ddr2 sdram 的情况,这图跟我仿出来loca_size = 2的是一样的。local_size = 1 的情况我没仿过,估计有可能是不连续出来的。要相信你自己的仿真。还有就是建议你不要去care数据是不是连续出来的,你只要看到local_rdata_valid = 1,那就证明数据是有效的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-3-28 20:37 , Processed in 0.031326 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表