基于 FPGA 与 W5500 的 SPI 以太网通信实现
在嵌入式系统开发中,FPGA 与以太网模块的结合往往能带来更高的灵活性与性能。本文以 Altera 平台为例,探讨如何利用 W5500 芯片配合 SPI 接口(80MHz)构建稳定的以太网通信链路,并分享相关的 Verilog 软核逻辑。
W5500 以太网模块概述
W5500 是一款集成了 TCP/IP 协议栈的物理层和网络层芯片,能够显著降低以太网开发的复杂度。示例代码以单 Socket 模式为基础,若项目需要多 Socket 并发,可参照此结构进行扩展。
SPI 传输与时序控制
SPI(Serial Peripheral Interface)作为高速同步串行通信协议,是 FPGA 与 W5500 交互的关键通道。设定为 80MHz 传输速率时,需精确设计时钟分频逻辑以确保时序满足芯片要求。
SPI 写操作核心逻辑
以下 Verilog 代码展示了如何通过分频产生 SPI 时钟,并按协议格式逐位发送数据。重点在于 clk_divider 的分频计数与 bit_counter 的位序控制。
module spi_write #(
parameter SPI_CLK_FREQ = 80_000_000,
parameter SYS_CLK_FREQ = 100_000_000
) (
input wire sys_clk,
input wire rst_n,
input wire [7:0] data_to_send,
output reg spi_clk,
output reg spi_cs_n,
output reg spi_mosi,
output reg spi_wr_done
);
reg [31:0] clk_divider;
reg [2:0] bit_counter;
// 时钟分频生成 80MHz SPI 时钟
always @(posedge sys_clk or negedge rst_n) begin
if (!rst_n) begin
clk_divider <= 32'd0;
spi_clk <= 1'b0;
end else begin
if (clk_divider == (SYS_CLK_FREQ / SPI_CLK_FREQ) / 2 - 1) begin
clk_divider <= 32'd0;
spi_clk <= ~spi_clk;
end else begin
clk_divider <= clk_divider + 1;
end
end
end
// SPI 数据移位输出
always @(posedge spi_clk or negedge rst_n) begin
if (!rst_n) begin
spi_cs_n <= 1'b1;
spi_mosi <= 1'b0;
bit_counter <= 3'd0;
spi_wr_done <= 1'b0;
end else begin
if (bit_counter == 3'd7) begin
spi_cs_n <= 1'b1;
spi_wr_done <= 1'b1;
end else begin
spi_cs_n <= 1'b0;
spi_mosi <= data_to_send[7 - bit_counter];
bit_counter <= bit_counter + 1;
end
end
end
endmodule
当 8 位数据发送完毕,拉高 spi_wr_done 信号通知上层逻辑写操作完成。实际工程中需注意建立时间与保持时间,避免亚稳态问题。
顶层模块实例化
在顶层设计中,将 SPI 写模块与其他逻辑连接即可。下面是一个简单的实例化参考:
module top_module (
input wire sys_clk,
input wire rst_n,
output wire spi_clk,
output wire spi_cs_n,
output wire spi_mosi,
output wire spi_wr_done
);
wire [7:0] data_to_send; // 假设数据已在其他逻辑中准备好
spi_write #(
.SPI_CLK_FREQ(80_000_000),
.SYS_CLK_FREQ(100_000_000)
) u_spi_write (
.sys_clk(sys_clk),
.rst_n(rst_n),
.data_to_send(data_to_send),
.spi_clk(spi_clk),
.spi_cs_n(spi_cs_n),
.spi_mosi(spi_mosi),
.spi_wr_done(spi_wr_done)
);
endmodule
注意事项与扩展
虽然上述代码描述了基本的工作流程,但在实际硬件平台上运行时,还需关注以下几点:


