Quick Start
- 确认LVDS接口标准(如LVDS-25、LVDS-18)及数据速率(如1.2 Gbps)。
- 从数据手册提取源端时钟(SCLK)与数据(SDATA)的时序参数:Tco(时钟到输出延迟)、Tsu(建立时间)、Th(保持时间)。
- 在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] - 添加LVDS输入缓冲原语(如IBUFDS)并约束其位置。
- 运行综合与实现,检查时序报告中的input delay路径。
- 仿真验证数据采样窗口,确保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](仅示例,实际需对所有通道赋值)。

评论 0