FPGA 以太网接口设计
本设计支持 UDP 和 TCP 协议,采用纯 Verilog 手写代码,无现成 IP 核,完全从底层逻辑实现。整个工程基于 Vivado,资源消耗约 2000 个 LUT(Xilinx FPGA)。
模块划分
设计分为两个主要模块:MAC 层和 TCP/IP 层。MAC 层负责处理物理接口,TCP/IP 层负责协议栈的实现。物理接口可根据需求定制,目前支持百兆网的 RMII 接口和千兆网的 GMII 转 RGMII 接口。
MAC 层
MAC 层代码主要处理物理接口的数据收发。以 RMII 为例:
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
核心是根据 crs_dv 和 rxd 信号解析出有效数据,并输出 rx_data 和 rx_valid 信号。
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 接口封装
设计支持封装为 AXI 接口,可以是 AXI Stream 或 AXI Lite。以 AXI Stream 为例:
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
核心是根据 tvalid 和 tready 信号处理数据流。
测试与通信
设计可与电脑端的网络调试助手、Python 或 C 的 Socket 进行通信。TCP 模块支持校验和重发功能,稳定性良好。




