[FPGA12]管脚约束_延迟约束

IO管脚约束,延迟约束

  • I/O约束是每个工程项目都必须要用的约束,具体又包括管脚约束和延迟约束。

管脚约束

  • 管脚约束就是指管脚分配,我们至少需要指定管脚的PACKAGE_PINIOSTANDARD两个属性的值,前者指定了管脚的位置,后者指定了管脚对应的电平标准。

XDC约束代码

  • 在vivado中,使用如下命令在xdc中对管脚进行约束。
#-----使用< >标识的内容为填入值-----#
#设置引脚分配
set_property PACKAGE_PIN <pin name> [get_port<port>] 

#设置引脚电气标准
seset_property IOSTANDARD <IO standard> [get_port<port>] 

#设置引脚驱动能力
seset_property DRIVE<driver_num> [get_port<port>] 

#设置引脚上拉设置
set_property PULLUP true [get_port<port>] 

#设置引脚下拉设置
set_property PULLDOWN true [get_port<port>] 
参数 含义
pin name 管脚名称
port 端口号
IO standard IO电平标准
driver_num 可驱动门数,数值可为2/4/6/8/12/16/24
  • 也可以使用-dict{ }指令将以上约束合并起来书写,例子如下:
set_property -dict {PACKAGE_PIN AJ16  IOSTANDARD  LVCMOS18} [get_ports "led[0]" ]

差分端接约束

  • 除了管脚位置和电平,还有一个大家容易忽略但很容易引起错误的就是端接,当我们使用差分电平时比如LVDS,在在V7中我们使用IBUFDS原语来处理输入的差分信号时,可以指定端接为TRUE。
IBUFDS #(
      .DIFF_TERM("TRUE"),       // Differential Termination
      .IOSTANDARD("DEFAULT")     // Specify the input I/O standard
   ) IBUFDS_inst (
      .O(O),  // Buffer output
      .I(I),  // Diff_p buffer input (connect directly to top-level port)
      .IB(IB) // Diff_n buffer input (connect directly to top-level port)
 );
  • 但在Ultrascale中的IBUFDS,却把端接这个选项去掉了
IBUFDS #(
      .DQS_BIAS("FALSE")  // (FALSE, TRUE)
   )
   IBUFDS_inst (
      .O(O),   // 1-bit output: Buffer output
      .I(I),   // 1-bit input: Diff_p buffer input (connect directly to top-level port)
      .IB(IB)  // 1-bit input: Diff_n buffer input (connect directly to top-level port)
   );
  • 所以,我们有必要在xdc或I/O Pors界面中,手动指定,否则,虽然程序可能不会出错,但是却可能会在实际调试使用过程中出现问题(一个大坑)。因为端接会影响信号的实际电平,导致FPGA判断错误,所以在处理差分端口时,一定需要注意该问题。具体添加指令如下:
set_property IOSTANDARD LVDS [get_ports {rx_data_in_p}] #约束端口为LVDS信号
set_property DIFF_TERM_ADV TERM_100 [get_ports {rx_data_in_p}] #100欧电阻差分端接

延迟约束

  • 延迟约束用的是set_input_delayset_output_delay,分别用于input端和output端,其时钟源可以是时钟输入管脚,也可以是虚拟时钟。

约束原理

  • 需要注意的是,延迟约束的原理并不是通过增加或减少某路信号的延迟,从而使得消除延迟或者让输入的延迟平衡。下面以set_input_delay约束为例,分析该约束的具体作用。
  • 这个约束是告诉vivado我们的输入信号和输入时钟之间的延迟关系,即T_inputdelay = Tco + TD,让vivado在这个前提下去Place and Route,而不是字面意思理解用于调节输入信号的延迟。如果在项目中确实需要调整输入信号的延迟,可使用IDELAYIDELAYCTRL原语。

XDC约束代码

  • 具体添加约束的方式如下:
create_clock -name sysclk -period 10 [get_ports clkin] #创建时钟sysclk,周期10ns
set_input_delay 2 -max -clock sysclk [get_ports Datain] #约束相较时钟sysckl的最大输入延迟
set_input_delay 1 -min -clock sysclk [get_ports Datain] #约束相较时钟sysckl的最小输入延迟
  • 输入延迟与输出延迟的值既可以为正值,也可以为负值,这具体取决于FPGA元器件时钟与数据的相对相位。
  • 如果未指定"-max"与"-min"参数,则延迟值会既作用于最大值,也会作用于最小值。

参考:

  1. FPGA时序约束理论篇之IO约束-Author:猫叔
  2. 《Xilinx FPGA权威设计指南--基于Vivado2018集成开发环境》,何宾,电子工业出版社