文章目录
基于VC709开发板利用IBERT实现SFP/SFP+ connectors GTH收发器的测试
具体的实现流程有以下几篇文章还不错
- https://blog.csdn.net/ZZ2588/article/details/121384818?spm=1001.2014.3001.5506
- https://zhuanlan.zhihu.com/p/93353191
- https://zhuanlan.zhihu.com/p/138225924
- https://zhuanlan.zhihu.com/p/46296438
流程一:例化IBERT 7 Series GTH IP核
这一页注意一下,选择SFP/SFP+ connectors所在的bank,如下图,还有我们的VC709 GTH的参考时钟要选SMA引入进来的时钟,上面的参考文章和后面会说到GTH 的参考时钟是由两根电缆引进来的差分时钟。
系统时钟就选择200MHz的差分时钟,具体可以在User Guide里面时钟部分找
配置完成
流程二:GTH 参考时钟的设置
首先我们要知道SFP/SFP+ connectors的GTH,它的参考时钟要用si570上电就有的156.25MHz差分时钟USER_CLOCK_P和USER_CLOCK_N,输入到FPGA芯片,然后输出给USER_SMA_CLOCK_P和USER_SMA_CLOCK_N两个SMA口,再通过电缆连接到SFP/SFP+ connectors的GTH参考时钟的SMA connectors上
具体的连接可以看实物图
代码的实现主要是在ibert的example上加上几句原语
//for SFP
input USER_CLOCK_P,
input USER_CLOCK_N,
output USER_SMA_CLOCK_P,
output USER_SMA_CLOCK_N,
//forr sfp
wire IBUFDS_out;
wire BUFG_O;
wire oddr_out;
//for sfp
IBUFDS #(
.DIFF_TERM("FALSE"), // Differential Termination
.IBUF_LOW_PWR("TRUE"), // Low power="TRUE", Highest performance="FALSE"
.IOSTANDARD("LVDS") // Specify the input I/O standard
) IBUFDS_inst (
.O(IBUFDS_out), // Buffer output
.I(USER_CLOCK_P), // Diff_p buffer input (connect directly to top-level port)
.IB(USER_CLOCK_N) // Diff_n buffer input (connect directly to top-level port)
);
BUFG BUFG_inst (
.O(BUFG_O), // 1-bit output: Clock output
.I(IBUFDS_out) // 1-bit input: Clock input
);
ODDR #(
.DDR_CLK_EDGE("OPPOSITE_EDGE"), //"OPPOSITE_EDGE" or "SAME_EDGE"
.INIT(1'b0), // Initial value of Q: 1'b0 or 1'b1
.SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC"
) ODDR_out_clock_inst_user_clock (
.Q(oddr_out), // 1-bit DDR output
.C(BUFG_O), // 1-bit clock input
.CE(1'b1), // 1-bit clock enable input
.D1(1'b1), // 1-bit data input (positive edge)
.D2(1'b0), // 1-bit data input (negative edge)
.R(), // 1-bit reset
.S() // 1-bit set
);
OBUFDS OBUFDS_inst (
.O( USER_SMA_CLOCK_P), // Diff_p output (connect directly to top-level port)
.OB(USER_SMA_CLOCK_N), // Diff_n output (connect directly to top-level port)
.I(oddr_out) // Buffer input
);
这些原语的原理和作用不做介绍,有篇文章讲的挺好
https://cloud.tencent.com/developer/article/1801189
流程三:光模块的打开
由vc709的原理图我们可以看到,它默认是关闭的,因此要在代码里面把光模块打开
代码就简单的给个低电平就行
output TX_DISABLE_p2,
output TX_DISABLE_p3,
output TX_DISABLE_p4,
output TX_DISABLE_p5
assign TX_DISABLE_p2 = 1'b0;
assign TX_DISABLE_p3 = 1'b0;
assign TX_DISABLE_p4 = 1'b0;
assign TX_DISABLE_p5 = 1'b0;
流程三:检查光模块的发射光功率和饱和光功率,看看是否加衰减器
在一定的传输速率下,饱和光功率值指光模块接收端最大可以探测到的光功率,一般为-3dBm。当接收光功率大于饱和光功率的时候同样会导致误码产生。因此对于发射光功率大的光模块不加衰减回环测试会出现误码现象。甚至无法接收。
我用的是HUAWEI的02310SNN光模块,
它的参数为
因此需要接一个7dB的衰减
一开始我没有加衰减,导致ibet测试的时候,近端PCS回环和PMA回环status都是link的,但是在使用外部光纤none进行回环时就NO LINK
由图可知pll Status是locked,那么引入的参考时钟肯定没有问题,翻阅手册查看GTH 的Loopback Testing Overview,
发现只能是光模块和光纤的问题,再次检查光模块是否打开,进行检测,还是no link,于是找师兄23333,在一次偶然的测试中,师兄准备把光纤拔出但还未完全拔出之际,发现link上了。。。。原来是因为所采用的光模块发射功率太大了,直接回环接收不了。。
流程四:创建link实现自回环
这一步最开始的三篇文章都讲了,加上衰减器后,如图
测试结果如下
眼图的效果:
可以看到信号的效果非常好,有些博主的眼图信号质量不好,有可能他做回环的时候光模块没有加上衰减
ibert测试没问题了,接下来准备利用10g subsystem ip核进行数据的收发