图(1)IDELAYE2接口示意图。 表(1)IDELAYE2接口描述
端口名 |
方向 |
位宽 |
描述 |
C |
I |
1 |
当使用VARIABLE, VAR_LOAD或 VAR_LOAD_PIPE模式下的时钟输入,必须是由BUFG或BUFR驱动,当使用SelectIO资源时,必须和它的时钟源相同。 |
REGRST |
I |
1 |
复位pipeline寄存器,仅在VAR_LOAD_PIPE模式下有效 |
LD |
I |
1 |
VARIABLE模式:加载预编程值; VAR_LOAD模式:加载CNTVALUEIN值; VAR_LOAD_PIPE模式:加载当前pipeline寄存器的值。 |
INC |
I |
1 |
INC/DEC增加,减少的Tap数 |
CE |
I |
1 |
使能INC和DEC功能,只在VARIABLE, VAR_LOAD或 VAR_LOAD_PIPE模式下有效;当CE保持为高的时候,每一个C周期都增加或减少一个TIDELAYRESOLUTION的时延。 |
CINVCTRL |
I |
1 |
动态翻转C的极性,当使用该功能时,需禁止IDELAY control引脚2个cycle。 |
CNTVALUEIN |
I |
5 |
来自FPGA逻辑的动态Tap值 |
IDATAIN |
I |
1 |
来自IBUF的数据输入,输出可驱动FPGA逻辑、ILOGICE和ISERDESE |
DATAIN |
I |
1 |
来自FPGA逻辑的数据输入,输出不可驱动IOB |
LDPIPEEN |
I |
1 |
使能pipeline寄存器加载数据 |
DATAOUT |
O |
1 |
延时输出的数据 |
CNTVALUEOUT |
O |
5 |
Tap值输出,用于FPGA监测 |
|
|
|
|
参数名 |
值域 |
默认值 |
描述 |
IDELAY_TYPE |
String: FIXED, VARIABLE, VAR_LOAD或 VAR_LOAD_PIPE |
FIXED |
定义延时类型 |
DELAY_SRC |
String: IDATAIN, DATAIN |
IDATAIN |
选择延时源 |
IDELAY_VALUE |
Integer: 0 to 31 |
0 |
固定延时值和其他模式的初值 |
HIGH_PERFORMANCE_MODE |
Boolean: FALSE 或TRUE |
TRUE |
为TRUE的时候减少输出jitter,否则减少功耗 |
SIGNAL_PATTERN |
StringATA, CLOCK |
DATA |
指定时序分析工具按时钟还是数据路径进行分析 |
REFCLK_FREQUENCY |
Real: 190 to 210 或290 to 310 |
200 |
设置静态时序分析的Tap值 |
CINVCTRL_SEL |
Boolean: FALSE or TRUE |
FALSE |
设置是否动态转换C的极性 |
PIPE_SEL |
Boolean: FALSE or TRUE |
FALSE |
选择是否使用Pipline模式 |
图(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结构示意图 表(3) ISERDESE2
端口名 |
方向 | 位宽 | 描述 |
Q[8:1] | O | 8 |
并行寄存器数据输出,最先进入的串行数据出现在Q8 |
O | O | 1 |
组合数据输出,DDLY或D未通过寄存器直接输出。 |
SHIFTOUT1 | O | 1 |
级联输出,连接到IOB或Slave的SHIFTIN1 |
SHIFTOUT2 | O | 1 |
级联输出,连接到IOB或Slave的SHIFTIN2 |
D | I | 1 |
来自IOB的串行数据输入 |
DDLY | I | 1 |
来自IDELAYE2的串行数据输入 |
CLK | I | 1 |
高速时钟输入,用于采样高速串行数据流 |
CLKB | I | 1 | 第二高速时钟输入,仅用于MEMORY_QDR模式 |
CE1, CE2 | I | 1/1 |
时钟输入使能,NUM_CE=1时,CE2不使用;当NUM_CE=2时,CE1使能ISERDESE2的前1/2的CLKDIV周期,CE2使能ISERDESE2的后1/2的CLKDIV周期 |
RST | I | 1 | 高有效复位 |
CLKDIV | I | 1 | 分频时钟输入,用于同步并行数据输出和控制信号 |
OCLK | I | 1 | 高速时钟输入,用于高速存储器,只有在INTERFACE_TYPE为MEMORY时才有效 |
OCLKB | I | 1 | 反相的高速数据输入,用于高速存储器,只有在INTERFACE_TYPE为MEMORY时才有效 |
BITSLIP |
I | 1 | BitSlip调节脉冲 |
SHIFTIN1 | I | 1 |
级联模式下连接到Master的SHIFTOUT1 |
SHIFTIN2 | I | 1 |
级联模式下连接到Master的SHIFTOUT2 |
OFB | I | 1 | 反馈输入,OLOGICE或OSERDESE的输出反馈 |
DYNCLKDIVSEL | I | 1 |
动态选择CLKDIV的相位使能位 |
DYNCLKSEL | I | 1 |
动态选择CLK/CLKB的相位使能位 |
参数名 |
阈值 |
默认值 |
描述 |
DATA_RATE |
String: SDRor DDR |
DDR |
定义输入的数据类型 |
DATA_WIDTH |
DDR:4,6,8,10,14 SDR:2,3,4,5,6,7,8 |
4 |
定义转换位宽 |
DYN_CLKDIV_INV_EN |
Boolean: TRUE或FALSE |
FALSE |
为真时使能DYNCLKDIVSEL反相和禁止CLKDIV的HDL反相 |
DYN_CLK_INV_EN |
Boolean: TRUE或FALSE |
FALSE |
为真时使能DYNCLKDIVSEL反相和禁止CLK/CLKB的HDL反相 |
INTERFACE_TYPE |
String: MEMORY, MEMORY_DDR3, MEMORY_QDR, OVERSAMPLE或 NETWORKING |
MEMORY |
选择ISERDESE2的工作模型 |
NUM_CE |
Integer: 1或2 |
2 |
定义使用时钟使能信号的个数 |
OFB_USED |
Boolean: TRUE或FALSE |
FALSE |
定义是否使用OFB功能 |
SERDES_MODE |
String: MASTER或SLAVE |
MASTER |
定义主从模式 |
INIT_Q1~Q4 |
Binary: 0 或1 |
0 |
设置采样寄存器的初始值 |
SRVAL_Q1~Q4 |
Binary: 0 或1 |
1 |
设置采样寄存器的复位值 |
图(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同步的一个脉冲。 图(6)BitSlip训练移位规律 在上面所介绍的资源中,IDELAYE2是动态相位对其训练的神器,ISERDESE2实现串并转换,其Bitslip功能是实现并行化数据对齐的关键。 2 LVDS高速接口实现实例 因为MIPI接口有其完整的物理层协议,因此不在这里讲具体实现,本文以Sony的IMX122 CMOS为例,聊一聊高速LVDS(HiSPi类似,只是电平标准有一点区别)接口在Xilinx 7系列FPGA和Zynq SoC上的实现。 2.1 需求分析 以Sony IMX122 CMOS为例,配置在1080P分辨率可输出30fps。CMOS在初始化完成后输出两通道稳定的LVDS数据,LVDS接收模块在收到配置完成信号后开始工作。因此,这个LVDS接收模块需要实现: ① CMOS工作在Slave模式下,向CMOS发出参考时钟(INCK)、行同步(XHS)、帧同步(XVS)信号; ② 接收LVDS数据并将它恢复成为指定的图像数据格式; ③ 提供测试信息接口。 2.2 IMX122 CMOS输出特性 本小节简介IMX122 CMOS的一些特性。 2.2.1 同步时序要求 在Slave模式下需要向CMOS提供周期稳定的XHS和XVS信号,两者的时序要求如图7所示。在产生同步时序时需要注意以下要点: ① XVS和XHS必须是稳定的周期性信号; ② XVS和XHS信号的低电平保持时间为4~100个INCK; ③ XHS可以和XVS同时拉低,也可延时一个时钟周期拉低。
图7Slave模式下同步时序
2.2.2 输出数据率 在串行SDR LVDS模式下以12bit模式输出,数据率为891Mbps,每个通道的数据率为445.5Mbps。 2.2.3 Sync Code格式 在串行输出模式下,CMOS通过输出固定的Sync Code来指示图像的有效帧、行信息,接收器需通过查找这些Sync Code来恢复图像。IMX122可提供两种模式的Sync Code,这里配置为SyncCode1,其具体定义如图8所示。
图8 IMX122 Sync Code定义 2.2.4 输出图像组织形式 IMX122在1080P读出模式下,输入参考时钟INCK是37.125MHz。一帧图像输出固定为1125行,每行1100 INCK(29.63μs),有效输出为1984×1105。图像输出的时序如图9所示,图10是输出数据编码规则。
图9 IMX122 LVDS模式输出时序
图10 IMX122 12-bit 2通道输出编码格式 2.3 设计思路和模块结构 Slave模式下工作的CMOS在XVS和XHS的同步下按照固定时序稳定输出LVDS图像数据。LVDS串行数据按照一定的方式进行编码,接收模块应先将串行数据解码恢复成为并行数据,再根据数据的排列方式格式化输出。因此,整个模块可以划分为时序同步、LVDS接收解码(串转并)和数据格式化输出三个部分。整个LVDS接收模块的结构如图11所示。
图11 LVDS接收模块顶层图 ① CMOS输入参考时钟(INCK)为37.125MHz; ② CMOS输出LVDS数据为445.5MHz SDR型; ③ 时序发生器由74.25MHz发生30fps的XVS、XHS信号; ④ LVDS数据接收解码模块将数据恢复为8bit@55.6875MHz并行格式(DATA[7:0]); ⑤ 格式化输出模块通过搜索同步头的状态确定是否发出bit_slip,并根据CMOS的数据格式和同步信号格式化输出12bit@74.25MHz像素数据(PIX_DATA[11:0]); ⑥ IDELAYCTRL以Ref_clk为基准对整个IO BANK进行输入延时控制。 2.3.1 时序同步 同步时序由内部74.25MHz计数产生。按照图7所示时序即可。 2.3.2 LVDS接收解码 LVDS接收的主要工作是将串行的数据转为并行数据并进行自动相位调节,移位寄存器抽头调整(Bitslip)。Xilinx Artix7系列FPGA提供串转并模块ISERDES和IO延时模块IODELAYE2,ISERDES性能可在415Mb/s~1200Mb/s之间,IODELAYE2的延时参考时钟可以是200MHz(1tap≈78ps)或300MHz(1tap≈52ps)。 (1)Artix7 FPGA时钟特性 在Artix7系列器件里,MMCM可驱动BUFIO、BUFR、BUFH和BUFG,PLL只能驱动BUFH和BUFG。ZYNQ-7020采用Artix7 Speed-1器件,时钟网络的最高性能如下表5所示。 表5 Artix7 Speed-1 器件时钟性能
FPGA | BUFG | BUFH | BUFR | BUFIO |
Artix7 Speed-1 | 464MHz | 464MHz | 315MHz | 600MHz |
图12 LVDS数据接收模块结构 IMX122输出两路LVDS数据,每个通道的接收逻辑相同,对每一通道而言,数据流路径如下: a)LVDS差分对通过IBUFDS_DIFF_OUT,得到位数据(记为Master)及与其反相的数据(记为Slave); b)Master和Slave分别进入各自的IODELAYE2和ISERDES2得到各自的并行数据送到补偿算法状态机进行动态相位调整并反馈各自的延时值到IODELAYE2。根据IMX122的LVDS编码特点,ISERDES2按照1:8作串并转换最为合适; c)数据格式化输出模块根据查找Sync Code的情况调整bitslip; d)补偿模块根据数据调整的情况输出解码后的8-bit并行数据。 2.3.3 动态相位补偿 动态相位补偿原理如下: ① 初始化时,Master数据延时假定设为数据眼图的中间位置,Slave和Master的延时相隔半个数据周期。 ② 在Master和Slave的数据不全为零或不全为壹时启动动态相位补偿算法。相位补偿的基本原理是:如果Master和Slave采样到的数据相同,则说明采样太靠后,延时减少一个Tap(如图13[a]);如果Master和Slave采样到的数据不同,则说明采样点太靠前,延时增加一个Tap(如图13)。
图13采样点延时示意图 ③如果延时Tap值为最小或最大位置时,则交换Master和Slave的的参考关系,同时输出数据作相应调整; 2.3.4 数据格式化输出 该模块的工作是将收到的串转并数据的基础上搜索Sync Code、并组织成12-bit的像素数据按照给定时序格式化输出。 (1)Sync Code搜索 Sync Code搜索采用的策略是,逻辑在不停的查找在一帧数据里是否存在图3-2所示的的特定数据,如果这些同步码都能找到,则表示接收逻辑串转并的输出位顺序正常,不再需要bitslip;若没有找到全部的同步码,则在下一帧开始的时候(XVS上升沿)给出一个bitslip脉冲调整输出,直到找到完整的Sync Code。 两路LVDS通道分别单独进行Sync Code搜索,若32次bitslip后任然没有找到Sync Code,则报告CMOS输出错误。 (2)格式化输出 格式化输出模块完成将CMOS输出的数据解码成12-bit Pixel数据并按照视频格式时序输出,结构如图14所示。
图14 格式化输出逻辑结构 对格式化输出的详细实现过程这里不赘述。 2.3.5 接收模块顶层文件描述 IMX122-LVDS接收模块由4个文件构成,分别是imx122_lvds_rev_v1_0、lvds_data_rx、rev_data_format_v1_0和imx122_slvsyn_timing_v1_0构成,它们的层析结构如图15所示。 图15 LVDS接收模块文件结构 注:蓝色的imx122_slvsyn_timing_v1_0不属于LVDS接收内容,但CMOS在SLAVE模式下必须由它提供同步信号后才能正常输出。