⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mac_tx_ctrl.v

📁 verilog实现的异步UART代码
💻 V
📖 第 1 页 / 共 2 页
字号:
//////////////////////////////////////////////////////////////////////////                                                              ////////  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 + -