目前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。
对这个工程的介绍就到这里了,希望对大家有用。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !