TI论坛
直播中

李艳

7年用户 1477经验值
私信 关注
[问答]

ads62p49输出ramp型测试码,但是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的测试码会有误码吗?
    被这个问题卡了好几天了,请大家帮忙看看吧,多谢!




回帖(4)

刘晓寰

2024-12-6 11:25:32
能否先测试一下通信波形, 这么高的频率信号, 传输比较容易失真变形导致错误。
举报

张茜

2024-12-6 11:25:39
您的意思是用示波器看看ADC的信号吗?
示波器引出两根探针,分别接到chb_p和chb_n上面,然后示波器内阻设置成50欧姆,查看示波器的信号。 请问是这样操作吗?
举报

葛睿洁

2024-12-6 11:25:47
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)
  );
------------------------------------------------------------------------------------------------------------------------------------------------
举报
针对您的问题,我提供以下解决方案:

1. 检查时钟同步:确保FPGA的数据捕获时钟和ADC的采样时钟完全同步。您提到两者都来自同一个时钟芯片,但是请确保时钟信号在传输过程中没有受到干扰或衰减。

2. 检查信号完整性:检查ADC输出的差分信号在传输到FPGA的过程中是否存在信号完整性问题,例如信号反射、串扰等。您可以尝试使用差分信号完整性仿真工具进行分析。

3. 优化IDelay2配置:您提到通过调节IDelay2的延时可以恢复出SDR信号,但是偶尔会出现误码。可以尝试进一步优化IDelay2的配置,以减少误码发生的概率。例如,可以尝试增加IDelay2的延迟范围,以便更好地匹配信号的时序。

4. 检查Iserdes配置:请检查Iserdes模块的配置是否正确。例如,确保数据宽度、时钟频率等参数与ADC输出的信号相匹配。如果配置不正确,可能会导致误码。

5. 增加误码检测和校正机制:在FPGA中实现误码检测和校正机制,例如CRC校验、奇偶校验等。这样可以在发现误码时进行校正,提高信号的可靠性。

6. 检查FPGA设计:检查FPGA设计中是否存在潜在的问题,例如信号竞争、时序问题等。这些问题可能会导致误码发生。可以使用FPGA设计工具进行时序分析和信号完整性检查。

7. 考虑硬件故障:如果以上方法都无法解决问题,可以考虑是否存在硬件故障。例如,检查FPGA、ADC、时钟芯片等硬件是否存在损坏或性能下降的问题。

通过以上步骤,希望能帮助您解决FPGA无法准确可靠地接收到ADC输出的测试码的问题。
举报

更多回帖

×
20
完善资料,
赚取积分