【Vivado那些事】Xilinx FPGA普通IO能不能直接接入PLL作为时钟输入

[结论]

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

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

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

ZYNQ的时钟管理也和之前的片子略有不同,相关文档 <ug472_7Series_Clocking.pdf>

链接:https://pan.baidu.com/s/1E2uZbeIGh8R8FaDUQ6XVFg

提取码:open

[Demo1]

// demo1 two bufg connect

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默认输入前端有个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]

// demo2 regular io directly connect to PLL
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(clk),      // IN

    .CLK_OUT1(clkout),  // OUT

    .RESET(rst));       // IN

assign led = clkout;

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,画图时一定要注意

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

文章转自:https://suisuisi.blog.youkuaiyun.com/article/details/112854131

版权归原作者所有

*声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

<think>首先,用户的问题是关于Vivado中如何处理从普通引脚输入时钟信号。用户说:“我想在Vivado中处理普通引脚输入时钟信号的方法 请问vivado 如何处理从普通引脚输入时钟信号” 根据系统级指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式必须使用$$...$$格式并单独成段。 - 使用LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 另外,参考站内引用: - 引用[1]: 关于Vivado引脚约束的基础知识。 - 引用[2]: FPGA时钟信号引入,提到从专用时钟引脚或普通引脚引入时钟。 - 引用[3]: Vivado配置IO引脚约束的步骤。 - 引用[4]: Vivado差分输出引脚配置。 - 引用[5]: Xilinx FPGA普通IO不能直接接入PLL作为时钟输入,包括一个demo。 用户的问题核心是处理普通引脚输入时钟信号。在Xilinx FPGA中,时钟信号通常通过专用时钟引脚(如MRCC/SRCC)引入,但有时也需要从普通IO引脚引入时钟。 从引用[2]中:FPGA时钟信号一般由板上晶振经由时钟引脚引入,有时由于工程需要也会从pin脚引入其他外部时钟,这时为了该时钟能够正常工作,满足xilinx fpga的外部时钟引入规则。 引用[5]讨论了普通IO能否直接接入PLL作为时钟输入,并给出了一个demo,使用BUFG缓冲时钟信号。 关键点: - 普通IO引脚不是专用时钟引脚,所以直接连接时钟信号可能会导致时序问题或失败。 - 为了正确处理,需要使用时钟缓冲器(如BUFG)来将时钟信号路由到全局时钟网络。 - 在Vivado中,需要正确约束时钟信号。 回答结构: 1. **理解问题**:解释普通引脚输入时钟信号的意义和挑战。 2. **基本方法**:使用时钟缓冲器(如BUFG)来处理普通引脚输入时钟。 3. **步骤**:在Vivado中如何实现: - 引脚约束:指定普通引脚为时钟输入。 - 添加缓冲器:在HDL代码中使用BUFG。 - 时钟约束:使用create_clock命令约束时钟。 4. **注意项**:讨论潜在问题,如抖动、时序等。 5. **示例**:提供一个简单的代码示例。 6. **相关问题**:生成相关问题。 使用中文回答。 生成相关问题:在回答末尾添加相关问题,类似示例。 引用标识:自然地添加引用标识。例如,基于引用[2]和[5],我可以添加[^2]和[^5]。 回答内容: - 开头:确认问题。 - 解释:为什么普通引脚需要特殊处理。 - 方法:步骤清晰。 - 代码:使用Verilog或VHDL示例。 - 结尾:相关问题。 确保回答真实可靠:基于Xilinx文档和引用。 最终回答结构: - 介绍 - 详细步骤 - 注意项 - 相关问题</think>### Vivado 中处理普通引脚输入时钟信号的方法 在 Xilinx FPGA 设计中,时钟信号通常通过专用时钟引脚(如 MRCC/SRCC)引入,以确保低抖动和稳定的时序性能。然而,由于工程需求(如外部时钟源或自定义接口),有时需要从普通 I/O 引脚输入时钟信号。普通引脚不具备专用时钟引脚的缓冲和路由优势,直接使用可能导致时序违规、时钟抖动增大或布局布线失败。因此,必须通过以下方法正确处理: #### 1. **理解普通引脚时钟输入的限制** - 普通 I/O 引脚(如 LVCMOS 引脚)没有内置全局时钟缓冲器,无法直接驱动 FPGA 内部的全局时钟网络(如 BUFG)。 - 如果直接连接到 PLL时钟管理单元,可能因信号完整性差导致时序分析失败或功能错误[^2][^5]。 - 关键规则:普通引脚输入时钟信号必须通过手动添加时钟缓冲器(如 BUFG)才能安全使用。 #### 2. **处理步骤(以 Verilog 为例)** 在 Vivado 中,从普通引脚输入时钟信号的核心步骤包括引脚约束、添加缓冲器、和时钟约束。以下是详细流程: **步骤 1: 在 HDL 代码中添加时钟缓冲器** - 使用 BUFG(全局时钟缓冲器)将普通引脚输入时钟信号路由到全局时钟网络,确保低延迟和高稳定性。 - 示例代码: ```verilog module top_module( input clk_in, // 普通引脚输入时钟信号 input rst, output reg led ); wire clk_buf; // 缓冲后的时钟信号 // 添加 BUFG 缓冲器 BUFG bufg_inst ( .I(clk_in), // 输入普通引脚时钟 .O(clk_buf) // 输出:缓冲后时钟 ); // 使用缓冲后时钟(例如驱动 PLL 或逻辑) always @(posedge clk_buf or posedge rst) begin if (rst) led <= 1'b0; else led <= ~led; end endmodule ``` - **说明**:`BUFG` 将 `clk_in`(来自普通引脚)转换为全局时钟 `clk_buf`,避免直接使用普通引脚时钟导致的时序问题[^5]。 **步骤 2: 配置引脚约束** - 在 Vivado 中,通过 XDC(Xilinx Design Constraints)文件指定普通引脚的时钟属性。 - 打开 Vivado → 在 “Flow Navigator” 中选择 “Open Synthesized Design” → 右键 “I/O Ports” 视图设置引脚。 - 或手动编辑 XDC 文件: ```tcl # 设置普通引脚为时钟输入,例如引脚 Y29(根据原理图调整) set_property PACKAGE_PIN Y29 [get_ports clk_in] set_property IOSTANDARD LVCMOS33 [get_ports clk_in] ``` - 注意:普通引脚需选择兼容的 I/O 标准(如 LVCMOS33),避免电平不匹配[^3]。 **步骤 3: 添加时钟约束** - 使用 `create_clock` 命令定义时钟特性,帮助 Vivado 进行时序分析。 ```tcl # 创建时钟约束,假设时钟频率为 50MHz create_clock -name clk_in -period 20 [get_ports clk_in] ``` - **说明**:`-period 20` 表示 50MHz 时钟(周期=20ns)。未添加此约束可能导致时序分析忽略该时钟路径[^1]。 **步骤 4: 综合与实现** - 运行综合(Synthesis)和实现(Implementation)后,检查 “Timing Summary”: - 确保时钟路径无 “Unconstrained” 警告。 - 如果报告时钟抖动(Clock Skew)过大,可能需要优化布局或添加额外缓冲。 #### 3. **注意项** - **信号完整性**:普通引脚时钟易受噪声干扰,建议在 PCB 设计时添加滤波电容或阻抗匹配[^2]。 - **性能影响**:普通引脚时钟的最大频率通常低于专用引脚(例如 ≤200MHz),高频场景推荐专用时钟引脚[^5]。 - **替代方案**:如果必须使用普通引脚,考虑添加外部时钟缓冲芯片或使用差分信号(需配置为伪差分输入)[^4]。 - **常见错误**:直接连接普通引脚时钟PLL 可能导致 “CLOCK_INPUT_INVALID” 错误;始终通过 BUFG 中转[^5]。 #### 4. **验证方法** - 在 Vivado 中运行 “Report Clock Networks”,检查 `clk_buf` 是否被识别为全局时钟。 - 使用硬件测试(如示波器)验证时钟稳定性。 通过以上方法,您可以安全地在 Vivado 中处理普通引脚输入时钟信号,确保设计可靠性和时序收敛[^2][^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值