XILINX FPGA lvds 解串方案

文章详细介绍了Xilinx7系列FPGA中的ISERDESE2输入串行到并行转换器和OSERDESE2输出并行到串行转换器的使用,包括它们在高速I/O数据速率下的应用,以及如何通过bitslip进行数据对齐。此外,还讨论了IDELAYE2延迟模块在时序补偿中的作用和工作原理。

一 概述:

7 Series ISERDESE2 and OSERDESE2

        ISERDESE2input serial-to-parallel converters

         OSERDESE2output parallel-to-serial converters

         xilinx 7系列FPGAISERDESE2OSERDESE2支持非常高的I/O数据速率,对于ISERDESE2存在bitslip信号来重新对齐串行数据以获得正确的字节数据;

         上图为OSERDESE2并转串输出到ISERDESE2串转并输入的字节序变化。

         上表列出了ISERDESE2以及OSERDESE2可以实现的串并转换的并行数据的位宽,其中1014位位宽需要两个ISERDESE2级联或两个OSERDESE2级联获得。

         注意级联时,当需要获取10位位宽时,使用下面一个ISERDESE2Q3Q4来作为Data Internal[8:9];当需要获取14位位宽时,使用下面一个ISERDESE2Q3~Q8来作为Data Internal[8:13]

         对于ISERDESE2而言,串行输入可以直接来自IOB也可以来自IDELAY2单元(串行信号经过IDELAY2后进行了延时),这就需要通过IOBDELAY Value来设置,具体参数设计以及ISERDESE2实际使用的输入如下表所示:

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

  二 :详细说明     

        无论是HiSPi、LVDS还是MIPI,其核心思想就是要实现将高速串行信号恢复成并行数据。这将会用到XilinxFPGA IOB上的一个重要的资源——ISERDES。

        实现串行信号的并行化,光有ISERDES还不行,还需要用到IOBANK上的延时模块IDELAYCTRL和IOB上的IODELAYE以及相关的相位训练算法。

1 Xilinx的IO资源

        本节对用到的IO资源作简要的介绍。

1.1IDELAYCTR资源

         在电压、温度等因素变化时,可能会影响到系统的时序,此时IDELAYCTRL模块就可以连续补偿时钟域内所有个体的delay taps (IDELAY/ODELAY)。如果使用了IOB上的IDELAY或ODELAY资源,那么就必须使用IDELAYCTRL资源。请注意,整个IO BANK里面只有一个IDELAYCTRL。

IDELAYCTRL很重要的一个输入项就是参考时钟REFCLK,补偿时钟域内所有模块的时序参考,这个时钟必须由BUFG或BUFH驱动。REFCLK必须保证在FIDELAYCTRL_REF+IDELAYCTRL_REF_PRECISION(MHz)ppm才能保证IDELAY/ODELAY的延时分辨率:

(TIDELAYRESOLUTION=1/(32x 2 x FREF))

(TIDELAYRESOLUTION=1/(32x 2 x FREF))

vivado,data_delay 可调tap范围0~31,clock_delay可调范围0~31;

即 data_delay 和clock_delay各占用ref_clock的半个周期。clock_delay即相当于data 前置,与data_delay是相反方向的相位设置。

ex,ref_clock = 200MHz, ref_clock_period = 1/ 200MHz = 0.5 ns = 5000ps

则data_delay 1个tap = 5000ps / 2  / 32 = 78ps

同样的,clock_delay 1个tap也是78ps。

1.2  IDELAYE2逻辑

       IDELAYE2逻辑是一个31抽头的循环延时补偿模块,对输入的信号进行指定分辨率的延时,FPGA可以直接访问。Tap延时分辨率由IDELAYCTRL的参考时钟提供持续补偿。图(1)是IDELAYE2接口示意图,表(1)是对这些接口的描述,表(2)是对逻辑参数的描述。

表(1)IDELAYE2接口描述

端口名

方向

位宽

描述

表(2)IDELAYE2逻辑参数描述

参数名

值域

默认值

描述

   以下以VAR_LOAD模式为例说明延时的时序动作,如图(2)所示。

a) Clock Event 0

在LD有效前,CNTVALUEOUT输出为未知值;

b) Clock Event 1

在C的上升沿采样到LD有效,此时DATAOUT延时CNTVALUEIN指定的延时Taps,改变tap Setting到Tap2,CNTVALUEOUT更新到新的Tap值;

c)Clock Event 2

INC和CE有效,此时指定了增量操作,Tap值加1,DATAOUT输出从Tap2更新到Tap3,CNTVALUEOUT更新到新的Tap值;

d)Clock Event 3

LD有效,DATAOUT输出延时更新到Tap10,CNTVALUEOUT更新到新的Tap值。

1.3  ISERDESE2逻辑

        输入串转并逻辑可以看做是OSERDESE2的逆过程,在SDR模式下可支持2-、3-、4-、5-、6-和7-的串并转换,在DDR模式下可支持2-、4-、6-、8-的串并转换,级联DDR模式下还可扩展到10-和14-。每一个ISERDESE2包括:

a)专门的串并转换器;

b) Bitslip子模块用于源同步接口;

c)专用的可支持strobe-based的存储接口。

       图(3)是ISERDESE2的结构示意图。表(3)是ISERDESE2接口描述,表(4)示ISERDESE2的参数描述。

表(3) ISERDESE2

端口名

方向

位宽

描述

表(4)ISERDESE2的参数描述

参数名

阈值

默认值

描述

(1)   时钟方案

         CLK和CLK_DIV必须是严格对齐的时钟,虽然允许使用BUFIO/BUFR,但任然有可能存在相位问题。图(5)时采用BUFIO/BUFR的方案。

          一般的,根据接口类型的差异,时钟必须满足以下的约束:

a)networking interface

n  CLK→BUFIO;CLKDIV→BUFR;

n  CLK→MMCM/PLL;CLKDIV→和CLK相同的MMCM/PLL的CLKOUT[0:6]的输出,使用MMCM时CLK和CLKDIV必须使用相同的驱动BUF;

n  CLK→BUFG;CLKDIV→BUFG。

b)MEMORY Interface Type

n  CLK→BUFIO, OCLK→BUFIO,或CLKDIV→BUFR;

n  CLK→MMCM或PLL, OCLK→MMCM,或CLKDIV由同一个MMCM/PLL的CLKOUT[0:6]驱动;

n  CLK→BUFG,CLKDIV→不同的BUFG。

         OCLK和CLKDIV的输入相位必须是严格对齐的,CLK和OCLK之间不要求相位关系。From CLK to OCLK的时钟域必须进行补偿。

其他接口类型的时钟方案参考文档UG471。

(2)   BitSlip子模块

         BitSlip用于调整并行寄存器输出串行数据的位置。在SDR模式下,每一个BitSlip脉冲让输出pattern的数据左移1bit;在DDR模式下,第一个BitSlip右移1bit,第二个BitSlip左移3bit,依次进行,移动规律如图(6)所示。BitSlip一定是和CLKDIV同步的一个脉冲

 使用bitslip信号可以修改串转并的起始位置,如下图所示,为DDR模式下使用bitslip的时序图,开始时最先采集到的串行数据转换出来的并行数据为0xCDAB,插入一个bitslip信号后采集数据变为0xBCDA,你可以通过多次插入bitslip的方法来获取正确的并行数据序。

SDR以及DDR模式下bitslip插入次数对并行数据字节序的影响如下图所示,插入8bitslip就可以将整个转换循序循环一遍。

图(6)BitSlip训练移位规律

但是在实际测试过程中发现规律为:

1 左1

2 右3

3 左1

4 右3

5 左1

6 右3

7 右1

8 左3

9 右1

不管是哪种方式,我们都是一次一次的拉高bitsilp,直到有正确的字节顺序。

          在上面所介绍的资源中,IDELAYE2是动态相位对其训练的神器,ISERDESE2实现串并转换,其Bitslip功能是实现并行化数据对齐的关键。

注意: 

Bitslip的移位并不是首尾循环

Although the repeating pattern seems to show that bitslip is a barrel shifting operation, this is not the case. A bitslip operation adds one bit to the input data stream and loses the nth bit in the input data stream. This causes the operation on repetitive patterns to appear like a barrel shifter operation.

如下图:

图1是没有使用bitsilp的情况,可以看到接受到的数据为:100111 011000 100000

再第二个时钟 使用bitsilp之后,数据变成: 100111 110001 000000 

可以看到第二拍的数据 从原来的011000 变成110001 ,而末尾的1是下一个数据的1,开始的0被丢弃

图1

图2

1.4 iddr:

IDDR三种模式:我们用的是SAME_EDGE_PIPELINED

端口:

介绍:

Xilinx FPGA 上实现 LVDS(Low-Voltage Differential Signaling)编码技术,主要依赖于 FPGA 的高速行器/器(SerDes)模块以及特定的原语(Primitive),例如 OSERDES2 和 OBUFDS。这些模块和原语提供了对高速差分信号的精确控制能力,从而实现 LVDS 编码。 ### LVDS 编码实现的关键模块和流程 1. **OSERDES2 原语** Xilinx 的 OSERDES2 原语用于将并行数据转换为高速行数据流,这是 LVDS 编码中的核心步骤。OSERDES2 支持多种并比(如 4:1 或 8:1),根据输入时钟频率和目标数据速率进行配置。例如,在 1920x1080@60Hz 的视频传输中,RGB 数据被转换为高速行信号,并通过 LVDS 差分对进行传输 [^1]。 2. **OBUFDS 原语** LVDS 信号是差分信号,因此需要使用 OBUFDS 原语将单端信号转换为差分信号。OBUFDS 是 Xilinx 提供的专用差分输出缓冲器,确保输出信号符合 LVDS 的电气规范 。 3. **时钟管理** 在 LVDS 编码过程中,时钟管理至关重要。Xilinx 提供了 MMCM(Mixed-Mode Clock Manager)和 PLL(Phase-Locked Loop)等时钟管理模块,用于生成高速行化所需的时钟信号。例如,在 1920x1080@60Hz 的视频传输中,需要生成一个与像素时钟同步的高速时钟,以驱动 OSERDES2 和 OBUFDS 模块 。 4. **IDELAYCTRL 与时序调整** 由于 FPGA 的制造工艺、电压和温度(PVT)变化可能影响时序,LVDS 接口通常需要使用 IDELAYCTRL 模块来校准输入或输出延迟。IDELAYCTRL 通过参考时钟(如 200MHz)提供精确的延迟抽头(Tap),以优化信号完整性 [^4]。 5. **LVDS 差分对配置** LVDS 接口通常由 8 对差分数据线和 2 对随路时钟线组成。在 Xilinx FPGA 中,每对差分信号都需要正确分配到支持 LVDS 的 IO 引脚,并通过约束文件(XDC)进行精确的时序约束 [^1]。 ### 实现示例:RGB 转 LVDS 编码 以下是一个简化的 VHDL 代码片段,展示如何使用 OSERDES2 和 OBUFDS 实现 LVDS 编码: ```vhdl -- 实例化 OSERDES2 模块 OSERDES2_inst : OSERDES2 generic map ( DATA_RATE_OQ => "DDR", -- DDR 模式 DATA_RATE_TQ => "SDR", DATA_WIDTH => 8, -- 8 位并行数据 SERDES => 8, -- 8:1 并比 TRISTATE_WIDTH => 1 ) port map ( OQ => parallel_data_out, -- 行输出 TQ => open, 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), CLK0 => clk_high_speed, -- 高速时钟 CLK1 => '0', IOCE => ioce, OCE => '1', RST => reset, TCE => '1', T1 => '0', T2 => '0', T3 => '0', T4 => '0' ); -- 实例化 OBUFDS 模块 OBUFDS_inst : OBUFDS port map ( I => parallel_data_out, -- 单端输入 O => lvds_p, -- 差分正端输出 OB => lvds_n -- 差分负端输出 ); ``` ### 资源消耗与功耗 在 Artix-7 系列 FPGA(如 xc7a35tfgg484-2)上实现单通道 LVDS 编码,资源消耗通常包括: - **LUTs**:约 200~300 个 - **FFs**:约 150~250 个 - **OSERDES2 原语**:每个通道使用 1 个 - **OBUFDS 原语**:每个通道使用 1 个 - **功耗**:约 0.5W~1.2W(取决于时钟频率和数据速率) ### 总结 Xilinx FPGA 上的 LVDS 编码实现依赖于 OSERDES2 和 OBUFDS 原语,结合时钟管理模块和时序调整机制,可以高效地实现高速差分信号传输。该技术广泛应用于视频接口、高速数据采集等领域。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值