目前TCP協(xié)議大多由cpu跑代碼實(shí)現(xiàn), 這次用FPGA的純邏輯實(shí)現(xiàn) , System Verilog編寫,下面給大家粗略講一下我的實(shí)現(xiàn)方法,下面是工程的示意圖.
這個(gè)工程由幾部分組成, 外部使用了88e1111千兆以太網(wǎng)phy。FPGA內(nèi)部有幾個(gè)大的模塊,
頂層模塊:
//////////////////////////////////////////////////////////////////////
//// ////
////tcpip_hw ////
//// ////
////Description ////
//// top module ////
//// ////
////Author(s): ////
//// - bin qiu, qiubin@opencores.org orchat1@126.com ////
//// ////
//// Copyright (C) 2015 ////
//////////////////////////////////////////////////////////////////////
`include "tcpip_hw_defines.sv"
module tcpip_hw(
input clk,
input rst_n,
output mdc,
inoutmdio,
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,
inputtx_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
);
。。。。
(由于微信字?jǐn)?shù)限制,此處省去200多行代碼,可以點(diǎn)擊閱讀原文查看)
1. 與外部phy芯片通信的模塊,simple_mac模塊。
主要功能是通過mdio配置phy, 給發(fā)送幀打包(加入preamble,padding和crc32),和接收幀解包。下面是頂層代碼:
//////////////////////////////////////////////////////////////////////
//// ////
////simple_mac_top ////
//// ////
////Description ////
//// top module of simple mac ////
//// ////
////Author(s): ////
//// - bin qiu, qiubin@opencores.org orchat1@126.com ////
//// ////
//// Copyright (C) 2015 ////
//////////////////////////////////////////////////////////////////////
module simple_mac_top(
input clk,
input rst_n,
output mdc,
inputmdio_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,
inputrx_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,
inputff_rx_clk,
output [31:0] ff_rx_data,
output ff_rx_eop,
output ff_rx_sop,
output rx_err,
output ff_rx_dval,
inputff_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
);
(由于微信字?jǐn)?shù)限制,此處省去200多行代碼,可以點(diǎn)擊閱讀原文查看)
2. mac_config
這個(gè)模塊主要是配置phy芯片寄存器的。
3. Rx Path
這個(gè)模塊負(fù)責(zé)從simple_mac接收數(shù)據(jù),然后提交給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個(gè)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。
中間一段用來從一幀中提取數(shù)據(jù)并提供給eth_fsm 。
下面是配置ip地址和收發(fā)端口號的。
4. Tx Path
這個(gè)模塊從eth_fsm取得數(shù)據(jù)和各種header,并發(fā)送給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是發(fā)送的字節(jié)數(shù)除以4 。
fifo_rdreq和fifo_q是從eth_fsm來的數(shù)據(jù)。
5. eth_fsm
這是整個(gè)工程的核心, 是處理協(xié)議的狀態(tài)機(jī)和控制數(shù)據(jù)的流動(dòng),下面是接口
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
由于這個(gè)模塊過于復(fù)雜,就不介紹了。
6. data_source
這個(gè)模塊提供了與用戶模塊的接口
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接口,分別用來寫和讀內(nèi)部的發(fā)送FIFO和接收FIFO.
目前實(shí)現(xiàn)情況
目前udp協(xié)議可以基本全速運(yùn)行,但是有丟包的情況,需要有個(gè)確認(rèn)機(jī)制。
tcp協(xié)議只實(shí)現(xiàn)了最基本的功能,能夠通信。窗口管理和慢啟動(dòng),擁塞避免等特性還在完善中,速度只能達(dá)到200多M。
對這個(gè)工程的介紹就到這里了,希望對大家有用。
審核編輯:湯梓紅
-
FPGA
+關(guān)注
關(guān)注
1629文章
21736瀏覽量
603248 -
千兆以太網(wǎng)
+關(guān)注
關(guān)注
0文章
67瀏覽量
13862 -
TCP
+關(guān)注
關(guān)注
8文章
1353瀏覽量
79068 -
UDP
+關(guān)注
關(guān)注
0文章
325瀏覽量
33934 -
TCP協(xié)議
+關(guān)注
關(guān)注
1文章
91瀏覽量
12070
原文標(biāo)題:千兆以太網(wǎng) TCP, UDP協(xié)議, FPGA實(shí)現(xiàn)
文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論