草庐IT

零基础学FPGA(六):FPGA时钟架构(Xilinx为例,完整解读)

千歌叹尽执夏 2023-04-18 原文

目录

日常·唠嗑

      不知不觉已经离开校园,工作了4个月。上班后,发现自己在学校学习的,其实都是些皮毛,所以一直不敢更新这个专栏(前面几篇文章,如果有错误的地方,笔者在这里期待大家批评指正)。要真正了解FPGA,其实不应该从表面应用开始,也不是一开始像学单片机那样敲代码,而是应该了解,何为FPGA?
      何为FPGA,其实应该从FPGA的架构开始了解起,FPGA的基本组成,时钟单元结构等等。平时要上班,周末又想休息,所以也是经常偷懒。😂
      这里对于逻辑单元等结构,暂时先不写,等后面抽空了,我再写了,补充到前面来。这里先描述一下FPGA时钟架构,以Xilinx 7系列FPGA为例子,下篇文章写Altera,感兴趣的同学,可以关注下一篇文章。

      网上其实有很多文章都对7系列的时钟架构做了概述,这里为什么还要选这个系列再啰嗦一次呢?因为很多文章都是抛开软件讲架构,或者抛开文档讲,软件跟技术文档没有配套起来研读,读者看起来,会有那种云里雾里的感觉,这里将Vivado工具+官方文档配套起来读,希望能帮到大家。

      本篇文章,历时半个月,篇幅较长,可以分段耐心看完。

一、时钟资源(及布线)概述

      在Xilinx官方文档中(UG472),该章节也叫时钟体系结构概述(Clocking Architecture Overview),时钟路由资源概述(Clock Routing Resources Overview)。
      7系列FPGA时钟资源通过专用的全局和区域I/O和时钟资源管理符合复杂和简单的时钟要求。时钟管理块(CMT)提供时钟频率合成、减少偏移和抖动过滤等功能。非时钟资源,如本地布线(路由),不推荐用于时钟功能。

7系列芯片时钟资源划分为全局时钟资源及区域时钟资源,因为翻译可能有误,这里引言官方文档描述,较为准确。
全局时钟资源:
• Global clock trees allow clocking of synchronous elements across the device.
   全局时钟树允许同步模块时钟跨越整个FPGA器件。

• I/O and regional clock trees allow clocking of up to three vertically adjacent clock regions.
   I/O时钟和区域时钟树允许最多为三个垂直相邻的时钟区域提供时钟。

• CMTs, each containing one mixed-mode clock manager (MMCM) and one phase-locked loop    (PLL), reside in the CMT column next to the I/O column.
   每个CMT包含一个混合模式时钟管理器(MMCM)和一个锁相环(PLL),位于I/O列旁边的CMT列中。

区域时钟资源:
• The number of clock regions varies with device size, from one clock region in the
   smallest device to 24 clock regions in the largest one.
   时钟区域的数量随器件大小而变化,从最小器件的一个时钟区域到最大器件中的24个时钟区域。(换句话说就是,不同芯片时钟区域数量不一样,小的芯片时钟区域分布得比较少,具体可以对比图1跟图2

• A clock region includes all synchronous elements (for instance: CLB, I/O, serial transceivers, DSP,    block RAM, CMT) in an area spanning 50 CLBs and one I/O bank (50 I/Os), with a horizontal    clock row (HROW) in its center.
   时钟区域包括50个CLB和一个I/O bank(50个I/O)的区域中的所有同步模块
(例如:CLB、I/O、串行收发器、DSP、块RAM、CMT),其中心有一个水平时钟行(HROW)。

• Each clock region spans 25 CLBs up and 25 CLBs down from the HROW, and horizontally across    each side of the device.
   每个时钟区域从HROW向上和向下跨越25个CLB,并水平跨越器件的每一侧。

关于Bank:
   在Vivado通过综合、布局布线后,可以打开一个Device界面(资源界面)(不知道在哪打开的,点一下左侧导航栏的Open Implemented Design),这个工程用的是Artix-7 50T-324封装的芯片,从截图上看有5个Bank,右上角那个是Bank0(配置用的,不算在这5个用户Bank里面)。
   在这里讲Bank有点超纲了,应该是放在FPGA整体结构的篇幅讲的,这里因为要理解时钟架构,只能先简单描述一下。(下一章对Bank还会有补充)
图1:

图2:Virtex-7芯片

二、时钟架构-解读

2.1、时钟整体架构

     7 系列器件通过使用时钟区域改进了时钟分布。 每个时钟区域最多可以有 12 个全局时钟域。这 12 个全局时钟可以由任何单片器件或 SLR 中可用的 32 个全局时钟缓冲器的组合。 这时钟区域的尺寸固定为 50 个 CLB 高(50 个 IOB)并跨越左侧或器件的右侧。 在 7 系列器件中,时钟主干将器件分成左或右边。 主干不在器件的中心,通过固定尺寸时钟区域,更大的 7 系列器件可以有更多的时钟区域 (下图中的Clock Region) 。7 系列 FPGA供应从 1 到 24 个时钟区域。

     垂直时钟中心线(Clocking Center 时钟主干线)将器件划分为相邻的左右区域,而水平中心线(Horizontal Center)将器件划分为顶部和底部侧面。时钟主干中的资源被镜像到水平相邻区域的两侧,从而将某些时钟资源扩展到水平相邻区域。顶部和底部(图中2个Bank的位置)分隔两组全局时钟缓冲器(BUFGs),并对它们的连接方式施加了一些限制。但是,BUFGs不属于时钟区域,可以到达器件上的任何时钟点。所有水平时钟资源包含在时钟区域水平时钟行(HROW)的中心,而垂直的、非区域的时钟资源包含在时钟主干或CMT主干中。


     HROW即水平时钟线,也就是的BUFH或BUFG所走的线,由下图我们可以看到,很明显在每个Bank中间被BUFH分割开,这就是HROW,时钟沿着水平中心线向两侧延伸以为其他器件提供时钟。而左右Bank对称的中心线即为“Clock Backbone”,BUFG在一定长程度上水平分别在“Clock Backbone”中间,一般来讲上部分16个BUFG时钟源来自上半部分的所有Bank,下部分16个BUFG时钟源来自下半部分的所有Bank,而他们的输出可以到整个device的任意位置。

上面的原理图如果看不懂,我们可以结合一下软件上,芯片实际的图来看:
xc7a35tfgg484:

2.2、时钟区域-内部架构

2.2.1、区域整体

     下图(Basic View of Clock Region 时钟区域基本视图 )是时钟区域中可用时钟资源及其基本连通性。

  • 全局时钟缓冲器(BUFG)可以通过HROW进入每个区域,即使物理位置不在那里。
  • 水平时钟缓冲器 (BUFH) 驱动通过 HROW 到达该地区的每个时钟点。
  • BUFG 和 BUFH 共享HROW路径。
  • I/O 缓冲器 (BUFIO) 和区域时钟缓冲器 (BUFR) 是位于 I/O Bank内。
  • BUFIO 仅驱动 I/O 时钟资源,而BUFR 驱动 I/O 资源和逻辑资源。
  • BUFMR 支持多区域链接BUFIO 和 BUFR。 具有时钟功能的输入 (CC) 将外部时钟连接到时钟设备上的资源。某些资源可以通过以下方式连接到上面和下面的区域CMT 骨干。

   如下图是一个Bank的整体,BUFH可以驱动同一Bank的所有资源,我们可以看出“上”和“下”是对称分布的,BUFH位于Bank的一侧垂直居中,中间的分割线是有12条水平时钟线,与12个BUFH相连。BUFG也是通过连接到BUFH进而通过这12条水平时钟线驱动整个Bank的逻辑资源。每个Bank资源是按照一定的规律进行排列,也就是每列有50个CLB、50个引脚、10个BRAM,它们均匀的分布在水平时钟线两侧。不同型号芯片每个Bank的资源是不一样的,但每列资源确实固定的,只不过行数的多少。

2.2.2、区域细节

BUFG/BUFH/CMT时钟区域-具体走向图:

官方描述:
     Any of the four clock-capable input pins can drive the PLL/MMCM in the CMT and the BUFH. The BUFG is shown as present in the region, but can be located physically somewhere else in the clock backbone. BUFG and BUFH share 12 routing tracks in the HROW and can drive all clocking points in the region. BUFGs can also drive BUFHs (not shown in Figure 1-4). This allows for individual clock enables (CE) on an otherwise global clock distribution.
      A GT quad has ten dedicated tracks to drive the CMT and clock buffers in the clock backbone. The BUFRs located in the I/O bank have four tracks driving clocking points in the logic, CMT, and BUFG. CMTs can, with limitations, drive other CMTs in the adjacent regions using the CMT backbone. Similarly, clock-capable pins can drive, with the same limitations, CMTs in adjacent regions.
     Clock-capable pins can drive BUFGs anywhere in the same top/bottom side of the device. There are four tracks in the CMT backbone to support connectivity between vertical regions.Clock sources from one region can drive clock buffer resources in its own region as well as in a horizontally adjacent region. CMTs, clock-capable pins, and serial transceivers can drive clocks into the horizontal adjacent region via the BUFH and also connect to the BUFGs in the same top/bottom side of the device.Logic interconnects drive the CE pins of BUFG and BUFH. Logic interconnects can also drive clocks into the same buffers, but care must be taken because the timing is not predictable.

简单解释:

  • SRCC和MRCC时钟的输入引脚中的任何一个都可以驱动CMT和BUFH中的PLL/MMCM。
  • BUFG显示位于该区域中,但可以实际位于时钟主干的其他位置。
  • BUFG和BUFH在HROW中共享12条路由,可以驱动该区域内的所有时钟点。BUFGs也可以驱动BUFHs,允许在其他全局时钟分布上单独启用时钟(CE)。
  • 一个GT Quad有十个专用的通道来驱动CMT和时钟缓冲器。
  • 位于I/O bank中的BUFRs有四个走线驱动逻辑、CMT和BUFG中的时钟点。CMT可以使用CMT主干网驱动相邻区域中的其他CMT,但有局限性。类似地,时钟输入管脚可以在相同的限制下驱动相邻区域的CMT。
  • 时钟输入管脚在器件的同一顶部/底部的任何地方可以驱动BUFG。CMT主干网中有四条走线支持垂直区域之间的连接。

IO Bank内部时钟结构:

     每个I/O bank包含4个BUFIOs和4个BUFRs。每一个时钟缓冲区都可以由特定的具有时钟功能的输入时钟引脚对驱动,也可以直接由MMCM的特定输出时钟驱动。两个具有时钟功能的输入引脚对,称为MRCC,支持多区域时钟方案。
     MRCC引脚对可以驱动特定的BUFMR,而BUFMR又可以驱动相同和相邻区域的BUFIOs和BUFRs,从而促进多区域/Bank接口。同样,GT也可以驱动BUFMRs。MMCM<3:0>输出到BUFRs和BUFIOs有一个专用的高性能差分路径。这个特性也被称为高性能时钟(HPC)。尽管所有7系列设备都具有相同的基本架构,但在系列和系列中的设备之间存在一些架构差异。每个7系列FPGA在设备的左侧边缘至少有一个完整的I/O列。
     GT (最右侧,深蓝色那列) 可以是7系列fpga支持的任何一个串行收发器(GTP、GTX或GTH)。带有GT的设备要么在设备的右边缘有一个GT和I/O的混合列(一些Kintex-7设备和一些Artix-7设备),要么在设备的右边缘有一个完整的GT列(一些Kintex-7设备和一些Virtex-7设备),在设备的右侧有一个完整的I/O列。其他Virtex-7设备在左右边缘有完整的GT列,在左右两侧有完整的I/O列。Artix-7 200T设备在顶部和底部的时钟旁边有GTP收发器列。
     因此,并非7系列设备中的所有时钟区域都包含前面图中所示的所有块。有关7系列设备的块级架构视图,请参见UG475, 7系列FPGA封装和Pinout规范中的模级库编号概述部分。

7K325T架构图

三、时钟术语-解读(及使用方法)

     7系列时钟架构,有很多术语,类似:BUFG、BUGH、BUFMR、BUFIO、CC等等,这些术语如果不加以描述,可能很多读者会一脸疑惑,这是个啥?
     下面是一张完整的Bank图,各种时钟资源的位置,其中RAM,DSP,CLB不是时钟资源,看到了顺手标一下给大家看。

3.1、BUFG

     BUFG 即全局缓冲,它的输入是IBUFG的输出,BUFG的输出到达FPGA内部的IOB、CLB、Block Select RAM的时钟延迟和抖动最小。输入为固定管脚,输出为H型全铜全局高速网络,这样抖动和到任意触发器的延时差最小,这个也就是FPGA做同步设计可以不需要做后仿真的原因。(每个芯片都有32个BUFG)

     IBUFG 即输入全局缓冲,是与专用全局时钟输入管脚相连接的首级全局缓冲。所有从全局时钟管脚输入的信号必须经过IBUFG单元,否则在布局布线时会报错。IBUFG支持AGP,CTT,GTL,GTLP,HSTL,LVCMOS,LVDCI,LVPECL,LVTTL,PCI,PCIX,,SSTL等多种格式的IO标准。

  • IBUFG + BUFG的使用方法:

  • IBUFG后面连接BUFG的方法是最基本的全局时钟资源的使用方法,由于IBUFG组合BUFG相当于BUFGP,所以在这种使用方法也称为BUFGP方法。


3.2、BUFH

     BUFH即为水平时钟缓冲器,它相当于一个功能受限的BUFG,其输出时钟只能通过HROW在左右相邻的时钟区域内工作。
     他在芯片中的位置,大家可以看前面的全局图。

原语描述:单个时钟区域的HROW时钟缓冲区

3.3、BUFIO/BUFR/BUFMR

     BUFIO即为IO时钟缓冲器,其输出时钟只能作用在一个时钟区域的IO寄存器处,无法在FPGA内部逻辑使用。BUFIO、BUFR都位于I/O BANK,所以它们是与引脚相关的区域时钟缓冲器,可有助于实现时钟源的同步采集,串并之间的转换等等。每个有引脚的BANK都有四个BUFIO和BUFR、两个BUFMRCE。

     BUFIO也是区域时钟缓冲器,它的作用是用来驱动I/O BANK里面的ILOGIC和OLOGIC。BUFR区域时钟缓冲器,与BUFIO不同在于可以驱动BUFG可以驱动的同一时钟区域中的任何时钟点。

     BUFR使用模型:BUFR非常适合需要时钟域交叉或串行到并行转换的源同步应用程序。与BUFIOs不同的是,BUFR能够对FPGA(而不是IOB)中的逻辑资源进行计时。BUFR设计示例如图所示。(这张图在UG472-54页)

     BUFMR是多区域时钟缓冲器,之所以只有两个是对应MRCC,MRCC就两个,所以BUFMR多了也没多啥用。它的作用就是扩展时钟区域,可以将某BANK的时钟引入到上下相邻的BANK中去,如下图所示,这里将MRCC直连到了BUFMR,但在实际应用情况下,MRCC需要先进过IOBUF,才可以连接到BUFMR。

下图是细节图,如果要看芯片中的位置,可以看上文的全局图。

3.4、CC

     CC即为外部时钟输入管脚,它是 “Clock-Capable” 即时钟功能的缩写,表示具有时钟功能的引脚,换句话说,并不是所有的引脚都可以接时钟的,有只有通过特定的引脚才能将外部时钟信号引入FPGA内部的时钟资源,这个引脚有两种,分别称之为MRCC(Multi-region clock-capable I/O)和SRCC(Single-region clock-capable I/O)。Multi-region译为多区域,Single-region译为单区域,而者的直观区别在于MRCC可以连接到BUFMR上,但SR不可以,BUFMR具有扩展功能,可以将本BANK时钟引入到其它BANK上,所以称可以连接到BUFMR的CC为MRCC。

     CC在内部可以连接到BUFG、BUFR、BUFIO、BUFH、MMCM、PLL等,看具体的应用具体连接。下图所示为更为细致的CC管脚连接图。

     每个BANK有50个引脚,其中有4对CC管脚,其中2对SRCC,2对MRCC。SRCC作为区域时钟使用时,只能连接本时钟区域的BUFR和BUFIO。而MRCC则还可以通过BUFMR作用在上下相邻的时钟区域。它们都是差分的,如果接单端时钟则需接到“P”上,对应的“N”引脚不可用。

     关于CC及BUFIO的关系,如果还不是很明白,可以看一下上面,章节3.3的 Figure 2-23: BUFR Driving Various Logic Resources。
下图为Artix-7一个完整的Bank(因为7A50T在很多开发板上都用的,所以这里以此举例)

cc-pad:

3.5、CMT

  • CMT Backbone:对于相邻时钟区域的时钟布线,可以不使用珍贵的全局时钟网络,而使用每个时钟区域都包含的CMT Backbone通道。
  • CMT Column:每个时钟区域都包含一个CMT,一个CMT由一个MMCM和一个PLL组成。

每个7系列FPGA最多有24个CMTs,每个CMT由一个MMCM和一个PLL组成。MMCMs和PLL用作频率合成器,用于非常宽的频率范围,用作外部或内部时钟的抖动滤波器,以及低偏移时钟。PLL包含MMCM功能的一个子集。7系列FPGA时钟输入连接允许多个资源向MMCM和PLL提供参考时钟。

7系列FPGA MMCMs具有任意方向的无限精细相移能力,可用于动态相移模式。MMCMs在反馈路径或一个输出路径中也有一个小数计数器,使得频率合成能力能够进一步细化。

LogiCORE™ IP时钟向导可用于帮助利用MMCMs和PLL在7系列FPGA设计中创建时钟网络。图形用户界面用于采集时钟网络参数。计时向导选择适当的CMT资源,并以最佳方式配置CMT资源和关联的时钟路由资源。

MMCM、PLL的功能可以总结为3点:

  • 频率综合。
  • 去抖动。
  • 去偏斜。

3.6、时钟资源的驱动关系

四、其他概念-补充说明

  • FPGA的全局时钟是什么?
         FPGA的全局时钟应该是从晶振分出来的,最原始的频率。其他需要的各种频率都是在这个基础上利用PLL或者其他分频手段得到的。
         对于一个设计项目来说,全局时钟(或同步时钟)是最简单和最可预测的时钟。在PLD/FPGA设计中最好的时钟方案是:由专用的全局时钟输入引脚驱动的单个主时钟去钟控设计项目中的每一个触发器。只要可能就应尽量在设计项目中采用全局时钟。PLD/FPGA都具有专门的全局时钟引脚,它直接连到器件中的每一个寄存器。这种全局时钟提供器件中最短的时钟到输出的延时。

  • CCLK是什么?
         FPGA同步配置时钟。如果配置模式为主模式,则该时钟由FPGA器件生成,并输出;如果配置模式为从模式,则该时钟由外部提供;当所配置的数据存放在PROM中,即通过PROM来配置器件时,必须选择CCLK时钟;
         USER CLOCK:用户定义的配置时钟信号,该配置时钟目前很少采用;
         JTAG CLOCK:JTAG模式的配置时钟,该时钟提供给内部的JTAG控制逻辑。
    默认值为:CCLK

  • CCLK是怎么产生的:
         CCLK的产生根据配置模式不同而不同,如果设置为Master模式,则由内部的震荡电路产生,作为外部ROM的工作时钟,默认为6MHZ,可通过配置选项设置;如果设置为Slave模式,则由计算机(或其他下载设备)提供,作为芯片内部下载电路的工作时钟;在JTAG模式情况下,CCLK不输出,此时芯片内部下载电路时钟由内部震荡电路提供,TCK仅用作边界扫描相关电路时钟。

补充记张图,增加大家对7系列时钟架构的理解:



五、参考文献

官方文档:
7 Series FPGAs Clocking Resources User Guide (UG472)

CSDN博客:
1、https://blog.csdn.net/z123canghai/article/details/121308631
2、https://blog.csdn.net/gslscyx/article/details/114602573
3、http://blog.chinaunix.net/uid-7547035-id-60220.html

知乎文章:
1、https://zhuanlan.zhihu.com/p/117290284

六、总结

     囫囵吞枣,洋洋洒洒写了半个月,借鉴了多位前辈的文章,以及官方文档,在这里表示感谢。如果有侵权的地方,可以私信我,马上删除。读者有不懂的地方,也可以跟我一起探讨讨论,邮箱:bumianzhe@126.com.

有关零基础学FPGA(六):FPGA时钟架构(Xilinx为例,完整解读)的更多相关文章

  1. ruby - Ruby 和 Ruby on Rails 中的三层架构 - 2

    我是一名决定学习Ruby和RubyonRails的ASP.NETMVC开发人员。我已经有所了解并在RoR上创建了一个网站。在ASP.NETMVC上开发,我一直使用三层架构:数据层、业务层和UI(或表示)层。尝试在RubyonRails应用程序中使用这种方法,我发现没有关于它的信息(或者也许我只是找不到它?)。也许有人可以建议我如何在RubyonRails上创建或使用三层架构?附言我使用ruby​​1.9.3和RubyonRails3.2.3。 最佳答案 我建议在制作RoR应用程序时遵循RubyonRails(RoR)风格。Rails

  2. u盘安装系统(win10为例) - 2

    下载微PE工具箱进入官网下载微PE工具箱-下载 安装好后,打开微PE工具箱客户端,选择安装PE到U盘 PE壁纸可选择自己喜欢的壁纸,勾选上包含DOS工具箱,个性化盘符图标 下载原版系统进入网站下载镜像NEXT,ITELLYOU如果没有账号,注册一下就好进入选择开始使用选择win10 这里我们选择消费者版,用迅雷把BT种子下载下来 下面的两个盘符,是PE工具箱安装进U盘后,分成的盘符,注意EFI的盘符,这里面不能删东西,也不能添东西,另一个盘符可以当做正常的U盘空间使用,我们现在需要把下载下来的景象文件复制到正常的U盘空间中去 这个时候我们的系统U盘就只做好了 安装系统我们将U盘插入电脑,开机,

  3. ruby-on-rails - 具有六边形架构和 DCI 模式的框架和数据库适配器 - 2

    我尝试用Ruby设计一个基于Web的应用程序。我开发了一个简单的核心应用程序,在没有框架和数据库的情况下在六边形架构中实现DCI范例。核心六边形中有小六边形和网络,数据库,日志等适配器。每个六边形都在没有数据库和框架的情况下自行运行。在这种方法中,我如何提供与数据库模型和实体类的关系作为独立于数据库的关系。我想在将来将框架从Rails更改为Sinatra或数据库。事实上,我如何在这个核心Hexagon中实现完全隔离的rails和mongodb的数据库适配器或框架适配器。有什么想法吗? 最佳答案 ROM呢?(Ruby对象映射器)。还有

  4. ruby 认为我在引用一个顶级常量,即使我指定了完整的命名空间 - 2

    在我的应用程序中我有classUserincludeUser::FooendUser::Foo定义在app/models/user/foo.rb现在我正在使用一个定义了自己的Foo类的库。我收到此错误:warning:toplevelconstantFooreferencedbyUser::FooUser仅引用具有完整路径的Foo,User::Foo,而Foo实际上从来没有指的是Foo。这是怎么回事?更新:才想起我之前遇到过同样的问题,在问题1中看到这里:HowdoIrefertoasubmodule's"fullpath"inruby? 最佳答案

  5. FPGA 之 时钟,时钟域, 以及复位系统的设计 - 2

    FPGA时钟和时钟域时钟树所谓时钟树为FPGA内部资源,分:全局时钟树,区域时钟树,IO时钟树原则上优先使用全局时钟树,在GT接口上使用IO时钟树,一般工具也会对GT时钟加以限制;时钟树使用方式正确的物理连接FPGA会由物理管脚专门用于全局时钟设置,通过查询数据手册可以在PCB设计阶段进行确认,当外部时钟接入此管脚时,工具会自动占有全局时钟树资源,当接入普通信号时不会分配时钟树资源;恰当的代码描述原语的使用,即BUFG的使用,可以将PLL的输出等内部时钟进行全局时钟资源的分配;IO时钟资源需要参考相应接口手册,以ultrascale的GTH为例,其JESD204的时钟方案针对不同的子类会由不同

  6. 设计一个亿级高并发系统架构 - 12306火车票核心场景DDD领域建模 - 2

    “架设一个亿级高并发系统,是多数程序员、架构师的工作目标。许多的技术从业人员甚至有时会降薪去寻找这样的机会。但并不是所有人都有机会主导,甚至参与这样一个系统。今天我们用12306火车票购票这样一个业务场景来做DDD领域建模。”开篇要实现软件设计、软件开发在一个统一的思想、统一的节奏下进行,就应该有一个轻量级的框架对开发过程与代码编写做一定的约束。虽然DDD是一个软件开发的方法,而不是具体的技术或框架,但拥有一个轻量级的框架仍然是必要的,为了开发一个支持DDD的框架,首先需要理解DDD的基本概念和核心的组件。一.什么是领域驱动设计(DDD)首先要知道DDD是一种开发理念,核心是维护一个反应领域概

  7. ruby-on-rails - 为 rails 中的 javascript 生成完整的 url(类似于 javascript_path,但是是 url) - 2

    如何生成指向javascript文件的绝对链接。我想应该有类似下面的东西(不幸的是它似乎不可用):javascript_url'main'#->'http://localhost:3000/javascripts/main.js'代替:javascript_path'main'#->'/javascripts/main.js'我需要绝对URL,因为该javascript文件将用于书签。另外我需要相同的css文件。谢谢,德米特里。 最佳答案 javascript和css文件的绝对URL现在在Rails4中可用ActionView::H

  8. ruby - 如何不在 ruby​​ 中编写完整的模块路径? - 2

    假设我在一个非常长的模块路径中有一个类:sux=Really::Long::Module::Path::Sucks.new我能否以某种方式“导入”这个模块,这样我就可以直接使用这个类,而不必担心每次使用它时都要写这个路径?编辑:我知道在同一个模块中会让事情变得更容易。但在这种情况下,我不能在同一个模块中。 最佳答案 模块是ruby​​中的对象,因此您可以只引用较短的模块。Sux=Really::Long::Module::Path::SucksSux.new 关于ruby-如何不在rub

  9. Ruby URI - 如何在 URL 之后获取完整路径 - 2

    给定以下内容,如何获取URL的完整路径uri=URI("http://foo.com/posts?id=30&limit=5#time=1305298413")我只想要posts?id=30&limit=5#time=1305298413我试过uri.path并返回/posts和ui.query返回'id=30&limit=5' 最佳答案 您要找的方法是request_uriuri.request_uri=>"/posts?id=30&limit=5"如果需要,您可以使用任何您想要删除前导/的方法。编辑:要获取#符号后的部分,请使用

  10. 论文解读OTA: Optimal Transport Assignment for Object Detection - 2

    CSDN优秀解读:https://blog.csdn.net/jiaoyangwm/article/details/1266387752021https://arxiv.org/pdf/2103.14259.pdf关键解读在目标检测中标签分配的最新进展主要寻求为每个GT对象独立定义正/负训练样本。在本文中,我们创新性地从全局的角度重新审视标签分配,并提出将分配程序制定为一个最优传输(OT)问题——优化理论中一个被充分研究的课题。具体来说,我们将每个需求方(锚框)和供应商(GT标签)的单位传输成本定义为他们的分类和回归损失加权之和。在公式化后,找到最好的分配方案即为最小传播成本解决最优传输方案,

随机推荐