跳转到主要内容

FPGA时序约束实战篇之延迟约束

demi 提交于

<font color="#FD8900">作者:猫叔</font>

<iframe height="358" width="600" frameborder="0" src="https://v.qq.com/txp/iframe/player.html?vid=v3011fiyhrc&quot; allowFullScreen="true"></iframe>

<font size="4" style="line-height: 50px;" color="red"><strong>延迟约束</strong></font>

对于延迟约束,相信很多同学是不怎么用的,主要可能就是不熟悉这个约束,也有的是嫌麻烦,因为有时还要计算PCB上的走线延迟导致的时间差。而且不加延迟约束,Vivado也只是在Timing Report中提示warning,并不会导致时序错误,这也会让很多同学误以为这个约束可有可无。

<center><img width="600" src="http://xilinx.eetrend.com/files/2020-02/wen_zhang_/100047451-89841-1.pn…; alt=""></center><br>

但其实这种想法是不对的,比如在很多ADC的设计中,输出的时钟的边沿刚好是数据的中心位置,而如果我们不加延迟约束,则Vivado会默认时钟和数据是对齐的。

<center><img width="600" src="http://xilinx.eetrend.com/files/2020-02/wen_zhang_/100047451-89842-2.pn…; alt=""></center><br>

对于输入管脚,首先判断捕获时钟是主时钟还是衍生时钟,如果是主时钟,直接用set_input_delay即可,如果是衍生时钟,要先创建虚拟时钟,然后再设置delay。对于输出管脚,判断有没有输出随路时钟,若有,则直接使用set_output_delay,若没有,则需要创建虚拟时钟。

在本工程中,输入输出数据管脚的捕获时钟如下表所示:

<center><img width="600" src="http://xilinx.eetrend.com/files/2020-02/wen_zhang_/100047451-89843-3.pn…; alt=""></center><br>

根据上表,我们创建的延迟约束如下,其中的具体数字在实际工程中要根据上下游器件的时序关系(在各个器件手册中可以找到)和PCB走线延迟来决定。未避免有些约束有歧义,我们把前面的所有约束也加进来。

<pre># 主时钟约束
create_clock -period 25.000 -name clk2 [get_ports clk_in2]

# 衍生时钟约束
create_generated_clock -name clk_samp -source [get_pins clk_gen_i0/clk_core_i0/clk_tx] -divide_by 32 [get_pins clk_gen_i0/BUFHCE_clk_samp_i0/O]
create_generated_clock -name spi_clk -source [get_pins dac_spi_i0/out_ddr_flop_spi_clk_i0/ODDR_inst/C] -divide_by 1 -invert [get_ports spi_clk_pin]
create_generated_clock -name clk_tx -source [get_pins clk_gen_i0/clk_core_i0/inst/mmcm_adv_inst/CLKIN1] [get_pins clk_gen_i0/clk_core_i0/inst/mmcm_adv_inst/CLKOUT1]
create_generated_clock -name clk_rx -source [get_pins clk_gen_i0/clk_core_i0/inst/mmcm_adv_inst/CLKIN1] [get_pins clk_gen_i0/clk_core_i0/inst/mmcm_adv_inst/CLKOUT0]

# 设置异步时钟
set_clock_groups -asynchronous -group [get_clocks clk_samp] -group [get_clocks clk2]

# 延迟约束
create_clock -period 6.000 -name virtual_clock
set_input_delay -clock [get_clocks -of_objects [get_ports clk_pin_p]] 0.000 [get_ports rxd_pin]
set_input_delay -clock [get_clocks -of_objects [get_ports clk_pin_p]] -min -0.500 [get_ports rxd_pin]
set_input_delay -clock virtual_clock -max 0.000 [get_ports lb_sel_pin]
set_input_delay -clock virtual_clock -min -0.500 [get_ports lb_sel_pin]
set_output_delay -clock virtual_clock -max 0.000 [get_ports {txd_pin {led_pins[*]}}]
set_output_delay -clock virtual_clock -min -0.500 [get_ports {txd_pin {led_pins[*]}}]
set_output_delay -clock spi_clk -max 1.000 [get_ports {spi_mosi_pin dac_cs_n_pin dac_clr_n_pin}]
set_output_delay -clock spi_clk -min -1.000 [get_ports {spi_mosi_pin dac_cs_n_pin dac_clr_n_pin}]</pre>

本文转自:<a href="https://mp.weixin.qq.com/s/cUhLP7l14kkOCKbd4STQWQ"><u>科学计算technomania</…;,作者:猫叔,转载此文目的在于传递更多信息,版权归原作者所有。