行业知识
FPGA——三速自适应以太网设计(1)基本模块
2026-11-08 18:00:52
来源:互联网转载
FPGA——以太网设计(1)基本模块
- 1. 协议解析
- (1)MAC层
- (2)IP层 和 ARP层
- (3)UDP层 和 ICMP层
- 2.1 MAC接收模块
- 2.2 MAC发送模块
- 3.1 IP接收模块
- 3.2 IP发送模块
- 4.1 UDP接收模块
- 4.2 UDP发送模块
- 5.1 ICMP接收模块
- 5.2 ICMP发送模块
- 6.1 ARP接收模块
- 6.2 ARP发送模块
- 6.3 ARP表模块
- 7 CRC数据对比模块
- 8 MAC下ARP和IP数据分流模块
- 9 数据流仲裁模块
- 模块收发组合
- 1 MAC层收发
- 2 ARP层收发
- 2 IP层收发
- 3 ICMP层收发
- 3 UDP层收发
- UDP协议���
1. 协议解析
每层都嵌套在上层的数据字段
(1)MAC层
以太网帧长: 64B~1518B
(2)IP层 和 ARP层
IP层
ARP层
(3)UDP层 和 ICMP层
UDP层
ICMP层
2.1 MAC接收模块
module MAC_rx#( parameter P_TARTGET_MAC = {8'h00,8'h00,8'h00,8'h00,8'h00,8'h00}, P_SOURCE_MAC = {8'h00,8'h00,8'h00,8'h00,8'h00,8'h00}, P_CRC_CHECK = 1)( input i_clk , input i_rst , /*--------info port--------*/ input [47:0] i_target_mac , input i_target_mac_valid , input [47:0] i_source_mac , input i_source_mac_valid , /*--------data port--------*/ output [15:0] o_post_type , output [7 :0] o_post_data , output o_post_last , output o_post_valid , output [47:0] o_rec_src_mac , output o_rec_src_valid , output o_crc_error , output o_crc_valid , /*--------GMII port--------*/ input [7 :0] i_GMII_data , input i_GMII_valid );/***************function**************//***************parameter*************//***************port******************/ /***************mechine***************//***************reg*******************/reg ro_post_last ;reg ro_post_valid ;reg [47:0] ro_rec_src_mac ;reg ro_rec_src_valid ;reg ro_crc_error ;reg [7 :0] ri_GMII_data ;reg ri_GMII_valid ;reg [7 :0] ri_GMII_data_1d ;reg ri_GMII_valid_1d ;reg [7 :0] ri_GMII_data_2d ;reg ri_GMII_valid_2d ;reg [7 :0] ri_GMII_data_3d ;reg ri_GMII_valid_3d ;reg [7 :0] ri_GMII_data_4d ;reg ri_GMII_valid_4d ;reg [7 :0] ri_GMII_data_5d ;reg ri_GMII_valid_5d ;reg [47:0] r_target_mac ;reg [47:0] r_source_mac ;reg [47:0] r_rec_mac ;reg r_rec_mac_access ;reg [15:0] r_rec_cnt ;reg r_headr_check ;reg r_header_access ;reg [15:0] r_rec_type ;//0x0800-IP 0X0806-ARPreg r_crc_rst ;reg r_crc_en ;reg r_crc_en_1d ;reg [15:0] r_rec_5d_cnt ;reg [31:0] r_crc_result ;reg ro_crc_valid ;/***************wire******************/wire [31:0] w_crc_result ;/***************component*************/CRC32_D8 CRC32_D8_u0( .i_clk (i_clk ), .i_rst (r_crc_rst ), .i_en (r_crc_en ), .i_data (ri_GMII_data_5d ), .o_crc (w_crc_result ) );/***************assign****************/assign o_post_type = r_rec_type ;assign o_post_data = ri_GMII_data_5d ;assign o_post_last = ro_post_last ;assign o_post_valid = ro_post_valid ;assign o_rec_src_mac = ro_rec_src_mac ;assign o_rec_src_valid = ro_rec_src_valid ;assign o_crc_error = ro_crc_error ;assign o_crc_valid = ro_crc_valid ;/***************always****************///数据打5拍,为了对齐信号always@(posedge i_clk,posedge i_rst)begin if(i_rst) begin ri_GMII_data r_rec_mac[39:0],ri_GMII_data}; else r_rec_mac