文章目录
- 一、设计框图
- 二、模块设计
- 三、IP核配置
- 四、上板验证
- 五、总结
一、设计框图
关于GT高速接口的设计一贯作风,万兆以太网同样如此,只不过这里将复位逻辑和时钟逻辑放到了同一个文件ten_gig_eth_pcs_pma_0_shared_clock_and_reset当中。如果是从第一篇高速接口设计看到现在,应该很熟悉了。
二、模块设计
ten_gig_eth_pcs_pma_0_shared_clock_and_reset模块将输入的用户复位信号i_rst进行同步然后产生相应的复位信号给到IP核,同时也根据IP核输出的txoutclk产生一系列用户时钟,与之前的高速接口设计不同的是,万兆以太网的用户时钟不再是txusrclk2,而是coreclk。
module TEN_GIG_ETH_PCSPMA(
input i_gt_refclk ,
input i_sys_clk ,
input i_rst ,
input i_qplllock ,
input i_qplloutclk ,
input i_qplloutrefclk ,
output o_qpllreset ,
output txp ,
output txn ,
input rxp ,
input rxn ,
input i_sim_speedup_control ,
output o_xgmii_clk ,
input [63 : 0] i_xgmii_txd ,
input [7 : 0] i_xgmii_txc ,
output [63 : 0] o_xgmii_rxd ,
output [7 : 0] o_xgmii_rxc ,
output o_block_sync ,
output o_rst_done ,
output o_pma_link ,
output o_pcs_rx_link ,
output o_tx_disable
);
wire coreclk ;
wire txusrclk ;
wire txusrclk2 ;
wire txoutclk ;
wire areset_coreclk ;
wire gttxreset ;
wire gtrxreset ;
wire txuserrdy ;
wire reset_counter_done ;
(* MARK_DEBUG = "TRUE" *)wire tx_resetdone ;
(* MARK_DEBUG = "TRUE" *)wire rx_resetdone ;
wire [7 :0] core_status ;
wire [447:0] status_vector ;
wire [535:0] configuration_vector ;
wire drp_req ;
assign o_xgmii_clk = coreclk;
assign o_block_sync = core_status[0];
assign o_rst_done = tx_resetdone & rx_resetdone;
assign o_pma_link = status_vector[18];
assign o_pcs_rx_link = status_vector[226];
assign configuration_vector[399:384] = 16'h4C4B;
assign configuration_vector[535:400] = 136'd0;
assign configuration_vector[383:1] = 384'd0;
assign configuration_vector[0:0] = 0;//PMA LOOPBACK
ten_gig_eth_pcs_pma_0_shared_clock_and_reset ten_gig_eth_pcs_pma_shared_clock_reset_block
(
.areset (i_rst ),
.refclk (i_gt_refclk ),
.coreclk (coreclk ),
.txoutclk (txoutclk ),
.qplllock (i_qplllock ),
.areset_coreclk (areset_coreclk ),
.gttxreset (gttxreset ),
.gtrxreset (gtrxreset ),
.txuserrdy (txuserrdy ),
.txusrclk (txusrclk ),
.txusrclk2 (txusrclk2 ),
.qpllreset (o_qpllreset ),
.reset_counter_done (reset_counter_done )
);
ten_gig_eth_pcs_pma_0 ten_gig_eth_pcs_pma_u0 (
.rxrecclk_out ( ), // output wire rxrecclk_out
.coreclk (coreclk ), // input wire coreclk
.dclk (i_sys_clk ), // input wire dclk
.txusrclk (txusrclk ), // input wire txusrclk
.txusrclk2 (txusrclk2 ), // input wire txusrclk2
.areset (i_rst ), // input wire areset
.txoutclk (txoutclk ), // output wire txoutclk
.areset_coreclk (areset_coreclk ), // input wire areset_coreclk
.gttxreset (gttxreset ), // input wire gttxreset
.gtrxreset (gtrxreset ), // input wire gtrxreset
.txuserrdy (txuserrdy ), // input wire txuserrdy
.qplllock (i_qplllock ), // input wire qplllock
.qplloutclk (i_qplloutclk ), // input wire qplloutclk
.qplloutrefclk (i_qplloutrefclk ), // input wire qplloutrefclk
.reset_counter_done (reset_counter_done ), // input wire reset_counter_done
.txp (txp ), // output wire txp
.txn (txn ), // output wire txn
.rxp (rxp ), // input wire rxp
.rxn (rxn ), // input wire rxn
.sim_speedup_control (i_sim_speedup_control ), // input wire sim_speedup_control
.xgmii_txd (i_xgmii_txd ), // input wire [63 : 0] xgmii_txd
.xgmii_txc (i_xgmii_txc ), // input wire [7 : 0] xgmii_txc
.xgmii_rxd (o_xgmii_rxd ), // output wire [63 : 0] xgmii_rxd
.xgmii_rxc (o_xgmii_rxc ), // output wire [7 : 0] xgmii_rxc
.configuration_vector (configuration_vector ), // input wire [535 : 0] configuration_vector
.status_vector (status_vector ), // output wire [447 : 0] status_vector
.core_status (core_status ), // output wire [7 : 0] core_status
.tx_resetdone (tx_resetdone ), // output wire tx_resetdone
.rx_resetdone (rx_resetdone ), // output wire rx_resetdone
.signal_detect (1 ), // input wire signal_detect
.tx_fault (0 ), // input wire tx_fault
.drp_req (drp_req ), // output wire drp_req
.drp_gnt (drp_req ), // input wire drp_gnt
.drp_den_o ( ), // output wire drp_den_o
.drp_dwe_o ( ), // output wire drp_dwe_o
.drp_daddr_o ( ), // output wire [15 : 0] drp_daddr_o
.drp_di_o ( ), // output wire [15 : 0] drp_di_o
.drp_drdy_o ( ), // output wire drp_drdy_o
.drp_drpdo_o ( ), // output wire [15 : 0] drp_drpdo_o
.drp_den_i (0 ), // input wire drp_den_i
.drp_dwe_i (0 ), // input wire drp_dwe_i
.drp_daddr_i (0 ), // input wire [15 : 0] drp_daddr_i
.drp_di_i (0 ), // input wire [15 : 0] drp_di_i
.drp_drdy_i (0 ), // input wire drp_drdy_i
.drp_drpdo_i (0 ), // input wire [15 : 0] drp_drpdo_i
.tx_disable (o_tx_disable ), // output wire tx_disable
.pma_pmd_type (3'b101 ) // input wire [2 : 0] pma_pmd_type
);
endmodule
三、IP核配置
整个IP核配置页面和使用都非常简单。难点在于后续基于此IP核进行万兆以太网MAC层的设计,该部分内容将在后续更新。
四、上板验证
这里写的用户逻辑很简单,我们不做关注,后续会进行完整的设计,这里主要看主机网卡发送过来的数据是否正常。
大家需要准备一张万兆网卡,与FPGA进行连接。
五、总结
初步打通了万兆以太网高速接口,后续将基于此进行完整的MAC层设计。