软件版本:Anlogic -TD5.9.1-DR1_ES1.1 操作系统:WIN10 64bit 硬件平台:适用安路(Anlogic)FPGA 实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板 3.2 IP_ARP层由于IP和ARP数据包送至MAC层要经过同一个通道,需要对发送的数据包类型进行判断和仲裁,这就需要额外增加一个IP_ARP层。 - /*******************************uiip_arp_rx模块*********************
- --以下是米联客设计的uiip_arp_rx模块
- 1.该模块1用于区分接收数据是IP包还是ARP包
- *********************************************************************/
- `timescale 1ns/1ps
- module uiip_arp_rx
- (
- input wire I_ip_arp_reset, //复位
- input wire I_ip_arp_rclk, //RX 接收时钟
- output wire O_ip_rvalid, //接收的有效IP信号
- output wire [7:0] O_ip_rdata, //接收的IP数据
- output wire O_arp_rvalid, //接收的有效ARP信号
- output wire [7:0] O_arp_rdata, //接收的有效ARP数据
- input wire I_mac_rvalid, //MAC接收到的数据有效信号
- input wire [7:0] I_mac_rdata, //MAC接收的有效数据
- input wire [15:0] I_mac_rdata_type //MAC接收到的帧类型
- );
- reg ip_rx_data_valid; //接收的有效IP信号
- reg [7:0] ip_rx_data; //接收的IP数据
- reg arp_rx_data_valid; //接收的有效ARP信号
- reg [7:0] arp_rx_data; //接收的有效ARP数据
- assign O_ip_rvalid = ip_rx_data_valid;
- assign O_ip_rdata = ip_rx_data;
- assign O_arp_rvalid = arp_rx_data_valid;
- assign O_arp_rdata = arp_rx_data;
- localparam ARP_TYPE = 16'h0806; //ARP包类型
- localparam IP_TYPE = 16'h0800; //IP 包类型
- always@(posedge I_ip_arp_rclk or posedge I_ip_arp_reset) begin
- if(I_ip_arp_reset) begin
- ip_rx_data_valid <= 1'b0;
- ip_rx_data <= 8'd0;
- arp_rx_data_valid <= 1'b0;
- arp_rx_data <= 8'd0;
- end
- else if(I_mac_rvalid) begin
- if(I_mac_rdata_type == IP_TYPE) begin//IP包
- ip_rx_data_valid <= 1'b1;
- ip_rx_data <= I_mac_rdata;
- end
- else if(I_mac_rdata_type == ARP_TYPE) begin//ARP包
- arp_rx_data_valid <= 1'b1;
- arp_rx_data <= I_mac_rdata;
- end
- else begin
- ip_rx_data_valid <= 1'b0;
- ip_rx_data <= 8'd0;
- arp_rx_data_valid <= 1'b0;
- arp_rx_data <= 8'd0;
- end
- end
- else begin
- ip_rx_data_valid <= 1'b0;
- ip_rx_data <= 8'd0;
- arp_rx_data_valid <= 1'b0;
- arp_rx_data <= 8'd0;
- end
- end
- endmodule
复制代码 3.2.1 IP_ARP接收模块该模块接收到MAC帧经过MAC层解包得到的数据包,通过类型字段判断该包是IP包还是ARP包,将其送入对应的模块中处理。
3.2.2 IP_ARP发送模块该模块接收IP层和ARP层传来的发送请求,通过busy信号与上层协议模块进行握手,来发送对应的数据。该模块的状态机转换图如图所示。 IDLE:如果是IP层发送的请求,且arp_req_pend信号没有挂起时,进入CHECK_MAC_CACHEE状态,进入ARP层查询mac_cache中缓存的MAC地址。如果是ARP层发送的请求,在MAC层非忙时,将arp_tbusy拉高,表示可以发送ARP包,进入WAIT_ARP_PACKET状态。 CHECK_MAC_CACHE:若没有查询到IP地址对应的MAC地址,则使能O_arp_treq_en信号,请求ARP层发送ARP广播包,并且将arp_req_pend挂起(该信号挂起时不能发送IP包),回到IDLE状态,等待ARP层发送请求信号。若查询到MAC地址,进入WAIT_IP_PACKET状态,等待IP层将有效数据发送过来。 WAIT_IP_PACKET:若I_ip_valid拉高,说明IP包有效数据开始传入,接收传来的数据并将其发送至MAC层,进入SEND_IP_PACKET状态。 SEND_IP_PACKET:等待一帧IP包数据全部发送完成时,回到IDLE状态。 WAIT_ARP_PACKET:I_arp_valid拉高,说明ARP包有效数据开始传入,接收传来的数据并将其发送至MAC层,进入SEND_ARP_PACKET状态。 SEND_ARP_PACKET:如果发送的数据包是ARP应答包,数据全部发送完成时,回到IDLE状态。如果发送的数据包是ARP请求包,则要进入SEND_ARP_REPLY状态,等待接收到对方发送ARP应答包。 SEND_ARP_REPLY:接收到ARP应答包后,将arp_req_pend信号拉低,回到IDLE状态。若超时未收到应答,则回到IDLE状态,此时由于arp_req_pend信号一直为高,该模块会持续发送ARP请求直至收到应答。 |