转自:http://www.eefocus.com/liu1teng/blog/12-02/237897_4533d.html
前一段时间画了一块千兆扩展板,板子上有千兆网口和千兆光纤接口,两种介质可以通过跳线来转换,板子做好之后进行回环测试时,发现网口会有随机的丢帧现象,而光口是正常的,一直没有找到问题根源,后来在做另一个项目里,需要写MAC的时序约束,发现Xilinx提供的MAC硬对‘RX_CLK’的时序约束要求很高,建立时间只有2.5ns,保持时间0.5ns,无论怎么反复修改这个约束值都无法达到约束要求,最后仔细研究了一下,发现评估板上的PHY芯片,'RX_CLK'这个信号连接在GC_CLK,而我的硬件设计只连接在普通IO口上,在时序约束时,用CLOCK_DEDICETED_ROUTE=FLASE绕过PAR的检查,这样就只是将本该接入专用时钟管脚(或者叫做全局时钟管脚)的信号,接到了普通IO口上,但并没有做好如何用普通IO口来引入全局时钟,Xilinx官方论坛上更是有老外直接指出这只是把一个error变成了warning,并没有解决真正的问题。作为初学者的我并没有意识到,什么是‘真正的问题’,直到出现这种丢帧现象之后,才慢慢意识到FPGA并不是我之前想象的那么‘简单顺手’。
现在说说专用时钟引脚,它的出现具体原因可以说是FPGA自身的实现结构引起的,FPGA实现时,具体的时钟大概有外部供给FPGA的工作时钟,由DCM或者PLL产生的时钟,和FPGA输入输出数据的随路时钟;再说说FPGA的实现,由于是基于触发器的设计实现,这就造成了,在布局布线时,同一时钟域但是布局相隔较远的同步器件再被相同时钟触发时,会有延时,这反映在时钟的skew(相位倾斜),为了解决这个问题,时钟树就出现了,将时钟的布线成树形结构,使得到达每一个逻辑单元的时钟信号同相,这样就可以实现同步,这就是全局时钟网络,GC_CLK。也就是说GC_CLK在FPGA内部是固定的位置,与其对应的引脚也就固定了,这样的引脚称为全局时钟引脚GC_CLK PIN。实际上,综合器会将扇出的较大的信号当做全局信号,并自动在引脚上加入IBUFG,但是只有全局引脚之后才有IBUFG,所以如果UCF中的时钟管脚不是用的GC_CLKPIN,PAR就会报错,反之,当一个信号分配的是GC_CLK PIN,无论是否扇出足够大,都会加入IBUFG,这也其实是FPGA内部结构造成的,只有全局管脚上有IBUFG,所以只要该信号用了全局管脚,无论是,或不是全局信号,IBUFG都在那里。