打印
[Quartus]

ML605 MIG 等不到 app_rd_data_valid有效

[复制链接]
5659|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
harborn|  楼主 | 2012-8-10 13:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 harborn 于 2012-8-10 13:56 编辑

刚才帖子被删了,重发一遍,别再删了啊。
ML605 MIG的问题。
各位大虾,我在用ML605的MIG操作DDR3时出现了一个问题,困扰我很久了,希望能有高手出来解答,万分感谢!

我对DDR3的操作是按照burst模式来的,所以一次读写的数据是512bit(64B),
现在的情况是write是正常的,而read不正常;

1.  read的操作规范是:在 app_rdy == 1 时,将 app_cmd 、app_addr同时使能 app_en,写入read的地址信息。
2.  read的错误现象是:app_en使能写入 app_cmd 及 app_addr后,在开始的一两个周期,app_rd_data_valid是有出现为高的(也就是说ddr3有数据出来);而在几次之后,app_rd_data_valid却始终没有有效信号,而这时当我再次写入app_en、app_addr、app_cmd时,app_rdy就始终无效了。
这个问题http://forums.xilinx.com/t5/MIG- ... -problem/m-p/111088也有人出现过,似乎没有解决方案,我被这个问题困扰了一个多月了,希望高人出来指点一下啊!

附我的read代码,状态机的一部分
APP_READ_PRE: begin  app_en <= 0;  app_addr <= 32'h0000_0000; //ddr3_get_addr;  app_cmd <= APP_CMD_IDLE;
  app_addr_count <= 32'd0;
  if(ddr3_get_size >= 32'd64)    app_state <= APP_READ;  else    app_state <= APP_IDLE;endAPP_READ: begin  if(app_rdy && (DDR3_GET_FIFO_DEPTH_DIV2 >= fifo_wr_data_count)) begin    app_en <= 1;    app_addr <= ddr3_get_addr + app_addr_count; // app_addr;    app_cmd <= APP_CMD_READ;
    app_addr_count <= app_addr_count + 32'd64;            app_state <= APP_READ_WAIT;  end else begin    app_state <= APP_READ;  endendAPP_READ_WAIT: begin  if(app_rdy) begin    app_en <= 0;    app_addr <= app_addr; //app_addr + 32'd64;    app_cmd <= APP_CMD_READ;
    if(app_addr_count >= ddr3_get_size)       app_state <= APP_IDLE;     else      app_state <= APP_READ;  end else begin    app_state <= APP_READ_WAIT;  endend

相关下载

相关帖子

沙发
ococ| | 2012-8-10 17:32 | 只看该作者
没操作过DDR3,DDR2倒是经常用。
不过我觉得可以用chipscope看看读操作的一些状态信号分析一下。

使用特权

评论回复
板凳
GoldSunMonkey| | 2012-8-11 22:18 | 只看该作者
你用的是XILINX的文件的步骤么?

使用特权

评论回复
地板
harborn|  楼主 | 2012-9-19 21:25 | 只看该作者
1# harborn 这么久了没人回复,还是我自己来回复吧。

根据xilinx MIG的文档(比如ug406),app_cmd其实不止两种状态的,通常我们只需要用到 read and write。

read = 3'b001,
write = 3'b000;

但是,当MIG工作在Read-Modify-Write下时,app_cmd可以接受3'b011;
当app_cmd所属的时序块的代码写得非常糟糕时,app_cmd有可能会有从3'b001变为3'b011,
这样的话MIG core收到的是Read-Modify-Write指令,而不是read指令,
所以也就不可能返回正常的app_rd_data_valid信号了。

最后的结论是:异步电路要处理好,否则信号很容易出问题。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
GoldSunMonkey + 2 谢谢分享
5
GoldSunMonkey| | 2012-9-19 21:50 | 只看该作者
其实不是没人回复您,是问您问题您不回答。
另外,您也是在憋大招;P

使用特权

评论回复
6
GoldSunMonkey| | 2012-9-20 12:59 | 只看该作者
;P

使用特权

评论回复
7
harborn|  楼主 | 2012-9-20 15:33 | 只看该作者
5# GoldSunMonkey 多谢monkey, 还是在论坛里收获了不少的

使用特权

评论回复
8
干吧得| | 2014-2-20 15:52 | 只看该作者
我在操作mig核的时候也遇到了问题,就是在读数据的时候,app_rd_data_valid信号先于app_rd_data提前出来了好多个时钟周期,就是说前面出来的数据都是多余的,后面数据也是出来了,读出来的数据也没少,但是和地址就对不齐了,这是什么情况?
如图,写的时候,burst 4模式,起始地址0为时,写的数据是64`h0000000000010002,读数据的时候,当读地址为0时,app_rd_data_valid信号出来,但是数据是0,过了一段时间后,数据64`h0000000000010002出来,但那时的地址已经不是0地址了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

13

帖子

0

粉丝