自己找到原因了,初学,心急,没细看《UG382 Spartan-6 FPGA Clocking Resources User Guide》,里面都讲的很详细关于各时钟的分配。
总结一下我这次问题的原因。
1、 错误提示中可以看到GTPA1_DUAL_X1Y0的GTPCLKOUT0[0]只能连接专用的BUFIO2,即只能连到BUFIO2_X4Y28,依据手册BUFIO2_X4Y28的DVICLK输出只能连到BUFGMUX_X2Y4(因为使用的是BUFG原语,默认使用的是I0输入端)。
Map把<gtp_lpbk/gtpclkout0_0_bufg0_bufio2_i> 分配到 <BUFIO2_X4Y28>
把<gtp_lpbk/gtpclkout0_0_bufg0_i> 分配到 <BUFGMUX_X2Y9>
可以看到<gtp_lpbk/gtpclkout0_0_bufg0_i>走的不是时钟专用路由(不是使用<BUFGMUX_X2Y4>),看来是有另外的BUFG占用了<BUFGMUX_X2Y4>。
2、 在SP605_BRD.ucf添加< PIN "gtp_lpbk/gtpclkout0_0_bufg0_bufio2_i.DIVCLK" CLOCK_DEDICATED_ROUTE = FALSE; >语句,Map成功后。
运行FPGA Editor发现是<clocks/bufio_gmii_clk>占用了<BUFIO2_X3Y12>,<clock/bufg_gmii_rx_clk>占用了<BUFGMUX_X2Y4>。
对照UG382的Figure 1-3及Figure 1-9,<clocks/bufio_gmii_clk>的IOCLK要做为PHY_RXD的IO时钟,所以只能使用<BUFIO2_X3Y12>;GCLK7(即PHY_RXCLK)直接输入到BUFG,只能是使用<BUFGMUX_X2Y4>。
原因就出在这里了,(1)及(2)都只能用<BUFGMUX_X2Y4>,冲突了,一方只能换成不是专用时钟路由了。
解决方法:
还是看Figure 1-3,发现GCLK7还可以通过<BUFIO2_X4Y20>,再接到<BUFGMUX_X2Y1>,就可以连到全局时钟树上了。
在SP605_BRD_clocks.v中修改“GMII Receiver Clock Logic”如下:
BUFIO2 bufio_gmii_rx_clk (
.DIVCLK (),
.I (CLK125_RX_int),
.IOCLK (CLK125_RX_BUFIO),
.SERDESSTROBE ()
);
BUFIO2 bufio_bufg_gmii_rx_clk (
.DIVCLK (CLK125_RX_int1),
.I (CLK125_RX_int),
.SERDESSTROBE ()
);
// Route rx_clk through a BUFG onto global clock routing
BUFG bufg_gmii_rx_clk (
.I (CLK125_RX_int1),
.O (CLK125_RX)
);
编译成功,生成.bit文件,下装测试SFP口成功。
如果碰到时ERROR:Place:1108也可以参考查找解决处理。
希望能对有碰到类似问题的朋友们有点帮助:P
最后还是有点疑问:
Table 1-3中列出了各GTPCLKOUT对应的BUFIO2:
GTPA1_DUAL_X0Y0的GTPCLKOUT0[0]对应BUFIO2_X1Y0;
GTPA1_DUAL_X1Y0的GTPCLKOUT0[0]对应BUFIO2_X3Y0;
而我SP605_BRD_Src\Logic编译看到的对应关系如下:
GTPA1_DUAL_X0Y0的GTPCLKOUT0[0]对应BUFIO2_X2Y28;
GTPA1_DUAL_X1Y0的GTPCLKOUT0[0]对应BUFIO2_X4Y28;
跟手册对不上啊,这是咋回事呢???
|