当前位置:   article > 正文

基于10G Ethernet subsystem 的简易万兆光纤通信

10g ethernet subsystem

基于10G Ethernet subsystem 的简易万兆光纤通信

前言

1.采用器件

HUAWEI的02310SNN光模块、xlinx vc709开发板

2.参考的手册

《10 Gigabit Ethernet Subsystem v3.1 Product Guide Vivado Design Suite PG157 February 4, 2021》
《VC709 Evaluation Board for the Virtex-7 FPGA User Guide》

3.10G Ethernet subsystem ip核

本次实验不涉及以太网的封装,只是简单的为数据生成模块产生的数据添加mac头,以axi_stream的时序给到10G Ethernet subsystem ip的用户接口,实现两个光模块之间10.3125Gbit/s数据流的对传。
axi_stream时序IP核配置选择 64bit 模式和10GBASER模式, 10GBASER是一种使用 64B/66B 编码(不是在千兆以太网中所用的 8B /10B)的串行接口,数据流为10.3125Gbit/s。其参考时钟为10.3125Gbit/s/66=156.25MHz
在这里插入图片描述

实现简易的光纤通信就取消了 AXI4-LITE 的配置状态接口, 基本 mac 功能可以在接口变量控制更方便。
在这里插入图片描述

DRP时钟100MHz
在这里插入图片描述

最后勾选上shared logic in example design,用上example里面的gt common的qpll来驱动同一个quad(bank)里面的4个sfp

详细的GT高速收发器知识可以先看看网上的介绍,然后直接参考官方手册,网上推荐的介绍:
VIVADO IP核:GT高速收发器(概述和IP example)https://zhuanlan.zhihu.com/p/559776073

详细的设计方案

1.总体架构

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

如图所示,这是整体的设计框图。tx_test_data模块产生自定义的裸数据,送到MAC_10gEngine_p2sfp2里面的MAC_TX进行组帧,添加mac头,并将组好帧的数据以axi_stream的时序给到MAC_10gEngine_p2sfp2里面的10G Ethernet Subsystem用户接口,并转串发送出去

MAC_10gEngine_p3sfp1的10G Ethernet Subsystem收到来自MAC_10gEngine_p2sfp2发送过来的串行数据,串转并,以axi_stream时序,将数据给到MAC_10gEngine_p3sfp1的MAC_RX模块,MAC_RX首先将收到数据的mac头提取出来,和自身的mac地址比对,看是否相同,如相同,则将数据解析出来,送到上层
顶层架构如下:

Entity: top_pass_onlymac_10g

  • File: top_pass_onlymac_10g.v

Diagram
在这里插入图片描述

Generics

Generic nameTypeValueDescription
P_SOURCE_MAC_SFP248’h00_11_22_33_44_55
P_TARTGET_MAC_SFP248’h00_55_00_55_00_55
P_SOURCE_MAC_SFP148’h00_55_00_55_00_55
P_TARTGET_MAC_SFP148’h00_11_22_33_44_55

Ports

Port nameDirectionTypeDescription
sys_clk_pinput
sys_clk_ninput
key_reset_pinput
txn_sfp2output
txp_sfp2output
rxn_sfp2input
rxp_sfp2input
txn_sfp1output
txp_sfp1output
rxn_sfp1input
rxp_sfp1input
tx_fault_sfp2input
mod_detect_sfp2input
los_sfp2input
TX_DISABLE_p2output
TX_DISABLE_p3output
TX_DISABLE_p4output
TX_DISABLE_p5output
tx_fault_sfp1input
mod_detect_sfp1input
los_sfp1input
USER_CLOCK_Pinputsi570的上电差分时钟
USER_CLOCK_Ninput
USER_SMA_CLOCK_Poutput
USER_SMA_CLOCK_Noutput
SMA_MGT_REFCLK_Pinput参考时钟
SMA_MGT_REFCLK_Ninput
led1output亮说明subsystem的核准备好了
led2output

Signals

NameTypeDescription
lockedwire
resetwire
dclkwire
coreclkwire
areset_coreclkwire
gttxresetwire
gtrxresetwire
txuserrdywire
txusrclkwire
txusrclk2wire
reset_counter_donewire
qplllock_outwire
qplloutclkwire
qplloutrefclkwire
core_ready_sfp2wire
o_send_data_sfp2wire [63:0]
o_send_data_sfp2_validwire
txoutclk_sfp2wire
i_target_mac_sfp2wire [47:0]通过这几个信号可以修改mac_engine的源mac地址和目的mac地址
i_target_mac_sfp2_validwire通过这几个信号可以修改mac_engine的源mac地址和目的mac地址
i_source_mac_sfp2wire [47:0]通过这几个信号可以修改mac_engine的源mac地址和目的mac地址
i_source_mac_sfp2_validwire通过这几个信号可以修改mac_engine的源mac地址和目的mac地址
o_post_data_sfp2wire [63:0]post的数据是给到mac engine上层的
o_post_last_sfp2wirepost的数据是给到mac engine上层的
o_post_valid_sfp2wire
o_rec_src_mac_sfp2wire [47:0]解析出来的收到数据的源mac地址
o_rec_srcmac_valid_sfp2wire
o_rec_target_mac_sfp2wire [47:0]解析出来的收到数据的目的mac地址
o_rec_targetmac_valid_sfp2wire
core_ready_sfp1wire
o_send_data_sfp1wire [63:0]
o_send_data_sfp1_validwire
txoutclk_sfp1wire
i_target_mac_sfp1wire [47:0]
i_target_mac_sfp1_validwire
i_source_mac_sfp1wire [47:0]
i_source_mac_sfp1_validwire
o_post_data_sfp1wire [63:0]
o_post_last_sfp1wire
o_post_valid_sfp1wire
o_rec_src_mac_sfp1wire [47:0]
o_rec_srcmac_valid_sfp1wire
o_rec_target_mac_sfp1wire [47:0]
o_rec_targetmac_valid_sfp1wire

Instantiations

  • IBUFDS_inst: IBUFDS
  • BUFG_inst: BUFG
  • ODDR_out_clock_inst_user_clock: ODDR
  • OBUFDS_inst: OBUFDS
  • clk_wiz_0: clk_wiz_0
  • tx_test_data_p2sfp2: tx_test_data
  • axi_10g_ethernet_0_shared_clocking_wrapper_inst: axi_10g_ethernet_0_shared_clocking_wrapper
  • MAC_10gEngine_p2sfp2_inst: MAC_10gEngine_p2sfp2
  • MAC_10gEngine_p3sfp1_inst: MAC_10gEngine_p3sfp1
  • ila_0_instance: ila_0

2.MAC_10gEngine

MAC_10gEngine_p2sfp2和MAC_10gEngine_p3sfp1一样的,就以MAC_10gEngine_p2sfp2来说了

Entity: MAC_10gEngine_p2sfp2

  • File: MAC_10gEngine_p2sfp2.v

Diagram
在这里插入图片描述

Generics

Generic nameTypeValueDescription
P_SOURCE_MAC48’h00_11_22_33_44_55
P_TARTGET_MAC48’h00_55_00_55_00_55

Ports

Port nameDirectionTypeDescription
dclkinput
i_rstinput
i_target_macinput[47:0]通过外部模块实时修改mac_engine的mac地址
i_target_mac_validinput通过外部模块实时修改mac_engine的mac地址
i_source_macinput[47:0]通过外部模块实时修改mac_engine的mac地址
i_source_mac_validinput通过外部模块实时修改mac_engine的mac地址
o_post_dataoutput[63:0]
o_post_lastoutput
o_post_validoutput
o_rec_src_macoutput[47:0]
o_rec_srcmac_validoutput
o_rec_target_macoutput[47:0]
o_rec_targetmac_validoutput
i_send_datainput[63:0]
i_send_data_validinput
txnoutput
txpoutput
rxninput
rxpinput
tx_faultinput
tx_disableoutput
mod_detectinput
losinput
qplllockinput
qplloutclkinput
qplloutrefclkinput
areset_coreclkinput
gttxresetinput
gtrxresetinput
txuserrdyinput
txusrclkinput
txusrclk2input
reset_counter_doneinput
txoutclkoutput
core_readyoutput
sim_speedup_controlSIM
coreclkinput

Signals

NameTypeDescription
pcspma_statuswire [7 : 0]
mac_status_vectorwire [2 : 0]
mac_tx_configuration_vectorwire [79:0]
mac_rx_configuration_vectorwire [79:0]
pcs_pma_configuration_vectorwire [535:0]
signal_detectwire
tx_ifg_delaywire [7 : 0]
tx_axis_aresetnwire
rx_axis_aresetnwire
o_axis_tx_tdatawire [63:0]
o_axis_tx_tkeepwire [7:0]
o_axis_tx_tlastwire
o_axis_tx_tuserwire
o_axis_tx_tvalidwire
o_axis_tx_treadywire
m_axis_rx_tdatawire [63:0]
m_axis_rx_tkeepwire [7:0]
m_axis_rx_tlastwire
m_axis_rx_tuserwire
m_axis_rx_tvalidwire
block_lockwire
no_remote_and_local_faultswire
tx_disable_nwire

Instantiations

  • ethernet_core_p2sfp2: axi_10g_ethernet_0
  • MAC_rx_axistream_p2sfp2: MAC_rx_axistream
  • MAC_tx_axistream_p2sfp2: MAC_tx_axistream

3.axi_10g_ethernet_0_shared_clocking_wrapper

这个是example里面的,其描述为This is the Shared clocking wrapper level code for the 10G Gigabit Ethernet Core. It contains the shareable clocking,reset circuitry and the gt common block.

一定要注意一个quad只能有一个gtcommon, 同一个quad中重复使用GT_COMMON的话会出问题

axi_10g_ethernet_0_shared_clocking_wrapper对于同一个quad的4个sfp,只用例化一次就行

Entity: axi_10g_ethernet_0_shared_clocking_wrapper

  • File: axi_10g_ethernet_0_shared_clocking_wrapper.v

Diagram
在这里插入图片描述

Ports

Port nameDirectionTypeDescription
resetinput
refclk_pinput
refclk_ninput
dclkinput
txoutclkinput
txoutclk_outoutput
coreclkoutput
areset_coreclkoutputwire
gttxresetoutput
gtrxresetoutput
txuserrdyoutput
txusrclkoutput
txusrclk2output
reset_counter_doneoutput
qplllock_outoutput驱动ip核的参考时钟
qplloutclkoutput驱动ip核的参考时钟
qplloutrefclkoutput驱动ip核的参考时钟

Signals

NameTypeDescription
qplllockwire
refclkwire
counter_donewire
qpllresetwire

Instantiations

  • gt_common_block_i: axi_10g_ethernet_0_gt_common
  • ethernet_shared_clock_reset_block_i: axi_10g_ethernet_0_shared_clock_and_reset
  • 仿真及上板调试验证

1.modelsim仿真

在这里插入图片描述

可以看到sfp2发出的目的mac是sfp1的数据,在sfp1处成功解析接收了

2.上板调试验证并演示

连接方式如图
连接方式如图
在这里插入图片描述

gt的参考时钟要通过线引过来,光模块需要加个7db衰减,详情见我的文章https://zhuanlan.zhihu.com/p/666731398

可以看到代表sfp2处的10g Ethernet subsystem和是是sfp1处的10g Ethernet subsystem的工作状态灯亮了,说明正常工作了。在sfp1的接收处,用ila抓取解析出来的数据,以o_rec_srcmac_valid_sfp1的上升沿为触发条件,如图
在这里插入图片描述

成功解析出sfp2发送过来的数据的mac地址,再次以其他信号作为触发,皆通过验证。

总结分析

1.高速串行接口与GT_COMMON / GT_CHANNEL 问题汇总

最开始我在sfp1和sfp2的macengine上都用了gtcommon,即例化了两次axi_10g_ethernet_0_shared_clocking_wrapper,同一个quad中重复使用GT_COMMON,导致错误。

一个quad只能有一个gtcommon。

另外驱动时要注意GT_COMMOM模块,即一个GT_COMMON最多可以驱动同一个QUAD上的4个GT_CHANNEL,如果说要驱动超过四个或者其他QUAD上的GT,必须要生成新的GT_COMMON模块,来保证其他QUAD上的GT可以正常工作。

这里有篇文章讲的挺好https://cloud.tencent.com/developer/article/1529579

2.Multiple DriverNets: Net ax-10g ethemet 0 shared clocking wrapper inst/ethernet shared cdlock reset blok p3sfp1/B2[0] has multiple drivers

我在axi_10g_ethernet_0_shared_clocking_wrapper例化了两次axi_10g_ethernet_0_shared_clock_and_reset,如下图,发生了错误,一个quad里面4个sfp都用同一个axi_10g_ethernet_0_shared_clock_and_reset,只用例化一次,然后同时给到4个sfp上的10g Ethernet subsystem ip核即可。
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/700360
推荐阅读
相关标签
  

闽ICP备14008679号