1,硬件工作环境
ADC:ADS52J90。FPGA:kintex7。供电:12V/4A 直流电源。该板卡最多外接32通道2Vpp模拟信号以及20路外部触发信号。数据传输接口方式有千兆以太网接口、高速光纤接口以及低速USB串口。需要用到的工具为万用表、示波器、信号发生器。
图1:硬件PCB
2,逻辑开发环境
Vivado2017.4(但也能够兼容ise14.7)。
3,工作模式总结
小青菜哥哥开发该ADC的工作模式如***:该ADC在8通道模式下只支持LVDS模式下的10bit精度):
-
- LVDS模式
通道数(Channel) |
采样精度(bit) |
采样率(MSPS) |
8 |
10 |
200 |
16 |
10 |
100 |
16 |
12 |
80 |
16 |
14 |
60 |
32 |
10 |
50 |
32 |
12 |
40 |
32 |
14 |
30 |
3.2 JESD204B模式(该ADC的JESD204B功能不支持8通道模式)
通道数(Channel) |
采样精度(bit) |
采样率(MSPS) |
16 |
10 |
100 |
16 |
12 |
80 |
16 |
14 |
60 |
32 |
10 |
50 |
32 |
12 |
40 |
32 |
14 |
30 |
4,LVDS_16通道_12bit_80MSPS数据采集开发过程
本篇将介绍该款ADC的16通道/12bit/80MSPS工作模式下的开发过程。开发过程本人按步骤总结了以下6点:
1)熟悉LVDS模式下的16通道工作原理
2)对时钟芯片编程,产生80MHz的ADC时钟
3)配置该ADC的工作模式为LVDS/16通道/12bit/80MSPS
4)开发FPGA端的ADC数据获取逻辑
5)在线chipscope调试与测试
6)利用真实信号测试
4.1熟悉LVDS模式下的16通道工作原理
小青菜哥哥在决定开发这款ADC后,首先做的第一件事就是仔细研读它的数据手册。该ADC工作在16通道时,其信号输入部分的采样原理由下图2详细给出了说明:
图2:16通道信号输入采样
该芯片内含16个AD转换器,从上图不难发现其工作在16通道模式时,每个AD转换器负责处理一路输入信号。并且该AD转换比较特殊的一点就是:每个AD转换内部都分为奇采样和偶采样,这是其他ADC所没有的,我想这么做的目的就是为了更好的实现每个AD可以处理2路输入信号,从而利用16个AD转换器就可以实现该芯片32通道的数据采集。该模式下的数据输出结构,在数据手册中也详细给出了,如下图3所示:
图3:16通道模式LVDS输出结构
我们可以看到,虽然一个ADC工作时分为奇数和偶数采样,但最终输出时已经合二为一,一个通道的采样数据最终通过一个AD输出。该模式下,从模拟信号输入到LVDS串行数据输出之间详细的映射关系如下表所示,属于一一对应:
4.2对时钟芯片编程,产生80MHz的ADC时钟
既然ADC工作在80MHz连续采样下,因此FPGA的处理时钟也应该设计为80MHz。FPGA利用板载40MHz晶振,产生配置逻辑,对LMK04826时钟芯片进行编程配置,分别产生ADC采样和FPGA系统80MHz时钟。即有输入时钟fIN=80MHz,采样时钟fSAMP=80MHz,转换时钟fc=80MHz。但是帧时钟和位时钟需要注意了:由于xilinx 7系列FPGA内部的串并转换模块ISERDES在接收DDR数据时,只支持10bit或者14bit的数据,因此当ADC工作在12bit精度时,是没办法处理的,但庆幸的是该款ADC有一个特殊功能,即当精度为12bit时,串行传输的数据通过在尾部添加2个零,可以变为14bit数据传输,因此帧时钟fFCLK=80MHz,位时钟变为fbitclk=7* fFCLK=560MHz.在FPGA端只需再移出最后两位即可。
4.3配置该ADC的工作模式为LVDS/16通道/12bit/80MSPS
该ADC芯片可以工作在多种模式下,其默认的工作模式可能不是我们所需要的模式。因此需要通过SPI配置该ADC,配置数据和地址应该严格按照数据手册给出的值确定。该ADC芯片功能很丰富,因此配置寄存器数量比较多,有一些寄存器不需要配置,保持默认值即可。我们需要做的就是了解每个配置寄存器的功能,选择需要的寄存器配置,这里需要花费大量的时间和精力。该款ADC配置的方面的内容在以前的文章已详细说明,这里略过。
4.4开发FPGA端的ADC数据获取逻辑
对于该款ADC的FPGA数据获取逻辑思路很清晰,其实就是高速源同步数据的获取,只需要利用FPGA自带的底层硬件资源ISERDES即可实现。ISERDES就是FPGA自带的高速串并转换模块,其具体定义和功能,小青菜哥哥在以前的文章中已专门说过。该数据采集模块功能图如图4所示:
图4:数据采集模块框图
下面分别介绍各个主要模块的功能:
1,DCLK模块
DCK模块的功能就是通过idelay\ISERDES\BUFIO\BUFR产生bitclk和clkdiv,使得bitclk的相位和位时钟dclk的相位对齐。其内部功能框图如图5所示:
图5:dlck
具体过程就是:首先控制模块控制Idelay延迟模块,使得dclk产生一定的延迟量。Idelay的输出再经过BUFIO和BUFR,进一步产生固定延迟,得到bitclk和clkdiv。Dclk同时还进入ISERDES模块进行串行转换,其时钟就为bitclk。控制模块一直监视iserdes的并行数据输出。随着idelay延迟量的改变,iserdes的输出也一直在变。当发现iserdes的输出为既有0又有1的状态时,说明bitclk和dclk相位对齐了。之后bitclk就可以作为fclk和data的数据采集时钟了。
2,FCLK模块
Dclk模块功能完成之后,只能保证采集到的数据的每一位都是对的,但并不知道一个14bit数据(最后2位为零)的首尾在哪,fclk模块就是用来寻找并行数据的正确起始与结束位置,因此业界也称fclk为帧时钟,但它并不是用作时钟,只用来判断data数据的位置。通过图3给出的LVDS输出时序图,不难发现:fclk进入iserdes进行串并转换后,如果输出的14bit数据为11111110000000,说明找到了正确的字符边界,在此状态下去取data从iserdes输出的并行14bit数据即可,如图6所示:
图6:fclk
fclk工作的原理就是通过bitslip不断的调节iserdes的输出,当输出为11111110000000时,该模块功能完成,bitslip的用法在iserdes的说明里很详细,前面的文章也具体介绍过~。
3,Data模块&数据输出模块
Dclk和fclk的功能完成后,该模块就只需要取数就就行了,不需要任何控制操作。然后将取到的数通过fifo同步到系统时钟域进行后续的处理,如图7所示:
图7:data
Fifo1的写入时钟为80MHz,用80MHz的系统时钟读这个fifo,读出的数据即为80MSPS采样率的全局时钟域下的模拟输入波形。由于所有的时钟都同源产生于LMK04826,所以不用担心fifo的空满问题,只需要不断读就可以~
4.5在线chipscope调试与测试
按照上面的思路和功能模块编写好代码,并利用chipscope观察输出信号。首先将ADC配置成ramp测试模式,即测试累加数据(0~4095)会取代正常采样数据,测试的波形如下图9,10所示。可以看到FPGA接收到的测试数据无误。
图8:ramp测试总体
图9:ramp测试细节
4.6利用真实信号测试采集功能
接下来,将ADC配置成正常采集模式,利用外接的信号发生器,FPGA获取到的80MHz采样波形如图10,11 ,12所示:
图10:chipscope抓取正弦波形
图11:chipscope正弦详细波形
图12:信号发生器输出波形
可以看到,信号发生器给的正弦波形频率为4MHz(250ns),而chipscope抓取的正弦波形一个周期为20个点,chipscope的观察时钟为80MHz(12.5ns),信号发生器给出的波形和数据采集后波形完全一致。
ADS52J90的LVDS_16通道_12bit_80MSPS数据采集模式的开发笔记就到这里,该篇最需要注意的就是12bit精度的数据要串行化成14bit进入FPGA进行串并转换,再取高12bit。下篇将是LVDS_16通道_14bit_60MSPS数据采集模式的开发笔记。