1. 项目概述:从“iserdes+oserdes”说起
如果你在FPGA开发中,尤其是涉及到高速串行数据传输的场合,比如DDR接口、高速ADC/DAC、或者像MIPI、JESD204B这类高速串行协议,那么“ISERDES”和“OSERDES”这两个词对你来说一定不陌生。它们不是某个具体的项目,而是FPGA设计中实现高速数据接口的核心“原语”。简单来说,ISERDES负责把高速串行信号“拆”成低速并行数据,而OSERDES则相反,把低速并行数据“拼”成高速串行信号。这个“拆”和“拼”的过程,正是FPGA与外部高速世界对话的桥梁。
我第一次接触这两个原语是在做一个摄像头图像采集的项目上,需要处理来自CMOS传感器的DVP并行数据,并将其转换为MIPI CSI-2的串行差分信号输出。当时对着数据手册和时序图一头雾水,时钟相位、数据对齐、位宽匹配,每一个参数设置不当都会导致屏幕上出现雪花点或者干脆没图像。经过几个项目的反复折腾,我才算摸清了它们的脾气。今天,我就以一个过来人的身份,把关于ISERDES和OSERDES的那些核心细节、配置要点和踩过的坑,系统地梳理一遍。无论你是正在调试一个DDR3内存控制器,还是想实现一个自定义的LVDS接口,理解并掌握这两个原语,都能让你在高速数字电路设计中如虎添翼。
2. 核心原理与架构拆解
2.1 为什么需要SerDes?
在深入ISERDES和OSERDES之前,我们必须先理解它们存在的根本原因:解决I/O速度与内部逻辑速度的鸿沟。现代FPGA的内部逻辑(查找表、寄存器)可以在几百MHz的频率下稳定运行,但芯片引脚(I/O)的物理特性限制了其单个引脚的最高数据速率。当外部设备(如内存、传感器)的数据速率(如每秒1Gb)远高于单个I/O引脚能可靠接收的速率时,直接连接是不可能的。
这时,SerDes(Serializer/Deserializer,串行器/解串器)就登场了。它的核心思想是用时间换空间(或者说用速度换引脚)。OSERDES将多条线上的低速并行数据,在时间上压缩,通过一条线高速串行发出;ISERDES则将收到的一条高速串行流,在时间上展开,恢复成多条线上的低速并行数据。例如,一个8:1的OSERDES,可以用内部125MHz的时钟,将8位并行数据转换成1位、速率高达1Gbps的串行流输出。这样,FPGA就用内部可承受的时钟频率,实现了对外的高速通信。
2.2 ISERDES内部工作机制详解
ISERDES,即输入串行解串器。你可以把它想象成一个高速旋转的收纳盘,串行数据像一根连续的面条一样输入,ISERDES按照内部节拍(时钟)将面条切成等长的小段,并同时摆放到多个盘子里(并行输出)。
其核心结构通常包含以下关键部分:
- 专用输入寄存器:直接位于I/O引脚之后,用于捕获最高速的串行数据比特。这个寄存器通常由来自I/O的专用高速时钟(如
CLK)驱动,性能最优。 - 串行转并行移位寄存器链:这是解串的核心。例如,在一个8:1的ISERDES中,会有一个8位的移位寄存器。每个高速时钟周期,新的串行比特从一端移入,最老的比特从另一端移出。经过8个周期后,最初的8个比特就并排存在于这个8位移位寄存器中。
- 并行捕获寄存器:当移位寄存器装满(即凑够一个并行字,如8位)时,由一个频率为高速时钟1/N(如
CLKDIV = CLK/8)的时钟CLKDIV触发,将整个移位寄存器的内容一次性锁存到这个并行寄存器中。此时,这N位并行数据就可以被FPGA内部逻辑以较低的CLKDIV频率读取。 - 时钟与数据对齐网络:这是ISERDES最难也最关键的部分。为了确保采样点位于数据比特的中心(眼图张开最大处),需要精细控制采样时钟与输入数据之间的相位关系。ISERDES通常支持:
- 位滑动(Bitslip):通过控制信号,可以逐比特地滑动并行输出的对齐位置。这是手动对齐数据的“微调旋钮”。
- 延迟链(IDELAY):在数据路径上插入可编程的精细延迟(皮秒级),可以调整数据相对于采样时钟的到达时间。
- 时钟前沿/后沿采样:支持在时钟的上升沿和下降沿都采样数据(DDR模式),从而将有效数据速率翻倍。
注意:ISERDES的输入数据速率(串行比特率)等于其高速采样时钟
CLK频率乘以每个时钟沿采样的比特数。在SDR(单数据速率)模式下,每个时钟周期采1个比特;在DDR(双数据速率)模式下,上升沿和下降沿各采1个比特,因此数据速率是CLK频率的2倍。
2.3 OSERDES内部工作机制详解
OSERDES,即输出串行器,其工作过程与ISERDES正好相反。它像是一个并排放置的调料盒(并行输入),在一个节拍器的指挥下,按顺序将每个盒子里的调料(数据比特)舀出来,合成一道连续的菜肴(串行输出)。
其核心结构包括:
- 并行加载寄存器:接收来自FPGA内部逻辑的低速并行数据(如8位),由分频时钟
CLKDIV控制加载。 - 并行转串行移位寄存器链:加载的并行数据被送入一个移位寄存器。在高速时钟
CLK的驱动下,每个周期将1位(SDR)或2位(DDR)数据移出到输出端。 - 三态控制:对于双向引脚,OSERDES通常集成了三态控制信号的串行器,用于控制输出使能,确保在输入模式时输出为高阻态。
- 时钟选择与复用:OSERDES需要两个时钟:高速串行时钟
CLK和低速并行时钟CLKDIV。CLKDIV必须是CLK的分频(如1/4, 1/8)。OSERDES内部会处理好这两个时钟域的交叉,确保数据从慢速域到快速域的无缝传递。
一个典型的8:1 OSERDES工作流程是:在CLKDIV的上升沿,8位并行数据D[7:0]被锁存;在接下来的8个CLK周期内,从D[0]到D[7]依次从DATA_OUT引脚移出。在DDR模式下,每个CLK周期会移出2个比特(上升沿和下降沿各一个),因此只需4个CLK周期即可完成8位数据的串行化。
2.4 IOSERDES与特殊功能模式
在Xilinx(现AMD)的一些器件中,ISERDES和OSERDES通常成对出现,并紧密耦合在同一个I/O逻辑块中,称为IOSERDES。这种集成设计带来了两大优势:
- 实现双向高速引脚:同一个物理引脚,可以通过配置,在某个时刻由OSERDES控制作为输出,在另一时刻由ISERDES控制作为输入。这对于DDR内存接口(数据线DQ是双向的)至关重要。
- 支持内存接口(如DDR3):IOSERDES与专用的延迟单元(IDELAY)、时钟缓冲器(BUFR)等结合,形成了FPGA的“SelectIO”逻辑资源,能够直接实现DDR3/4等内存控制器物理层(PHY)所需的所有功能,包括写平衡(Write Leveling)、读均衡(Read Leveling)等。
此外,ISERDES还支持一些高级模式,如过采样(Oversampling)。在过采样模式下,ISERDES可以用数倍于数据速率的时钟对输入信号进行采样(例如,用4倍频时钟采样1个数据流),然后通过数字逻辑(如多数表决)从多个样本中恢复出最可能的数据值。这种方法常用于异步串行通信(如UART)的接收,或者对时钟恢复要求不高的场合,以降低对时钟精度的依赖。
3. 关键参数配置与设计要点
3.1 数据宽度与时钟比率设定
这是配置SerDes的第一步,也是最容易出错的一步。参数之间必须满足严格的数学关系。
DATA_WIDTH:你希望内部逻辑处理的并行数据位宽。常见的有4, 6, 8, 10等。这个宽度决定了串并转换的比率。DATA_RATE:串行数据的传输模式。可选SDR(单数据速率)或DDR(双数据速率)。这是最容易混淆的点。DDR并不意味着你的并行数据宽度要翻倍,而是指在串行线上,每个时钟周期传输2个比特。CLK与CLKDIV的频率关系:- 在
SDR模式下:串行比特率 =CLK频率。CLKDIV频率 =CLK频率 /DATA_WIDTH。 - 在
DDR模式下:串行比特率 =CLK频率 * 2。CLKDIV频率 =CLK频率 * 2 /DATA_WIDTH。
- 在
举个例子:你要设计一个1.6Gbps的串行输出接口,内部逻辑用100MHz时钟处理数据。
- 方案一(SDR):
DATA_RATE = SDR。串行比特率1.6Gbps要求CLK = 1.6 GHz。这通常超出了FPGA普通I/O和内部时钟的承受范围,不可行。 - 方案二(DDR):
DATA_RATE = DDR。串行比特率1.6Gbps要求CLK = 800 MHz。若选择DATA_WIDTH = 8,则CLKDIV = (800 MHz * 2) / 8 = 200 MHz。但你的内部逻辑时钟是100MHz,不匹配。 - 方案三(DDR,调整宽度):
DATA_RATE = DDR,CLK = 800 MHz。为了让CLKDIV = 100 MHz,我们需要反推DATA_WIDTH = (800 MHz * 2) / 100 MHz = 16。这意味着你需要使用16:1的OSERDES,内部逻辑每次处理16位数据。虽然位宽增加了,但时钟域匹配了。
实操心得:永远先从目标串行速率和可用的内部逻辑时钟(
CLKDIV)出发,反向计算所需的DATA_WIDTH和CLK。优先确保CLKDIV时钟可以由FPGA的PLL/MMCM稳定生成,并且与你的数据处理逻辑时钟同源或成简单倍数关系,以避免复杂的跨时钟域处理。
3.2 时钟与数据对齐实战
配置好宽度和时钟只是万里长征第一步,让数据被正确采样才是真正的挑战。这主要涉及输入通道的ISERDES。
1. 时钟选择与布线:
CLK:必须是低抖动、高稳定的参考时钟,通常由板上的晶振或通过PLL从参考时钟倍频得到。必须使用全局时钟网络(BUFG)或区域时钟网络(BUFR)来驱动,以确保到各个ISERDES单元的时钟歪斜最小。CLKDIV:通常由CLK经过器件内部的专用分频器(如MMCM/PLL)产生,或者直接由CLK经过BUFR分频得到。确保其与CLK同源且相位关系确定。
2. 使用IDELAY进行精细延时调整: IDELAY是一个可编程的延迟线,可以以约78ps(在7系列FPGA上)为步进,对输入数据或时钟信号进行延迟。它的主要作用是补偿PCB走线延迟差异,将数据边缘“推”到采样时钟的中心。
- 固定延迟(IDELAY_TYPE = FIXED):在配置时设定一个固定的延迟值。适用于已知的、稳定的延迟差。
- 可变延迟(IDELAY_TYPE = VARIABLE):可以通过逻辑动态调整延迟值。用于实时校准,比如内存接口的读训练(Read Training)。
- 操作模式:
IDELAYE2原语有CINVCTRL、CE、INC等端口,用于动态控制。通常,我们会编写一个状态机,逐步增加或减少延迟值,同时检查ISERDES输出的数据是否稳定正确,从而找到最佳的延迟设定点(眼图中心)。
3. Bitslip操作: Bitslip是ISERDES的一个控制信号。每激活一次(一个脉冲),并行输出的数据就会向左或向右滑动一个比特的位置。这用于解决因为串行数据起始位不确定而导致的并行数据“错位”问题。例如,即使时钟采样点正确,你得到的8位并行数据可能是{bit7, bit6, ..., bit0},而你需要的是{bit0, bit1, ..., bit7},这时就需要进行Bitslip操作。
对齐流程建议:
- 首先,发送一个已知的、周期性的训练码型(如
0xF0F0或0xAA55,这样每个字节都有跳变,便于观察)。 - 在接收端,固定IDELAY为一个初始值(如0)。
- 循环执行Bitslip操作(每次1个脉冲),同时观察并行输出。
- 当并行输出稳定地出现预期的训练码型时,说明比特对齐完成。
- 保持Bitslip不变,扫描IDELAY值(从0到最大值),找到并行输出稳定正确的延迟值范围(通常是一个窗口)。
- 将这个窗口的中间值设置为最终的IDELAY值,以提供最大的时序裕量。
3.3 资源与位置约束
ISERDES和OSERDES是FPGA I/O Bank内的专用硬件资源,并非所有I/O引脚都支持,也并非可以随意组合。
- Bank类型:高速SerDes通常只存在于支持高性能I/O标准的Bank(如HP - High Performance Bank)中。在工程初期选型FPGA和分配引脚时,就必须确认。
- Master/Slave配对:为了实现更宽的并行数据宽度(如10:1, 14:1),通常需要将两个相邻的ISERDES或OSERDES原语配对使用,一个配置为Master,另一个配置为Slave。Slave会借用Master的时钟和部分控制逻辑。它们必须在物理位置上是相邻的。在Xilinx工具中,当你实例化一个宽度超过8的SerDes时,工具通常会自动处理这种配对,但你需要确保为Master和Slave分配的LOC约束是相邻的引脚对。
- I/O标准与电压:SerDes的工作模式受制于其所在的I/O Bank的VCCO电压和所选的I/O标准(如LVDS_25, LVCMOS18等)。必须确保硬件电平与配置一致。
4. 基于Vivado的原语实例化与仿真
4.1 ISERDESE2原语实例化详解
以下是一个典型的8位DDR模式ISERDESE2的Verilog实例化模板,并附关键参数说明:
ISERDESE2 #( .DATA_RATE("DDR"), // 数据速率模式:SDR或DDR .DATA_WIDTH(8), // 并行数据输出宽度:4, 6, 8, 10, 14 .DYN_CLKDIV_INV_EN("FALSE"), // 动态CLKDIV反相使能,通常关闭 .DYN_CLK_INV_EN("FALSE"), // 动态CLK反相使能,通常关闭 .INTERFACE_TYPE("NETWORKING"), // 接口类型:MEMORY, MEMORY_DDR3, NETWORKING等。NETWORKING是通用模式。 .NUM_CE(2), // 时钟使能数量,固定为2 .OFB_USED("FALSE"), // 是否使用OFB输入,用于高级应用 .SERDES_MODE("MASTER") // 主从模式:MASTER或SLAVE。当宽度>8时需配对。 ) ISERDESE2_inst ( // 并行数据输出 .Q1(data_out[7]), // 最高位(最先收到的串行比特) .Q2(data_out[6]), .Q3(data_out[5]), .Q4(data_out[4]), .Q5(data_out[3]), .Q6(data_out[2]), .Q7(data_out[1]), .Q8(data_out[0]), // 最低位(最后收到的串行比特) // 时钟与复位 .CLK(clk_high), // 高速串行采样时钟(如800MHz) .CLKB(~clk_high), // CLK的互补时钟,DDR模式必须连接 .CLKDIV(clk_div), // 低速并行域时钟(如100MHz),必须是CLK的分频 .RST(rst), // 高有效复位,必须同步于CLKDIV // 串行数据输入 .D(data_serial_in), // 来自IOB的串行数据输入 // 时钟使能 .CE1(1'b1), // 时钟使能1,通常拉高 .CE2(1'b1), // 时钟使能2,通常拉高 // Bitslip控制 .BITSLIP(bitslip_ctrl), // Bitslip控制信号,同步于CLKDIV // 动态延迟接口(连接IDELAYE2) .DDLY(delayed_data), // 来自IDELAYE2的延迟后数据 // 其他 .OCLK(1'b0), // 用于内存接口的高速时钟,通用模式接0 .OCLKB(1'b0), .DYNCLKDIVSEL(1'b0), .DYNCLKSEL(1'b0), .SHIFTOUT1(), .SHIFTOUT2(), .O(1'b0) );关键连线说明:
CLK和CLKB:在DDR模式下,CLKB必须连接到CLK的反相。Vivado的Clocking Wizard生成的差分时钟可以直接用clk_p接CLK,clk_n接CLKB。D与DDLY:通常,高速串行数据先经过IDELAYE2进行延迟调整,再将IDELAYE2的输出CNTVALUEOUT连接到ISERDESE2的DDLY引脚。D引脚可以不接或用于旁路延迟。BITSLIP:这个信号需要你编写一个控制状态机来产生。通常是一个与CLKDIV同步的单周期脉冲。
4.2 OSERDESE2原语实例化详解
对应的,一个8位DDR模式OSERDESE2实例如下:
OSERDESE2 #( .DATA_RATE_OQ("DDR"), // OQ输出的数据速率模式 .DATA_RATE_TQ("SDR"), // TQ(三态)输出的数据速率模式,通常SDR即可 .DATA_WIDTH(8), // 并行数据宽度 .SERDES_MODE("MASTER"), // 主从模式 .TRISTATE_WIDTH(1) // 三态控制位宽 ) OSERDESE2_inst ( // 高速串行数据输出 .OQ(data_serial_out), // 三态控制输出(连接IOB的三态控制) .TQ(tri_state_ctrl_out), // 并行数据输入 .D1(data_in[0]), // 最先串行化输出的位 .D2(data_in[1]), .D3(data_in[2]), .D4(data_in[3]), .D5(data_in[4]), .D6(data_in[5]), .D7(data_in[6]), .D8(data_in[7]), // 最后串行化输出的位 // 时钟 .CLK(clk_high), // 高速串行时钟 .CLKDIV(clk_div), // 低速并行时钟 // 三态控制输入 .TCE(1'b1), // 三态时钟使能,常开 .T1(tri_state_ctrl), // 三态控制信号,0=输出使能,1=高阻 // 复位 .RST(rst), // 高有效复位,同步于CLKDIV // 从设备接口(当SERDES_MODE="SLAVE"时连接主设备) .SHIFTIN1(1'b0), .SHIFTIN2(1'b0), .SHIFTOUT1(), .SHIFTOUT2(), // 动态控制,通常不用 .OCE(1'b1), .TBYTEIN(1'b0), .TBYTEOUT() );重要提示:OSERDESE2输出的
OQ和TQ信号,必须直接连接到IOB(输入输出缓冲器)原语(OBUFDS,IOBUF等)的输入,中间不应有任何组合逻辑,否则会引入不可控的延迟,破坏高速时序。
4.3 仿真测试平台搭建要点
仿真SerDes模块至关重要,因为硬件调试高速信号极其困难。仿真重点在于验证时钟关系、数据对齐逻辑和Bitslip/IDELAY控制逻辑。
生成测试激励:
- 编写一个任务,模拟发送端行为。用
CLKDIV时钟生成并行测试数据(如递增计数器),然后用行为级模型模拟OSERDES,将其转换为串行比特流。 - 关键是要在串行数据流中引入可控制的延迟(
#delay),以模拟PCB走线延迟和时钟偏移,用于测试接收端的对齐逻辑。
// 模拟带延迟的串行数据发送 task send_serial_data; input [7:0] par_data; integer i; real delay_ps; begin for (i=0; i<8; i=i+1) begin // 模拟一个比特的传输,并加入随机延迟抖动 delay_ps = 10 + $random % 50; // 10ps固定延迟 + 最多50ps抖动 #(delay_ps / 1000.0); // 转换为ns serial_data = par_data[i]; // 在DDR模式下,还需要在半个高速时钟周期后发送下一位 // 这里简化处理 end end endtask- 编写一个任务,模拟发送端行为。用
编写对齐校准逻辑的仿真:
- 在接收端测试模块中,实例化你的ISERDES模块以及IDELAY、Bitslip控制状态机。
- 在仿真中,主动触发Bitslip操作和IDELAY值扫描。
- 监控ISERDES的并行输出,断言其是否与发送的原始并行数据匹配。通过观察波形,确认状态机能否在各种初始延迟下成功锁定数据。
检查时序报告:
- 在综合和实现后,必须查看时序报告,特别是
CLK到CLKDIV的路径、以及CLKDIV域内控制信号的时序。确保建立/保持时间满足要求。SerDes内部的跨时钟域路径通常由工具自动约束,但你的控制逻辑(如Bitslip生成状态机)必须在CLKDIV域内满足时序。
- 在综合和实现后,必须查看时序报告,特别是
5. 常见问题、调试技巧与实战案例
5.1 典型问题排查清单
| 现象 | 可能原因 | 排查思路与解决方法 |
|---|---|---|
| ISERDES输出全是X或0 | 1. 复位信号有效或未释放。 2. 时钟 CLK或CLKDIV未连接或频率关系错误。3. 输入数据 D/DDLY引脚未收到有效信号。 | 1. 检查复位逻辑,确保上电后经过足够时间释放复位。 2. 用ILA(集成逻辑分析仪)抓取 CLK和CLKDIV,验证其频率和存在性。检查原语参数DATA_RATE和DATA_WIDTH是否与时钟频率匹配。3. 使用ILA抓取输入引脚前的信号,或通过 IDELAYE2的DATAIN路径回环测试。 |
| ISERDES输出数据不稳定(跳动) | 1. 时钟质量差(抖动大)。 2. 数据与时钟未对齐(采样点在数据跳变沿)。 3. PCB信号完整性差(过冲、振铃)。 | 1. 测量时钟源的抖动,确保使用高质量的晶振或时钟发生器,并通过PLL的滤波功能。 2.这是最常见原因。启动Bitslip和IDELAY校准流程。发送固定的训练码型,逐步调整直至输出稳定。 3. 检查PCB布局布线,确保差分对等长,阻抗匹配,远离噪声源。必要时使用示波器观察眼图。 |
| OSERDES无输出或输出波形畸变 | 1. 三态控制T1信号被置高(高阻)。2. CLK或CLKDIV时钟问题。3. 输出负载不匹配,导致信号反射。 | 1. 检查T1和TCE信号,确保在输出时段为0。2. 同ISERDES时钟检查。 3. 检查PCB上终端电阻(如LVDS的100欧姆差分终端)是否正确焊接,测量输出端波形。 |
| 数据位序错误 | Bitslip未正确配置,导致并行数据的高低位顺序错乱。 | 发送一个易于识别的非对称码型(如8‘b00001111),观察输出。通过Bitslip操作,直到输出顺序正确。记住:ISERDES的Q1对应最先收到的串行比特。 |
| 仅在高低温或电压波动时出错 | 时序裕量不足。IDELAY或时钟相位设置在临界点,环境变化导致采样失败。 | 在实验室进行高低温测试。在校准IDELAY时,不要只找一个“刚好能用”的点,而要找到一个稳定的“窗口”(即一段连续的IDELAY值都能正确采样)。将工作点设置在这个窗口的中心。增加系统时序裕量,如略微降低串行速率。 |
5.2 硬件调试技巧:善用ILA与VIO
在板上调试SerDes,逻辑分析仪(ILA)和虚拟输入输出(VIO)核是你的左膀右臂。
ILA抓取关键信号:
- 抓什么:ISERDES/OSERDES的并行数据端口(
Q1-Q8,D1-D8)、CLK、CLKDIV、BITSLIP、RST、以及IDELAY的控制信号CNTVALUEOUT。 - 技巧:将
CLKDIV作为ILA的采样时钟。设置触发条件,例如当BITSLIP信号有效时触发,这样可以捕捉到每次滑动后的数据变化。对于数据对齐,可以触发在并行数据等于某个特定训练码型时。
- 抓什么:ISERDES/OSERDES的并行数据端口(
VIO进行动态控制:
- 将
BITSLIP、IDELAY的CE(增量使能)和INC(增减方向)等控制信号,连接到VIO核的输出。 - 在PC上通过Vivado Hardware Manager,你可以像点击按钮一样手动发出一个Bitslip脉冲,或者逐步增加/减少IDELAY值,同时通过ILA观察数据输出的变化。这种交互式调试对于初始对齐至关重要。
- 你还可以将当前的最佳IDELAY值(
CNTVALUEOUT)通过VIO读回,并保存到非易失性存储器中,供下次上电直接加载。
- 将
5.3 实战案例:实现一个简单的LVDS视频像素传输
假设我们需要通过一对LVDS线,将FPGA内部的24位RGB像素数据(每像素3字节)传输到另一个器件。像素时钟为100MHz(周期10ns)。
方案设计:
- 并串转换比率:为了降低线对数量,我们采用串行化。目标串行速率不能太高,假设选定1.6Gbps。使用DDR模式,则
CLK = 800 MHz。CLKDIV我们希望是像素时钟100MHz。计算DATA_WIDTH = (800MHz * 2) / 100MHz = 16。这意味着我们需要16:1的OSERDES。 - 数据组织:24位像素数据不足以填满16位。我们可以每像素周期发送16位,但这样效率低。更好的方法是使用两个16位通道(即两对LVDS线),每个通道的
CLKDIV为100MHz。这样,每个像素周期,两个通道各发送16位,共32位,其中24位是有效RGB数据,剩余8位可以传输行/场同步信号或保留。实际带宽为 2通道 * 1.6Gbps = 3.2Gbps。 - OSERDES配置:实例化两个
OSERDESE2,DATA_WIDTH=16,DATA_RATE_OQ="DDR"。CLK由800MHz的差分时钟驱动,CLKDIV接100MHz的像素时钟。将重组后的16位数据(包含RGB和同步信号)分别输入两个OSERDES。 - 时钟传输:除了数据线,还需要一对LVDS线传输800MHz的串行时钟,供接收端用于数据恢复。
- 接收端(ISERDES):接收端同样需要两个ISERDESE2,配置与发送端镜像。关键难点在于对齐。上电后,接收端需要检测同步头(可以在空闲时发送特定K码),然后启动Bitslip和IDELAY校准流程,锁定两个通道的数据。由于时钟是单独传输的,时钟-数据对齐(CDR)相对简单,主要依赖IDELAY调整。
避坑点:
- PCB设计:800MHz的时钟和1.6Gbps的数据线必须按严格差分对布线,等长、阻抗控制(通常100欧姆差分)、远离干扰源。
- 时钟生成:800MHz的时钟需要由FPGA的MMCM/PLL从板载参考时钟(如100MHz)倍频得到,需检查该频率是否在所选FPGA型号和速度等级的PLL输出范围内。
- 跨时钟域(CDC):发送端,数据从100MHz像素时钟域传递到800MHz
CLK域,OSERDES内部已处理。但你需要确保在CLKDIV(100MHz)的上升沿,数据是稳定的。接收端同理,从CLKDIV域读取数据时,也需注意潜在的亚稳态问题,虽然ISERDES的输出通常已经是CLKDIV同步的稳定信号。