FPGA 实现 3G-SDI 视频传输:Xilinx 7 系列 GTP 配置与 1080p@60 时序解析 FPGA 实现 3G-SDI 视频传输Xilinx 7 系列 GTP 配置与 1080p60 时序解析在专业视频制作和广播领域3G-SDI 接口因其高带宽、低延迟和长距离传输能力而成为行业标准。本文将深入探讨如何利用 Xilinx 7 系列 FPGA 的 GTP 高速收发器实现 3G-SDI 视频传输重点解析 1080p60 视频时序生成与数据串行化过程。1. 3G-SDI 技术基础与系统架构3G-SDI3Gbps Serial Digital Interface是 SMPTE 424M 标准定义的高速串行数字接口支持 2.97Gbps 的传输速率能够无损传输 1080p60 的视频信号。与 HDMI 不同SDI 采用同轴电缆传输最长距离可达 100 米且支持嵌入式音频和元数据。典型的 FPGA 3G-SDI 发送系统包含以下关键模块视频源处理模块生成或接收 BT.1120 格式的视频数据时序生成器产生符合 CEA-861 标准的视频时序数据映射模块将并行视频数据映射到 SDI 数据流GTP 收发器实现并行到串行转换和电缆驱动// 3G-SDI 发送系统顶层模块示例 module sdi_tx_top ( input wire clk_148m5, // 148.5MHz 主时钟 input wire rst_n, // 异步复位 input wire [19:0] video_in, // 10-bit YUV 422 视频输入 output wire sdi_out // 串行 SDI 输出 ); // 时序生成与数据映射 wire [19:0] mapped_data; wire data_valid; sdi_data_mapper mapper( .clk(clk_148m5), .rst_n(rst_n), .video_in(video_in), .mapped_data(mapped_data), .data_valid(data_valid) ); // GTP 收发器实例化 gtp_sdi_tx gtp_inst ( .clk(clk_148m5), .rst_n(rst_n), .parallel_in(mapped_data), .serial_out(sdi_out) ); endmodule2. 1080p60 视频时序生成1080p60 视频遵循 BT.1120 标准每帧包含 1125 行其中 1080 行为有效视频数据。关键时序参数如下参数值说明总行数1125每帧总行数有效行1080可见视频行数水平总数2200每行总时钟数有效像素1920每行有效像素数场频60Hz帧率像素时钟148.5MHz主时钟频率时序生成器需要产生以下同步信号行同步H Sync标记每行开始场同步V Sync标记每帧开始有效视频区域标识有效像素位置// BT.1120 时序生成模块 module bt1120_timing_gen ( input wire clk_148m5, input wire rst_n, output reg h_sync, output reg v_sync, output reg data_enable, output reg [11:0] line_count, output reg [11:0] pixel_count ); // 时序常数定义 parameter H_TOTAL 2200; parameter V_TOTAL 1125; parameter H_ACTIVE 1920; parameter V_ACTIVE 1080; parameter H_SYNC_START 1920 88; // 前肩结束 parameter H_SYNC_END H_SYNC_START 44; // 同步脉冲宽度 parameter V_SYNC_START 1080 4; parameter V_SYNC_END V_SYNC_START 5; always (posedge clk_148m5 or negedge rst_n) begin if (!rst_n) begin pixel_count 0; line_count 0; h_sync 0; v_sync 0; data_enable 0; end else begin // 像素计数器 if (pixel_count H_TOTAL-1) pixel_count pixel_count 1; else begin pixel_count 0; // 行计数器 if (line_count V_TOTAL-1) line_count line_count 1; else line_count 0; end // 生成行同步 h_sync (pixel_count H_SYNC_START) (pixel_count H_SYNC_END); // 生成场同步 v_sync (line_count V_SYNC_START) (line_count V_SYNC_END); // 数据有效区域 data_enable (pixel_count H_ACTIVE) (line_count V_ACTIVE); end end endmodule3. GTP 收发器配置与数据串行化Xilinx 7 系列 FPGA 的 GTP 收发器是实现 3G-SDI 的关键组件需要进行以下配置参考时钟设置148.5MHz 参考时钟线速率配置2.97Gbps (148.5MHz × 20)编码方案不归零码NRZ预加重与均衡根据电缆长度调整关键 GTP 配置参数参数推荐值说明REFCLK_FREQUENCY148.5 MHz参考时钟频率LINE_RATE2.97 Gbps串行数据速率DATA_WIDTH20并行数据宽度CLK25_DIVIDER625MHz 时钟分频TXDIFFCTRL0x3发送差分摆幅控制TXPREEMPHASIS0x3预加重设置GTP 收发器配置示例通过 Vivado IP Integrator创建 GTPE2_CHANNEL 原语设置参考时钟和线速率配置 TX 预加重和均衡设置 20-bit 并行接口启用 TX 缓冲旁路模式// GTP 收发器包装模块 module gtp_sdi_tx ( input wire clk_148m5, input wire rst_n, input wire [19:0] parallel_in, output wire serial_out ); // GTP 原语实例化 GTPE2_CHANNEL #( // 仿真属性 .SIM_RECEIVER_DETECT_PASS(TRUE), .SIM_RESET_SPEEDUP(TRUE), .SIM_TX_EIDLE_DRIVE_LEVEL(X), .SIM_VERSION(2.0), // 时钟配置 .CLK25_DIVIDER(6), .CLK_CORRECT_USE(FALSE), .CLK_COR_SEQ_2_USE(FALSE), // 通道配置 .ALIGN_COMMA_DOUBLE(FALSE), .ALIGN_COMMA_ENABLE(10b1111111111), .ALIGN_COMMA_WORD(1), .ALIGN_MCOMMA_DET(TRUE), .ALIGN_MCOMMA_VALUE(10b1010000011), .ALIGN_PCOMMA_DET(TRUE), .ALIGN_PCOMMA_VALUE(10b0101111100), // TX 配置 .TX_DATA_WIDTH(20), .TX_INT_DATAWIDTH(1), .TXDIFFCTRL(4b1100), .TXPREEMPHASIS(4b0011) ) gtp_inst ( // 时钟与复位 .PLL0CLK(clk_148m5), .PLL0REFCLK(clk_148m5), .PLL1CLK(1b0), .PLL1REFCLK(1b0), .TXPLLREFSELDY(2b00), .GTPRXN(1b0), .GTPRXP(1b0), .GTPTXN(serial_out_n), .GTPTXP(serial_out_p), // TX 数据接口 .TXDATA(parallel_in), .TXUSRCLK(clk_148m5), .TXUSRCLK2(clk_148m5), // 控制信号 .GTRESET(~rst_n), .TXRESETDONE(), .TXPMARESET(1b0) ); // 差分输出缓冲 OBUFDS #( .IOSTANDARD(LVDS_25) ) obufds_inst ( .O(serial_out_p), .OB(serial_out_n), .I(gtp_inst.GTPTXP) ); assign serial_out serial_out_p; endmodule4. 数据映射与辅助数据插入SDI 数据流不仅包含视频数据还需要插入以下辅助信息行号信息每行的行计数CRC 校验错误检测辅助数据音频、元数据等时序参考信号SAV/EAV数据映射过程需要遵循 SMPTE 424M 标准将 20-bit 并行数据转换为串行流。关键步骤包括视频数据排列YUV 4:2:2 分量排序EAV/SAV 插入标记有效视频区域的开始和结束行号插入每行开始处插入行计数CRC 计算保护重要数据字段// SDI 数据映射模块 module sdi_data_mapper ( input wire clk_148m5, input wire rst_n, input wire [19:0] video_in, output reg [19:0] mapped_data, output reg data_valid ); // 内部信号 reg [11:0] line_count; reg [11:0] pixel_count; reg [15:0] crc; reg in_active_video; // 时序生成实例化 bt1120_timing_gen timing_inst ( .clk_148m5(clk_148m5), .rst_n(rst_n), .h_sync(), .v_sync(), .data_enable(in_active_video), .line_count(line_count), .pixel_count(pixel_count) ); // CRC 计算 always (posedge clk_148m5) begin if (!in_active_video) crc 16hFFFF; else crc next_crc(crc, mapped_data); end // 数据映射状态机 always (posedge clk_148m5 or negedge rst_n) begin if (!rst_n) begin mapped_data 20h0; data_valid 1b0; end else begin case (pixel_count) // EAV (End of Active Video) 1920: begin mapped_data 20h3FF_3FF; // XYZ 前缀 data_valid 1b1; end 1921: begin mapped_data {4h0, line_count[9:0], 6h00}; // 行号 data_valid 1b1; end 1922: begin mapped_data {4h0, crc}; // CRC data_valid 1b1; end // SAV (Start of Active Video) 2160: begin mapped_data 20h000_000; // XYZ 前缀 data_valid 1b1; end 2161: begin mapped_data {4h0, line_count[9:0], 6h00}; // 行号 data_valid 1b1; end 2162: begin mapped_data {4h0, crc}; // CRC data_valid 1b1; end // 有效视频数据 default: begin if (in_active_video) begin mapped_data video_in; data_valid 1b1; end else begin mapped_data 20h0; data_valid 1b0; end end endcase end end // CRC 计算函数 function [15:0] next_crc; input [15:0] crc; input [19:0] data; begin // 简化的 CRC 计算逻辑 next_crc crc ^ {data[15:0]}; for (int i0; i16; ii1) if (next_crc[15]) next_crc (next_crc 1) ^ 16h8005; else next_crc next_crc 1; end endfunction endmodule5. 系统集成与调试技巧完成各模块设计后系统集成需要考虑以下关键点时钟域处理确保所有模块同步在 148.5MHz 时钟域时序约束为 GTP 收发器设置正确的时序约束信号完整性PCB 设计时注意差分对布线调试 3G-SDI 系统时以下工具和技术非常有用眼图分析评估信号质量误码率测试验证链路可靠性逻辑分析仪捕获并行接口数据SDI 分析仪解码 SDI 数据流常见问题及解决方案问题现象可能原因解决方案无信号输出GTP 未锁定检查参考时钟和复位时序图像撕裂时序不同步验证 EAV/SAV 位置随机误码信号完整性差调整预加重/均衡设置CRC 错误数据映射错误检查辅助数据插入逻辑在 Vivado 中实现完整系统的步骤创建包含 GTP 收发器的 Block Design添加自定义 HDL 模块时序生成、数据映射设置正确的时钟约束生成比特流并编程 FPGA使用 ILA集成逻辑分析仪进行调试# 示例 Vivado 约束文件 (XDC) create_clock -name clk_148m5 -period 6.734 [get_ports clk_148m5] set_property PACKAGE_PIN H9 [get_ports clk_148m5] set_property IOSTANDARD LVCMOS18 [get_ports clk_148m5] set_property PACKAGE_PIN D10 [get_ports sdi_out_p] set_property PACKAGE_PIN D11 [get_ports sdi_out_n] set_property IOSTANDARD LVDS_25 [get_ports {sdi_out_p sdi_out_n}] set_property DIFF_TERM TRUE [get_ports {sdi_out_p sdi_out_n}]通过本文介绍的技术方案开发者可以基于 Xilinx 7 系列 FPGA 构建完整的 3G-SDI 发送系统。实际项目中还需要根据具体应用场景调整 GTP 参数和 PCB 设计以获得最佳的信号质量和系统稳定性。