分享

FPGA管脚分配时需注意的一些事项(以xilinx xc4vsx55为例)

 raymoon_sure 2016-02-26

 FPGA管脚分配时需注意的一些事项(以xilinx xc4vsx55为例)

  (2012-09-12 11:12:27)

转载

标签:

 设计过FPGA的原理图,看FPGA的手册,说管脚的分配问题,如时钟管脚要用GC类管脚,而且单端时钟输入时要用P类型的管脚,不能用N类型管脚等等。

一直以来都没有试验过,今天试验一把,以求各种验证。

 

1GC类全局时钟管脚是否可用作普通IO使用?

所谓GC类管脚,就是在管脚的称是诸如IO_L1P_GC_LC等带有GC的管脚。其实手册中说的是GC类管脚可以用作IO的,但在《Xilinx FPGA开发实用教程》(清华出版社)574页倒数第八行提到:所有从全局时钟管脚输入的信号必须经过IBUF元,否则在布局布线时会报错,于是今天我试了一下,将某一GC类管脚分配给一个普通的输入口(也试验了分配给一个普通的输出口),经布局布线后,未出错。

因此得出结论:GC类全局时钟管脚可以作为普通IO使用。(不知道是不是我对书中提到的全局时钟管脚理解有误,如果是,请网友别拍我,敬请留言指正)

 

2)非GC类全局时钟管脚是否可以作时钟使用?

其实至于说能否作为时钟使用,这里有另一层函义。当然,如果你把一个普通IO口配置成输入口,就把它的输入信号作为时钟,那是没问题的。但我们一般不这么做,因为时钟信号对于我们来说是一个很重要的信号,因此FPGA在内部会有特殊照顾,如果你使用FPGA传门为时钟预留的管脚,并作一些处理,那么你的时钟对于各种模块的时延是可以忽略的,因为时钟在布线时是单独走的一层,而如果你就仅用普通IO的话,经过FPGA内部布局布线后,从它的输到,再到各个使用时钟的地方,有的线长,有的线短,它的时延将是不一样的。这些东西还是看一些FPGA结构的内容吧。

xilinx里有专门的DCM IP核可供调用,在ISE中执行project——>New Source——>IP(CORE Generator & Architecture Wizard)——>FPGA Features and Design——>Clocking——>Virtex-4——>Single DCM ADV v9.1i,可得如下界面:

需要特别注意的是CLKIN Source需要选择是External还是Internal,各自生成的源文件如下:

==========================选择External=========================

`timescale 1ns / 1ps

module clk_test(CLKIN_IN,
               
 CLKIN_IBUFG_OUT,
               
 CLK0_OUT,
               
 LOCKED_OUT);

    input CLKIN_IN;
  
 output CLKIN_IBUFG_OUT;
  
 output CLK0_OUT;
  
 output LOCKED_OUT;
  
  
 wire CLKFB_IN;
  
 wire CLKIN_IBUFG;
  
 wire CLK0_BUF;
  
 wire GND_BIT;
  
 wire [6:0] GND_BUS_7;
  
 wire [15:0] GND_BUS_16;
  
  
 assign GND_BIT = 0;
  
 assign GND_BUS_7 = 7'b0000000;
  
 assign GND_BUS_16 = 16'b0000000000000000;
  
 assign CLKIN_IBUFG_OUT = CLKIN_IBUFG;
  
 assign CLK0_OUT = CLKFB_IN;
   IBUFG CLKIN_IBUFG_INST (.I(CLKIN_IN),
                           .O(CLKIN_IBUFG));
  
 BUFG CLK0_BUFG_INST (.I(CLK0_BUF),
                       
 .O(CLKFB_IN));
  
 DCM_ADV DCM_ADV_INST (.CLKFB(CLKFB_IN),
                        
 .CLKIN(CLKIN_IBUFG),
                        
 .DADDR(GND_BUS_7[6:0]),
                        
 .DCLK(GND_BIT),
                        
 .DEN(GND_BIT),
                        
 .DI(GND_BUS_16[15:0]),
                        
 .DWE(GND_BIT),
                        
 .PSCLK(GND_BIT),
                        
 .PSEN(GND_BIT),
                        
 .PSINCDEC(GND_BIT),
                        
 .RST(GND_BIT),
                        
 .CLKDV(),
                        
 .CLKFX(),
                        
 .CLKFX180(),
                        
 .CLK0(CLK0_BUF),
                        
 .CLK2X(),
                        
 .CLK2X180(),
                        
 .CLK90(),
                        
 .CLK180(),
                        
 .CLK270(),
                        
 .DO(),
                        
 .DRDY(),
                        
 .LOCKED(LOCKED_OUT),
                        
 .PSDONE());
  
 defparam DCM_ADV_INST.CLK_FEEDBACK = "1X";
  
 defparam DCM_ADV_INST.CLKDV_DIVIDE = 2.0;
  
 defparam DCM_ADV_INST.CLKFX_DIVIDE = 1;
  
 defparam DCM_ADV_INST.CLKFX_MULTIPLY = 4;
  
 defparam DCM_ADV_INST.CLKIN_DIVIDE_BY_2 = "FALSE";
  
 defparam DCM_ADV_INST.CLKIN_PERIOD = 16.129;
  
 defparam DCM_ADV_INST.CLKOUT_PHASE_SHIFT = "NONE";
  
 defparam DCM_ADV_INST.DCM_;
  
 defparam DCM_ADV_INST.DCM_PERFORMANCE_MODE = "MAX_SPEED";
  
 defparam DCM_ADV_INST.DESKEW_ADJUST = "SYSTEM_SYNCHRONOUS";
  
 defparam DCM_ADV_INST.DFS_FREQUENCY_MODE = "LOW";
  
 defparam DCM_ADV_INST.DLL_FREQUENCY_MODE = "LOW";
  
 defparam DCM_ADV_INST.DUTY_CYCLE_CORRECTION = "TRUE";
  
 defparam DCM_ADV_INST.FACTORY_JF = 16'hF0F0;
  
 defparam DCM_ADV_INST.PHASE_SHIFT = 0;
  
 defparam DCM_ADV_INST.STARTUP_WAIT = "FALSE";
endmodule

 

==========================选择Internal=========================

`timescale 1ns / 1ps

module clk1_test(CLKIN_IN,
                
 CLK0_OUT,
                
 LOCKED_OUT);

    input CLKIN_IN;
  
 output CLK0_OUT;
  
 output LOCKED_OUT;
  
  
 wire CLKFB_IN;
  
 wire CLK0_BUF;
  
 wire GND_BIT;
  
 wire [6:0] GND_BUS_7;
  
 wire [15:0] GND_BUS_16;
  
  
 assign GND_BIT = 0;
  
 assign GND_BUS_7 = 7'b0000000;
  
 assign GND_BUS_16 = 16'b0000000000000000;
  
 assign CLK0_OUT = CLKFB_IN;
  
 BUFG CLK0_BUFG_INST (.I(CLK0_BUF),
                       
 .O(CLKFB_IN));
  
 DCM_ADV DCM_ADV_INST (.CLKFB(CLKFB_IN),
                        
 .CLKIN(CLKIN_IN),
                        
 .DADDR(GND_BUS_7[6:0]),
                        
 .DCLK(GND_BIT),
                        
 .DEN(GND_BIT),
                        
 .DI(GND_BUS_16[15:0]),
                        
 .DWE(GND_BIT),
                        
 .PSCLK(GND_BIT),
                        
 .PSEN(GND_BIT),
                        
 .PSINCDEC(GND_BIT),
                        
 .RST(GND_BIT),
                        
 .CLKDV(),
                        
 .CLKFX(),
                        
 .CLKFX180(),
                        
 .CLK0(CLK0_BUF),
                        
 .CLK2X(),
                        
 .CLK2X180(),
                        
 .CLK90(),
                        
 .CLK180(),
                        
 .CLK270(),
                        
 .DO(),
                        
 .DRDY(),
                        
 .LOCKED(LOCKED_OUT),
                        
 .PSDONE());
  
 defparam DCM_ADV_INST.CLK_FEEDBACK = "1X";
  
 defparam DCM_ADV_INST.CLKDV_DIVIDE = 2.0;
  
 defparam DCM_ADV_INST.CLKFX_DIVIDE = 1;
  
 defparam DCM_ADV_INST.CLKFX_MULTIPLY = 4;
  
 defparam DCM_ADV_INST.CLKIN_DIVIDE_BY_2 = "FALSE";
  
 defparam DCM_ADV_INST.CLKIN_PERIOD = 16.129;
  
 defparam DCM_ADV_INST.CLKOUT_PHASE_SHIFT = "NONE";
  
 defparam DCM_ADV_INST.DCM_;
  
 defparam DCM_ADV_INST.DCM_PERFORMANCE_MODE = "MAX_SPEED";
  
 defparam DCM_ADV_INST.DESKEW_ADJUST = "SYSTEM_SYNCHRONOUS";
  
 defparam DCM_ADV_INST.DFS_FREQUENCY_MODE = "LOW";
  
 defparam DCM_ADV_INST.DLL_FREQUENCY_MODE = "LOW";
  
 defparam DCM_ADV_INST.DUTY_CYCLE_CORRECTION = "TRUE";
  
 defparam DCM_ADV_INST.FACTORY_JF = 16'hF0F0;
  
 defparam DCM_ADV_INST.PHASE_SHIFT = 0;
  
 defparam DCM_ADV_INST.STARTUP_WAIT = "FALSE";
endmodule

 

比较以上两段代码,区别在于选择是ExternalCLKIN经过了IBUFG才到的DCM_ADV,而选择InternalCLKIN则直接到了DCM_AV,而IBUFG就是原语全局时钟缓冲单元,我们使用时要选择External,只有当我们的级联两个DCM模块时,直接与外面相连的选External,而另一个选择Internal

这也是本文的一个知识点吧:两个DCM级联时,直接与外面相连的选External,而另一个选择Internal

所以本段的主题是GC类全局时钟管脚是否可以作时钟使用?其实更多应该指的是GC类全局时钟管脚是否可以接到IBUFG

试验中,我们将ExternalDCM的输入CLKIN输入引脚配置成一个普通的IO口,即非GC类全局时钟管脚,布局布线阶段出现以下错误:

ERROR:Place:645 - A clock IOB clock component is not placed at an optimal clock IOB site. The clock IOB component

因此得出结论:非GC类全局时钟管脚不可以作时钟使用(其实是不可以接到IBUFG的输入端)。

 

3)在Xilinx手册中提到,如果使用单端输入时钟,要使用P类型GC全局时钟管脚,那么空间N类型的管脚是否可以么?

所谓P类型还是N类型其实指的是IO_L1P_GC_LCIO_L1N_GC_LC,注意这里的L1PL1N,这就标识这个管脚是P类型还是N类型。

试验中,我们将N类型全局时钟管脚配置给CLKIN,结果布局布线时出现与(2)中一样的错误。

因此得出结论:GC类全局时钟管脚N类型管脚不可以作为单端时钟输入管脚(其实也是不能作为IBUFG的输入端)

 

4)差分时钟输入时钟管脚能否配置普通ION类型管脚和P类型管脚必须分别给配置P类型GC全局时钟管脚和N类型GC全局时钟管脚?

<4.1>使用了一对普通IO配置给DCMCLKIN_N_INCLKIN_P_IN,并且将这对普通的IOP型分配给DCMCLKIN_N_IN型输入,ION型分配给DCMCLKIN_P_IN型输入,出现如下错误:

ERROR:Place:604 - The I/O components "clkp" and "clkn" are the P- and N-sides of a differental I/O pair. The component

<4.2>使用了一对普通IO配置给DCMCLKIN_N_INCLKIN_P_IN,并且对应地将这对普通的IOP型分配给DCMCLKIN_P_IN型输入,ION型分配给DCMCLKIN_N_IN型输入,出现如下错误:

ERROR:Place:645 - A clock IOB clock component is not placed at an optimal clock IOB site. The clock IOB component

<4.3>使用一对GC类全局时钟IO管脚配置给DCMCLKIN_N_INCLKIN_P_IN,并且将这对普通的IOP型分配给DCMCLKIN_N_IN型输入,ION型分配给DCMCLKIN_P_IN型输入,出现与4.1中相同的错误。

<4.4>正常配置,即使用了一对GC类全局时钟IO管脚配置给DCMCLKIN_N_INCLKIN_P_IN,并且对应地将这对普通的IOP型分配给DCMCLKIN_P_IN型输入,ION型分配给DCMCLKIN_N_IN型输入,则完全正确。

因此得出结论:差分时钟输入时必须使用一对GC类全局时钟IO管脚配置给DCMCLKIN_N_INCLKIN_P_IN,且N类型和P类型要匹配。

其实这个归根到底还是原语IBUFGDS在作怪,查看一下差分输入DCM的原文件就行了:

   IBUFGDS CLKIN_IBUFGDS_INST (.I(CLKIN_P_IN),
                              
 .IB(CLKIN_N_IN),
                              
 .O(CLKIN_IBUFGDS));

 

5)那么如果将输入输出口配置成非IO管脚会怎么样呢?

在试验中,将某一VCCO配置成了给了输出口,结果在映射阶段出现如下错误:

ERROR:MapLib:30 - LOC constraint AF17 on q<2> is invalid: No such site on the

因此,不能将输入输出口配置成非IO管脚,当然这样配置本身也是不合理的。

 

 

 

 

[求助] 两个不相关的单端信号可以上一个差分对管脚么?

信号

我记得之前好像是不行的,一个单端信号上只能差分对的P端,N端只能空,不知道现在行不行了?

 

 

你的这个差分IO是指FPGA上可以用作差分的IO吗?还是已经配置成了差分的IO

如果你用的这个差分IO被配置成了差分,肯定是不行的

如果只是把可以做差分IOpad当做单端使用,肯定没有问题的。

如果这个差分IO是全局时钟输入管脚,那么如果做单端使用,只能连到P端使用

 

 

!!!FPGA时钟问题求教!!!急!!!

发布: 2011-5-20 15:38 | 作者: netshell | 来源: EETOP 赛灵思(Xilinx 社区

请问一个时钟信号(单端的)从FPGAN端信号管脚输入,而不是从P端输入,对设计是否会有影响 如何解决?谢谢!

chit_wps (2011-5-20 16:05:00)

没关系的吧

demonsolar (2011-5-20 16:38:31)

看你速度要求怎么样,如果不高,没有问题的

justshuashua (2011-5-20 17:06:09)

没什么影响的吧,一般差分对管脚做单端时,两个角都可以作为全局时钟管脚的。

asic_wang (2011-5-20 17:45:20)

没有,Np是为了差分时钟输入

netshell (2011-5-20 19:34:43)

回复 5# asic_wang 好像用N的话 时钟会不大好的吧!?

acgoal (2011-5-20 22:21:57)

Xilinxdatasheet明显有强调,用P端是最优的单端时钟方案。

luckymiaojw (2011-5-20 22:22:57)

最好是别这样,这样你的编译是得加特殊约束的,而且FPGA的设计一般是不让这么做的

yesowen (2011-5-21 13:11:53)

单端时钟的性能差点,高速跑不上去

dspmimo (2011-5-21 22:12:54)

如果是xilinx的,最好别用,特别是你还用了P端做时钟的时候。有时候非得在系统变量里面加个CLOCK_DEDICATED_ROUTE = FALSE 才行。

netshell (2011-5-23 08:21:28)

回复 10# dspmimo 谢谢 我换成P端试试~

tiansanfeixu (2011-5-23 11:04:52)

关注!!!!

ee_designer (2011-5-23 15:23:42)

按照要求,单端的时候应该是从P端进去!

jlfeieee (2011-5-24 15:54:16)

还没用过差分的,看来要努力了

netshell (2011-5-24 16:01:43)

回复 13# ee_designer 的确是这样~

hh7kknd (2011-5-25 11:52:03)

注意读datasheet,上面写的很清楚,比如V6FPGA,单端时钟必须接在P,否则无法通过IBUFG,这样会多一个IBUF的延迟,你在内部调一下相位,也能解决。

netshell (2011-5-25 12:49:43)

回复 16# hh7kknd 请问如何调相位?

emaklutz (2011-5-25 17:36:31)

单端时钟放在P好些。DCM里面应该可以调相位的。

netshell (2011-5-26 09:51:12)

回复 18# emaklutz 但你不知道相位差多少啊。。怎么调啊?

Fei_Fly (2011-5-26 10:47:34)

用了其实也没什么,主要就是另外一个不能做时钟了,你外部时钟多少M

Fei_Fly (2011-5-26 10:49:33)

回复 4# justshuashua 若是两个单端的时钟,就不能同时接同一对的PN

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多