TCP和UDP协议的实现方法

描述

目前TCP协议大多由cpu跑代码实现, 这次用FPGA的纯逻辑实现 , System Verilog编写,下面给大家粗略讲一下我的实现方法,下面是工程的示意图.

UDP

这个工程由几部分组成, 外部使用了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。

对这个工程的介绍就到这里了,希望对大家有用。

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分