Xilinx FPGA高级设计及应用
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.3 FPGA对同步技术的支持

在高速数据传输系统中,时钟和数据稳定的相对相位关系是关键。可靠的相对相位关系要求接收端采样时刻位于数据稳定期的中间时刻,即采样时刻对应于数据眼图的正中央。可靠的同步技术应该具有静态或动态相位调整的能力,以实现稳定采样。目前,主流的FPGA都已经成功地在I/O结构中实现了采样时钟或数据的动态相位调整功能,实现对同步技术的支持。

3.3.1 动态相位调整技术

随着单线传输速率不断接近1Gbps,使每位所占的时间窗不断减小,从而降低采样时钟对信号线的采样点在其有效区间采样的准确性;再加上传输路径的不同,各数据线和采样时钟到达接收端的延迟时间不能保证完全一致,从而带来了各信号线之间的位偏移(Bit Skew)和字偏移(Word Skew)。位偏移是采样时钟沿不在各数据窗口的中心位置采样,可能会导致数据采样保持时间不够长,易使比特位发生瞬间突变,从而导致接收的数据不稳定;字偏移是指采样接收后的各数据信号之间不同步,使同时在发送端发送的数据在接收端却不能在同一时刻被采样,导致接收的数据无效。

静态相位调整SPA(Static Phase Alignment)通过匹配时钟线和数据线的长度,使各信号在其传输线上延时相等。SPA过程将耗费大量劳动和时间,而且其设定的静态参数只针对板卡当前的物理状态,不能适应外部环境的变化。采用动态相位调整(Dynamic Phase Align-ment,DPA)技术,根据当前各信号线的物理状态,在每次系统上电后,自动对各信号线进行去偏移操作,从而使相位调整的参数适合当前物理状态,保证相位调整的时效性。所以,DPA技术能够使通信接口不断适应外部环境的变化,避免由于相位偏移而导致的数据采样错误,从而保证了数据的可靠传输。

Altera FPGA的动态相位调整电路就是为实现动态相位调整而设计的。它采用LVDS信号和DPA技术实现数据的可靠接收。如图3-6 所示,DPA 的原理是使用快速锁相环(Fast PLL)产生8个45°相位差的时钟同时采样输入的串行数据,判断数据翻转的位置,这样就可以从8个不同相位的时钟中选择一个最靠近数据中心点的时钟及其采样数据送给同步器,以完成采样时钟到串行时钟域的转换及其他后续的处理。

图3-6 DPR电路原理

Xilinx FPGA的ChipSync技术也能实现动态相位调整功能,其实现原理如图3-7 所示。ChipSync电路是由可配置的64拍延迟线、控制逻辑和校准电路等组成的,包含于每个ISER-DES之中。不同的是它以200MHz的校准时钟为参考(在实现时必须用一个校准时钟参考源例化IDELAYCTRL模块,IDELAYCTRL模块的例化方式如图3-8所示。实现每一节拍的精确时钟延时定标),以约78.125ps(相对于输入200MHz校准时钟源,最大延迟为5ns)每节的延时为步进基准,实现数据相位的精确调整。搜索有效数据窗口的过程是通过更改输入延时来寻找跳变沿的,从而确定最佳采样点。其中,硬核IDELAYCTRL在CX4VLX15中的位置如图3-9所示。

图3-7 ChipSync结构框图

图3-8 IDELAYCTRL模块输入输出结构及例化实例

图3-9 IDELAYCTRL模块在CX4VLX15中的相对位置

需要说明的是,无论是DPA还是ChipSync,都需要与数据同源的时钟来实现数据的稳定接收。前者的本质是改变时钟的相位,后者则是调整数据的延时,以实现时钟和数据相对相位的调整。

3.3.2 基于ChipSync的动态相位调整方法

为保证接收端可靠并有效地接收数据,用于去偏移的动态相对相位调整设计方案必须具有消除位偏移的功能。在动态相对相位调整过程中,发送端不停地发送训练序列,而接收端对承载各数据的传输线进行位校正,利用FPGA内部的IDELAY功能,对各个数据线进行不同程度的精确线延迟操作,使数据窗的中心位置都正对着采样时钟的边沿。

利于Xilinx ChipSync技术实现输入相位动态调整主要有两步,首先对输入相对相位延迟进行测量,得到相对相位延迟值;然后,通过IDELAY对相对相位延迟进行校正。其中,输入相位延时自动测量方法主要有以下两种:基于固定训练字的自动测试方法和基于遍历的自动测试方法。

1. 基于固定训练字的自动测量方法

基于固定训练字的相对相位延迟测量方法的思路是接收端在不同的延迟节上对接收数据循环移位并与固定训练字对比,以确定数据是否稳定接收,从而实现数据眼图的搜索,实现步骤如下:

(1)复位IDELAY和BITSLIP,发送端循环发送选定的训练字。

(2)接收端将恢复的8位并行数与训练字比较,如不一致,循环移位一次再对比……,如循环移位7次都无法对上,进入步骤(3),否则进入步骤(4)。

(3)如果延迟节数小于63,则延迟节加1,返回步骤(2),否则进入步骤(5)。

(4)将该延迟节数保存,如果延迟节数小于63,则延迟节加1返回步骤(2),否则进入步骤(5)。依据延迟节的开始值和结束值,判断眼图中央位置,调整延迟节数至此,然后调整位序,再次与固定训练字对上,固定,进入步骤(5)。

(5)本链路测定结束,如有待测链路,转到步骤(1),否则结束测试。

上述过程中,延迟节的增加由IDELAY模块实现,循环移位和位序调整由BITSLIP负责。由状态机实现数据眼图最佳位置的搜索。训练字的选择无太大约束,但最好能够包含多种码元间距以尽量接近真实数据的翻转率,实践中选用0X2C。测试流程图如图3-10所示,某通道延迟调整过程如图3-11所示,完整的测试工程VHDL代码可从网站下载。

所有链路使用同一个自动测试程序,测完的链路转接到后续的同步模块中,而自动测试程序则转接到下一链路继续测试,直到测试完成。收、发两端以反馈或定时的方式决定测试的结束时间。

2. 基于遍历数的自动测量方法

这里所说的遍历数是指0 ~255 的连续数,因其包含了8 位数所有可能值,故称为顺序遍历数,简称遍历数。实际上,方法一中也可以采用顺序遍历数作为训练字,只是比较次数太多,会使测试程序变得复杂,测试时间增长。

考虑不增加程序负担和逻辑冗余,该方法设计之初就意在做延迟测试程序使用。因此,程序的最终不包含测试模块,只使用测试结果。基于此,每条链路有自己的测试模块,它将数据稳定接收的延迟节数和位序编码存到RAM中,测试完成后循环读出RAM的所有值,通过ChipScope界面获取,并放在最终程序中使用。为保证测试结果的有效性,要求最终的通信模块、时钟网络和测试程序相同。该方法的思想是对每条链路的接收并行数据分别做8种不同的循环移位,如果数据稳定接收,那么必有一种移位结果满足连续递增的关系,如图3-12所示。其中a是稳定时某种移位结果,b是a的单周期延迟,如果数据稳定,那么必满足:

图3-10 固定训练字调整链路延迟流程图

图3-11 某通道延迟调整过程

借此关系,搜索数据眼图并确定眼图宽度。为提高可靠性,通常设定 N 个循环周期(0 ~255为一个循环周期)都满足式(3-1)时才判定该延迟节数有效。

图3-12 某移位和延迟的稳定接收结果

上述方法的实现流程如图3-13 所示,图3-14 是测试结果的 ChipScope 截图。测试工程的VHDL代码见附录。图3-14 中px value就是第x路的Value值,而 px shift对应第 x路数据最低位实际所处的位置,即位序。

图3-13 相对延迟测试流程

图3-14 测量结果ChipScope截图

基于遍历数的自动测试方法相对于方法一略显笨拙,但只做测试用,不会在最终程序中出现,故能减少最终程序的逻辑冗余,并且不用启动ISERDES的BITSLIP等模块,可有效降低功耗需求。

3.3.3 串行收发器SERDES(ISERDES和OSERDES)

SERDES是SERializer DESerializer的缩写,即串行收发器。发送端为串行发送单元OS-ERDES,接收端为串行接收单元ISERDES。收发器支持SDR(Single Data Rate,单倍数据速率)和DDR(Double Data Rate,双倍数据速率)采样模式,具有可编程特性。单个SERDES串化或解串的最大位宽为是6bit,可以通过级联的方式进行位扩展。在SDR模式下,能生成2~8 位的任意并行字或反并行串化;在DDR模式下,以4、6、8 或10 位宽实现串并转换。OSERDES结构如图3-15 所示。图中数据接口使用 DDR 模式,两个串化器级联进行位扩展,实现二级串化的8∶1 转换,如图3-16 所示。

图3-15 OSERDES原理结构图

图3-16 OSERDES级联位扩展

下面给出OSERDES的VHDL语言例化方式:

              Library UNISIM;                -- 在该库中声明,必须引用
              use UNISIM.vcomponents.all;
                    -- OSERDES:Output SERDES
                  OSERDES inst:OSERDES
              generic map (
                      DATA RATE OQ=>"DDR",  -- Specify data rate to "DDR"or "SDR"
                      DATA RATE TQ=>"DDR",  -- Specify data rate to "DDR","SDR",
                                          -- or "BUF"
                      DATA WIDTH=>4,        -- Specify data width-For DDR:4,6,8,or 10
                                          -- For SDR or BUF:2,3,4,5,6,7,or 8
                      INIT OQ=>′0′,          -- INIT for Q1 register-′1′or′0′
                      INIT TQ=>′0′,          -- INIT for Q2 register-′1′or′0′
                      SERDES MODE=>"MASTER",
                                          --Set SERDES mode to "MASTER"or "SLAVE"
                      SRVAL OQ=>′0′, -- Define Q1 output value upon SR assertion-′1′or′0′
                      SRVAL TQ=>′0′, -- Define Q1 output value upon SR assertion-′1′or′0′
                      TRISTATE WIDTH=>4)   -- Specify parallel to serial converter width
                                          -- When DATA RATE TQ=DDR:2 or 4
                                          -- When DATA RATE TQ=SDR or BUF:1 "
                  port map (
                      OQ=>OQ,               -- 1-bit output
                      SHIFTOUT1=>SHIFTOUT1, -- 1-bit data expansion output
                      SHIFTOUT2=>SHIFTOUT2, -- 1-bit data expansion output
                      TQ=>TQ,               -- 1-bit 3-state control output
                      CLK=>CLK,             -- 1-bit clock input
                      CLKDIV=>CLKDIV,       -- 1-bit divided clock input
                      D1=>D1,               -- 1-bit parallel data input
                      D2=>D2,               -- 1-bit parallel data input
                      D3=>D3,               -- 1-bit parallel data input
                      D4=>D4,               -- 1-bit parallel data input
                      D5=>D5,               -- 1-bit parallel data input
                      D6=>D6,               -- 1-bit parallel data input
                      OCE=>OCE,             -- 1-bit clcok enable input
                      REV=>′0′,              -- Must be tied to logic zero
                      SHIFTIN1=>SHIFTIN1,   -- 1-bit data expansion input
                      SHIFTIN2=>SHIFTIN2,   -- 1-bit data expansion input
                      SR=>SR,               -- 1-bit set/reset input
                      T1=>T1,               -- 1-bit parallel 3-state input
                      T2=>T2,               -- 1-bit parallel 3-state input
                      T3=>T3,               -- 1-bit parallel 3-state input
                      T4=>T4,               -- 1-bit parallel 3-state input
                      TCE=>TCE           -- 1-bit 3-state signal clock enable input
                  );
                    -- End of OSERDES inst instantiation

ISERDES内部集成IDELAY、CE Module和BITSLIP等模块,其内部结构如图3-17所示。其中IDELAY线延迟核将串行输入数据在其内部进行精确延迟,提供可调的64级抽头延迟功能。

图3-17 ISERDES内部实现结构

BITSLIP模块内部提供串并转换和位调整功能,每个并串转换器的最大并行输出宽度为6,若需要更宽的并行输出,可以以主从模式将两个相邻的ISERDES连接起来,最大提供10位输出,级联位扩展如图3-18所示。BITSLIP的位调整功能将并行输出数据存储,并对数据进行移位,提供BITSLIP输入控制信号,通过控制BITSLIP信号,对输出数据进行左移或右移。

图3-18 ISERDES级联位扩展

ISERDES除了用做串并转换之外,集成的IDELAY模块包含64 节,每节约75ps(延时参考时钟为200 MHz,以下同)的延迟线,可用于精确的数据延迟调整;内建的BITSLIP模块用于输出端并行数据的位序调整,实现字对齐。这是Xilinx ChipSync技术的核心,为高速接口应用提供了很大的方便,也是实现高性能系统同步接口的基础之一。

ISERDES是Vertex-4内部集成的输入串并转换器,支持SDR和DDR两种模式。这两种模式均可以进行编程操作,在SDR 模式下,可生成2 ~8 bit 的任意并行数据;在 DDR 模式下,可以实现1bit 串行数据到4 bit、6 bit、8 bit及10 bit 并行数据的转换,具体设置关系如表3-1所示。当生成数据的位宽大于6 bit时,需要采用主从模式将两个相邻的 ISERDES 模块连接在一起。BITSLIP字偏移核内部提供串并转换和位调整功能,BITSLIP的位调整功能存储并行输出数据并对数据进行移位,提供BITSLIP输入控制信号,通过控制BITSLIP信号,对输出数据进行左移或右移,最终使并行输出数据的排序满足本DPA方案中设定的同步字格式。

表3-1 串并转换位宽和时钟的关系

ISERDES由串并转换单元(Serial to Parallel Converter)、可编程延迟单元(Digitally Pro-grammable Delay Element)、比特偏移模块(Bit Slip Sub Module)和时钟使能模块(Clock En-able)四部分组成。串并转换单元是ISERDES 的核心单元,主要由一组移位寄存器实现串并转换功能。

每个ISERDES 中包含一个可编程延迟单元,通过对其编程能够控制并行输出的延迟时间,可用于组合逻辑输入路径、寄存器输入路径或两者的混合路径上。其基本原理是将延迟单元划分为64 个循环连接的延迟节拍,延迟时间可以是其中的任何一个节拍。简单地讲就是将这64 个节拍编号为1,2,3,…,64,紧跟在编号为64 的延迟节拍后面的是编号为1的节拍,对应的最大延迟时间为5ns,则Bit Alignment提供的最小延迟颗粒度为78.125 ps,其初始化值设为零延迟。IDELAY线延迟核提供dlyce和dlyinc两个输入控制信号。当dlyce输入为高电平时,表明IDELAY处于工作状态,此时dlyinc每置一周期的高电平,信号线的延迟就增加一级;而dlyinc每置一周期的低电平,信号线的延迟就减少一级。根据延迟时间的不同,延迟单元可以工作在零延迟、固定延迟和可变延迟时间3个模式。使用了延迟单元后,FPGA 在接收信号时可以根据需要调整数据相对于时钟的延迟,以便在时钟的上升沿采到稳定的数据,并且这个延迟不受电压、温度等因素的影响,延迟控制逻辑如表3-2所示。

表3-2 延迟控制逻辑

ISERDES的主要端口定义如下。

D:串行数据输入。此端口与Virtex-4 的I/O端口相连接,支持多种通用的I/O 标准。

CLK、CLKDIV、OCLK:高速时钟、分频时钟和存储器高速时钟输入。CLK 时钟用于输入串行数据流;CLKDIV 的频率由所要完成的解串器的位宽决定,该时钟驱动串并转换器、延迟单元、比特偏移模块和控制模块;OCLK时钟驱动存储器。

BITSLIP:比特偏移控制。当此端口连接高电平时,完成比特偏移功能。

DLYINC、DLYCE、DLYRST:可编程延迟单元的增减量输入、使能输入和重启控制。共同作用于延迟单元,实现延迟输出功能。

CE1和CE2:时钟使能输入。每个ISERDES 模块包括一个时钟使能模块。

SHIFTIN1/SHIFTIN2、SHIFTOUT1/SHIFTOUT2:数据宽度扩大输入、输出。扩大字宽度时,需要连接此端口,主ISERDES 的SHIFTOUT 连接从ISERDES 的SHIFTIN。

Q1 ~Q6:并行数据输出,一个ISERDES 模块最多可输出6 bit 并行数据。如果需要更宽的并行数据,可以将两块相邻的ISERDES 连接起来使用。

ISERDES的VHDL语言例化方式如下:

            Library UNISIM;                 -- 在该模块中声明,必须引用
            use UNISIM.vcomponents.all;
                ISERDES inst:ISERDES
                generic map (
                    BITSLIP ENABLE=>FALSE,-- TRUE/FALSE to enable bitslip controller
                                      -- Must be "FALSE"in interface type is "MEMORY"
                    DATA RATE=>"DDR",     -- Specify data rate of "DDR"or "SDR"
                    DATA WIDTH=>4,        -- Specify data width-For DDR 4,6,8,or 10
                                          -- For SDR 2,3,4,5,6,7,or 8
                    INTERFACE TYPE=>"MEMORY",
                                          -- Use model-"MEMORY"or "NETWORKING"
                    IOBDELAY=>"NONE",
                                  -- Specify outputs where delay chain will be applied
                                          -- "NONE","IBUF","IFD",or "BOTH"
                    IOBDELAY TYPE=>"DEFAULT",
                                      -- Set tap delay"DEFAULT","FIXED",or"VARIABLE"
                    IOBDELAY VALUE=>0,-- Set initial tap delay to an integer from 0 to 63
                    NUM CE=>2,  -- Define number or clock enables to an integer of 1 or 2
                    SERDES MODE=>"MASTER")
                                          --Set SERDES mode to "MASTER"or "SLAVE"
                port map (
                    O=>O,                 -- 1-bit output
                    Q1=>Q1,               -- 1-bit output
                    Q2=>Q2,               -- 1-bit output
                    Q3=>Q3,               -- 1-bit output
                    Q4=>Q4,               -- 1-bit output
                    Q5=>Q5,               -- 1-bit output
                    Q6=>Q6,               -- 1-bit output
                    SHIFTOUT1=>SHIFTOUT1, -- 1-bit output
                    SHIFTOUT2=>SHIFTOUT2, -- 1-bit output
                    BITSLIP=>BITSLIP,     -- 1-bit input
                    CE1= CE1,              -- 1-bit input
                    CE2=>CE2,             -- 1-bit input
                    CLK=>CLK,             -- 1-bit input
                    CLKDIV=>CLKDIV,       -- 1-bit input
                    D=>D,                 -- 1-bit input
                    DLYCE=>DLYCE,         -- 1-bit input
                    DLYINC=>DLYINC,       -- 1-bit input
                    DLYRST=>DLYRST,       -- 1-bit input
                    OCLK=>OCLK,           -- 1-bit input
                    REV=>′0′,              -- Must be tied to logic zero
                    SHIFTIN1=>SHIFTIN1,   -- 1-bit input
                    SHIFTIN2=>SHIFTIN2,   -- 1-bit input
                    SR=>SR                 -- 1-bit input
                );
              -- End of ISERDES inst instantiation