ads62p49和FPGA间的接口问题

大家好,我遇到一个问题: ads62p49输出ramp型测试码,但是FPGA无法准确可靠地接收到该测试码。

FPGA用的是Xilinx 的Kintex7, FPGA的数据捕获时钟是245MHz; ads62p49的采样时钟也是245MHz。 两者都来自cdce72010时钟芯片。

ADC配置成DDR模式,7对差分信号到达FPGA管脚后依次经过了 IBUFDS、IDelay2、 Iserdes模块,转换为SDR信号。

现在的问题是,让ADC输出测试码,通过调节IDelay2的延时,恢复出的SDR信号与测试码也是一致的,但偶尔会出现误码!

这是我在逻辑分析中观察到其中一个的误码情况:

恢复出的SDR信号:0 1 2 3... 16383,  0 1 2 3 ... 16383,  0 1 2 3... 16383,  0 1 2 3...4095  4264 4097 .. 

也就是说,FPGA在连续接收到3*16384 + 4095个正确码的情况下,突然接收到了一个错误码4264(理论值应该是4096)。

进一步分析一下这个错误码产生的原因:

也就是说chb[1] chb[2] chb[3] 这3个数据通道上的数据传输发生了错误。以chb[1]来看, 正确的序列应该是 11110000, 而FPGA接收到的序列却变成了11110100。 个人认为引起错误的原因可能有2个:

1) ADC芯片产生的ramp测试码出错了;

2) FPGA内部的时钟jitter或者skew导致的;

如果是原因2),那么接收到的序列应该是 11111000才对,而不该是11110100。

那么貌似只剩下原因1)了,难道ADC的测试码会有误码吗?

被这个问题卡了好几天了,请大家帮忙看看吧,多谢!

  • 能否先测试一下通信波形, 这么高的频率信号, 传输比较容易失真变形导致错误。
  • 回复 user151383853:

    谢谢!
    您的意思是用示波器看看ADC的信号吗?
    示波器引出两根探针,分别接到chb[i]_p和chb[i]_n上面,然后示波器内阻设置成50欧姆,查看示波器的信号。 请问是这样操作吗?
  • 找到问题了!
    FPGA的捕获时钟是来自cdce72010芯片的一对差分信号,该差分对进入FPGA管脚后经IBUFDS转换为单端信号,再给到MMCM模块生成同频的捕获时钟。
    问题就出在IBUFDS原语的调用上,更正之后问题就解决了。
    ------------------- 之前的IBUFDS配置,导致FPGA不能正确捕获ADC输出的ramp测试码--------------------------
    IBUFDS #(
    .DIFF_TERM("FALSE"), // Differential Termination
    .IBUF_LOW_PWR("TRUE"), // Low power="TRUE", Highest performance="FALSE"
    .IOSTANDARD("DEFAULT") // Specify the input I/O standard
    ) IBUFDS_inst1 (
    .O(ab_clk_buf), // Buffer output
    .I(clk_ab_p), // Diff_p buffer input (connect directly to top-level port)
    .IB(clk_ab_n) // Diff_n buffer input (connect directly to top-level port)
    );
    --------------------------更正后的IBUFDS配置, FPGA可以正确到正确的ramp测试码了------------------------------
    IBUFDS #(
    .DIFF_TERM("TRUE"), // Differential Termination
    .IBUF_LOW_PWR("FALSE"), // Low power="TRUE", Highest performance="FALSE"
    .IOSTANDARD("LVDS_25") // Specify the input I/O standard
    ) IBUFDS_inst1 (
    .O(ab_clk_buf), // Buffer output
    .I(clk_ab_p), // Diff_p buffer input (connect directly to top-level port)
    .IB(clk_ab_n) // Diff_n buffer input (connect directly to top-level port)
    );
    ------------------------------------------------------------------------------------------------------------------------------------------------

    结贴!