微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > DDR2 controller求助

DDR2 controller求助

时间:10-02 整理:3721RD 点击:
小弟在使用altera DDR2 controller的时候遇到一个问题,就是讲在进行burst传输的时候,local_be必须是全部有效,不能使部分有效,否则,在进行burst传输时就会出现地址紊乱的情况,我现在不知道这是IP固有的问题呢?还是我IP用错了呢?但是,按我想Altera再设计这个IP的时候不可能这么傻,估计是我哪块设得不对,望大虾指教!

你为什么要屏蔽掉一些,你可以把它读出来,然后不要嘛!



请问我自己写的DDR2控制器读出的数据是高阻太,或者说没有读出数据,是怎么回事啊,能不能看看你的源代码啊,谢谢,不甚感激!


不好意思,我用的是IP核,自己写controller难度太大!

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比较山寨的,建议就全部有效吧。



    看了你的回复,有点明白了,不过还有几个问题需要请教一下:
    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不是有效,那这样进行的是何操作呢?谢谢!



    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。说多了就啰嗦了。



    嗯,十分感谢!



    还有个问题想要请教一下,就是emi_ddr_ug上面8--3这张图在local_size=2时,在地址连续发送的时候,数据的发出是连续的,每一个输出数据仅占一个时钟周期。但是我在仿真local_size=1的时候,发现数据的发出不是连续的,前一个从IP里输出的数据要隔一个时钟周期才能从IP里再输出,这张图是否在这里画的不对,望指教!



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

顶一个,目前也在用ALTERA DDR3 IP,不过只使用它的PHY,控制器自己写的,它的控制器调度效率不高。进公司一直在做DDR,希望有机会跟楼上的高手交流



    恩,有空多多交流啊,你才是高手,控制器都自己写。 我还没用过altera 的ddr3, 只用过xilinx的ddr3。


你用的什么arbitration算法?方便透露吗?

我最近也在学ddr2 controller,请问quartus生成ip核,自动生成的testbench怎么仿真,具体步骤如何?使用quartus调用modelsim,还是用modelsim直接仿真,最近很困惑,若能解惑,感激不尽!



    直接用modelsim吧,不要用什么quartus去调用,搞麻烦了。

DDR控制器其实算成熟的技术了,仲裁算法也主要是根据DRAM的特性来对请求进行调度,通过BANK间插、读写操作捆绑等方式对请求进行调度,目的就是尽可能得间插命令,在数据总线上数据吞吐率高。
控制IP业界很多公司都有,像DENALI 、SYNOPSYS等,它们的IP的数据带宽和延迟性能都比XILINX和ALTERA的好



    你在例子工程里面照一个generate_sim_example_design.qpf文件,用QUARUTS打开,再用TOOL里面的TCL脚本工具执行generate_sim_verilog_example_design.tcl 。然后系统就会生成仿真文件,再去里面找运行文件吧。MODELSIM应该是DO文件吧,我以前用的是VCS,我记得是运行vcs_setup.sh



    关于DDR2的IP还有一个问题想要请教一下:就是我在对该控制器IP进行仿真的时候,发现在进行连续不断的发送read命令的时候,(我是每一次在local一侧连续发送五个read命令,local_burst以及local_read_req都持续5个时钟周期)但是在memory接口一侧,有时候会出现发出一个时钟周期的active命令,之后紧接着是两个时钟周期的nop命令,然后有时候memory一侧就只发出4个read命令,也就是没有将我想要发出的读命令全部发出,这是为何,望指点!



    不好意思,刚才是我太粗心了,没有仔细看波形,没有发现在我当时发送第五个读请求的时候,local_ready已经变低了!犯了一个幼稚的错误。工程师的粗心真要不得!



    我看了你在altera中文论坛上发的帖子,有几个问题想再向你请教一下:
    1、你们所谓的calibration到底是怎么理解的?我以前都是把它翻译为校准,以前就理解成是DDR2对其内部的片内OCT以及ODT进行校准,但是我也不知道这样理解对不对?
    2、在“ug_ddr_ddr2_sdram_hp”这篇文档中提到关于DDR2 IP core有几种设计流程,分别是SOPC Builder flow和MegaWizard Plug-In Manager flow这两种设计流程该怎样理解,我们一般都是使用的是MegaWizard Plug-In Manager flow吗?这两种流程有啥区别?咱们是不是一般只要不使用sopc的话,用的都是MegaWizard Plug-In Manager flow呢?
     望指教,不胜感激!


参考下emi_handbook, v4, chapter 3 吧。 calibration 要做很多事情。
-----------------------------------------------------------------------------
    The ALTMEMPHY IP performs the following calibration stages:
1. Enter Calibration (s_reset)
2. Initialize PHY (s_phy_initialize)
3. Initialize DRAM
4. Write Header Information in the internal RAM (s_write_ihi)
5. Load Training Patterns
6. Test More Pattern Writes
7. Calibrate Read Resynchronization Phase
8. Advertize Write Latency (s_was)
9. Calculate Read Latency (s_adv_rlat)
10. Output Write Latency (s_adv_wlat)
11. Calibrate Postamble (s_poa)
12. Set Up Address and Command Clock Cycle
13. Write User Mode Register Settings (s_prep_customer_mr_setup)
14. Voltage and Temperature Tracking
------------------------------------------------------------------------
SOPC的流程是在SOPC的时候用的,你的说的对。 也可以用到一般设计里面,只要接口时序对上了,都是可以的。但是我们一般不做SOPC就不用SOPC那套东西。其实它底层也是一样的,估计就是在上面包了一个对应到SOPC的标准接口。



    好的!谢谢!我在研究一下你所说的那部分内容!很感谢你这种分享精神,向你学习!


请教一个问题:DDR2 controller ip核前仿功能正确,后仿时mem_dq信号比mem_dqs信号晚一个时钟周期,有什么办法解决吗?



    mem_dps和mem_dp的关系读写的时候是不一样的。写的时候dps的rising edge和falling edge各对齐写入的前后两个数据的正中间,读的时候对齐前一个数据,后一个数据拉低。
    后仿不对的话,你是不是延时参数没设对? 还有,controller根据这个dps取到的数据是不是对的?


看里面的约束文件比较多,不知从何处着手,有什么建议没?另外,它的example工程换个器件全编译之后,后仿也出现同样的问题,采用example工程默认的器件就OK



    读出的数据有问题的,dqs没有指示到的dq数据就读不出来



    这种情况真的没有遇到过。 你直接上板试吧。 如果IP的输出信号波形都是正确的,那我觉得这个现象已经跟IP 本身没有关系了,是后仿真的走线latency什么地方出了问题。 直接上板看看。


       关于Altera的DDR2的IP核还有一个问题想要讨教一下,就是在DDR2的IP里有local_size这个参数,这个参数的设置有啥意义呢?比如说,要进行burst4的传输,也就是说要burst传输4个数,但是我可以把local_size一直设为1,这样,无非也就是local_burstbegin在burst传输期间一直为高,这和把local_size设为2,local_burstbegin一个周期为高下一个周期为低在传输效果上有啥区别呢?望赐教!

local_size是设置一次burst传输数据的大小的,也是设置一次burst传输需要访问多少个sdram的地址空间的。比如,fpga 外围接了一颗sdram颗粒,颗粒的数据DQ位宽是8bit,那么burst_len =4 的时候,每一次burst 将访问sdram的4个地址,每次burst需要4*8bit个数据。对应的,local_data宽度就是2*8bit,local_address每一次burst 加2,mem_addr每次burst则是加4。数据在full rate时候的分两个时钟周期写入,这是正常情况下local_size=2的时候。
    那么,在local_size=1时候,只是一半,local_address每次加1,mem_addr每次加2,每次burst写入2*8bit个数据,在一个时钟周期写入。你可以看到在local_size=1的时候,每次burst,phy层的 mem_dm,就是sdram的data mask信号会有置1的时候,就是屏蔽调这次burst的另外2*8bit数据。
    local_size=2的时候是4个一组访问sdram的地址空间,local_size=1的时候是2个一组访问sdram的空间,都是一次burst需要进行的操作,但是local_size=1的时候效率低了一半,只写进去一半的数据。根据不同情况可以灵活选择local_size。



    那么根据您所说的情况,那么当把控制器的Burst length设成8的时候,是否相应的Local_size设成4,谢谢!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top