-02-Xilinx的SerDes接口介绍【Xilinx-LVDS读写功能实现】

因为摄像头输出的LVDS信号速率会达到600Mbps,我们将不能够通过FPGA的I/O接口直接去读取这么高速率的信号。因此,需要使用Xilinx FPGA内的SerDes去实现高速数据的串并转换。

熊猫君的文章“Zynq高速串行CMOS接口的设计与实现”,都已经说清楚了,大神~~

参考文档ug953,ug471,我们为了捕获OV7251摄像头LVDS的数据信号,将会使用的以下资源:
- IDELAYCTRL
- IDELAYE2
- ISERDESE2
- ODELAYE2 (用于模拟LVDS输出信号)
- OSERDESE2 (用于模拟LVDS输出信号)
- MMCME2_ADV
- BUFG, BUFR, BUFIO, IBUFG, IBUFDS, OBUFDS

1. IDELAYCTRL
这里写图片描述
因FPGA的电压偏置、制造过程、电压、温度的不同,可能会对整个芯片的时序造成一些小的影响。IDELAYCTRL可以通过一个较高频率的参考时钟REFCLK为IDELAY或ODELAY提供延时抽头,可选0~31。参考时钟的频率可选200MHz或者300MHz,它们的每个抽头的分辨率分别约是78ps和52ps。我们的LVDS输入为600Mbps,则选用200MHz需要21taps,300MHz需要32taps,所以最终选择200MHz为参考时钟。
使用时还需要注意需要对IDELAYCTRL进行LOC约束,实现工具将IDELAYCTRL实例自动复制到整个器件,甚至复制到未使用延迟单元的时钟区域中。这样做资源占用率较高,在每个时钟区域内都要使用一个全局 时钟资源,并且使用布线资源较多,因此功耗较大。参考文档:输入输出延迟单元IODELAY简介

2. IDELAYE2
这里写图片描述
IDELAYE2逻辑是一个31抽头的循环延时补偿模块,对输入的信号进行指定分辨率的延时,从而保证从外部采集到的时钟和数据信号对应的建立保持时间在可接受的范围内。简单的说就是通过配置不同的Tap值,将600MHz的输入信号实现在1.667ns周期范围内进行相位调整。
为了调整时不出现数据的信号的断裂或者过分的变化,我们需要对Tap值每次只进行加一或者减一操作,不能一次调整的过大。参考xapp585进行动态相位补偿设计,章节:SDR Data Reception with Per-Bit Deskew。

3. ISERDESE2
这里写图片描述
ISERDESE2就是我们的核心模块了,负责将串行数据转换为并行数据。
单个ISERDESE2的位宽只有8bit,而我们的数据是10bit,好在我们可以把两个ISERDESE2进行级联实现10bit串并转换。结构如下图,将bit8和bit9分别连为Slave的Q3和Q4。
这里写图片描述

虽然前面通过IDELAYE2对数据的相位进行了调整,数据的建立保持时间都OK,可以正常捕获串行数据了。但是,OV7251只有一对差分时钟线和一对差分数据线,而没有额外的串行数据同步信号线,我们必须对串行数据进行字对齐(对于我们来说,像素数据是10bit,所以是进行10bit对齐)。这就需要使用ISERDESE2中的Bitslip功能模块了。
Bitslip功能是通过BITSLIP输入信号来调整数据对齐的,BITSLIP信号的参考时钟是CLKDIV。每发送一次BITSLIP信号,对齐边沿就会按照下图的方式变化,SDR和DDR模式的变化方式不同。
这里写图片描述
OV7251发出的数据是DDR方式,所以是按照上图右边的方式进行变化:右移1位,左移3位,右移1位,左移3位……。而前面说到,既然没有同步信号线,我们就只能够使用数据线中的同步码Sync Code去实现字对齐。OV7251的帧格式如下图,我可以使用编码3FF 000 000 2AC来实现BITSLIP调整。
这里写图片描述
我的处理方式和熊猫君的方式相同:图像开始传输后,在每一帧中都去搜索固定的同步码“3FF 000 000 2AC”。如果在这一帧找到了同步码则表示同步完成,若没有找到同步码,则在下一帧开始前触发一次BITSLIP信号,然后继续查找。直到找到了同步码为止,或者超过了20次BITSLIP仍然没有找到,则代表同步失败。

ODELAYE2和OSERDESE2相对来说没有那么复杂,就不介绍了。

4. MMCME2_ADV
时钟

5. BUF
buf

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章