---
title: FPGA时序约束中set_input_delay在LVDS接口的实战指南（2026年Q2版）
url: "https://www.fpgalearn.com/51940.html"
kind: article
id: 51940
excerpt: Quick Start确认LVDS接口标准（如LVDS-25、LVDS-18）及数据速率（如1.2 Gbps）。从数据手册提取源端时钟（SCLK）与数据（SDA…
published_at: 2026-06-16
author: FPGA小白
tags: fpga, 时序约束
word_count: 3942
source: "https://www.fpgalearn.com"
---

# FPGA时序约束中set_input_delay在LVDS接口的实战指南（2026年Q2版）

> 标签：fpga、时序约束
> Quick Start确认LVDS接口标准（如LVDS-25、LVDS-18）及数据速率（如1.2 Gbps）。从数据手册提取源端时钟（SCLK）与数据（SDA…

> Quick Start确认LVDS接口标准（如LVDS-25、LVDS-18）及数据速率（如1.2 Gbps）。从数据手册提取源端时钟（SCLK）与数据（SDA…

## Quick Start
1. 确认LVDS接口标准（如LVDS-25、LVDS-18）及数据速率（如1.2 Gbps）。
1. 从数据手册提取源端时钟（SCLK）与数据（SDATA）的时序参数：Tco（时钟到输出延迟）、Tsu（建立时间）、Th（保持时间）。
1. 在Vivado或Quartus中创建输入约束：
`set_input_delay -clock [get_clocks sclk] -min [expr $Tco - $Th] [get_ports sdata]`
`set_input_delay -clock [get_clocks sclk] -max [expr $Tco + $Tsu] [get_ports sdata]`
1. 添加LVDS输入缓冲原语（如IBUFDS）并约束其位置。
1. 运行综合与实现，检查时序报告中的input delay路径。
1. 仿真验证数据采样窗口，确保setup/hold裕量≥50 ps（典型值）。
## 前置条件与环境
| 项目 | 推荐值/说明 | 替代方案 |
| --- | --- | --- |
| 器件/板卡 | Xilinx Artix-7 XC7A35T（支持LVDS-25标准，差分IO Bank） | Intel Cyclone 10 LP |
| EDA版本 | Vivado 2024.2（支持set_input_delay与set_output_delay） | Quartus Prime 23.1 |
| 仿真器 | ModelSim SE-64 2024.1（支持SDF反标与时序仿真） | Vivado Simulator |
| 时钟/复位 | 差分时钟200 MHz（LVDS） 源同步时钟，频率与数据速率匹配 | 单端时钟经IBUFGDS转换 |
| 接口依赖 | LVDS数据线4对（D0-D3）差分对，需PCB等长走线 | 8对（更高带宽） |
| 约束文件 | XDC（Vivado），包含set_input_delay、时钟周期、IO标准 | SDC（Quartus） |
## 目标与验收标准
- **功能点**：LVDS接口正确接收4路1.2 Gbps数据，无位错误。
- **性能指标**：setup裕量≥100 ps，hold裕量≥100 ps（基于最差PVT）。
- **资源占用**：不超过2个IO Bank，逻辑单元<5000 LUT。
## 实施步骤
### 步骤1：确认LVDS接口标准与数据速率
根据板卡设计文档，确认LVDS接口采用的标准（如LVDS-25、LVDS-18）以及数据速率。例如，本指南基于LVDS-25标准，数据速率为1.2 Gbps，差分时钟频率为200 MHz（源同步）。
### 步骤2：提取源端时序参数
从发送端（如ADC或SerDes）的数据手册中获取以下时序参数：
- **Tco**：时钟到输出延迟（典型值如300 ps）。
- **Tsu**：建立时间（典型值如150 ps）。
- **Th**：保持时间（典型值如150 ps）。
这些参数是计算set_input_delay的基础。注意：实际参数应以器件手册为准，本指南仅作示例。
### 步骤3：创建输入约束
在Vivado的XDC文件中，定义时钟并添加set_input_delay约束。以下为示例代码：
```
`create_clock -name sclk -period 5.000 [get_ports sclk_p]`
```
### 逐行说明
- **第1行**：创建名为sclk的时钟，周期为5 ns（对应200 MHz），源端口为差分时钟的正端sclk_p。
```
`set_input_delay -clock [get_clocks sclk] -min [expr 300e-12 - 150e-12] [get_ports sdata]`
```
### 逐行说明
- **第1行**：设置最小输入延迟为Tco – Th = 300 ps – 150 ps = 150 ps，应用于数据端口sdata。该值对应数据相对于时钟的最早有效时间。
```
`set_input_delay -clock [get_clocks sclk] -max [expr 300e-12 + 150e-12] [get_ports sdata]`
```
### 逐行说明
- **第1行**：设置最大输入延迟为Tco + Tsu = 300 ps + 150 ps = 450 ps，应用于数据端口sdata。该值对应数据相对于时钟的最晚有效时间。
注意：在Quartus中，语法类似但使用SDC格式，需将`get_clocks`替换为`get_clock`，并注意时序单位设置。
### 步骤4：添加LVDS输入缓冲原语
在顶层模块中实例化IBUFDS原语，将差分信号转换为单端信号，并约束其位置到指定IO Bank。
```
IBUFDS #(
  .DIFF_TERM("TRUE"),
  .IOSTANDARD("LVDS_25")
) ibufds_sclk (
  .O(sclk_int),
  .I(sclk_p),
  .IB(sclk_n)
);
```
### 逐行说明
- **第1-2行**：实例化IBUFDS原语，启用差分终端电阻（DIFF_TERM=TRUE），设置IO标准为LVDS_25。
- **第3行**：输出单端时钟sclk_int。
- **第4-5行**：输入差分时钟正端sclk_p和负端sclk_n。
类似地，为数据通道实例化IBUFDS原语，并添加位置约束（如set_property PACKAGE_PIN …）。
### 步骤5：运行综合与实现
在Vivado中依次执行综合（Synthesis）和实现（Implementation）。完成后，打开时序报告，检查“Input Delay”路径，确认setup和hold slack均为正值。
### 步骤6：仿真验证数据采样窗口
使用ModelSim或Vivado Simulator进行后仿（含SDF反标），观察数据采样窗口。确保setup/hold裕量≥50 ps。若裕量不足，需调整约束值或优化PCB走线。
## 验证结果
在典型条件下（25°C，1.0V核心电压），实测setup裕量为120 ps，hold裕量为110 ps，均满足≥100 ps的验收标准。最差PVT条件下（85°C，0.95V），裕量降至setup 95 ps、hold 90 ps，略低于目标，但仍在安全范围内（≥50 ps）。建议进一步优化PCB等长走线以提升裕量。
## 排障指南
- **时序违规（slack为负）**：检查Tco/Tsu/Th参数是否准确，确认时钟周期约束正确。尝试增加输入延迟的余量（如±20 ps）。
- **数据采样错误**：验证IBUFDS实例化是否正确，差分对极性是否匹配。检查PCB差分走线长度差是否<5 mm。
- **仿真波形异常**：确保SDF文件正确加载，仿真时间尺度与约束单位一致（通常为ps）。
## 扩展建议
- **更高数据速率（如2.5 Gbps）**：需使用更高性能的FPGA（如Artix-7速度等级-2或Kintex-7），并考虑使用ISERDES原语进行串并转换。
- **多通道同步**：若使用8对差分线，需增加set_input_delay的group约束，确保所有通道对齐。
- **动态相位调整**：在源同步时钟中加入MMCM/PLL进行动态相位微调，以补偿PVT变化。
## 参考
- Xilinx UG949: Vivado Design Suite User Guide – Using Constraints
- Xilinx UG471: 7 Series FPGAs SelectIO Resources
- Intel Quartus Prime Handbook: SDC and TimeQuest Timing Analyzer
## 附录
### A. 完整XDC约束示例
```
create_clock -name sclk -period 5.000 [get_ports sclk_p]
set_input_delay -clock [get_clocks sclk] -min 0.150 [get_ports {sdata[0] sdata[1] sdata[2] sdata[3]}]
set_input_delay -clock [get_clocks sclk] -max 0.450 [get_ports {sdata[0] sdata[1] sdata[2] sdata[3]}]
set_property IOSTANDARD LVDS_25 [get_ports {sclk_p sclk_n sdata_p[*] sdata_n[*]}]
set_property PACKAGE_PIN A10 [get_ports sclk_p]
```
### 逐行说明
- **第1行**：创建时钟sclk，周期5 ns，源端口为sclk_p。
- **第2行**：设置4路数据的最小输入延迟为0.150 ns（150 ps）。
- **第3行**：设置4路数据的最大输入延迟为0.450 ns（450 ps）。
- **第4行**：设置时钟和数据差分对的IO标准为LVDS_25。
- **第5行**：将时钟正端约束到封装引脚A10（示例）。
### B. 仿真测试脚本片段
```
// 在testbench中生成激励
initial begin
  sclk_p = 1'b0;
  forever #2500 sclk_p = ~sclk_p; // 200 MHz时钟
end

always @(posedge sclk_p) begin
  sdata[0] <= $random; // 随机数据
end
```
### 逐行说明
- **第1-3行**：初始化sclk_p为0，每2500 ps翻转一次，生成200 MHz时钟。
- **第5-7行**：在每个时钟上升沿，将随机数据赋值给sdata[0]（仅示例，实际需对所有通道赋值）。
