FPGA 时序分析(三)

 接上一篇文章:FPGA 时序分析(二)-CSDN博客

6、输入延迟约束

        输入延迟约束,其路径模型为FPGA引脚到寄存器的路径。输入延迟约束,向vivado工具说明了数据相对于时钟发生沿延迟的时间,工具根据此输入延迟时间,调整布局布线策略,已到达时序收敛的目的。

        在vivado进行input delay约束时,我们告知工具的是,FPGA数据引脚的数据信号相对于FPGA时钟引脚的时钟信号的发射沿,在FPGA外部延时的最大时间和最小时间。在已知外部延时的情况下,FPGA就可以在内部布局布线时,尽可能保证进入到FPGA内部触发器的时钟和数据,达到时序收敛。

        以下内容可以参考上一篇文章理解。

6.1 系统时钟同步输入约束

6.1.1 系统同步单边沿采样

        对于系统同步接口,假设FPGA采用上升沿采样。为了保证数据在采样时是稳定的,锁存边沿晚于发射边沿1个时钟周期。

        上图中,input_clock指的是FPGA的时钟引脚所接收到的时钟信号,data指的是到达FPGA引脚的数据信号。

        数据相对于时钟的延迟,主要是外部器件的tco时间,以及PCB布线时间。其最大延迟时间为max_delay = tco_max + trce_dly_max;最小延迟时间为min_delay = tco_min + trce_dly_min;

        其约束指令为:

#基于时钟上升沿的输入延迟约束,其中-clock_rise可省略
set_input_delay -clock <input_clock> -max max_delay [get_ports data] -clock_rise
set_input_delay -clock <input_clock> -min min_delay [get_ports data] -clock_rise


#基于时钟下降沿的输入延迟约束
set_input_delay -clock <input_clock> -max max_delay [get_ports data] -clock_fall
set_input_delay -clock <input_clock> -min min_delay [get_ports data] -clock_fall

6.1.2 系统同步双边沿采样

6.2 源时钟同步的输入约束

6.2.1 源时钟同步单边沿采样  

        源时钟同步接口数据和时钟信号边沿对齐有两种情况,一种是时钟直接送到采样寄存器;另一种是时钟经过PLL锁相环再送到寄存器。由于锁相环能对时钟相位进行调整,因此约束命令不同。

        情况一:时钟直接送到采样寄存器。

       FPGA引脚接收到时序图如下所示: 

        上图中,时钟的上升沿和数据的开始对齐,直接采样难以满足建立时间要求,因此锁存沿在发射沿后一个时钟周期。其中skew_bre指的skew before rise edge,skew_are指的是skew after rise edge,数据可能提前到达,也可能会延时到达,可以查阅外部设备手册获取参数。

        最大延时即为max_delay = cycle + skew_are;

        最小延时即为min_delay = cycle - skew_bre;

        约束命令如下:

set_input_delay -clock <input_clock> -max max_delay [get_ports data] -clock_rise
set_input_delay -clock <input_clock> -min min_delay [get_ports data] -clock_rise


#若为下降沿采样,则可以如下约束,仅需要修改对应的延时时间计算即可。
set_input_delay -clock <input_clock> -max max_delay [get_ports data] -clock_fall
set_input_delay -clock <input_clock> -min min_delay [get_ports data] -clock_fall

        情况二:时钟经过PLL后到达采样寄存器

        时钟经过锁相环的情况,锁相环可以对时钟延时进行补偿,使时钟的上升沿和数据的结束对齐。此时可以直接用PLL时钟的上升沿采样数据,延时计算如下:

        最大延时即为max_delay = skew_are;

        最小延时即为min_delay =  - skew_bre; (注意为负数,表示数据可能提前到达)

set_input_delay -clock <input_clock> -max max_delay [get_ports data] -clock_rise
set_input_delay -clock <input_clock> -min min_delay [get_ports data] -clock_rise


#若为下降沿采样,则可以如下约束,仅需要修改对应的延时时间计算即可。
set_input_delay -clock <input_clock> -max max_delay [get_ports data] -clock_fall
set_input_delay -clock <input_clock> -min min_delay [get_ports data] -clock_fall

6.2.2 源时钟同步双边沿采样边沿对齐

        情况一:时钟直接送到采样寄存器。

        对于双边沿采样,时钟直接送到采样寄存器的情况,时钟的边沿和数据的开始对齐锁存沿在发生沿后半个时钟周期

        数据和时钟的时序图如下所示:

        其中skew_bfe指的skew before fall edge,skew_afe指的是skew after fall edge,skew_bre指的skew before rise edge,skew_are指的是skew after rise edge,数据可能提前到达,也可能会延时到达,可以查阅外部设备手册获取参数。与单边沿的延时计算类似,上升沿采样的数据,由上一个下降沿发送;而下降沿的采样数据,由上一个上升沿发送。可得到如下结果:

        上升沿最大延时为rise_max_delay= (cycle/2)+ skew_afe。

        上升沿的最小延时为rise_min_delay = (cycle/2)- skew_bfe。

        下降沿最大延时为fall_max_delay= (cycle/2)+ skew_are。

        下降沿的最小延时为fall_min_delay = (cycle/2)- skew_bre。

        输入延迟的约束命令如下:

set_input_delay -clock <input_clock> -max rise_max_delay [get_ports data] -clock_rise
set_input_delay -clock <input_clock> -min rise_min_delay [get_ports data] -clock_rise


set_input_delay -clock <input_clock> -max fall_max_delay [get_ports data] -clock_fall -add_delay
set_input_delay -clock <input_clock> -min fall_min_delay [get_ports data] -clock_fall -add_delay

       情况二:时钟经过PLL后到达采样寄存器

         时钟经过锁相环的情况,锁相环可以对时钟延时进行补偿,使时钟的边沿和数据的结束对齐。延时计算如下:

        上升沿最大延时为rise_max_delay= skew_are。

        上升沿的最小延时为rise_min_delay = -skew_bre。(注意为负数,表示数据可能提前到达)

        下降沿最大延时为fall_max_delay=  skew_afe。

        下降沿的最小延时为fall_min_delay = - skew_bfe。(注意为负数,表示数据可能提前到达)

set_input_delay -clock <input_clock> -max rise_max_delay [get_ports data] -clock_rise
set_input_delay -clock <input_clock> -min rise_min_delay [get_ports data] -clock_rise


set_input_delay -clock <input_clock> -max fall_max_delay [get_ports data] -clock_fall -add_delay
set_input_delay -clock <input_clock> -min fall_min_delay [get_ports data] -clock_fall -add_delay

6.2.3 源时钟同步双边沿采样中心对齐

        对于源时钟同步接口双边沿采样,数据和时钟中心对齐的情况(数据在时钟高低电平中心位置发生变化),发射沿和锁存沿为同一个时钟沿,其数据和时钟的关系图如下:

         上图中,input_clock指的是FPGA的时钟引脚所接收到的时钟信号,data指的是到达FPGA引脚的数据信号。dv_bfe指的是:data valid before fall edge;dv_afe指的是:data valid after fall edge; dv_bre指的是,data_valid before rise edge; dv_are指的是data valid after rise edge。

        上升沿最大延时为rise_max_delay= (cycle/2) - dv_bfe。 若大于此时间,则下个下降沿的建立时间无法满足。

        上升沿的最小延时为rise_min_delay = dv_are。若小于此时间,则当前上升沿的保持时间无法满足。

        下降沿最大延时为fall_max_delay= (cycle/2) - dv_bre。 若大于此时间,则下个上升沿的建立时间无法满足。

        下降沿的最小延时为fall_min_delay = dv_afe。若小于此时间,则当前下降沿的保持时间无法满足。

        输入延迟的约束命令如下:

set_input_delay -clock <input_clock> -max rise_max_delay [get_ports data] -clock rise
set_input_delay -clock <input_clock> -min rise_min_delay [get_ports data] -clock rise

#增加-add_delay的目的是告知vivado,不要覆盖上面的两条约束
set_input_delay -clock <input_clock> -max fall_max_delay [get_ports data] -clock fall -add_delay
set_input_delay -clock <input_clock> -min fall_min_delay [get_ports data] -clock rise -add_delay

       

        当然,约束是一种方式,实际工程中,一般使用IDLEY原语和IDLEYA_CTRL原语,手动或者自动调整数据的延时时间,保证时序收敛。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值