Zynq 高速串行 CMOS 接口的设计与实现 作者: hello,panda 现在 CMOS 传感器的分辨率越来越大,对应的,对数据传输接口的要求也越来越高。根据熊猫君有限的实现和调试经验,基本上遇到了: ①多通道 HiSPi 接口:主要是 Aptina (现已经被安森美收购),常用的有 1080P60 的 AR0331 ( 3.1M ), 3664 × 2748P15 的 MT9J003 , 3984 × 2712P80 (开窗输出最高可达 1200fps )的 AR1011 等; ②多通道 LVDS 接口:主要有索尼系列、安森美的 Python 系列、国产如长光辰芯和德国 viimagic 系列等,至少熊猫君用过的 IMX172/IMX122/IMX185/ IMX236 、安森美 Python 全系列和 VII9222 等都是 LVDS 输出; ③ MIPI 接口:多用于手机,一些监控用的 CMOS 如 Sony IMX185 、 OV14810 等也带; ④ CCIR656 :一般低分辨率的会带 CCIR656 接口,也有一些厂家的高分摄像头也带,比如 OV14810 ; ⑤并行接口:较早设计的 CMOS 许多都是直接并口输出,比如 Aptina 的 MT9M031 、 MT9J003 都带有并口输出; 熊猫君在这里想讨论的是前三种接口的实现,它们是业界应用最广泛而且对 FPGA 资源有着共性要求。 无论是 HiSPi 、 LVDS 还是 MIPI ,其核心思想就是要实现将高速串行信号恢复成并行数据。这将会用到 Xilinx FPGA IOB 上的一个重要的资源—— ISERDES 。 实现串行信号的并行化,光有 ISERDES 还不行,还需要用到 IO BANK 上的延时模块 IDELAYCTRL 和 IOB 上的 IODELAYE 以及相关的相位训练算法。 1 Xilinx 的 IO 资源 本节对用到的 IO 资源作简要的介绍。 1.1 IDELAYCTRL 资源 在电压、温度等因素变化时,可能会影响到系统的时序,此时 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/(32 x 2 x FREF )) 1.2 IDELAYE2 逻辑 IDELAYE2 逻辑是一个 31 抽头的循环延时补偿模块,对输入的信号进行指定分辨率的延时, FPGA 可以直接访问。 Tap 延时分辨率由 IDELAYCTRL 的参考时钟提供持续补偿。图( 1 )是 IDELAYE2 接口示意图,表( 1 )是对这些接口的描述,表( 2 )是对逻辑参数的描述。 ( 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 监测 表( 2 ) IDELAYE2 逻辑参数描述 参数名 值域 默认值 描述 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 String:DATA, 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 模式 以下以 VAR_LOAD 模式为例说明延时的时序动作,如图( 2 )所示。 图( 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 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 的相位使能位 表( 4 ) ISERDESE2 的参数描述 参数名 阈值 默认值 描述 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 设置采样寄存器的复位值 (1) 时钟方案 CLK 和 CLK_DIV 必须是严格对齐的时钟,虽然允许使用 BUFIO/BUFR ,但任然有可能存在相位问题。图( 5 )时采用 BUFIO/BUFR 的方案。 图( 5 )采用 BUFIO/BUFR 的时钟方案 一般的,根据接口类型的差异,时钟必须满足以下的约束: ① networking interface a ) CLK → BUFIO ; CLKDIV → BUFR ; b ) CLK → MMCM/PLL ; CLKDIV →和 CLK 相同的 MMCM/PLL 的 CLKOUT 的输出,使用 MMCM 时 CLK 和 CLKDIV 必须使用相同的驱动 BUF ; c ) CLK → BUFG ; CLKDIV → BUFG 。 ② MEMORY Interface Type a ) CLK → BUFIO, OCLK → BUFIO ,或 CLKDIV → BUFR ; b ) CLK → MMCM 或 PLL, OCLK → MMCM, 或 CLKDIV 由同一个 MMCM/PLL 的 CLKOUT 驱动; c ) 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 同时拉低,也可延时一个时钟周期拉低。 图 7 Slave 模式下同步时序 2.2.2 输出数据率 在串行 SDR LVDS 模式下以 12bit 模式输出,数据率为 891Mbps ,每个通道的数据率为 445.5Mbps 。 2.2.3 Sync Code 格式 在串行输出模式下, CMOS 通过输出固定的 Sync Code 来指示图像的有效帧、行信息,接收器需通过查找这些 Sync Code 来恢复图像。 IMX122 可提供两种模式的 Sync Code ,这里配置为 Sync Code1 ,其具体定义如图 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 ); ⑤ 格式化输出模块通过搜索同步头的状态确定是否发出 bit_slip, 并根据 CMOS 的数据格式和同步信号格式化输出 12bit@74.25MHz 像素数据( PIX_DATA ); ⑥ 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 ( 2 ) LVDS 接收时钟选择 ① LVDS 解码串行参考时钟选择 从表 1 可以知道,采用 BUFG 最高时钟性能为 464MHz 。 IMX122 1080P 串行模式下两通道 LVDS 每通道的输出数据率为 445.5Mbps ( SDR ) , 接近 BUFG 的极限值,因此这里作一个变通处理, 使用 222.75MHz 时钟按照 DDR 方式对串行数据进行采样。 ② IODELAYE2 延时参考时钟选择 延时参考时钟选择的原则是在 LVDS 数据时钟周期内,可调节的 Tap 数尽量的多。 IMX122 输出的数据周期为 2.245ns ,调节一个周期采用 200MHz 参考时钟需要 28taps ,采用 300MHz 参考时钟需要 43 个 Taps ,而 IODELAYE2 的调节 Tap 数为 0~31 ,故只能 选择 200MHz 的参考时钟 。 ( 3 ) LVDS 数据接收模块时钟 因 CMOS IMX122 不输出 LVDS bit 时钟, FPGA 使用内部时钟来接收解码 LVDS 数据。如图 12 所示,与 LVDS 相关的时钟由同一个 MMCM 产生以保证其相位的一致性。其中: ① 37.125MHz ,为 CMOS 工作参考时钟; ② 55.6875MHz ,提供给 IODELAYE2.C 、 ISERDES2.CLKDIV 、补偿状态机及解码后的字节数据参考时钟; ③ 74.25MHz ,产生 30fps 的 CMOS 同步参考时序和 12bit 像素参考时钟; ④ 222.75MHz ,以 DDR 模式接收的 DDR 位参考时钟; 图 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 );如果 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 接收模块文件结构 注 1 :蓝色的 imx122_slvsyn_timing_v1_0 不属于 LVDS 接收内容,但 CMOS 在 SLAVE 模式下必须由它提供同步信号后才能正常输出。 注 2 :以上基于 IMX112 的代码可关注微信公众号回复 “ CMOS 解串源码” 免费获取,欢迎加入 QQ 群 300148644 或 关注微信公众号讨论交流。 注 3 :楼主有少量自用评估板可提供验证,扫描下方二维码即可获取。