IO管脚约束,延迟约束
- I/O约束是每个工程项目都必须要用的约束,具体又包括管脚约束和延迟约束。
管脚约束
- 管脚约束就是指管脚分配,我们至少需要指定管脚的
PACKAGE_PIN
和IOSTANDARD
两个属性的值,前者指定了管脚的位置,后者指定了管脚对应的电平标准。
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_delay
和set_output_delay
,分别用于input端和output端,其时钟源可以是时钟输入管脚,也可以是虚拟时钟。
约束原理
- 需要注意的是,延迟约束的原理并不是通过增加或减少某路信号的延迟,从而使得消除延迟或者让输入的延迟平衡。下面以set_input_delay约束为例,分析该约束的具体作用。
- 这个约束是告诉vivado我们的输入信号和输入时钟之间的延迟关系,即
T_inputdelay = Tco + TD
,让vivado在这个前提下去Place and Route,而不是字面意思理解用于调节输入信号的延迟。如果在项目中确实需要调整输入信号的延迟,可使用IDELAY
和IDELAYCTRL
原语。
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"参数,则延迟值会既作用于最大值,也会作用于最小值。
参考:
- FPGA时序约束理论篇之IO约束-Author:猫叔
- 《Xilinx FPGA权威设计指南--基于Vivado2018集成开发环境》,何宾,电子工业出版社