FPGA时序约束

时序的各种概念详见这一篇:FPGA时序分析_居安士的博客-CSDN博客

目录

时钟周期约束

主时钟

Generated Clocks(生成时钟)

计数器分频

锁相环、MMCM

分组约束

输入约束 

输出约束

输入-输出约束

虚拟时钟约束

多周期约束

无需做时序约束Types of False Paths


时钟周期约束

FPGA时序约束_第1张图片

如上图,有两种表示方法,可以说period或者waveform 

主时钟

主时钟指的是晶振输入给FPGA管脚的时钟,或者采用高速收发器的方法

 FPGA时序约束_第2张图片

对主时钟进行约束,用create_clock

代码示例  create_clock -period 10 [get_ports sysclk]

意思是创建一个周期10ns的时钟,时钟管脚是sysclk(晶振的输出)

FPGA时序约束_第3张图片

 还有一种使用高速收发器产生主时钟的方法,高速收发器rxclk经过MMCM

create_clock -name rxclk -period 3.33 [get_pins gt0/RXOUTCLK] 

 内部模块用pins,FPGA管脚用port

Generated Clocks(生成时钟)

比如计数器分频得到的时钟,用PLL生成的时钟,也需要约束

计数器分频

 FPGA时序约束_第4张图片

 约束的时候先约束主时钟,再约生成时钟

create_clock -name clkin -period 10 [get_ports clkin]

如图是一个2分频电路

# Option 1:

create_generated_clock -name clkdiv2 -source [get_ports clkin] -divide_by 2 \ [get_pins REGA/Q]

REGA/Q:regA的Q端口(粉圈处)

# Option 2: 

create_generated_clock -name clkdiv2 -source [get_pins REGA/C] -divide_by 2 \ [get_pins REGA/Q]

FPGA时序约束_第5张图片

 此外,还可以用沿来定义:

create_generated_clock -name clkdiv2 -source [get_pins REGA/C] \ -edges {1 3 5} [get_pins REGA/Q]

clkdiv2 一个周期里面有clkin 3个时钟沿(1 3 5)

锁相环、MMCM

FPGA时序约束_第6张图片

 由锁相环和MMCM生成的时钟无需约束,vivado会自动约束

分组约束

需把不同晶振的不同的时钟分成一组,否则布局布线时会很慢

FPGA时序约束_第7张图片

osc1和osc2为两个晶振,分别输出clka,b,c,d和clke,f,g,h,代码如下:

set_clock_groups –name async_clk0_clk1 –asynchronous \

–group [get_clocks –include_generated_clocks clk0] \

–group [get_clocks –include_generated_clocks clk1]

FPGA时序约束_第8张图片

 clk0和clk1经过BUFG(经过选择,只有一个时钟作用在电路上)互斥时钟分组:

set_clock_groups –name exclusive_clk0_clk1 –physically_exclusive \ –group clk0 –group clk1

输入约束 

set_input_delay [-clock args] [-reference_pin args] [-clock_fall] [-rise] [-fall] [-max] [-min]

[-add_delay] [-network_latency_included] [-source_latency_included] [-quiet] [-verbose] delay objects

FPGA时序约束_第9张图片

create_clock –name sysclk –period 10 [get_ports clk]    首先约束主时钟

set_input_delay –clock sysclk 4 [get_ports din]     约束输入延迟

这样的目的是,告诉FPGA,数据传输的时间要小于6ns

约束最大值和最小值

FPGA时序约束_第10张图片

 set_input_delay –clock sysclk –max 4 [get_ports din]  建立时间检测会用到

set_input_delay –clock sysclk –min 2 [get_ports din]  保持时钟检测会用到

双沿采集数据的情况

FPGA时序约束_第11张图片

 set_input_delay 1 –min –clock Clk [get_ports Data_In]    上升沿最小1ns延时

set_input_delay 2 –max –clock Clk [get_ports Data_In]    上升沿最大2ns延时

set_input_delay 1 –min –clock Clk [get_ports Data_In]\ -clock_fall –add_delay   下降沿最小1ns延时

set_input_delay 2 –max –clock Clk [get_ports Data_In]\ -clock_fall –add_delay   下降沿最大2ns延时

输出约束

FPGA时序约束_第12张图片

create_clock –name sysclk –period 10 [get_ports clkin]

set_output_delay –clock sysclk 6 [get_ports din]

最大延时和最小延时的约束

FPGA时序约束_第13张图片

create_clock –name sysclk –period 10 [get_ports clkin]

set_output_delay –clock sysclk –max 2 [get_ports dout]     约束建立时间

set_output_delay –clock sysclk –min -1 [get_ports dout]     hold time要取负 

数据手册可以看到建立时间和保持时间的数值

双沿情况 

FPGA时序约束_第14张图片

set_output_delay –min -1 –clock Clk [get_ports Data_Out]

set_output_delay –max 3 –clock Clk [get_ports Data_Out]

set_output_delay –min -1 –clock Clk [get_ports Data_Out]\ -clock_fall –add_delay

set_output_delay –max 3 –clock Clk [get_ports Data_Out]\ -clock_fall –add_delay

FPGA时序约束_第15张图片 

 

输入-输出约束

对组合逻辑延时进行约束,基本不需要

FPGA时序约束_第16张图片 

 set_max_delay 15 –from [get_ports din] –to [get_ports dout]

虚拟时钟约束

FPGA时序约束_第17张图片

FPGA时序约束_第18张图片

 

FPGA时序约束_第19张图片

多周期约束

FPGA时序约束_第20张图片 

FPGA时序约束_第21张图片

 set_multicycle_path -from [get_cells rega] -to [get_cells rega] –setup -end 2

set_multicycle_path -from [get_cells regb] -to [get_cells regb] –hold -end 1

*语句中数字的含义:

对于-setup:表示该多周期路径所需要的时钟周期个数;

对于-hold:表示相对于缺省捕获沿(图中的Default hold),实际捕获沿 (图中的New hold)应回调的时钟周期个数

*参考时钟周期的选取:

-end表示参考时钟为捕获端(收端)所用时钟,对于-setup缺省为-end

-start表示参考时钟为发送端(发端)所用时钟,对于-hold缺省为-start

 

无需做时序约束Types of False Paths

组合逻辑

FPGA时序约束_第22张图片

 时序逻辑

FPGA时序约束_第23张图片

 FPGA时序约束_第24张图片

 

你可能感兴趣的:(fpga开发)