module udp_top(
    input                rst_n       , //¸´Î»ÐÅºÅ£¬µÍµçÆ½ÓÐÐ§
    //GMII½Ó¿Ú
    input                gmii_rx_clk , //GMII½ÓÊÕÊý¾ÝÊ±ÖÓ
    input                gmii_rx_dv  , //GMIIÊäÈëÊý¾ÝÓÐÐ§ÐÅºÅ
    input        [7:0]   gmii_rxd    , //GMIIÊäÈëÊý¾Ý
    input                gmii_tx_clk , //GMII·¢ËÍÊý¾ÝÊ±ÖÓ    
    output               gmii_tx_en  , //GMIIÊä³öÊý¾ÝÓÐÐ§ÐÅºÅ
    output       [7:0]   gmii_txd    , //GMIIÊä³öÊý¾Ý 
    //ÓÃ»§½Ó¿Ú
    output               rec_pkt_done, //ÒÔÌ«Íøµ¥°üÊý¾Ý½ÓÊÕÍê³ÉÐÅºÅ
    output               rec_en      , //ÒÔÌ«Íø½ÓÊÕµÄÊý¾ÝÊ¹ÄÜÐÅºÅ
    output       [31:0]  rec_data    , //ÒÔÌ«Íø½ÓÊÕµÄÊý¾Ý
    output       [15:0]  rec_byte_num, //ÒÔÌ«Íø½ÓÊÕµÄÓÐÐ§×Ö½ÚÊý µ¥Î»:byte     
    input                tx_start_en , //ÒÔÌ«Íø¿ªÊ¼·¢ËÍÐÅºÅ
    input        [31:0]  tx_data     , //ÒÔÌ«Íø´ý·¢ËÍÊý¾Ý  
    input        [15:0]  tx_byte_num , //ÒÔÌ«Íø·¢ËÍµÄÓÐÐ§×Ö½ÚÊý µ¥Î»:byte  
    input        [47:0]  des_mac     , //·¢ËÍµÄÄ¿±êMACµØÖ·
    input        [31:0]  des_ip      , //·¢ËÍµÄÄ¿±êIPµØÖ·    
    output               tx_done     , //ÒÔÌ«Íø·¢ËÍÍê³ÉÐÅºÅ
    output               tx_req        //¶ÁÊý¾ÝÇëÇóÐÅºÅ    
    );

//parameter define
//¿ª·¢°åMACµØÖ· 00-11-22-33-44-55
parameter BOARD_MAC = 48'h00_11_22_33_44_55;    
//¿ª·¢°åIPµØÖ· 192.168.1.10     
parameter BOARD_IP  = {8'd192,8'd168,8'd1,8'd10};
//Ä¿µÄMACµØÖ· ff_ff_ff_ff_ff_ff
parameter  DES_MAC  = 48'hff_ff_ff_ff_ff_ff;
//Ä¿µÄIPµØÖ· 192.168.1.102     
parameter  DES_IP   = {8'd192,8'd168,8'd1,8'd102};

//wire define
wire          crc_en  ; //CRC¿ªÊ¼Ð£ÑéÊ¹ÄÜ
wire          crc_clr ; //CRCÊý¾Ý¸´Î»ÐÅºÅ 
wire  [7:0]   crc_d8  ; //ÊäÈë´ýÐ£Ñé8Î»Êý¾Ý

wire  [31:0]  crc_data; //CRCÐ£ÑéÊý¾Ý
wire  [31:0]  crc_next; //CRCÏÂ´ÎÐ£ÑéÍê³ÉÊý¾Ý

//*****************************************************
//**                    main code
//*****************************************************

assign  crc_d8 = gmii_txd;

//ÒÔÌ«Íø½ÓÊÕÄ£¿é    
udp_rx 
   #(
    .BOARD_MAC       (BOARD_MAC),         //²ÎÊýÀý»¯
    .BOARD_IP        (BOARD_IP )
    )
   u_udp_rx(
    .clk             (gmii_rx_clk ),        
    .rst_n           (rst_n       ),             
    .gmii_rx_dv      (gmii_rx_dv  ),                                 
    .gmii_rxd        (gmii_rxd    ),       
    .rec_pkt_done    (rec_pkt_done),      
    .rec_en          (rec_en      ),            
    .rec_data        (rec_data    ),          
    .rec_byte_num    (rec_byte_num)       
    );                                    

//ÒÔÌ«Íø·¢ËÍÄ£¿é
udp_tx
   #(
    .BOARD_MAC       (BOARD_MAC),         //²ÎÊýÀý»¯
    .BOARD_IP        (BOARD_IP ),
    .DES_MAC         (DES_MAC  ),
    .DES_IP          (DES_IP   )
    )
   u_udp_tx(
    .clk             (gmii_tx_clk),        
    .rst_n           (rst_n      ),             
    .tx_start_en     (tx_start_en),                   
    .tx_data         (tx_data    ),           
    .tx_byte_num     (tx_byte_num),    
    .des_mac         (des_mac    ),
    .des_ip          (des_ip     ),    
    .crc_data        (crc_data   ),          
    .crc_next        (crc_next[31:24]),
    .tx_done         (tx_done    ),           
    .tx_req          (tx_req     ),            
    .gmii_tx_en      (gmii_tx_en ),         
    .gmii_txd        (gmii_txd   ),       
    .crc_en          (crc_en     ),            
    .crc_clr         (crc_clr    )            
    );                                      

//ÒÔÌ«Íø·¢ËÍCRCÐ£ÑéÄ£¿é
crc32_d8   u_crc32_d8(
    .clk             (gmii_tx_clk),                      
    .rst_n           (rst_n      ),                          
    .data            (crc_d8     ),            
    .crc_en          (crc_en     ),                          
    .crc_clr         (crc_clr    ),                         
    .crc_data        (crc_data   ),                        
    .crc_next        (crc_next   )                         
    );

endmodule