FPGA以太网接口设计,纯Verilog实现UDPTCP协议,支持校验和重发功能,适合学习和简单通信

FPGA以太网接口设计,纯Verilog实现UDPTCP协议,支持校验和重发功能,适合学习和简单通信

fpga以太网接口设计,支持udp和tcp协议,纯verilog手写代码,纯逻辑实现udptcp协议,接口类似于axi stream 。 mac层和tcp/ip层模块是分开的,物理接口可根据要求定制,目前的百兆网版本接口为RMII,千兆网版本接口为GMII转RGMII,Gmii和rgmii均下板测试过,tcp模块支持校验和重发功能,可和电脑端进行一对一通信。 可封装为axi接口(axi stream 或 axi lite)。 适合简单基础通信和参考学习,工程基于vivado,已有代码框图如下,其中图三为soc版本,网口为从机,riscv核为主机,通过axi interconnect桥接,也可灵活增加其他从设备。 非soc版本就只有网口的硬件代码,如图四。 可以和网络调试助手和python或c的socket通信。 注:资源消耗将近2000lut(xilinx fpga) 附带四份文档,1为抓包实测的文档说明,2为以太网协议介绍的ppt,3为tcp实现的代码说明,4为报文基本概念

最近在搞一个FPGA的以太网接口设计,支持UDP和TCP协议,纯Verilog手写代码,没有用任何现成的IP核,完全从底层逻辑实现。这个设计的目标是做一个简单、基础的通信模块,适合学习和参考。整个工程基于Vivado,资源消耗大概2000个LUT(Xilinx FPGA),不算特别大,但功能还算齐全。

模块划分

整个设计分为两个主要模块:MAC层和TCP/IP层。MAC层负责处理物理接口,TCP/IP层则负责协议栈的实现。物理接口可以根据需求定制,目前有百兆网的RMII接口和千兆网的GMII转RGMII接口。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

这个模块的核心是根据crsdv和rxd信号解析出有效的数据,并输出rxdatarxvalid信号。rxvalid信号表示当前rx_data是有效的。

TCP/IP层

TCP/IP层的实现稍微复杂一些,特别是TCP协议,涉及到校验和、重发等功能。这里简单看一下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为例,代码大致如下:

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

这个模块的核心是根据tvalidtready信号处理数据流,并输出rdatarvalid信号。rvalid信号表示当前rdata是有效的。

测试与通信

这个设计可以和电脑端的网络调试助手、Python或C的Socket进行通信。测试时,我用Wireshark抓包验证了数据的正确性,抓包文档也附在了工程里。TCP模块支持校验和重发功能,和电脑端进行一对一通信时,稳定性还不错。

总结

这个FPGA以太网接口设计虽然不算特别复杂,但涵盖了从MAC层到TCP/IP层的完整实现,适合初学者学习和参考。代码全部手写,没有依赖任何现成的IP核,理解起来相对容易。如果你对FPGA和网络协议感兴趣,这个工程应该能给你一些启发。

附带的文档里还有以太网协议的介绍、TCP实现的代码说明和报文基本概念,感兴趣的话可以深入了解一下。

Read more

2025.12.21 学习web前必要知识点梳理

文章目录 * 1.一次HTTP请求的完整流程 * 2.GET vs POST 区别 * 3.常见状态码 * 4.Cookie vs Session * 5.前后端分离如何维护登录态 * 为什么不用Session * Token的缺点 * 为什么说Token是“登录态”,而不是“权限”? * 6.==和equals区别 * 7.为什么重写equals一定要重写hashCode * 举例说明: * 回到主题,为什么在上述例子中map.get(u2)返回null?(再次说明,若对上述例子理解可跳过) * 8.String为什么不可变 * 那么“拼接字符串是怎么回事” * 为什么String必须不可变(重点) * 9.异常体系(Exception vs RuntimeException) * Exception代表受检异常,是Java强制我们处理的异常 * RuntimeException一般用于业务异常的处理,Java不强制我们处理 * 为什么不建议捕获RuntimeException?

Java Web 中山社区医疗综合服务平台系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】

Java Web 中山社区医疗综合服务平台系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】

摘要 随着我国人口老龄化加剧和慢性病患病率上升,社区医疗服务需求呈现爆发式增长。传统社区医疗存在服务效率低、信息孤岛严重、资源分配不均等问题,难以满足居民多元化健康需求。中山社区医疗综合服务平台以"互联网+医疗健康"理念为指导,通过信息化手段整合区域医疗资源,构建覆盖预约挂号、健康档案管理、在线咨询、药品配送等全流程服务的数字化平台。该系统有效解决了社区居民看病难、医疗数据碎片化、医患沟通不畅等痛点,为构建分级诊疗体系提供技术支撑。关键词:社区医疗、信息化平台、分级诊疗、健康档案、互联网医疗。 该系统采用前后端分离架构,后端基于SpringBoot2框架实现RESTful API,前端使用Vue3组合式API开发响应式界面,数据持久层采用MyBatis-Plus增强CRUD操作。平台主要功能模块包括:智能分诊系统(基于症状树匹配推荐科室)、电子健康档案(支持检验报告图像识别)、药品库存预警(采用Redis缓存热点数据)、医患即时通讯(集成WebSocket协议)。数据库选用MySQL8.0利用窗口函数优化统计查询,通过JWT实现分布式会话管理,结合Hutool工具包提升开发效率。系

Java Web 医疗挂号管理系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】

Java Web 医疗挂号管理系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】

摘要 随着信息技术的快速发展,医疗行业的数字化转型已成为必然趋势。传统的医疗挂号方式存在效率低下、资源分配不均、患者体验差等问题,亟需通过信息化手段优化管理流程。医疗挂号管理系统能够整合医院资源,实现线上预约、智能分诊、数据统计等功能,从而提升医疗服务效率,改善患者就医体验。该系统通过信息化手段减少人工操作错误,优化医疗资源配置,为医院管理者和患者提供便捷的服务。关键词:医疗挂号、数字化转型、资源优化、信息化管理。 本系统基于SpringBoot2、Vue3、MyBatis-Plus和MySQL8.0技术栈开发,采用前后端分离架构,确保系统的高效性和可扩展性。SpringBoot2提供了快速开发能力,Vue3实现了响应式前端界面,MyBatis-Plus简化了数据库操作,MySQL8.0则提供了高性能的数据存储支持。系统功能涵盖用户管理、医生排班、挂号预约、订单支付、数据统计等模块,支持多角色权限控制,确保数据安全。通过智能算法优化挂号流程,减少患者等待时间,提升医院运营效率。关键词:SpringBoot2、Vue3、MyBatis-Plus、MySQL8.0、智能挂号。 数据表