之前我们在讲serdes的时候讲到了使用in-system-ibert来进行眼的扫描,在transceiverwizard中,是直接有includein-systemibert选项的,生成一个exanple就可以得到一个带in-systemibertIP核的工程,参见我serdes总结的博文,JESD204B实际上也是基于serdes来实现的,问题是JESD204B的IP核并不带有includein-system-ibert的选项,那JESD204B有没有办法在不影响正常使用的情况下,对JESD高速接口进行扫眼和调整收发参数呢?实际上JESDPHY也是可以挂载一个in-systemibert的,只是需要自己手动添加这个模块,实际上根据transceiverwizard生成的例子,我们自己也很好添加,因为这个接口比较简单也明了,一看就知道怎么连接了,这里直接把连接线列在下面
IP核的设置
可以勾选或者不勾选,不勾选的话需要手动添加逻辑设置相关参数的初值勾选中serdes的相关位置就这么简单,没有其他设置了。IP核端口模型通过这个IP核,我们可以设置以及改变以下这些值:rxrate,rxlpmen,txdiffctrl,txpostcursorandtxprecursor,这些值就是serdes的主要收发参数值了
rxrate_i、txdiffctril_i、txprecursor_i、txpostcusor_i,rxlpmen_i,这些输入端口是进行初值设置当不启用includein-systemibert调试时rxrate_o、txdiffctril_o、txprecursor_o、txpostcusor_o,rxlpmen_o的输出就是上述初值,启用includein-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界面
添加link
修改参数进行眼扫描
总结
这样我们就可以在不影响整个功能正常使用的情况下,进行眼的观察,也可以对收发参数进行调整,特别是在一些极端情况下,例如高低温,可以直接调试,方便定位问题。
从中可以看出,in-sysmbert功能还是比较有限的,不能进行误码率的测试,大部分参量也无法设置,不过对于观察信号质量来说,能看眼也可以了
文章为作者独立观点,不代表 股票程序化软件自动交易接口观点