基于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数据流的对传。
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 name | Type | Value | Description |
---|---|---|---|
P_SOURCE_MAC_SFP2 | 48’h00_11_22_33_44_55 | ||
P_TARTGET_MAC_SFP2 | 48’h00_55_00_55_00_55 | ||
P_SOURCE_MAC_SFP1 | 48’h00_55_00_55_00_55 | ||
P_TARTGET_MAC_SFP1 | 48’h00_11_22_33_44_55 |
Ports
Port name | Direction | Type | Description |
---|---|---|---|
sys_clk_p | input | ||
sys_clk_n | input | ||
key_reset_p | input | ||
txn_sfp2 | output | ||
txp_sfp2 | output | ||
rxn_sfp2 | input | ||
rxp_sfp2 | input | ||
txn_sfp1 | output | ||
txp_sfp1 | output | ||
rxn_sfp1 | input | ||
rxp_sfp1 | input | ||
tx_fault_sfp2 | input | ||
mod_detect_sfp2 | input | ||
los_sfp2 | input | ||
TX_DISABLE_p2 | output | ||
TX_DISABLE_p3 | output | ||
TX_DISABLE_p4 | output | ||
TX_DISABLE_p5 | output | ||
tx_fault_sfp1 | input | ||
mod_detect_sfp1 | input | ||
los_sfp1 | input | ||
USER_CLOCK_P | input | si570的上电差分时钟 | |
USER_CLOCK_N | input | ||
USER_SMA_CLOCK_P | output | ||
USER_SMA_CLOCK_N | output | ||
SMA_MGT_REFCLK_P | input | 参考时钟 | |
SMA_MGT_REFCLK_N | input | ||
led1 | output | 亮说明subsystem的核准备好了 | |
led2 | output |
Signals
Name | Type | Description |
---|---|---|
locked | wire | |
reset | wire | |
dclk | wire | |
coreclk | wire | |
areset_coreclk | wire | |
gttxreset | wire | |
gtrxreset | wire | |
txuserrdy | wire | |
txusrclk | wire | |
txusrclk2 | wire | |
reset_counter_done | wire | |
qplllock_out | wire | |
qplloutclk | wire | |
qplloutrefclk | wire | |
core_ready_sfp2 | wire | |
o_send_data_sfp2 | wire [63:0] | |
o_send_data_sfp2_valid | wire | |
txoutclk_sfp2 | wire | |
i_target_mac_sfp2 | wire [47:0] | 通过这几个信号可以修改mac_engine的源mac地址和目的mac地址 |
i_target_mac_sfp2_valid | wire | 通过这几个信号可以修改mac_engine的源mac地址和目的mac地址 |
i_source_mac_sfp2 | wire [47:0] | 通过这几个信号可以修改mac_engine的源mac地址和目的mac地址 |
i_source_mac_sfp2_valid | wire | 通过这几个信号可以修改mac_engine的源mac地址和目的mac地址 |
o_post_data_sfp2 | wire [63:0] | post的数据是给到mac engine上层的 |
o_post_last_sfp2 | wire | post的数据是给到mac engine上层的 |
o_post_valid_sfp2 | wire | |
o_rec_src_mac_sfp2 | wire [47:0] | 解析出来的收到数据的源mac地址 |
o_rec_srcmac_valid_sfp2 | wire | |
o_rec_target_mac_sfp2 | wire [47:0] | 解析出来的收到数据的目的mac地址 |
o_rec_targetmac_valid_sfp2 | wire | |
core_ready_sfp1 | wire | |
o_send_data_sfp1 | wire [63:0] | |
o_send_data_sfp1_valid | wire | |
txoutclk_sfp1 | wire | |
i_target_mac_sfp1 | wire [47:0] | |
i_target_mac_sfp1_valid | wire | |
i_source_mac_sfp1 | wire [47:0] | |
i_source_mac_sfp1_valid | wire | |
o_post_data_sfp1 | wire [63:0] | |
o_post_last_sfp1 | wire | |
o_post_valid_sfp1 | wire | |
o_rec_src_mac_sfp1 | wire [47:0] | |
o_rec_srcmac_valid_sfp1 | wire | |
o_rec_target_mac_sfp1 | wire [47:0] | |
o_rec_targetmac_valid_sfp1 | wire |
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 name | Type | Value | Description |
---|---|---|---|
P_SOURCE_MAC | 48’h00_11_22_33_44_55 | ||
P_TARTGET_MAC | 48’h00_55_00_55_00_55 |
Ports
Port name | Direction | Type | Description |
---|---|---|---|
dclk | input | ||
i_rst | input | ||
i_target_mac | input | [47:0] | 通过外部模块实时修改mac_engine的mac地址 |
i_target_mac_valid | input | 通过外部模块实时修改mac_engine的mac地址 | |
i_source_mac | input | [47:0] | 通过外部模块实时修改mac_engine的mac地址 |
i_source_mac_valid | input | 通过外部模块实时修改mac_engine的mac地址 | |
o_post_data | output | [63:0] | |
o_post_last | output | ||
o_post_valid | output | ||
o_rec_src_mac | output | [47:0] | |
o_rec_srcmac_valid | output | ||
o_rec_target_mac | output | [47:0] | |
o_rec_targetmac_valid | output | ||
i_send_data | input | [63:0] | |
i_send_data_valid | input | ||
txn | output | ||
txp | output | ||
rxn | input | ||
rxp | input | ||
tx_fault | input | ||
tx_disable | output | ||
mod_detect | input | ||
los | input | ||
qplllock | input | ||
qplloutclk | input | ||
qplloutrefclk | input | ||
areset_coreclk | input | ||
gttxreset | input | ||
gtrxreset | input | ||
txuserrdy | input | ||
txusrclk | input | ||
txusrclk2 | input | ||
reset_counter_done | input | ||
txoutclk | output | ||
core_ready | output | ||
sim_speedup_control | SIM | ||
coreclk | input |
Signals
Name | Type | Description |
---|---|---|
pcspma_status | wire [7 : 0] | |
mac_status_vector | wire [2 : 0] | |
mac_tx_configuration_vector | wire [79:0] | |
mac_rx_configuration_vector | wire [79:0] | |
pcs_pma_configuration_vector | wire [535:0] | |
signal_detect | wire | |
tx_ifg_delay | wire [7 : 0] | |
tx_axis_aresetn | wire | |
rx_axis_aresetn | wire | |
o_axis_tx_tdata | wire [63:0] | |
o_axis_tx_tkeep | wire [7:0] | |
o_axis_tx_tlast | wire | |
o_axis_tx_tuser | wire | |
o_axis_tx_tvalid | wire | |
o_axis_tx_tready | wire | |
m_axis_rx_tdata | wire [63:0] | |
m_axis_rx_tkeep | wire [7:0] | |
m_axis_rx_tlast | wire | |
m_axis_rx_tuser | wire | |
m_axis_rx_tvalid | wire | |
block_lock | wire | |
no_remote_and_local_faults | wire | |
tx_disable_n | wire |
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 name | Direction | Type | Description |
---|---|---|---|
reset | input | ||
refclk_p | input | ||
refclk_n | input | ||
dclk | input | ||
txoutclk | input | ||
txoutclk_out | output | ||
coreclk | output | ||
areset_coreclk | output | wire | |
gttxreset | output | ||
gtrxreset | output | ||
txuserrdy | output | ||
txusrclk | output | ||
txusrclk2 | output | ||
reset_counter_done | output | ||
qplllock_out | output | 驱动ip核的参考时钟 | |
qplloutclk | output | 驱动ip核的参考时钟 | |
qplloutrefclk | output | 驱动ip核的参考时钟 |
Signals
Name | Type | Description |
---|---|---|
qplllock | wire | |
refclk | wire | |
counter_done | wire | |
qpllreset | wire |
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核即可。