我是靠谱客的博主 无聊项链,最近开发中收集的这篇文章主要介绍静态时序分析之时钟约束,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

FPGA静态时序分析
quartus ii中的静态时序分析工具支持以下几种类型的时钟约束:
(1)Base clocks基础时钟
(2)Virtual clocks 虚拟时钟
(3)Multifrequency clocks 多频率时钟
(4)Generated clocks 生成时钟
在sdc里编写约束文件时,首先要对时钟进行约束,因为其他的约束都是对参考时钟进行的。静态时序分析是从上面到下面
对你的约束指令进行读取并执行的
1、创建Base clocks 基础时钟约束
基础时钟是输入FPGA的主要时钟,基础时钟是由片外晶振或外部器件输入的,是整个设计的时钟源头,其余的Generated clocks
以及其他的约束都是用base clocks作为参考时钟的。
 用creat_clock指令对输入时钟进行约束,下面的7-8是对输入的时钟进行约束
 -period 10 是指输入的的时钟周期是10ns,即时钟频率是100M;
 -waveform{2.5 7.5}是指时钟偏移2.5ns(1/4周期),即相位偏移了90度;
 -get_ports clk_sys是指输入的时钟是从clk_sys这个管脚进入FPGA的。
 
 EXAMPLE 100Mhz shifted by 90degrees clock creation
 ----------------------------------------------------------
 creat_clock  -period 10 -waveform{2.5 7.5} [get_ports clk_sys]
 ---------------------------------------------------------- 
 对同一个输入管脚有多个频率的时钟进行约束,在第二条指令后加上-add,该约束命令表示从clk_sys管脚输入的时钟有100M和
 200M两种频率,格式如下:
--------------------------------------------------------------------
creat_clock  -period 10 -waveform{2.5 7.5} [get_ports clk_sys]
creat_clock  -period 5 -waveform{2.5 7.5} [get_ports clk_sys] -add
--------------------------------------------------------------------

2、创建Virtual clocks虚拟时钟约束
 虚拟时钟并没有真正的输入源,是通过指令虚拟出来的。虚拟时钟主要用在I/O输入输出约束上,用来代表与FPGA相连的外部器件的
 时钟。比如源同步输入时,就可以通过创建虚拟时钟进行最大最小延迟约束。
 creat virtual clock
 ----------------------------------------------------------------------
 creat_clock -period 10 -name my_virt_clk
 ----------------------------------------------------------------------
3、创建Multifrequency clocks多频率时钟约束
指令格式如下;
Multifrequency clocks example
--------------------------------------------------------------------
creat_clock -period 10 -name clock_primary -waveform{0 5}[get_ports clk]
creat_clock -period 15 -name clock_secondary -waveform{0 7.5}[get_ports clk] -add
--------------------------------------------------------------------
4、创建generated clocks 生成时钟
generated clocks是指从PLL生成的时钟,或者由程序分频产生的时钟。在SDC里用creat_generated_clock
指令对生成的时钟进行约束。Options里有中括号的表示可选的,不是必须的。格式如下:
.Command:  crear_generated_clock
.Options
   [-name<clock_name>]
   -source<master_pin>
   [-master_clock<clock_name>]
   [-divide_by<factor>]
   [-multiply_by<factor>]
   [-duty_cycle<percent>]
   [-invert]
   [-phase<degrees>]
   [-edges<edge_list>]
   [-edge_shift<shift_list>]
   [<targets>]
   [-add]
   
   -name用来指定通过creat_generated_clock指令生成的时钟名称
   -source指用来生成时钟的源时钟,比如在PLL里面,指输入PLL的源时钟
   -master_clock是指源时钟如果有几个不同的频率,该master_clock指示源时钟用哪个频率的时钟作为source clock
   -divide_by时钟的分频值
   -multipl_by时钟的倍频值
   -duty_cycle生成时钟的占空比
   -invert生成时钟反相
   -phase生成时钟相位偏移值
   
   下面是用程序进行分频产生时钟的例子
   一个寄存器把输入时钟CLK_IN进行二分频输出
   
   
   对其进行时钟约束,指令如下:
   creat_clock -period 10 [get_ports clk_in]   //Base clocks 基础时钟约束
   
   creat_generated_clock -name clk_div
                         -source[get_pins inst|clk]
                         -divide_by 2
                         [get_pins inst|regout]
                         
   
   再举一个PLL生成时钟约束的例子:
   下面是程序里例化的一个PLL,输入时钟CLK是25M,产生4个输出时钟outclk_0是125M,outclk_1是25M,outclk2是2.5M,outclk_3是50M
    wire   clk_125M
    wire   clk_25M
    wire   clk_2_5M
    wire    mm_clk
    PLL     pll_inst
    (
    .rst                (0),
    .outclk_0            (CLK),
    .outclk_1              (clk_125M),
    .outclk_2              (clk_25M),
    .outclk_3               (clk_2_5M),
    .locked                  ()
    ); 
    
    首先对输入时钟clk进行约束,指令如下:
    
    set clk_in  "CLK"
    set IN_CLK_PERIOD  40
    
    creat_clock -name altera_tse_$clk_in -period $IN_CLK_PERIOD [get_ports $clk_in ]  
    
    5、derive_pll_clocks
    该命令是将程序里面所有的PLL生成的时钟都进行约束,生成约束时钟的名称不能修改,所以为了可以灵活的修改生成时钟
    的名称,很多时候都是用creat_generated_clock指令来对PLL生成的时钟进行约束。
       using derive pll command
        creat_clock -period 10.0
        [get_ports in_clk]
        derive_pll_clocks
        
   6、derive_clock_uncertainty
   对时钟的uncertainty进行约束,时钟的uncertainty指的是时钟的jitter(抖动)和skew(偏斜)。用derive_clock_uncertainty,
   静态时序分析工具会自动的计算时钟的uncertainty,而不用手动去添加。
   
   7、set_clock_groups创建时钟分组 命令
   对于静态时序分析工具默认所有的时钟都是相关的,这样会把一些没有关联的信号进行分析,导致错误的分析结果,所以
   需要用该命令去吧时钟进行分组。
   set_clock_groups有两个类型:
   -exclusive:表示所分的组是互斥的,不能同时存在
   -asynchronous:表示所分的组是异步的,即不相关的
   下面是创建两个互斥的时钟分组,时钟clk_A和clk_B分在不同的组,是互斥的。两者不会同时在程序里面出现。
   
   example  creat mutually exclusive clock groups
   -------------------------------------------------------------------------------------
   creat_clock -period 40 -name clk_A [get_ports{port_A}]
   creat_clock -add -period 20 -name clk_B [get_ports{port_A}]
   set_clock_groups -exclusive -group{clk_A} -group{clk_B}
   --------------------------------------------------------------------------------------
   下面是创建两个异步的时钟分组,时钟clk_A和clk_B为一组,这样clk_A,clk_B和clk_C就是异步的,不相关的。
    example creat asynchronous clock groups
    --------------------------------------------------------------------------------------
    set_clock_groups -asynchronous  -group{clk_A clk_B} -group{clk_C}
    --------------------------------------------------------------------------------------
   
   
   摘抄自https://blog.csdn.net/huan09900990/article/details/77163970?t=123
                      

最后

以上就是无聊项链为你收集整理的静态时序分析之时钟约束的全部内容,希望文章能够帮你解决静态时序分析之时钟约束所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部