打印
[Quartus]

请教:谁用过xilinx的 ODDR2 ?

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

芯片是xilinx的XC6SLX9
用了DCM模块倍频
发现倍频输出后的时钟不能用
看了很多资料,说是要加一个叫“ODDR2”的东西

加上去之后又产生了新的错误:

ERROR:Pack:2531 - The dual data rate register "U_ODDR2_clk200M" failed to join
   the "OLOGIC2" component as required.  The output signal for register symbol
   U_ODDR2_clk200M requires general routing to fabric, but the register can only
   be routed to ILOGIC, IODELAY, and IOB.



源代码如下:

module XXXXX(
        clk10M,
        rst,
        sig_1,
        sig_2,
        clk200M_out,
       .......
       ........
);
         
         input clk10M;
         input rst;
         input sig_1;
         input sig_2;
         output clk200M_out;        
         .........
         .........

         
         wire clk200M;
         wire clk200M_out;
                  
        clk_dcm        Unit1(//倍频模块
                                                        .CLK_IN1(clk10M),
                                                        .RESET(rst),
                                                        .CLK_OUT1(clk200M),
                                                        .LOCKED(clk_lock)
                                                );
                                                
ODDR2 #(
    .DDR_ALIGNMENT("NONE"), // Sets output alignment to "NONE", "C0" or "C1"
    .INIT(1'b0),    // Sets initial state of the Q output to 1'b0 or 1'b1
    .SRTYPE("SYNC") // Specifies "SYNC" or "ASYNC" set/reset
    ) U_ODDR2_clk200M
(
      .Q(clk200M_out),   // 1-bit DDR output data
      .C0(clk200M),   // 1-bit clock input
      .C1(~clk200M),   // 1-bit clock input
      .CE(1'b1), // 1-bit clock enable input
      .D0(1'b1), // 1-bit data input (associated with C0)
      .D1(1'b0), // 1-bit data input (associated with C1)
      .R(1'b0),   // 1-bit reset input
      .S(1'b0)    // 1-bit set input
);

                                       
        
        XXXXX        Unit2(
                                                                .clk(clk200M_out),
                                                                .clk_com(clk_com),
                                                                .rst(rst),
                                                                .d(XX)
                                                        );                                                               
        
        com_t        Unit3(//串口输出模块
                                                .reset(rst),
                                                .clk16x(clk_com),
                                                .din(dout),
                                                .wrn(comt_en),
                                                .com1_sdo(PF_out)
                                        );
                                       
        clk_div        Unit4(//串口时钟产生模块
                                                        .rst(rst),
                                                        .clk(clk200M_out),/
                                                        .clk_com(clk_com)
                                                );

endmodule



谁能帮忙看看怎么回事?

谢谢了!

相关帖子

沙发
drentsi| | 2012-10-28 22:40 | 只看该作者
The output signal for register symbol
   U_ODDR2_clk200M requires general routing to fabric, but the register can only
   be routed to ILOGIC, IODELAY, and IOB.


这英文说得很清楚了啊

使用特权

评论回复
评分
参与人数 1威望 +4 收起 理由
GoldSunMonkey + 4
板凳
星星之火红| | 2012-10-28 23:09 | 只看该作者
对头

使用特权

评论回复
地板
xuehua230| | 2012-10-28 23:23 | 只看该作者
说的对啊。

使用特权

评论回复
5
GoldSunMonkey| | 2012-10-28 23:24 | 只看该作者
说的非常好,请仔细看文档。

使用特权

评论回复
6
lanpad|  楼主 | 2012-10-29 11:00 | 只看该作者
本帖最后由 lanpad 于 2012-10-29 11:05 编辑
The output signal for register symbol
   U_ODDR2_clk200M requires general routing to fabric, but the register can only
   be routed to ILOGIC, IODELAY, and IOB.


这英文说得很清楚了啊
drentsi 发表于 2012-10-28 22:40

就是这句看不懂啊
这种术语对我这种没玩过几天verilog的菜鸟就是白说

我要用倍频之后的200MHz时钟分频得到串口需要的9600波特率,必须接到一个分频模块clk_div上,那应该怎么连呢?
难道程序中的Unit2、Unit4这两个模块不是ILOGIC, IODELAY, and IOB?

使用特权

评论回复
7
sleepybear| | 2012-10-29 11:21 | 只看该作者
说白了:ODDR2是用来FPGA输出的。ILOGIC、IODELAY、IOB都是接口上的输入/出单元。
比如你想把某个时钟clk200M_out输出给片外,就这么用,clk200M_out是一个PIN。但是,你这种把clk200M_out又用到片内逻辑的,是不行的。好比说,你只能在某间屋子里去完成某工作。现在把你关在屋子外边,可还要你去完成只能在屋子里完成的工作,咋整?

使用特权

评论回复
评分
参与人数 2威望 +5 收起 理由
kennlu + 1 回答经典,赞。
GoldSunMonkey + 4 回答的非常好。
8
GoldSunMonkey| | 2012-10-29 13:00 | 只看该作者
回答的非常好

使用特权

评论回复
9
lanpad|  楼主 | 2012-10-29 14:18 | 只看该作者
说白了:ODDR2是用来FPGA输出的。ILOGIC、IODELAY、IOB都是接口上的输入/出单元。
比如你想把某个时钟clk200M_out输出给片外,就这么用,clk200M_out是一个PIN。但是,你这种把clk200M_out又用到片内逻辑的,是不行 ...
sleepybear 发表于 2012-10-29 11:21

多谢了

麻烦再多请教一下啊:
DCM的输出不能直接作为接口的输出吧?
是不是必须利用ODDR2模块?

听有些人说片外晶振输入的时钟如果要作为全局时钟用,最好经过DCM模块,以获得更好的稳定性,是否有这一说?看datasheet没找到相关说法。

使用特权

评论回复
10
wrigleymint| | 2012-10-29 17:13 | 只看该作者
楼上解释的都不错。我看看

使用特权

评论回复
11
qwempty| | 2012-10-29 17:30 | 只看该作者
:)

使用特权

评论回复
12
huanben| | 2012-10-29 18:57 | 只看该作者
7# sleepybear

如果一个模块在时钟的同步下工作,同时将这个同步时钟作为输出 也是可以的吧?

使用特权

评论回复
13
zhoumingzr| | 2012-10-29 19:24 | 只看该作者
12# huanben 应该是可以的~

使用特权

评论回复
14
星星之火红| | 2012-10-29 22:41 | 只看该作者
7# sleepybear  

如果一个模块在时钟的同步下工作,同时将这个同步时钟作为输出 也是可以的吧?
huanben 发表于 2012-10-29 18:57
可以。

使用特权

评论回复
15
lxAPP| | 2012-10-29 22:54 | 只看该作者
可以。
星星之火红 发表于 2012-10-29 22:41
看看~学习了

使用特权

评论回复
16
GoldSunMonkey| | 2012-10-29 23:05 | 只看该作者
12# huanben 应该是可以的~
zhoumingzr 发表于 2012-10-29 19:24
必须可以

使用特权

评论回复
17
qiuzhichang| | 2015-5-9 21:55 | 只看该作者
本帖最后由 qiuzhichang 于 2015-5-10 11:20 编辑

一般情况下,
内部使用的应该是 PLL -> BUFG->内部使用
外部管脚输出的 应该是  PLL  -> BUFG -> ODDR -> PIN

1.外部管脚输出的的话,(有时候还是马屁不通过)或许你可以在后面再加一个,PLL  -> BUFG -> ODDR -> OBUFG(IOBUFG) -> PIN

2. 内部要用的话,也就是说你的clk200M_out 还想在内部使用的话,你可以试一下让它经过一下BUFG再使用(例如你的unit2、unit4),这个我没试过。。。

仅供参考,不知道能不能帮上

使用特权

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

本版积分规则

8

主题

25

帖子

0

粉丝