时序约束之偏移约束
FPGA的学习,最难的那块,应该就是时序约束了吧。所以,这玩意需要耐心且循序渐进,共勉!
本博文内容参考自:《Xilinx FPGA/CPLD设计手册》
偏移约束包括 OFFSET_IN_BEFORE、OFFSET_IN_AFTER、OFFSET_OUT_BEFORE、OFFSET_OUT_AFTER 4中约束。偏移约束规定了外部时钟和数据输入输出引脚之间的时序关系,只用于与PAD相连的信号,不能用于内部信号。通过设置偏移约束,告诉综合工具输入信号到达的时间和输出信号需要保持稳定的时间,从而保证输入FPGA/CPLD的信号满足建立时间的要求,同时保证由FPGA/CPLD输出的信号满足下一级电路的时序要求。
偏移约束的语法是:
OFFSET = {IN|OUT} "offset_time" [units] {BEFORE|AFTER} "clk_name" [{RISING|FALLING}]
命令解释:
- IN|OUT 说明约束的是输入还是输出;
- offset_time 为偏移时间差值;
- BEFORE|AFTER 说明该时间差值是在有效时钟沿之前,还是在有效时钟沿之后;
- clk_name 是时钟名;
- RISING|FALLING 指定时钟有效沿是上升沿还是下降沿。
设置偏移约束最重要的一步就是如何计算偏移时间差值,在ISE中对各种偏移差值都有明确的规定。
下面分别叙述上面的4中偏移约束:
一、OFFSET_IN_BEFORE 和 OFFSET_IN_AFTER 约束设置
OFFSET_IN_BEFORE 说明输入信号在有效时钟沿到来提前了多少时间准备好,用于约束芯片内部与输入引脚之间的组合逻辑,使其延时不能大于该时间,否则当时钟有效沿到来时信号还没有稳定,将导致寄存器信号采样错误;
而OFFSET_IN_AFTER 指的是输入信号在时钟有效沿后多少时间到达输入引脚,同样是用于约束输入引脚到芯片内部之间的组合逻辑的延时上限。
如下图:
信号从上一级电路输出到达芯片输入引脚的延时计算公式为:
信号将在有效时钟沿之后的时刻到达,即 OFFSET_IN_AFTER的差值为 ,约束可以设置为:
NET SIGNAL_IN OFFSET = IN AFTER CLK
到达时间与时钟周期之间的关系必须满足 ,电路才能正常工作。
如果采用 OFFSET_IN_BEFORE来定义该条约束,则为:
NET SIGNAL_IN OFFSET = IN BEFORE CLK
其中, 必须满足:
二、OFFSET_OUT_BEFORE 和 OFFSET_OUT_AFTER约束设置
图还是用上个图,这里贴出来方便看:
OFFSET_OUT_BEFORE用来说明下一级芯片的输入信号必须在有效沿之前多长时间准备好,而OFFSET_OUT_AFTER用于规定本级输出信号需要在时钟有效沿之后多长时间到达稳定状态,即达到芯片内部的输出延迟的最大值。
根据下一级输入端的延时可以计算出当前设计输出的信号必须在何时到达稳定状态,从而对设计输出逻辑进行约束,以满足下一级电路的信号建立时间要求,使电路能正常工作。
根据上图,输出信号稳定时间的计算公式为:
只要当本级设计的输出端信号比时钟上升沿提早时间到达稳定状态,那么下一级电路即可对信号正确采样。同样和系统时钟周期也必须满足:
至此,我们就可以根据来设置OFFSET_OUT_BEFORE 和 OFFSET_OUT_AFTER约束了。
OFFSET_OUT_BEFORE约束设置:
NET SIGNAL_OUT OFFSET = OUT BEFORE CLK
NET SIGNAL_OUT OFFSET = OUT AFTER CLK
其中,