打印

MIg生成ddr2时序约束问题

[复制链接]
9749|38
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zx1278|  楼主 | 2012-8-20 11:51 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
在使用MIG生成ddr2,实现ddr2读写控制时遇到了一些问题:
首先,在时序约束方面,起初使用MIG自动生成的UCF文件,由于ddr2的系统时钟是由差分时钟sys_clk_p和sys_clk_n作用产生的,所以UCF文件中定义如下约束为时钟周期约束:NET "u_ddr2_infrastructure/sys_clk_ibufg"TNM_NET=  "SYS_CLK";
TIMESPEC "TS_SYS_CLK" = PERIOD "SYS_CLK" 3.75 ns HIGH 50 %;
NET "u_ddr2_infrastructure/clk200_ibufg" TNM_NET = "SYS_CLK_200";
TIMESPEC "TS_SYS_CLK_200" = PERIOD "SYS_CLK_200" 5 ns HIGH 50 %;
但是在Implement Design过程中会报错找不到NET "SYS_CLK",这是一个什么原因呢?
其次,在测试过程中,通过自己添加的UCF文件(约束不完整的)虽然通过Implement Design,在Chipscope pro Analyzer中观察到写入ddr2中的数据app_wdf_data基本上是正确的,但ddr2的输出数据rd_data_fifo_out没有和写入的有效数据对应起来,请大家帮着分析一下

相关帖子

沙发
水畔天蓝| | 2012-8-20 12:45 | 只看该作者
你用的FPGA是什么型号的?如果是spartan3或者V5的芯片,是需要修改的

使用特权

评论回复
板凳
zx1278|  楼主 | 2012-8-20 14:34 | 只看该作者
你好,我是用的V5110t的,还要请教您如何修改?谢谢!

使用特权

评论回复
地板
水畔天蓝| | 2012-8-20 15:25 | 只看该作者
这里的sys_clk_p和sys_clk_n是指FPGA输入的控制时钟,并非指DDR2硬件连接上的时钟ck和ck_n,所以当时我是用单端时钟输入的

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
GoldSunMonkey + 2 感谢回复
5
zx1278|  楼主 | 2012-8-20 16:57 | 只看该作者
水畔天蓝:
很高兴你的回答!我使用的是sys_clk_p和sys_clk_n双端输入时钟,现在正纠结于怎样对FPGA输入时钟进行时序约束,不知道是该选用sys_clk_p还是sys_clk_n,或者是其他的时钟信号,因为我发现此时的时序约束直接影响了我设计系统的性能,时序约束稍有改变,输出数据有比较大的差异,还请你多多指教!谢谢

使用特权

评论回复
6
GoldSunMonkey| | 2012-8-20 22:06 | 只看该作者
MIG版本是什么?

使用特权

评论回复
7
zx1278|  楼主 | 2012-8-21 09:04 | 只看该作者
6# GoldSunMonkey 使用的是MIG3.61的,采用的是sys_clk_p和sys_clk_n这对差分时钟作为FPGA的输入时钟控制,但不太清楚如何对差分时钟进行时序约束,而MIG3.61自己生成的UCF文件不能直接用,不太清楚需要修改哪些地方

使用特权

评论回复
8
GoldSunMonkey| | 2012-8-21 09:53 | 只看该作者
谁说不能直接用?

使用特权

评论回复
9
zx1278|  楼主 | 2012-8-21 10:14 | 只看该作者
8# GoldSunMonkey 我用的是V5的芯片,前面的帖子上也提到了直接用所遇到的问题,如果你能帮我解决上面的问题,将不胜感激!

使用特权

评论回复
10
水畔天蓝| | 2012-8-22 10:44 | 只看该作者
请问你是用chipscope看到的信号吗?

使用特权

评论回复
11
zx1278|  楼主 | 2012-8-22 14:35 | 只看该作者
10# 水畔天蓝
是的,只要是因为时序约束没有做好,在chipscope中观察到输入数据基本是正常的,但输出数据没有和输入数据相对应起来,比如:输入数据是12345,输出数据可能是45123,或者51234等情况,但输出的都是写入DDR中的有效数据

使用特权

评论回复
12
明空| | 2012-8-22 18:02 | 只看该作者
可以用PLL输出的频率做约束

使用特权

评论回复
13
piandhai| | 2012-8-22 20:25 | 只看该作者
看来你对约束规则的语法不是很了解!将sys_clk_p和sys_clk_n调用差分buffer基元,基元输出为SYS_CLK!然后将其引至u_ddr2_infrastructure模块下sys_clk_ibufg的输入。NET "u_ddr2_infrastructure/sys_clk_ibufg"TNM_NET=  "SYS_CLK";意思是u_ddr2_infrastructure/sys_clk_ibufg下的SYS_CLK net。

使用特权

评论回复
14
zx1278|  楼主 | 2012-8-22 21:33 | 只看该作者
13# piandhai
对,您说的很对,我现在刚接触时序约束不久,有些地方不是很熟悉。 想深入的请教一下高手:在UCF文件中定义如下:NET "u_ddr2_infrastructure/sys_clk_ibufg"TNM_NET=  "SYS_CLK";
TIMESPEC "TS_SYS_CLK" = PERIOD "SYS_CLK" 3.75 ns HIGH 50 %;
NET "phy_init_done" OFFSET = OUT 11 ns AFTER "SYS_CLK";
……
在Implement Design过程中会报错:NET "SYS_CLK" not found.  Please
   verify that:
   1. The specified design element actually exists in the original design.
   2. The specified object is spelled correctly in the constraint source file.
请问这是一种什么原因?

使用特权

评论回复
15
GoldSunMonkey| | 2012-8-22 22:24 | 只看该作者
你是XP系统?然后?

使用特权

评论回复
16
GoldSunMonkey| | 2012-8-22 22:34 | 只看该作者
你用XILINX的user design来试一下。

使用特权

评论回复
17
zx1278|  楼主 | 2012-8-23 08:59 | 只看该作者
15# GoldSunMonkey
Win7的哈

使用特权

评论回复
18
piandhai| | 2012-8-23 09:43 | 只看该作者
楼主这个不是系统的问题,也不是软件的问题!上面说的很清楚,NET "SYS_CLK" not found,你的“u_ddr2_infrastructure/sys_clk_ibufg”下面根本就没有这个信号,你怎么对他进行约束!我昨天查了下,楼主肯定是自动生成的设计例子,想使用差分时钟输入,但你的约束条件写的有问题,如果楼主不介意的话将u_ddr2_infrastructure这个文件贴出来,我就知道你的约束条件该怎么写了!

使用特权

评论回复
19
zx1278|  楼主 | 2012-8-23 10:30 | 只看该作者
18# piandhai
piandhai:
真心感谢您的帮助!正如您所说,我是想采用自动生成的设计例子,由于行不通所以想寻求帮助,下面贴出u_ddr2_infrastructure,具体情况在附件中。麻烦您帮忙指点一下,谢谢!

u_ddr2_infrastructure.rar

9.67 KB

使用特权

评论回复
20
piandhai| | 2012-8-23 10:47 | 只看该作者
约束更改如下:
NET "u_ddr2_infrastructure/sys_clk_ibufg"TNM_NET=  "sys_clk_ibufg";
TIMESPEC "TS_SYS_CLK" = PERIOD "sys_clk_ibufg" 3.75 ns HIGH 50 %;
NET "phy_init_done" OFFSET = OUT 11 ns AFTER "sys_clk_ibufg";
...
分析:
你的ddr2_infrastructure.v中是这么写的
generate
  if(CLK_TYPE == "DIFFERENTIAL") begin : DIFF_ENDED_CLKS_INST
    //***************************************************************************
    // Differential input clock input buffers
    //***************************************************************************

    IBUFGDS_LVPECL_25 SYS_CLK_INST
      (
       .I  (sys_clk_p),
       .IB (sys_clk_n),
       .O  (sys_clk_ibufg)
       );

    IBUFGDS_LVPECL_25 IDLY_CLK_INST   //clk200一直有信号,其来源于clk200_p和clk200_n;
      (
       .I  (clk200_p),
       .IB (clk200_n),
       .O  (clk200_ibufg)
       );

  end else if(CLK_TYPE == "SINGLE_ENDED") begin : SINGLE_ENDED_CLKS_INST
    //**************************************************************************
    // Single ended input clock input buffers
    //**************************************************************************

    IBUFG SYS_CLK_INST
      (
       .I  (sys_clk),
       .O  (sys_clk_ibufg)
       );
    if ( NOCLK200 == 0 ) begin : IBUFG_INST
        IBUFG IDLY_CLK_INST
          (
           .I  (idly_clk_200),
           .O  (clk200_ibufg)
           );
    end

  end
  endgenerate

那么你使用差分时钟,CLK_TYPE == "DIFFERENTIAL",程序就综合的是:
if(CLK_TYPE == "DIFFERENTIAL") begin : DIFF_ENDED_CLKS_INST
    //***************************************************************************
    // Differential input clock input buffers
    //***************************************************************************

    IBUFGDS_LVPECL_25 SYS_CLK_INST
      (
       .I  (sys_clk_p),
       .IB (sys_clk_n),
       .O  (sys_clk_ibufg)
       );

    IBUFGDS_LVPECL_25 IDLY_CLK_INST   //clk200一直有信号,其来源于clk200_p和clk200_n;
      (
       .I  (clk200_p),
       .IB (clk200_n),
       .O  (clk200_ibufg)
       );
这部分使用的时钟就是“sys_clk_ibufg”,所以你该对“sys_clk_ibufg”约束。

使用特权

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

本版积分规则

1

主题

16

帖子

0

粉丝