📄 mac_tx_ctrl.v
字号:
////////////////////////////////////////////////////////////////////////// //////// MAC_tx_ctrl.v //////// //////// This file is part of the Ethernet IP core project //////// http://www.opencores.org/projects.cgi/web/ethernet_tri_mode///////// //////// Author(s): //////// - Jon Gao (gaojon@yahoo.com) //////// //////// ////////////////////////////////////////////////////////////////////////////// //////// Copyright (C) 2001 Authors //////// //////// This source file may be used and distributed without //////// restriction provided that this copyright statement is not //////// removed from the file and that any derivative work contains //////// the original copyright notice and the associated disclaimer. //////// //////// This source file is free software; you can redistribute it //////// and/or modify it under the terms of the GNU Lesser General //////// Public License as published by the Free Software Foundation; //////// either version 2.1 of the License, or (at your option) any //////// later version. //////// //////// This source is distributed in the hope that it will be //////// useful, but WITHOUT ANY WARRANTY; without even the implied //////// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //////// PURPOSE. See the GNU Lesser General Public License for more //////// details. //////// //////// You should have received a copy of the GNU Lesser General //////// Public License along with this source; if not, download it //////// from http://www.opencores.org/lgpl.shtml //////// //////////////////////////////////////////////////////////////////////////// // CVS Revision History // // $Log: MAC_tx_Ctrl.v,v $// Revision 1.4 2006/06/25 04:58:56 maverickist// no message//// Revision 1.3 2006/01/19 14:07:54 maverickist// verification is complete.//// Revision 1.3 2005/12/16 06:44:17 Administrator// replaced tab with space.// passed 9.6k length frame test.//// Revision 1.2 2005/12/13 12:15:38 Administrator// no message//// Revision 1.1.1.1 2005/12/13 01:51:45 Administrator// no message// module MAC_tx_ctrl ( Reset ,Clk ,//CRC_gen Interface CRC_init ,Frame_data ,Data_en ,CRC_rd ,CRC_end ,CRC_out ,//Ramdon_gen interfacRandom_init ,RetryCnt ,Random_time_meet ,//flow control pause_apply ,pause_quanta_sub ,xoff_gen ,xoff_gen_complete ,xon_gen ,xon_gen_complete ,//MAC_tx_FF Fifo_data ,Fifo_rd ,Fifo_eop ,Fifo_da ,Fifo_rd_finish ,Fifo_rd_retry ,Fifo_ra ,Fifo_data_err_empty ,Fifo_data_err_full ,//RMII TxD ,TxEn ,CRS , //MAC_tx_addr_add MAC_tx_addr_rd ,MAC_tx_addr_data ,MAC_tx_addr_init ,//RMON Tx_pkt_type_rmon ,Tx_pkt_length_rmon ,Tx_apply_rmon ,Tx_pkt_err_type_rmon,//CPU pause_frame_send_en ,pause_quanta_set , MAC_tx_add_en , FullDuplex ,MaxRetry ,IFGset );input Reset ;input Clk ; //CRC_gen Interface output CRC_init ;output [7:0] Frame_data ;output Data_en ;output CRC_rd ;input CRC_end ;input [7:0] CRC_out ; //Ramdon_gen interfaceoutput Random_init ;output [3:0] RetryCnt ;input Random_time_meet ;//levle hight indicate random time passed away //flow controlinput pause_apply ;output pause_quanta_sub ;input xoff_gen ;output xoff_gen_complete ;input xon_gen ;output xon_gen_complete ; //MAC_rx_FFinput [7:0] Fifo_data ;output Fifo_rd ;input Fifo_eop ;input Fifo_da ;output Fifo_rd_finish ;output Fifo_rd_retry ;input Fifo_ra ;input Fifo_data_err_empty ;input Fifo_data_err_full ; //RMIIoutput [7:0] TxD ;output TxEn ; input CRS ; //MAC_tx_addr_addoutput MAC_tx_addr_init ;output MAC_tx_addr_rd ;input [7:0] MAC_tx_addr_data ; //RMONoutput [2:0] Tx_pkt_type_rmon ;output [15:0] Tx_pkt_length_rmon ;output Tx_apply_rmon ;output [2:0] Tx_pkt_err_type_rmon; //CPUinput pause_frame_send_en ; input [15:0] pause_quanta_set ;input MAC_tx_add_en ; input FullDuplex ;input [3:0] MaxRetry ;input [5:0] IFGset ;//****************************************************************************** //internal signals //****************************************************************************** parameter StateIdle =4'd00;parameter StatePreamble =4'd01;parameter StateSFD =4'd02;parameter StateData =4'd03;parameter StatePause =4'd04;parameter StatePAD =4'd05;parameter StateFCS =4'd06;parameter StateIFG =4'd07;parameter StateJam =4'd08;parameter StateBackOff =4'd09;parameter StateJamDrop =4'd10;parameter StateFFEmptyDrop =4'd11;parameter StateSwitchNext =4'd12;parameter StateDefer =4'd13;parameter StateSendPauseFrame =4'd14;reg [3:0] Current_state /*synthesis syn_keep=1 */;reg [3:0] Next_state;reg [5:0] IFG_counter;reg [4:0] Preamble_counter;//reg [7:0] TxD_tmp ; reg TxEn_tmp ; reg [15:0] Tx_pkt_length_rmon ;reg Tx_apply_rmon ;reg Tx_apply_rmon_tmp ;reg Tx_apply_rmon_tmp_pl1;reg [2:0] Tx_pkt_err_type_rmon; reg [3:0] RetryCnt ;reg Random_init ;reg Fifo_rd_finish ;reg Fifo_rd_retry ;reg [7:0] TxD ; reg TxEn ; reg CRC_init ;reg Data_en ;reg CRC_rd ;reg Fifo_rd ;reg MAC_tx_addr_rd ;reg MAC_header_slot ;reg MAC_header_slot_tmp ;reg [2:0] Tx_pkt_type_rmon ;wire Collision ; reg MAC_tx_addr_init ;reg Src_MAC_ptr ;reg [7:0] IPLengthCounter ;//for pad appendreg [1:0] PADCounter ;reg [7:0] JamCounter ;reg PktDrpEvenPtr ;reg [7:0] pause_counter ;reg pause_quanta_sub ;reg pause_frame_send_en_dl1 ; reg [15:0] pause_quanta_set_dl1 ;reg xoff_gen_complete ;reg xon_gen_complete ;//****************************************************************************** //boundery signal processing //****************************************************************************** always @(posedge Clk or posedge Reset) if (Reset) begin pause_frame_send_en_dl1 <=0; pause_quanta_set_dl1 <=0; end else begin pause_frame_send_en_dl1 <=pause_frame_send_en ; pause_quanta_set_dl1 <=pause_quanta_set ; end //****************************************************************************** //state machine //****************************************************************************** assign Collision=TxEn&CRS;always @(posedge Clk or posedge Reset) if (Reset) pause_counter <=0; else if (Current_state!=StatePause) pause_counter <=0; else pause_counter <=pause_counter+1; always @(posedge Clk or posedge Reset) if (Reset) IPLengthCounter <=0; else if (Current_state==StateDefer) IPLengthCounter <=0; else if (IPLengthCounter!=8'hff&&(Current_state==StateData||Current_state==StateSendPauseFrame||Current_state==StatePAD)) IPLengthCounter <=IPLengthCounter+1;always @(posedge Clk or posedge Reset) if (Reset) PADCounter <=0; else if (Current_state!=StatePAD) PADCounter <=0; else PADCounter <=PADCounter+1;always @(posedge Clk or posedge Reset) if (Reset) Current_state <=StateDefer; else Current_state <=Next_state; always @ (*) case (Current_state) StateDefer: if ((FullDuplex)||(!FullDuplex&&!CRS)) Next_state=StateIFG; else Next_state=Current_state; StateIFG: if (!FullDuplex&&CRS) Next_state=StateDefer; else if ((FullDuplex&&IFG_counter==IFGset-4)||(!FullDuplex&&!CRS&&IFG_counter==IFGset-4))//remove some additional time Next_state=StateIdle; else Next_state=Current_state; StateIdle: if (!FullDuplex&&CRS) Next_state=StateDefer; else if (pause_apply) Next_state=StatePause; else if ((FullDuplex&&Fifo_ra)||(!FullDuplex&&!CRS&&Fifo_ra)||(pause_frame_send_en_dl1&&(xoff_gen||xon_gen))) Next_state=StatePreamble; else Next_state=Current_state; StatePause: if (pause_counter==512/8) Next_state=StateDefer; else Next_state=Current_state; StatePreamble: if (!FullDuplex&&Collision) Next_state=StateJam; else if ((FullDuplex&&Preamble_counter==6)||(!FullDuplex&&!Collision&&Preamble_counter==6)) Next_state=StateSFD; else Next_state=Current_state; StateSFD: if (!FullDuplex&&Collision) Next_state=StateJam; else if (pause_frame_send_en_dl1&&(xoff_gen||xon_gen)) Next_state=StateSendPauseFrame; else Next_state=StateData; StateSendPauseFrame: if (IPLengthCounter==17) Next_state=StatePAD; else Next_state=Current_state; StateData: if (!FullDuplex&&Collision) Next_state=StateJam; else if (Fifo_data_err_empty) Next_state=StateFFEmptyDrop; else if (Fifo_eop&&IPLengthCounter>=59)//IP+MAC+TYPE=60 ,start from 0 Next_state=StateFCS; else if (Fifo_eop) Next_state=StatePAD; else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -