JESD204接口调试总结——JESD204+In-system-ibert

本文转载自:十年老鸟的CSDN博客

前言

之前我们在讲serdes的时候讲到了使用in-system-ibert来进行眼图的扫描,在transceiver wizard 中,是直接有 include in-systemibert选项的,生成一个exanple就可以得到一个带in-systemibert IP核的工程,参见我serdes总结的博文,JESD204B实际上也是基于serdes来实现的,问题是JESD204B的IP核并不带有include in-system-ibert的选项,那JESD204B有没有办法在不影响正常使用的情况下,对JESD 高速接口进行扫眼图和调整收发参数呢?

实际上JESD PHY也是可以挂载一个in-systemibert的,只是需要自己手动添加这个模块,实际上根据transceiver wizard生成的例子,我们自己也很好添加,因为这个接口比较简单也明了,一看就知道怎么连接了,这里直接把连接线列在下面。

IP核的设置

1、可以勾选 或者不勾选,不勾选的话需要手动添加逻辑设置相关参数的初值

1.png

2、勾选中serdes的相关位置

2.png

就这么简单,没有其他设置了。
IP核端口模型

3.png

通过这个IP核,我们可以设置以及改变以下这些值:

rxrate, rxlpmen, txdiffctrl, txpostcursor and txprecursor,这些值就是serdes的主要收发参数值了

(The configuration and tuning of the GTH/GTY transceivers is accessible though logic which communicates with the Dynamic Reconfiguration Port (DRP) of the transceivers, to change attribute settings, as well as registers that control the values on the following ports: rxrate, rxlpmen, txdiffctrl, txpostcursor and txprecursor)

rxrate_i、txdiffctril_i、txprecursor_i、txpostcusor_i,rxlpmen_i,这些输入端口是进行初值设置

当不启用include in-systemibert调试时rxrate_o、txdiffctril_o、txprecursor_o、txpostcusor_o,rxlpmen_o的输出就是上述初值,启用include in-systemibert调试时,输出的就是调试界面上得值

IP核连线

in_system_ibert_0 your_instance_name (
  .drpclk_o(drpclk_o),              // output wire [7 : 0] drpclk_o
  .gt0_drpen_o(gt0_drpen_o),        // output wire gt0_drpen_o
  .gt0_drpwe_o(gt0_drpwe_o),        // output wire gt0_drpwe_o
  .gt0_drpaddr_o(gt0_drpaddr_o),    // output wire [9 : 0] gt0_drpaddr_o
  .gt0_drpdi_o(gt0_drpdi_o),        // output wire [15 : 0] gt0_drpdi_o
  .gt0_drprdy_i(gt0_drprdy_i),      // input wire gt0_drprdy_i
  .gt0_drpdo_i(gt0_drpdo_i),        // input wire [15 : 0] gt0_drpdo_i
  .gt1_drpen_o(gt1_drpen_o),        // output wire gt1_drpen_o
  .gt1_drpwe_o(gt1_drpwe_o),        // output wire gt1_drpwe_o
  .gt1_drpaddr_o(gt1_drpaddr_o),    // output wire [9 : 0] gt1_drpaddr_o
  .gt1_drpdi_o(gt1_drpdi_o),        // output wire [15 : 0] gt1_drpdi_o
  .gt1_drprdy_i(gt1_drprdy_i),      // input wire gt1_drprdy_i
  .gt1_drpdo_i(gt1_drpdo_i),        // input wire [15 : 0] gt1_drpdo_i
  .gt2_drpen_o(gt2_drpen_o),        // output wire gt2_drpen_o
  .gt2_drpwe_o(gt2_drpwe_o),        // output wire gt2_drpwe_o
  .gt2_drpaddr_o(gt2_drpaddr_o),    // output wire [9 : 0] gt2_drpaddr_o
  .gt2_drpdi_o(gt2_drpdi_o),        // output wire [15 : 0] gt2_drpdi_o
  .gt2_drprdy_i(gt2_drprdy_i),      // input wire gt2_drprdy_i
  .gt2_drpdo_i(gt2_drpdo_i),        // input wire [15 : 0] gt2_drpdo_i
  .gt3_drpen_o(gt3_drpen_o),        // output wire gt3_drpen_o
  .gt3_drpwe_o(gt3_drpwe_o),        // output wire gt3_drpwe_o
  .gt3_drpaddr_o(gt3_drpaddr_o),    // output wire [9 : 0] gt3_drpaddr_o
  .gt3_drpdi_o(gt3_drpdi_o),        // output wire [15 : 0] gt3_drpdi_o
  .gt3_drprdy_i(gt3_drprdy_i),      // input wire gt3_drprdy_i
  .gt3_drpdo_i(gt3_drpdo_i),        // input wire [15 : 0] gt3_drpdo_i
  .gt4_drpen_o(gt4_drpen_o),        // output wire gt4_drpen_o
  .gt4_drpwe_o(gt4_drpwe_o),        // output wire gt4_drpwe_o
  .gt4_drpaddr_o(gt4_drpaddr_o),    // output wire [9 : 0] gt4_drpaddr_o
  .gt4_drpdi_o(gt4_drpdi_o),        // output wire [15 : 0] gt4_drpdi_o
  .gt4_drprdy_i(gt4_drprdy_i),      // input wire gt4_drprdy_i
  .gt4_drpdo_i(gt4_drpdo_i),        // input wire [15 : 0] gt4_drpdo_i
  .gt5_drpen_o(gt5_drpen_o),        // output wire gt5_drpen_o
  .gt5_drpwe_o(gt5_drpwe_o),        // output wire gt5_drpwe_o
  .gt5_drpaddr_o(gt5_drpaddr_o),    // output wire [9 : 0] gt5_drpaddr_o
  .gt5_drpdi_o(gt5_drpdi_o),        // output wire [15 : 0] gt5_drpdi_o
  .gt5_drprdy_i(gt5_drprdy_i),      // input wire gt5_drprdy_i
  .gt5_drpdo_i(gt5_drpdo_i),        // input wire [15 : 0] gt5_drpdo_i
  .gt6_drpen_o(gt6_drpen_o),        // output wire gt6_drpen_o
  .gt6_drpwe_o(gt6_drpwe_o),        // output wire gt6_drpwe_o
  .gt6_drpaddr_o(gt6_drpaddr_o),    // output wire [9 : 0] gt6_drpaddr_o
  .gt6_drpdi_o(gt6_drpdi_o),        // output wire [15 : 0] gt6_drpdi_o
  .gt6_drprdy_i(gt6_drprdy_i),      // input wire gt6_drprdy_i
  .gt6_drpdo_i(gt6_drpdo_i),        // input wire [15 : 0] gt6_drpdo_i
  .gt7_drpen_o(gt7_drpen_o),        // output wire gt7_drpen_o
  .gt7_drpwe_o(gt7_drpwe_o),        // output wire gt7_drpwe_o
  .gt7_drpaddr_o(gt7_drpaddr_o),    // output wire [9 : 0] gt7_drpaddr_o
  .gt7_drpdi_o(gt7_drpdi_o),        // output wire [15 : 0] gt7_drpdi_o
  .gt7_drprdy_i(gt7_drprdy_i),      // input wire gt7_drprdy_i
  .gt7_drpdo_i(gt7_drpdo_i),        // input wire [15 : 0] gt7_drpdo_i
  .eyescanreset_o(eyescanreset_o),  // output wire [7 : 0] eyescanreset_o
  .rxrate_o(rxrate_o),              // output wire [23 : 0] rxrate_o
  .txdiffctrl_o(txdiffctrl_o),      // output wire [39 : 0] txdiffctrl_o
  .txprecursor_o(txprecursor_o),    // output wire [39 : 0] txprecursor_o
  .txpostcursor_o(txpostcursor_o),  // output wire [39 : 0] txpostcursor_o
  .rxlpmen_o(rxlpmen_o),            // output wire [7 : 0] rxlpmen_o
  .rxrate_i(rxrate_i),              // input wire [23 : 0] rxrate_i
  .txdiffctrl_i(txdiffctrl_i),      // input wire [39 : 0] txdiffctrl_i
  .txprecursor_i(txprecursor_i),    // input wire [39 : 0] txprecursor_i
  .txpostcursor_i(txpostcursor_i),  // input wire [39 : 0] txpostcursor_i
  .rxlpmen_i(rxlpmen_i),            // input wire [7 : 0] rxlpmen_i
  .drpclk_i(drpclk_i),              // input wire [7 : 0] drpclk_i
  .rxoutclk_i(rxoutclk_i),          // input wire [7 : 0] rxoutclk_i
  .clk(clk)                        // input wire clk
);

大部分连线一看就是一目了然。这里就不多讲了,时钟的设置如下即可。

  .drpclk_o(),              // output wire [7 : 0] drpclk_o
  .drpclk_i(8{drpclk}),              // input wire [7 : 0] drpclk_i
  .rxoutclk_i(8{drpclk}),          // input wire [7 : 0] rxoutclk_i
  .clk(drpclk)                        // input wire clk
);

调试jtag界面

1、添加link

4.png

2、修改参数

5.png

3、进行眼图扫描

6.png

总结

这样我们就可以在不影响整个功能正常使用的情况下,进行眼图的观察,也可以对收发参数进行调整,特别是在一些极端情况下,例如高低温,可以直接调试,方便定位问题。

从图中可以看出,in-sysmbert 功能还是比较有限的,不能进行误码率的测试,大部分参量也无法设置,不过对于观察信号质量来说,能看眼图也可以了。

最新文章

最新文章