微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 关于DDR3乒乓操作

关于DDR3乒乓操作

时间:10-02 整理:3721RD 点击:
我想要用MIG核控制两片同样的DDR3芯片进行乒乓操作。现在程序逻辑都已经没有问题了,但是关于时钟有一点不是很明白。
程序中首先将数据写入FIFO中,再从FIFO进入DDR3.但是调用MIG控制两片DDR3时,会出现两个用户时钟,在我的MIG配置中,这两个用户时钟是同样的频率。但是在控制c0_app_wdf_data,c0_app_addr,c1_app_wdf_data,c1_app_addr时候应该选用哪个时钟呢。我之前用的是各自的时钟控制,仿真没有问题,但是上板测试后发现时对时错。错误的原因是另一片DDR的控制信号没有按照预想的状态改变,感觉应该是这两个用户时钟之间有相位差造成的。想问一下这个问题应该怎么解决?是将他们的控制信号放在同一个时钟的时序下控制吗?

没人吗?
别沉啊。求各位大神赐教

系统时钟用的是同一个时钟吗?
系统时钟是同一个时钟的情况下,在线调试的时候,自己写几个测试的数据测试一下,看看有没有偏差



输入给核的输入时钟和参考时钟肯定是一样的。现在上板调试之后发现的结果是有时候对有时候错。错都是错在读写状态切换的时候,一片从写到读了另一片没切换,感觉就是没有两片DDR的ui_clk,不太同步啊

别沉别沉

小编的pingpong 操作是怎么实现的呢?
例化了两个Mig core, 地址和控制信息是独立的吗?
说一下我个人的想法:
1.两个mig core 同源的话, user clock 是应该有个固定的相位差的,对每个mig core的控制应该使用相应的user clock.
2.小编说,每个mig core 使用自己独立的user clock,功能不对,为什么不对?这里我不能理解。
3.关于时钟,小编可以合并两个mig core的时钟网络,用一个PLL去产生mem_refclk/freq_refclk/sync_pulse/user clock;具体如何改IP可以参考手册clock 部分。
但是我认为即便两个user clock合并为一个后,小编的问题也不一定能解决,仅供参考。



我的实现方法是调用一个IP core控制两个DDR3。程序的逻辑是一片读的同时另一片在写,当一片写够我要求的数据量后,拉高一个标志位,切换两片的读写命令。现在我遇到的问题是:如果分别选用两片DDR的时钟进行控制,因为两个时钟不同步,导致两个命令切换的时间不同,而一片DDR命令切换后,在命令切换的同时也会清空标志位。上板出错就是因为切换命令时一片DDR的命令正常切换,而另一片DDR的命令没有切换成功(因为在这个时钟到来的时候标志位已经被清除了)。


我看了下xilinx的IP的例化,7 series是不支持ping-pong phy的设置的。
而且你使用ping-pong phy的话,外部的controler也是要自己写的。
从你的描述看,你应该使用的是MIG 7series的 Multi-core, 不知道我理解的对不对。
如果是
Multi-core的话,那么就是两个IP了,只不过给你一次例化了,如果这样的话,你就可以改时钟网络了。

对于你的描述理解的不清楚,希望能有帮助。  



请问时钟网络怎么修改,能不能就现在我出现的这个问题给一个解决的思路呢

首先,你的乒乓系统时钟一定是唯一一个pp_clk,而2个DDR缓存逻辑,一定是要具备独立的输入和输出FIFO,换句话说,肯定是有c0_in_fifo和c0_out_fifo,还有c1_in_fifo和c1_out_fifo,所有in_fifo的写入时钟是pp_clk,所有out_fifo的读出时钟是pp_clk,而in_fifo的读出时钟以及out_fifo的写入时钟肯定是根据c0还是c1来单独用c0_clk或者c1_clk,记住,2个DDR肯定是独立用户时钟,不能用同一个!
乒乓系统,必须保证读端大于等于写端,而且一定是写端控制读端,你首先在乒乓写端向c0写入一段数据,传递信息(当前写入的是c0)至乒乓读端端,乒乓读端根据信息把c0的数据读走,然后你在乒乓写端向c1写入一段数据,传递信息(当前写入的是c1)至乒乓读端,乒乓读端根据信息把c1的数据读走,如此往复,就是连贯的乒乓操作。


接着上面说,你之前描述的乒乓系统,不可靠性有2点。1、你是的乒乓系统是用2个以上的时钟去控制切换,这样如果跨时钟域或者逻辑没有思考周全,会导致系统混乱,应该用第三个固定的时钟去做乒乓写入以及读出的切换操作,第三个固定时钟和2个DDR时钟用fifo或者ram隔开,这样的系统简单,可靠;
2、你的乒乓写端只传递了1个切换信号到读端,整个乒乓操作完全依赖于初始状态,而2边是独立切换DDR3通道,一但混乱,无法恢复,你应该做成读端跟随写端,在写端向某个DDR片子写入足够数据后吗,传递2个信息,第一个是写入完成信息(1bit脉冲),第二是写入的DDR片子信息(比如c0是1,c1是0),读端收到写端传递来的信息后,根据DDR片子信息,去选择从对应的c0或c1读取数据,这样的乒乓系统不依赖于任何初始状态,就算出错,在下一条写入信息传递到后就可以正常恢复,安全可靠。

这两个c0_ui_Clk和c1_ui_clk是有相位差的,可以理解为不同的时钟,如果需要从c0的写切换到c1的读,涉及到了异步时钟数据切换问题,逻辑上设计要分开做,通过一个中间信号来引导。比如说用c0为主状态机来引导c1从状态机

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

网站地图

Top