xilinx FPGA普通IO作PLL时钟输入

本文详细介绍了如何在Xilinx ZC7020 FPGA上将普通IO作为PLL的时钟输入,包括使用BUFG进行缓冲、修改PLL设置以及避免BUFG串联等关键步骤。同时,文章还指出普通IO连接到时钟线上可能遇到的错误,并提供了解决方案。特别地,文章强调了ZYNQ7000系列的时钟管理与前代产品的差异,并提供了相关文档链接。

xilinx FPGA普通IO作PLL时钟输入

在xilinx ZC7020的片子上做的实验;

[结论]

普通IO不能直接作PLL的时钟输入,专用时钟管脚可以;

普通IO可以通过BUFG再连到PLL的时钟输入上,但要修改PLL的设置 input clk的选项中要选择"No Buffer";

具体内部布局分配可以通过 Xilinx的FPGA Editor来查看,

ZYNQ的时钟管理也和之前的片子略有不同,之后在另一篇介绍,相关文档 <ug472_7Series_Clocking.pdf>

[Demo1]

复制代码
 1 // demo1 two bufg connect
 2 
 3 module iobuf(
 4 
 5  input clk,
 6 
 7  input     rst,
 8 
 9  output   led
10 
11  );
12 
13  wire clkin_w;
14 
15  BUFG BUFG_inst (
16 
17       .O(clkin_w),           // Clock buffer output
18 
19       .I(clk)                   // Clock buffer input
20 
21    );
22 
23  pll0 u_pll0(
24 
25     .CLK_IN1(clkin_w),      // IN
26 
27     .CLK_OUT1(clkout),  // OUT
28 
29     .RESET(rst));       // IN
30 
31 assign led = clkout;
32 
33 endmodule
复制代码

锁相环PLL默认输入前端有个BUFG单元,而两个BUFG不能相连,所以会报这样的错:

ERROR:NgdBuild:770 - IBUFG 'u_pll0/clkin1_buf' and BUFG 'BUFG_inst' on net

   'clkin_w' are lined up in series. Buffers of the same direction cannot be

   placed in series.

ERROR:NgdBuild:924 - input pad net 'clkin_w' is driving non-buffer primitives:

 [Demo2]

复制代码
 1 // demo2 regular io directly connect to PLL
 2 
 3 module iobuf(
 4 
 5     input clk,
 6 
 7  input     rst,
 8 
 9  output   led
10 
11  );
15  wire clkin_w;
16 
17  /*
18 
19  BUFG BUFG_inst (
20 
21       .O(clkin_w),           // Clock buffer output
22 
23       .I(clk)                   // Clock buffer input
24 
25    );
26 
27 */
28 
29  pll0 u_pll0(
30 
31     .CLK_IN1(clk),      // IN
32 
33     .CLK_OUT1(clkout),  // OUT
34 
35     .RESET(rst));       // IN
36 
37 assign led = clkout;
38 
39 endmodule
复制代码

普通IO不能直接做锁相环的输入,所以会报这样的错:

ERROR:Place:1397 -  A clock IOB / MMCM clock component pair have been found that

   are not placed at an optimal clock IOB / MMCM site pair. The clock IOB

   component <clk> is placed at site <A18>. The corresponding MMCM component

   <u_pll0/mmcm_adv_inst> is placed at site <MMCME2_ADV_X0Y0>. The clock IO can

   use the fast path between the IOB and the MMCM if the IOB is placed on a

   Clock Capable IOB site that has dedicated fast path to MMCM sites within the

   same clock region. You may want to analyze why this problem exists and

   correct it. If this sub optimal condition is acceptable for this design, you

   may use the CLOCK_DEDICATED_ROUTE constraint in the .ucf file to demote this

   message to a WARNING and allow your design to continue. However, the use of

   this override is highly discouraged as it may lead to very poor timing

   results. It is recommended that this error condition be corrected in the

   design. A list of all the COMP.PINs used in this clock placement rule is

ERROR:Pack:1654 - The timing-driven placement phase encountered an error.

如果有ucf中加上这句约束:

NET clk          CLOCK_DEDICATED_ROUTE = FALSE;

依旧会报错,在ZYNQ7000系列,这样还是通不过,如下:

ERROR:PhysDesignRules:2256 - Unsupported MMCME2_ADV configuration. The signal

   u_pll0/clkin1 on the CLKIN1 pin of MMCME2_ADV comp u_pll0/mmcm_adv_inst with

   COMPENSATION mode ZHOLD must be driven by a clock capable IOB.

ERROR:Pack:1642 - Errors in physical DRC.

使用普通的IO,再连接bufg来连到时钟线上,

仍会报这样的错误,因为还是两bufg相连了:

ERROR:NgdBuild:770 - IBUFG 'u_pll0/clkin1_buf' and BUFG 'BUFG_inst' on net

   'clkin_w' are lined up in series. Buffers of the same direction cannot be

   placed in series.

ERROR:NgdBuild:924 - input pad net 'clkin_w' is driving non-buffer primitives:

  [Demo3]

复制代码
// dem3 regular io with BUFG then connect to PLL which with"No Buffer" setting

 module iobuf(

 input clk,

 input     rst,

 output   led

 );

 wire clkin_w;

 BUFG BUFG_inst (

      .O(clkin_w),           // Clock buffer output

      .I(clk)                   // Clock buffer input

   );

 pll0 u_pll0(

    .CLK_IN1(clkin_w),      // IN

    .CLK_OUT1(clkout),  // OUT

    .RESET(rst));       // IN

assign led = clkout;

endmodule
复制代码

PLL的设置如下图,

这样普通IO就可以当作PLL的时钟输入了,顺利产生bit;

时钟还是最好用全局时钟IO,画图时一定要注意:)

zc702里没有global clock的概念了,但有了很多专用时钟脚,用起来一样;

 

 

<think> 嗯,用户的问题是关于FPGA普通IO能否连接时钟信号。从用户提供的引用资料来看,这个问题在FPGA设计中确实是个关键点。用户应该是在做硬件设计时遇到了时钟信号处理的困惑,引用中提到了BUFG、ODDR2、PLL等专业术语,说明用户有一定FPGA基础。 用户可能真正想知道的是:普通IO直接连接时钟有哪些潜在风险?为什么官方推荐特定路径?以及具体如何安全实现?因为引用[1]提到直接连接会导致时序错误,引用[2]展示了ODDR2解决方案,引用[3][4]则对比了普通IO接入PLL的不同方式。看来需要重点解释时钟域的特殊性和硬件约束。 考虑到用户引用的是Xilinx器件文档(出现ODDR2和BUFG),应该优先基于Xilinx架构回答。不过Altera/Intel FPGA时钟处理原则也类似。用户没说明具体器件型号,所以需要给出通用方案。 需要强调两个核心矛盾:一是全局时钟网络(BUFG)和普通布线资源的延迟差异,二是IOB对差分信号的要求。引用[2]的ODDR2方案之所以有效,是因为它把单端时钟转换成DDR信号,符合IOB的电气特性。这点在回答里必须讲透。 另外注意到引用[3][4]的代码对比很有价值——直接连PLL输入可能不稳定,而通过BUFG再进PLL(即使PLL设为"No Buffer")更可靠。这涉及到时钟输入缓冲类型的选择,用户可能没意识到约束文件设置的重要性。 用户情绪似乎带着技术焦虑(用了“请问”“能否”这样谨慎的措辞),应该是正在调试项目。回答时除了理论还要给实操方案,比如ODDR2的端口配置细节。最后生成的三个相关问题都围绕设计陷阱展开,这样用户能按需深入查阅。 </think> 根据提供的技术资料和FPGA设计规范,关于FPGA普通I/O连接时钟信号的问题,核心解答如下: --- ### **关键结论** 1. **时钟输入端** ✅ FPGA普通I/O**可以**直接接收外部时钟信号,但需遵循特定路径: - **推荐路径**:外部时钟信号 → **全局时钟缓冲器(BUFG)** → 内部逻辑或PLL(如`引用[4]`方案)。 - **风险路径**:若跳过BUFG直接接入PLL(如`引用[3]`),可能因时钟抖动(Jitter)和偏移(Skew)导致时序违例,需在PLL属性中明确设为 **"No Buffer"** [^3][^4]。 2. **时钟输出端** ✅ 需通过**专用时钟驱动电路**(如Xilinx的ODDR2)输出: ```verilog ODDR2 #( .DDR_ALIGNMENT("NONE"), .INIT(1'b0), .SRTYPE("SYNC") ) ODDR2_inst ( .Q(clk_out_pin), // 输出到普通I/O .C0(clk_bufg), // 原时钟 .C1(~clk_bufg), // 反相时钟 .CE(1'b1), .D0(1'b1), // 固定高电平 .D1(1'b0), // 固定低电平 .R(1'b0), .S(1'b0) ); ``` ODDR2将单端时钟转为差分信号输出,确保时钟边沿对齐[^2]。 --- ### **设计风险与规避** - **时序不可控问题**: 若强制将BUFG时钟直连普通I/O(如`引用[1]`),需添加约束忽略时序检查(如Xilinx的`CLOCK_DEDICATED_ROUTE = FALSE`),但会导致延迟不可预测,可能引发系统故障[^1]。 - **抖动与噪声**: 普通I/O的布线资源(通用互连)比全局时钟网络更易受干扰,高速时钟(>100MHz)强烈建议使用专用时钟引脚。 --- ### **设计准则总结** | **场景** | **可行方案** | **风险** | |--------------------|----------------------------------|------------------------------| | **外部时钟输入** | 普通I/O → BUFG → 逻辑/PLL | 跳过BUFG可能时序违例 | | **内部时钟输出** | BUFG → ODDR2 → 普通I/O | 直连OBUF导致布局布线错误[^1] | | **PLL外部时钟输入**| 普通I/O → BUFG → PLL(No Buffer)| 未缓冲时钟增大PLL失锁风险 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值