TCP和UDP协议的实现方法

目前tcp协议大多由cpu跑代码实现, 这次用fpga的纯逻辑实现 , system verilog编写,下面给大家粗略讲一下我的实现方法,下面是工程的示意图.
这个工程由几部分组成, 外部使用了88e1111千兆以太网phy。fpga内部有几个大的模块,
顶层模块:
//////////////////////////////////////////////////////////////////////  
    ////                                                              ////  
    ////  tcpip_hw                                                    ////  
    ////                                                              ////  
    ////  description                                                 ////  
    ////      top module                                              ////  
    ////                                                              ////  
    ////  author(s):                                                  ////  
    ////      - bin qiu, qiubin@opencores.org or  chat1@126.com       ////  
    ////                                                              ////  
    ////                   copyright (c) 2015                         ////  
    //////////////////////////////////////////////////////////////////////  
    `include tcpip_hw_defines.sv  
    module tcpip_hw(      
        input clk,  
        input rst_n,  
        output mdc,  
        inout  mdio,  
        output phy_rst_n,  
        output is_link_up,  
        input [7:0] rx_data,  
        output logic [7:0] tx_data,  
        input rx_clk,  
        input rx_data_valid,  
        output logic gtx_clk,  
        input  tx_clk,    
        output logic tx_en,  
//user interface
        input [7:0] wr_data,    
        input wr_clk,    
        input wr_en,    
        output wr_full,    
        output [7:0] rd_data,    
        input rd_clk,    
        input rd_en,    
        output rd_empty  
    );  
。。。。
(由于微信字数限制,此处省去200多行代码,可以点击阅读原文查看)
1. 与外部phy芯片通信的模块,simple_mac模块。
主要功能是通过mdio配置phy, 给发送帧打包(加入preamble,padding和crc32),和接收帧解包。下面是顶层代码:   
//////////////////////////////////////////////////////////////////////  
    ////                                                              ////  
    ////  simple_mac_top                                              ////  
    ////                                                              ////  
    ////  description                                                 ////  
    ////      top module of simple mac                                ////  
    ////                                                              ////  
    ////  author(s):                                                  ////  
    ////      - bin qiu, qiubin@opencores.org or  chat1@126.com       ////  
    ////                                                              ////  
    ////                   copyright (c) 2015                         ////  
    //////////////////////////////////////////////////////////////////////  
    module simple_mac_top(    
        input clk,  
        input rst_n,  
        output mdc,  
        input  mdio_in,  
        output mdio_out,  
        output mdio_oe,  
        output phy_rst_n,  
        input [7:0] rx_data,  
        output logic [7:0] tx_data,  
        input eth_mode,  
        input rx_clk,  
        input tx_clk,  
        input clk125out,  
        output tx_en,  
        input  rx_data_valid,  
        input [7:0] reg_addr,  
        input reg_wr,  
        input [31:0] reg_wr_data,  
        input reg_rd,  
        output [31:0] reg_rd_data,  
        output reg_busy,  
        input  ff_rx_clk,  
        output [31:0] ff_rx_data,  
        output ff_rx_eop,  
        output ff_rx_sop,  
        output rx_err,  
        output ff_rx_dval,  
        input  ff_rx_rdy,  
        input ff_tx_clk,  
        input [31:0] ff_tx_data,  
        input ff_tx_eop,  
        input ff_tx_sop,  
        input ff_tx_wren,  
        output ff_tx_rdy  
    );  
(由于微信字数限制,此处省去200多行代码,可以点击阅读原文查看)
2. mac_config
这个模块主要是配置phy芯片寄存器的。
3. rx path
这个模块负责从simple_mac接收数据,然后提交给eth_fsm的。下面是接口列表.
input rst_n,  
    ff_rx_if.s if_rx,  
    headers_if if_headers_rx,   
    output frame_type_t rx_type,  
    output logic rx_done,  
    output logic [31:0] data_recv,  
    output logic data_recv_start,  
    output logic data_recv_valid,  
    output logic [15:0] data_recv_len,  
    output u32_t cur_ripaddr,  
    output u16_t cur_rport,  
    input rx_done_clear,  
    input [31:0] local_ipaddr,  
    input [31:0] remote_port_local_port
接口列表里有2个interface, 
if_rx是与simple_mac连接的接口。 
if_headers_rx是保存各种header并提供给eth_fsm的,如mac_header, arp_header,ip_header,udp_header,tcp_header。 
rx_done是一帧接收完的信号并提供给eth_fsm。
中间一段用来从一帧中提取数据并提供给eth_fsm 。
下面是配置ip地址和收发端口号的。
4. tx path
这个模块从eth_fsm取得数据和各种header,并发送给simple_mac, 下面是接口
input rst_n,  
    ff_tx_if.s if_tx,  
    headers_if if_headers_tx,  
    input frame_type_t tx_type,  
    input tx_start,  
    input [13:0] tx_dword_count,  
    output logic fifo_rdreq,  
    input [31:0] fifo_q
其中if_tx是与simple_mac的接口, if_headers_tx是从eth_fsm来的各种header, 
tx_type是帧的类型,目前支持arp, icmp,tcp,udp。
tx_start是一帧传输开始的信号。
tx_dword_count是发送的字节数除以4 。
fifo_rdreq和fifo_q是从eth_fsm来的数据。
5. eth_fsm
这是整个工程的核心, 是处理协议的状态机和控制数据的流动,下面是接口
input clk,  
    input rst_n,  
    input is_link_up,  
    headers_if if_headers_rx,  
    input frame_type_t rx_type,  
    input rx_done,  
    headers_if if_headers_tx,  
    output frame_type_t tx_type,  
    output logic tx_start,  
    input [31:0] data_recv,  
    input [15:0] data_recv_len,  
    input data_recv_valid,  
    input data_recv_start,  
    output logic rx_done_clear,  
    input u32_t cur_ripaddr,  
    input u16_t cur_rport,  
    rx_ram_in_if.m if_rx_ram_in,  
    tx_ram_out_if.m if_tx_ram_out,  
    input [31:0] remote_port_local_port,  
    input [31:0] local_ipaddr,  
    input fifo_rdreq,  
    output [31:0] fifo_q,  
    input pkt_send_eop,  
    output logic [13:0]  tx_dword_count,  
    output logic init_done
由于这个模块过于复杂,就不介绍了。
6. data_source
这个模块提供了与用户模块的接口        
        input rst_n,  
        input init_done,  
        input [7:0] wr_data,  
        input wr_clk,  
        input wr_en,  
        output wr_full,  
        output [7:0] rd_data,  
        input rd_clk,  
        input rd_en,  
        output rd_empty,  
        tx_ram_in_if.m if_tx_ram_in,  
        rx_ram_out_if.s if_rx_ram_out  
其中wr开头和rd开头的都是对外提供的fifo接口,  分别用来写和读内部的发送fifo和接收fifo.
目前实现情况
目前udp协议可以基本全速运行,但是有丢包的情况,需要有个确认机制。
tcp协议只实现了最基本的功能,能够通信。窗口管理和慢启动,拥塞避免等特性还在完善中,速度只能达到200多m。
对这个工程的介绍就到这里了,希望对大家有用。


新冠疫情对全球航空业造成了哪些影响
智能家居-温湿度探测器WS-SD01的功能特点是什么
可穿戴设备:全球苹果第一 华为跟随其后
人脸识别无感考勤摄像头,开启智慧化人脸考勤打卡之路
Nitride成功开发R/G/B三种可见光范围内的Micro LED
TCP和UDP协议的实现方法
iPad虚拟键盘不带劲儿?苹果准备了附件供选购
啥是水力发电站 水力发电的基本方式
AR增强现实引发教育学习新革命
C语言中宏定义的使用技巧
暴风集团亏损1亿,自救的同时,股东及高管却在纷纷减持
国际电气巨头施耐德电气在强化智能家居市场的布局
科创板嘉元科技副总经理张小玲介绍、履历信息
5G领域全球领先 vivo与通讯人才携手并进
实感技术 已然成为人机交互最佳模式
洞悉数字经济发展动态,掌握数字经济发展新趋势
嫦娥四号任务圆满成功 探月得花多少钱?
横河电机发布新型混合信号示波器系列
德国莱茵TUV正式向华为颁发了全球首张5G手机CE证书
华为Mate 9:一切都是XL级的进化