SDC命令详解:使用create_generated_clock命令进行约束(上)

相关阅读

SDC命令详解https://blog.csdn.net/weixin_45791458/category_12931432.html?spm=1001.2014.3001.5482


目录

        时钟分频器

        时钟倍频器

        时钟门控

        创建生成时钟命令的BNF范式

        标识生成时钟源

        指定生成时钟的源引脚

        生成时钟命名

        设定生成时钟特性


        有时候,复杂的设计需要多个时钟来完成相应的操作,当设计中有多个时钟存在时,它们需要相互协作或各司其职。有几种时钟可能由其他时钟而派生或者说生成,在定义这些时钟时需要使用创建生成时钟命令create_generated_clock。这类时钟可能是时钟分频器,时钟倍频器和时钟门控。

时钟分频器

        时钟分频器产生一个比原始时钟频率更低(周期更长)的时钟信号。典型的时钟分频器是由多个T触发器串联构成的异步计数器。异步计数器的电路如图1所示,产生的时钟波形如图2所示。对于该电路,如果输入的时钟周期是10ns,则clk_1的时钟周期是20ns,clk_2的时钟周期是40ns。

图1  异步计数器

图2 分频器电路时钟波形

时钟倍频器

        时钟倍频器是一种通过增加时钟频率来获得更快时钟速度的电路。这种技术通常用于微处理器和内部总线,并配合内部高速缓存以提高处理器的吞吐量。图3给出了一个简单的时钟倍频器电路,电路利用延迟的时钟和原时钟异或产生更高的时钟频率,延迟可以使用反相器或缓冲器得到,产生的时钟波形如图4所示。在一般情况下,通过PLL锁相环实现时钟倍频。

图3 简单的时钟倍频器

图4 倍频器电路时钟波形

时钟门控

        自20世纪90年代中期以来,时钟门控成为了一种非常流行的减少功耗的技术。当触发器或寄存器因时钟触发而翻转时,会产生一定的动态功耗。然而,某些情况下,部分电路在特定时间无需工作,此时禁用这些电路的时钟可以减少不必要的功耗,这称为时钟门控。图5给出了门控时钟的一个简单实现,更复杂的实现可以参考以往的文章。

 图5 门控时钟

创建生成时钟命令的BNF范式

        SDC命令中用于创建生成时钟的命令是create_generated_clock。该命令的BNF为:

create_generated_clock 
    [-name clock_name] [-add] [-master_clock clock]
    [-divide_by divide_factor | -multiply_by multiply_factor]
    [-duty_cycle percent] [-invert]
    [-preinvert] //该选项在SDC 2.2引入
    [-edges edge_list] [-edge_shift edge_shift_list]
    [-combinational] [-comment comment_string]
    -source master_pin source_objects
    //注:该命令的选项和参数顺序任意

标识生成时钟源

        就像create_clock命令一样,创建一个生成时钟同样需要它的时钟源对象,简单来说就是生成时钟生成的位置,源对象可以是一个端口(port)或者是一个引脚(pin)。一个生成时钟可能有多个时钟源,当然一个时钟源上也可能有多个生成时钟。

指定生成时钟的源引脚

        指定生成时钟的源引脚可以使用-source选项。这个选项指明生成时钟是由哪个引脚或端口上的时钟派生的,这个原时钟被称为master clock(注意,这里不一定要master clock的源对象是该引脚或端口,该引脚或端口也不需要是生成时钟源的扇入,只需要master clock能传播至该引脚或端口即可)。例如,在图1中,可以定义两个生成时钟,生成时钟源对象分别为clk_1和clk_2,源引脚则定义为clk,或者也可以是clk_1_reg/CK(如果已在clk定义了时钟,则会传播至clk_1_reg/CK,需要注意的是时钟无法穿过寄存器传播)。

        在这里需要搞清楚,生成时钟源对象和生成时钟源引脚的区别,生成时钟源对象指的是生成时钟定义在哪个位置,而生成时钟源引脚指明了哪个是获得生成时钟的原时钟。

        如果一个引脚或端口上有多个时钟传播至此,则无法推断出生成时钟属于哪个master clock,需要显式指明。这可以使用-master_clock选项实现,只需指定参数为master_clock的名字即可。在创建了生成时钟后,开发工具将基于master_clock的属性派生生成时钟的属性(如波形、周期等)。

        指定生成时钟的源引脚只是用于确定master_clock及其极性(如果master clock传播至生成时钟源引脚时极性为负,也就是反相的,比如在时钟路径上存在奇数个反相器/与非/或非门,则本文后面谈到的master clock的waveform指的是原waveform反相后的,这将在讨论-preinvert选项时详细说明),对于master clock为传播时钟的情况,master clock到生成时钟的延迟并不依赖源引脚,而是依赖master clock源对象到生成时钟源对象。

        在这里有必要说明一下,定义生成时钟的必要性。有人可能会认为,根据master_clock定义生成时钟是不必要的,可以让开发工具自行推断出最后生成的时钟而不去单独创建。但这是错误的,比如对于图1的分频器,如果只在clk处定义了时钟,开发工具不会认为clk_1和clk_2处生成的是时钟信号,因为所有时钟信号在传播到触发器的时钟端后即终止传播,如图6的时钟树报告所示(该报告使用report_transitive_fanout -clock_tree命令产生),故不能用clk_1和clk_2信号去触发后面的触发器,这导致了后面的触发器是无约束的。此时可以在clk_1和clk_2上定义生成时钟,来约束分频时钟控制的触发器。

图6 时钟树报告

生成时钟命名

        和普通的时钟一样,每一个生成时钟对象的创建都会给生成时钟命名,使用-name选项可以指定一个生成时钟名,当没有使用选项指定时,默认使用生成时钟源名作为生成时钟名。在有些情况下,-name选项是必须的,比如当使用了-add选项时,关于这点,将在后面进行介绍。

设定生成时钟特性

        设定生成时钟的特性可利用以下三个选项当中的一个:

  1. -edges——选项的参数一个列表,指明了生成时钟的边沿是如何与master_clock的边沿对齐的。列表中的第1个数表示生成时钟的第1个上升沿对应master clock的第几个沿(master clock的沿的编号是waveform开始从左到右,从1开始依次增加),第2个数表示生成时钟的第1个下降沿对应master clock的第几个沿,第3个数表示生成时钟的第2个上升沿对应master clock的第几个沿,以此类推。列表中需要至少有3个以上的奇数个沿表示一个完整的周期,生成时钟的周期就是第1个上升沿到最后1个上升沿之间的时间(上升沿-下降沿-上升沿...)。
  2. -divide by——选项的参数是一个除法因子,表示分频倍数,周期通过这个因子翻倍。
  3. -multiply_by——选项的参数是一个乘法因子,表示倍频倍数,周期要除以这个因子。

        需要注意的是,尽管时钟是通过周期来定义的,但divide by和multiply_by是针对频率而言的。

        总的来说,任何使用-divide_by或multiply_by选项来表示的生成时钟,也可以使用-edges来表示,反之则未必正确。参考图1,假设在clk处定义时钟,在clk_1和clk_2上定义生成时钟。使用-edges创建生成时钟,参数{1 3 5}表示生成时钟的第1个上升沿,对应master clock由的第1个沿(上升沿),生成时钟的第1个下降沿,对应master clock的第3个沿(下降沿),生成时钟的第2个上升沿,对应master clock的第5个沿(上升沿),生成时钟的周期是master clock由waveform开始计算的第1个沿到master clock由waveform开始计算的第5个沿的时间,即20ns(这里所指边沿的位置,不考虑自动推理)

        需要注意的是,使用-divide by选项和-multiply_by选项创建的生成时钟的waveform中的边沿数与master clock相同,而对于-edges选项则没有这个要求。

create_clock -period 10 -waveform {10 15} [get_ports clk]

################################################################################
#可以使用-divide_by
create_generated_clock -source [get_ports clk] 
    -divide_by 2 [get_ports clk_1]
create_generated_clock -source [get_ports clk] 
    -divide_by 4 [get_ports clk_2]

#下面的形式也可以有相同的效果,即其中一种生成时钟的master_clock是另一个生成时钟
create_generated_clock -source [get_ports clk] 
    -divide_by 2 [get_ports clk_1]
create_generated_clock -source [get_ports clk_1] 
    -divide_by 2 [get_ports clk_2]

################################################################################
#使用-edges也可以
create_generated_clock -source [get_ports clk] 
    -edges {1 3 5} [get_ports clk_1]
create_generated_clock -source [get_ports clk]
    -edges {1 5 9} [get_ports clk_2]

#下面的形式也可以有相同的效果,即其中一种生成时钟的master_clock是另一个生成时钟
create_generated_clock -source [get_ports clk] 
    -edges {1 3 5} [get_ports clk_1]
create_generated_clock -source [get_ports clk_1]
    -edges {1 3 5} [get_ports clk_2]

        下面展示了使用-divide_by选项创建生成时钟的情况,可以使用report_clock报告设计中的各个时钟的情况,如图7所示,可以看到使用-divide_by选项生成的时钟的第一个上升沿与master clock的第一个上升沿是对齐的,如果使用-edges选项则没有此要求,生成的时钟的第一个上升沿可以与master clock的任何一个沿对齐。

图7 时钟报告

         对于使用-divide by选项的生成时钟,除了周期有相应改变外,其他性质有什么变化呢?前面其实已经谈到了一个,使用-divide by选项分频得到的生成时钟的第一个上升沿与master clock的第一个上升沿对齐。对于其他上升下降沿,Design Compiler的处理方式是将周期平均分给所有的上下脉冲,也就是说,无法保证占空比与分频前一致,具体如下例所示。

#定义了一个复杂的时钟波形
create_clock -period 20 -waveform {2 5 12 15} [get_ports clk]

#根据这个时钟使用-divide_by创建分频时钟,结果如图8所示
create_generated_clock -source [get_ports clk] -divide_by 2 [get_ports clk_0]

 图8 上升沿对齐,周期在上下脉冲间均分

         对于使用-multiply_by选项的生成时钟,无法保证倍频得到的生成时钟的第一个上升沿与master clock的第一个上升沿对齐。Design Compiler的处理方式是将所有沿的出现时间除以倍频因子,这样能保证所有脉冲占空比与之前相同,具体如下例所示。

#定义了一个复杂的时钟波形
create_clock -period 20 -waveform {2 5 12 15} [get_ports clk]

#根据这个时钟使用-multiply_by创建倍频时钟,结果如图9所示
create_generated_clock -source [get_ports clk] -multiply_by 2 [get_ports clk_2]

 图9 倍频之后的waveform相当于之前的waveform除以倍频因子

下一节

SDC命令详解:使用create_generated_clock命令进行约束(下)https://chenzhang.blog.csdn.net/article/details/134290809

在本章中,我们将深入探讨基于块匹配的全景图像拼接技术,这是一种广泛应用于计算机视觉和图像处理领域的技术。在深度学习和机器学习的背景下,这种方法的实现与整合显得尤为重要,因为它们能够提升图像处理的效率和精度。下面,我们将会详细阐述相关知识点。 我们要了解什么是全景图像拼接。全景图像拼接是一种将多张有限视角的图像合并成一个宽视角或全方位视角图像的技术,常用于虚拟现实、地图制作、监控系统等领域。通过拼接,我们可以获得更广阔的视野,捕捉到单个图像无法覆盖的细节。 块匹配是全景图像拼接中的核心步骤,其目的是寻找两张图片中对应域的最佳匹配。它通常包括以下几个关键过程: 1. **图像预处理**:图像的预处理包括灰度化、直方图均衡化、降噪等操作,以提高图像质量,使匹配更加准确。 2. **特征提取**:在每张图像上选择特定域(块)并计算其特征,如灰度共生矩阵、SIFT(尺度不变特征变换)、SURF(加速稳健特征)等,这些特征应具备旋转、缩放和光照不变性。 3. **块匹配**:对于每一张图像的每个块,计算与另一张图像所有块之间的相似度,如欧氏距离、归一化互信息等。找到最相似的块作为匹配对。 4. **几何变换估计**:根据匹配对确定对应的几何关系,例如仿射变换、透视变换等,以描述两张图像之间的相对位置。 5. **图像融合**:利用估计的几何变换,对图像进行融合,消除重叠域的不一致性和缝隙,生成全景图像。 在MATLAB环境中实现这一过程,可以利用其强大的图像处理工具箱,包括图像读取、处理、特征检测和匹配、几何变换等功能。此外,MATLAB还支持编程和脚本,方便算法的调试和优化。 深度学习和机器学习在此处的角色主要是改进匹配过程和图像融合。例如,通过训练神经网络模型,可以学习到更具鲁棒性的特征表示,增强匹配的准确性。同时,深度学习方法也可以用于像素级别的图像融合,减少拼接的失真和不连续性。 在实际应用中,我们需要注意一些挑战,比如光照变化、遮挡、动态物体等,这些因素可能会影响匹配效果。因此,往往需要结合其他辅助技术,如多视图几何、稀疏重建等,来提高拼接的稳定性和质量。 基于块匹配的全景图像拼接是通过匹配和融合多张图像来创建全景视图的过程。在MATLAB中实现这一技术,可以结合深度学习和机器学习的先进方法,提升匹配精度和图像融合质量。通过对压缩包中的代码和数据进行学习,你可以更深入地理解这一技术,并应用于实际项目中。
基于Python+OpenCV的全景图像拼接系统设计与实现 本系统的设计与实现基于Python和OpenCV,旨在提供一个高效、准确的全景图像拼接系统。系统的前台界面使用了最新的HTML5技术,使用DIV+CSS进行布局,使整个前台页面变得更美观,极大的提高了用户的体验。后端的代码技术选择的是PYTHON,PYTHON语言是当下最常用的编程语言之一,可以保证系统的稳定性和流畅性,PYTHON可以灵活的与数据库进行连接。 系统的数据使用的MYSQL数据库,它可以提高查询的速度,增强系统数据存储的稳定性和安全性。同时,本系统的图像拼接技术以OpenCV为核心,最大化提升图片拼接的质量。 本系统的设计与实现可以分为以下几个部分: 一、系统架构设计 本系统的架构设计主要基于Python和OpenCV,使用MYSQL数据库存储数据。系统的前台界面使用HTML5技术,后端使用PYTHON语言连接MYSQL数据库,实现图像拼接功能。 二、图像拼接算法 本系统使用OpenCV库实现图像拼接,OpenCV库提供了丰富的图像处理功能,可以实现图像拼接、图像识别、图像处理等功能。通过OpenCV库,可以实现高效、准确的图像拼接。 三、系统实现 本系统的实现主要基于Python和OpenCV,使用MYSQL数据库存储数据。系统的前台界面使用HTML5技术,后端使用PYTHON语言连接MYSQL数据库,实现图像拼接功能。同时,本系统还实现用户认证、数据加密、数据备份等功能,以确保系统的安全和稳定性。 四、系统优点 本系统的优点有: * 高效:本系统使用OpenCV库实现图像拼接,可以实现高效的图像拼接。 * 准确:本系统使用OpenCV库实现图像拼接,可以实现准确的图像拼接。 * 安全:本系统实现用户认证、数据加密、数据备份等功能,以确保系统的安全和稳定性。 * 灵活:本系统使用PYTHON语言,可以灵活的与数据库进行连接,实现灵活的图像拼接功能。 本系统的设计与实现可以提供一个高效、准确的全景图像拼接系统,为用户提供了一个方便、快捷的图像拼接体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

日晨难再

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值