前言
MAC_RX的设计暂时告一段落,本节将开始进行MAC_TX的设计。
一、模块功能
- 接收上层用户的AXIS数据,将其转换为XGMII进接口的数据发送给IP核。
- 可接受AXIS数据流,可支持数据包之间的间隔最小为一个时钟周期
- 目的MAC以及源MAC等参数可动态配置
- 流控,万兆以太网帧间隔为9.6ns,用户时钟频率为156.25Mhz,周期为6.4ns,因此XGMII接口数据之前至少间隔2个时钟周期
模块接口如下:
module TEN_GIG_MAC_TX#(
parameter P_SRC_MAC = 48'h00_00_00_00_00_00,
parameter P_DST_MAC = 48'h00_00_00_00_00_00
)(
input i_clk ,
input i_rst ,
input [47:0] i_dynamic_src_mac ,
input i_dynamic_src_valid ,
input [47:0] i_dynamic_dst_mac ,
input i_dynamic_dst_valid ,
input [63:0] s_axis_tdata ,
input [79:0] s_axis_tuser ,
input [7 :0] s_axis_tkeep ,
input s_axis_tlast ,
input s_axis_tvalid ,
output s_axis_tready ,
output [63:0] o_xgmii_txd ,
output [7 :0] o_xgmii_txc
);
二、实现方式
- 将接收到的AXIS数据先存入FIFO,将包头组织完毕后从FIFO当中读取数据进行填充
- 组帧同时要进行CRC计算并且在末尾填充,需要注意,在尾端填充CRC数据时,根据尾端keep信号有多种情况,会存在数据额外需要一个时钟周期进行传输CRC数据。
包含子模块如下:
FIFO_64X256 FIFO_64X256_data_tx (
.clk (i_clk ),
.srst (i_rst ),
.din (rs_axis_tdata ),
.wr_en (rs_axis_tvalid ),
.rd_en (r_fifo_data_rden ),
.dout (w_fifo_data_dout ),
.full (w_fifo_data_full ),
.empty (w_fifo_data_empty )
);
FIFO_32X32 FIFO_32X32_len_type (
.clk (i_clk ),
.srst (i_rst ),
.din ({
rs_axis_tuser[79:64],rs_axis_tuser[15:0]}),
.wr_en (rs_axis_tlast ),
.rd_en (r_fifo_len_type_rden ),
.dout (w_fifo_len_type_dout ),
.full (w_fifo_len_type_full )