zoukankan      html  css  js  c++  java
  • 两个MMCM共享时钟输入时的严重警告和错误

    情景描述:

    芯片:zynq7020

    问题:

    设计从FPGA的U19引脚上的开发板板接收时钟输入125M,并将其送到两个MMCM。
    使用软件:vivado2015.4
    在Vivado中打开合成设计后,我得到以下Crticial警告:

    Failed to create I/OLOGIC Route Through shape for instance MMCM_2/inst/clkin1_ibufg. Found overlapping instances within the shape: MMCM_1/inst/clkin1_ibufg and MMCM_MAC_1/inst/clkin1_ibufg.

    Cannot set LOC property of ports, Instance MMCM_2/inst/clkin1_ibufg can not be placed in INBUF_DCIEN of site IOB_X1Y424 because the bel is occupied by MMCM_1/inst/clkin1_ibufg. This could be caused by bel constraint conflict 

    MMCM没有手工实例化,而是使用时钟向导创建的,通常,当使用MMCM IP核,它包括所有缓冲区:

    输出时钟上BUFG

    时钟反馈的ebufg

    驱动输入时钟的IBUFG

    当只有一个时钟向导核心由输入时钟驱动时,这很好,但是当你尝试使用两个时,你最终会实例化两个IBUFG(或IBUF)单元。
    这是非法的。

    FPGA的每个引脚都有一个且只有一个输入缓冲区(IBUF) - 你不能将两个并行放置

    必须修改MMCM的输入。
    如果您正在使用时钟向导,则必须从两个时钟核心的输入中移除IBUF,然后在设计的顶层手动实例化IBUF(并将输出馈送到两个时钟核心)。
    但是,解决这个问题会产生另一个问题。
    用于MMCM的“最佳”输入是与MMCM在同一时钟区域中的四个时钟引脚之一。
    但是,在7系列中,每个时钟区域只有一个MMCM。
    因此,您无法通过“最佳”输入机制从同一时钟源驱动多个MMCM。
    试图这样做会产生另一个严重警告。
    这可以通过将另一个MMCM(在不同的时钟区域中)的CLOCK_DEDICATED_ROUTE属性设置为“BACKBONE”来解决,假设它在时钟能力引脚的相邻时钟区域内(即时钟区域上方或下方的时钟区域)
    功能引脚和其他MMCM驻留)。
    这样做(使用BACKBONE)会增加一些额外的时钟延迟,而这些延迟不会被MMCM补偿 - 这会对使用MMCM在“其他”时钟区域生成的时钟的任何接口的时序产生负面影响(可能
    或者对你的设计无关紧要)。
    那么,下一个问题是“为什么你需要两个MMCM”? 
    MMCM可以使用相同的VCO(因此相同的MMCM)生成不同的时钟输出频率和相位。
    虽然有些情况下您绝对必须使用两种不同的MMCM,但如果可以的话,通常最好避免这种情况,并将两者结合起来。
    那么告诉我们你在做什么需要不同的MMCM,我们可以看看它们是否可能/更好地结合起来。

    何检查哪个MMCM放置在时钟引脚的时钟区域中,哪个放置在时钟区域上方/下方?
    最简单的方法是在Vivado IDE(GUI)中打开设计,并在设备查看器中找到MMCM和时钟引脚。
    在器件查看器中,时钟区域(和I / O bank)可清晰识别。
    要查找对象,可能最容易从设计的示意图开始,并选择要查找的对象。
    在原理图视图中选择对象时,它也会在设备视图中被选中并高亮显示。
    有没有办法可以让工具将特定的MMCM放在时钟引脚的时钟区域,而另一个MMCM放在上/下的时钟区域?
    引脚的时钟区域只有一个MMCM。
    像所有资源一样,FPGA中的站点被命名 -  MMCM位置看起来像MMCME2_ADV_X0Y0
    您可以通过设置单元格的LOC属性将单元格放置在站点上。
    在您的XDC中,您可以做到
    set_property LOC MMCME2_ADV_X0Y0 [get_cells]
    我需要两个MMCM,因为我需要9个异步时钟
    首先,这是很多时钟......其次,根据定义,来自MMCM的时钟都是彼此同步的。
    它们之间的时序关系可能很复杂,但它们是同步的......
    我可以通过使用divide_by_2逻辑生成一些时钟来最小化这个数字(9)。
    我可以通过放置BUFG并使用create_clock(不是create_generated_clock)约束来在divide_by_2逻辑的输出上定义新时钟吗?
    通常不建议使用结构时钟 - 这会在生成的时钟和源时钟之间引入大量偏差。
    但是,你说你的时钟是异步的 - 如果你真的不关心时钟之间的关系那么你就可以做到这一点。
    生成时钟作为触发器的输出并通过BUFG运行。
    生成分频时钟的更好方法是使用BUFGCE或BUFHCE,每隔一个时钟启用“CE”。
    这会产生频率为1/2的时钟,输出时钟与输入时钟保持同相。
    但是,如果你真的希望时钟是异步的,这并不重要。
    当使用BUFGCE / BUFHCE生成时钟时,您需要知道结果时钟的占空比不是50/50  - 除以2,它将是25/75。
    最后,无论你做什么(结构分割器或BUFGCE / BUFHCE),我通常会用create_generated_clock限制它 - 这是一个生成的时钟,而不是主时钟。
    但是 - 再次 - 如果这些时钟真正异步,这也无所谓......

  • 相关阅读:
    Ionic3 遇到的一些错误-Error: Cannot find module 'reflect-metadata'
    Ionic3 遇到的一些错误-submodule update -q --init --recursive
    Ionic3 一些命令
    Npm 使用淘宝镜像
    在PHP中使用AES加密算法加密数据-2
    php实现AES/CBC/PKCS5Padding加密解密(又叫:对称加密)-1
    php rsa加密解密实例
    composer 安装Laravel、thinkphp5.1
    PHP原生分页的编写
    微信授权登录并获取用户信息接口开发
  • 原文地址:https://www.cnblogs.com/hcr1995/p/9904218.html
Copyright © 2011-2022 走看看