`timescale 1ns/1ns
////////////////////////////////////////////////////////////////////////
// Author : EmbedFire
// 实验平台: 野火FPGA系列开发板
// 公司 : http://www.embedfire.com
// 论坛 : http://www.firebbs.cn
// 淘宝 : https://fire-stm32.taobao.com
////////////////////////////////////////////////////////////////////////
module eth_udp_loop(
input sys_clk , //系统时钟
input sys_rst_n , //系统复位信号,低电平有效
//PL以太网RGMII接口
input eth_rxc , //RGMII接收数据时钟
input eth_rx_ctl, //RGMII输入数据有效信号
input [3:0] eth_rxd , //RGMII输入数据
output eth_txc , //RGMII发送数据时钟
output eth_tx_ctl, //RGMII输出数据有效信号
output [3:0] eth_txd , //RGMII输出数据
output eth_rst_n //以太网芯片复位信号,低电平有效
);
//parameter define
//开发板MAC地址
parameter BOARD_MAC = 48'h12_34_56_78_9a_bc;
//开发板IP地址
parameter BOARD_IP = {8'd192,8'd168,8'd0,8'd234};
//目的MAC地址
parameter DES_MAC = 48'hff_ff_ff_ff_ff_ff;
//目的IP地址
parameter DES_IP = {8'd192,8'd168,8'd0,8'd145};
//wire define
wire clk_phase ; //用于IO延时的时钟
wire gmii_rx_clk; //GMII接收时钟
wire gmii_rx_dv ; //GMII接收数据有效信号
wire [7:0] gmii_rxd ; //GMII接收数据
wire gmii_tx_clk; //GMII发送时钟?
wire gmii_tx_en ; //GMII发送数据使能信号
wire [7:0] gmii_txd ; //GMII发送数据?
wire udp_gmii_tx_en; //UDP GMII输出数据有效信号
wire [7:0] udp_gmii_txd ; //UDP GMII输出数据
wire rec_pkt_done ; //UDP单包数据接收完成信号
wire rec_en ; //UDP接收的数据使能信号
wire [31:0] rec_data ; //UDP接收的数据
wire [15:0] rec_byte_num ; //UDP接收的有效字节数 单位:byte
wire udp_tx_done ; //UDP发送完成信号
wire tx_req ; //UDP读数据请求信号
wire [31:0] tx_data ;
reg [31:0] cnt;
reg led_reg;
reg tx_flag;
//*****************************************************
//** main code
//*****************************************************
assign eth_rst_n = 1'b1;
//MMCM/PLL
clk_wiz_0 u_clk_phase
(
.clk_in1 (eth_rxc ), //以太网接收时钟
.clk_out1 (clk_phase ), //经过相位偏移后的时钟
.reset (~sys_rst_n ), //pll复位
.locked ( ) //pll时钟稳定标识
);
//GMII接口与RGMII接口 互转
gmii_to_rgmii u_gmii_to_rgmii(
.gmii_rx_clk (gmii_rx_clk ), //gmii接收
.gmii_rx_dv (gmii_rx_dv ),
.gmii_rxd (gmii_rxd ),
.gmii_tx_clk (gmii_tx_clk ), //gmii发送
.gmii_tx_en (gmii_tx_en ),
.gmii_txd (gmii_txd ),
.rgmii_rxc (clk_phase ), //rgmii接收
.rgmii_rx_ctl (eth_rx_ctl ),
.rgmii_rxd (eth_rxd ),
.rgmii_txc (eth_txc ), //rgmii发送
.rgmii_tx_ctl (eth_tx_ctl ),
.rgmii_txd (eth_txd )
);
//UDP通信
udp
.BOARD_MAC (BOARD_MAC), //参数例化
.BOARD_IP (BOARD_IP ),
.DES_MAC (DES_MAC ),
.DES_IP (DES_IP )
)
u_udp(
.rst_n (sys_rst_n ),
.gmii_rx_clk (gmii_rx_clk ),//gmii接收
.gmii_rx_dv (gmii_rx_dv ),
.gmii_rxd (gmii_rxd ),
.gmii_tx_clk (gmii_tx_clk ),//gmii发送
.gmii_tx_en (gmii_tx_en ),
.gmii_txd (gmii_txd ),
.rec_pkt_done (rec_pkt_done), //数据包接收结束
.rec_en (rec_en ), //四字节接收使能
.rec_data (rec_data ), //接收数据
.rec_byte_num (rec_byte_num), //接收到的有效数据长度
.tx_start_en (rec_pkt_done), //发送使能
.tx_data (tx_data ), //发送数据
.tx_byte_num (rec_byte_num), //发送长度
.tx_done (udp_tx_done ), //发送结束
.tx_req (tx_req ) //四字节发送使能
);
//同步FIFO
fifo_generator_0 u_sync_fifo_2048x32b (
.clk (gmii_rx_clk ), // input wire clk
.srst (~sys_rst_n ), // input wire rst
.din (rec_data ), // input wire [31 : 0] din
.wr_en (rec_en ), // input wire wr_en
.rd_en (tx_req ), // input wire rd_en
.dout (tx_data ), // output wire [31 : 0] dout
.full ( ), // output wire full
.empty ( ) // output wire empty
);
endmodule