FPGA 以太网接口设计
本设计基于纯 Verilog 手写代码,不依赖现成 IP 核,从底层逻辑实现 UDP 和 TCP 协议。工程基于 Vivado,资源消耗约 2000 LUT(Xilinx FPGA),功能齐全,适合学习和参考。
模块划分
整个设计分为两个主要模块:MAC 层和 TCP/IP 层。MAC 层负责处理物理接口,TCP/IP 层则负责协议栈的实现。物理接口可根据需求定制,目前有百兆网的 RMII 接口和千兆网的 GMII 转 RGMII 接口。GMII 和 RGMII 均经过下板测试,运行稳定。
MAC 层
MAC 层的代码相对简单,主要是处理物理接口的数据收发。以 RMII 为例,核心是根据 crs_dv 和 rxd 信号解析出有效的数据,并输出 rx_data 和 rx_valid 信号。
module rmii_rx (
input wire clk_50m,
input wire rst_n,
input wire [1:0] rxd,
input wire crs_dv,
output reg [7:0] rx_data,
output reg rx_valid
);
// 状态机和数据处理逻辑
always @(posedge clk_50m or negedge rst_n) begin
if (!rst_n) begin
rx_data <= 8'b0;
rx_valid <= 1'b0;
end else begin
// 根据 crs_dv 和 rxd 信号解析数据
end
end
endmodule
TCP/IP 层
TCP/IP 层的实现涉及校验和、重发等功能。以下是 TCP 校验和计算部分的示例:
function [15:0] tcp_checksum;
input [15:0] data [0:9];
reg [31:0] sum;
integer i;
begin
sum = 0;
for (i = 0; i < 10; i = i + 1) begin
sum = sum + data[i];
end
while (sum >> 16) begin
sum = (sum & 16'hFFFF) + (sum >> 16);
end
tcp_checksum = ~sum;
end
endfunction
该函数计算 TCP 报文的校验和,输入是一个 16 位的数据数组,输出是 16 位的校验和。计算过程是将所有数据相加,然后对结果进行进位处理,最后取反得到校验和。
AXI 接口封装
为了方便集成到 SoC 系统中,这个设计还支持封装为 AXI 接口,可以是 AXI Stream 或 AXI Lite。以 AXI Stream 为例,核心是根据 tvalid 和 tready 信号处理数据流,并输出 rdata 和 rvalid 信号。
module axi_stream_interface (
input wire aclk,
input wire aresetn,
input wire [31:0] tdata,
input wire tvalid,
output reg tready,
output reg [31:0] rdata,
output reg rvalid,
input wire rready
);
// 状态机和数据处理逻辑
always @(posedge aclk or negedge aresetn) begin
if (!aresetn) begin
tready <= 1'b0;
rdata <= 32'b0;
rvalid <= 1'b0;
end else begin
// 根据 tvalid 和 tready 信号处理数据
end
end
endmodule
测试与通信
该设计可以和电脑端的网络调试助手、Python 或 C 的 Socket 进行通信。测试时,使用 Wireshark 抓包验证了数据的正确性。TCP 模块支持校验和重发功能,和电脑端进行一对一通信时稳定性良好。
配套资料涵盖抓包实测说明、以太网协议介绍、TCP 代码说明及报文基本概念。




