📄 mac_tx_ff.v
字号:
////////////////////////////////////////////////////////////////////////// //////// MAC_tx_FF.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_FF.v,v $// Revision 1.5 2006/06/25 04:58:56 maverickist// no message//// Revision 1.4 2006/05/28 05:09:20 maverickist// no message//// Revision 1.3 2006/01/19 14:07:54 maverickist// verification is complete.//// Revision 1.3 2005/12/16 06:44:18 Administrator// replaced tab with space.// passed 9.6k length frame test.//// Revision 1.2 2005/12/13 12:15:39 Administrator// no message//// Revision 1.1.1.1 2005/12/13 01:51:45 Administrator// no message// module MAC_tx_FF ( Reset , Clk_MAC , Clk_SYS , //MAC_rx_ctrl interface Fifo_data ,Fifo_rd ,Fifo_rd_finish ,Fifo_rd_retry ,Fifo_eop ,Fifo_da ,Fifo_ra ,Fifo_data_err_empty ,Fifo_data_err_full ,//user interface Tx_mac_wa ,Tx_mac_wr ,Tx_mac_data ,Tx_mac_BE ,Tx_mac_sop ,Tx_mac_eop ,//host interface FullDuplex ,Tx_Hwmark , Tx_Lwmark );input Reset ;input Clk_MAC ;input Clk_SYS ; //MAC_tx_ctrloutput [7:0] Fifo_data ;input Fifo_rd ;input Fifo_rd_finish ;input Fifo_rd_retry ;output Fifo_eop ;output Fifo_da ;output Fifo_ra ;output Fifo_data_err_empty ;output Fifo_data_err_full ; //user interface output Tx_mac_wa ;input Tx_mac_wr ;input [31:0] Tx_mac_data ;input [1:0] Tx_mac_BE ;//big endianinput Tx_mac_sop ;input Tx_mac_eop ; //host interface input FullDuplex ;input [4:0] Tx_Hwmark ;input [4:0] Tx_Lwmark ;//******************************************************************************//internal signals //******************************************************************************parameter MAC_byte3 =4'd00; parameter MAC_byte2 =4'd01;parameter MAC_byte1 =4'd02; parameter MAC_byte0 =4'd03; parameter MAC_wait_finish =4'd04;parameter MAC_retry =4'd08;parameter MAC_idle =4'd09;parameter MAC_FFEmpty =4'd10;parameter MAC_FFEmpty_drop =4'd11;parameter MAC_pkt_sub =4'd12;parameter MAC_FF_Err =4'd13;reg [3:0] Current_state_MAC /* synthesis syn_preserve =1 */ ; reg [3:0] Current_state_MAC_reg /* synthesis syn_preserve =1 */ ; reg [3:0] Next_state_MAC ;parameter SYS_idle =4'd0;parameter SYS_WaitSop =4'd1;parameter SYS_SOP =4'd2;parameter SYS_MOP =4'd3;parameter SYS_DROP =4'd4;parameter SYS_EOP_ok =4'd5; parameter SYS_FFEmpty =4'd6; parameter SYS_EOP_err =4'd7;parameter SYS_SOP_err =4'd8;reg [3:0] Current_state_SYS /* synthesis syn_preserve =1 */;reg [3:0] Next_state_SYS;reg [`MAC_RX_FF_DEPTH-1:0] Add_wr ;reg [`MAC_RX_FF_DEPTH-1:0] Add_wr_ungray ;reg [`MAC_RX_FF_DEPTH-1:0] Add_wr_gray ;reg [`MAC_RX_FF_DEPTH-1:0] Add_wr_gray_dl1 ;wire[`MAC_RX_FF_DEPTH-1:0] Add_wr_gray_tmp ;reg [`MAC_RX_FF_DEPTH-1:0] Add_rd ;reg [`MAC_RX_FF_DEPTH-1:0] Add_rd_reg ;reg [`MAC_RX_FF_DEPTH-1:0] Add_rd_gray ;reg [`MAC_RX_FF_DEPTH-1:0] Add_rd_gray_dl1 ;wire[`MAC_RX_FF_DEPTH-1:0] Add_rd_gray_tmp ;reg [`MAC_RX_FF_DEPTH-1:0] Add_rd_ungray ;wire[35:0] Din ;wire[35:0] Dout ;reg Wr_en ;wire[`MAC_RX_FF_DEPTH-1:0] Add_wr_pluse ;wire[`MAC_RX_FF_DEPTH-1:0] Add_wr_pluse_pluse;wire[`MAC_RX_FF_DEPTH-1:0] Add_rd_pluse ;reg [`MAC_RX_FF_DEPTH-1:0] Add_rd_reg_dl1 ;reg Full /* synthesis syn_keep=1 */;reg AlmostFull /* synthesis syn_keep=1 */;reg Empty /* synthesis syn_keep=1 */;reg Tx_mac_wa ;reg Tx_mac_wr_dl1 ;reg [31:0] Tx_mac_data_dl1 ;reg [1:0] Tx_mac_BE_dl1 ;reg Tx_mac_sop_dl1 ;reg Tx_mac_eop_dl1 ;reg FF_FullErr ;wire[1:0] Dout_BE ;wire Dout_eop ;wire Dout_err ;wire[31:0] Dout_data ; reg [35:0] Dout_reg /* synthesis syn_preserve=1 */;reg Packet_number_sub_dl1 ;reg Packet_number_sub_dl2 ;reg Packet_number_sub_edge /* synthesis syn_preserve=1 */;reg Packet_number_add /* synthesis syn_preserve=1 */;reg [4:0] Fifo_data_count ;reg Fifo_ra /* synthesis syn_keep=1 */;reg [7:0] Fifo_data ;reg Fifo_da ;reg Fifo_data_err_empty /* synthesis syn_preserve=1 */;reg Fifo_eop ;reg Fifo_rd_dl1 ;reg Fifo_ra_tmp ; reg [5:0] Packet_number_inFF /* synthesis syn_keep=1 */; reg [5:0] Packet_number_inFF_reg /* synthesis syn_preserve=1 */;reg Pkt_sub_apply_tmp ;reg Pkt_sub_apply ;reg Add_rd_reg_rdy_tmp ;reg Add_rd_reg_rdy ; reg Add_rd_reg_rdy_dl1 ; reg Add_rd_reg_rdy_dl2 ;reg [4:0] Tx_Hwmark_pl ;reg [4:0] Tx_Lwmark_pl ;reg Add_rd_jump_tmp ;reg Add_rd_jump_tmp_pl1 ;reg Add_rd_jump ;reg Add_rd_jump_wr_pl1 ;integer i ;//******************************************************************************//write data to from FF .//domain Clk_SYS//******************************************************************************always @ (posedge Clk_SYS or posedge Reset) if (Reset) Current_state_SYS <=SYS_idle; else Current_state_SYS <=Next_state_SYS; always @ (Current_state_SYS or Tx_mac_wr or Tx_mac_sop or Full or AlmostFull or Tx_mac_eop ) case (Current_state_SYS) SYS_idle: if (Tx_mac_wr&&Tx_mac_sop&&!Full) Next_state_SYS =SYS_SOP; else Next_state_SYS =Current_state_SYS ; SYS_SOP: Next_state_SYS =SYS_MOP; SYS_MOP: if (AlmostFull) Next_state_SYS =SYS_DROP; else if (Tx_mac_wr&&Tx_mac_sop) Next_state_SYS =SYS_SOP_err; else if (Tx_mac_wr&&Tx_mac_eop) Next_state_SYS =SYS_EOP_ok; else Next_state_SYS =Current_state_SYS ; SYS_EOP_ok: if (Tx_mac_wr&&Tx_mac_sop) Next_state_SYS =SYS_SOP; else Next_state_SYS =SYS_idle; SYS_EOP_err: if (Tx_mac_wr&&Tx_mac_sop) Next_state_SYS =SYS_SOP; else Next_state_SYS =SYS_idle; SYS_SOP_err: Next_state_SYS =SYS_DROP; SYS_DROP: //FIFO overflow if (Tx_mac_wr&&Tx_mac_eop) Next_state_SYS =SYS_EOP_err; else Next_state_SYS =Current_state_SYS ; default: Next_state_SYS =SYS_idle; endcase //delay signals always @ (posedge Clk_SYS or posedge Reset) if (Reset) begin Tx_mac_wr_dl1 <=0; Tx_mac_data_dl1 <=0; Tx_mac_BE_dl1 <=0; Tx_mac_sop_dl1 <=0; Tx_mac_eop_dl1 <=0; end else begin Tx_mac_wr_dl1 <=Tx_mac_wr ; Tx_mac_data_dl1 <=Tx_mac_data ; Tx_mac_BE_dl1 <=Tx_mac_BE ; Tx_mac_sop_dl1 <=Tx_mac_sop ; Tx_mac_eop_dl1 <=Tx_mac_eop ; end always @(Current_state_SYS) if (Current_state_SYS==SYS_EOP_err) FF_FullErr =1; else FF_FullErr =0; reg Tx_mac_eop_gen;always @(Current_state_SYS) if (Current_state_SYS==SYS_EOP_err||Current_state_SYS==SYS_EOP_ok) Tx_mac_eop_gen =1; else Tx_mac_eop_gen =0; assign Din={Tx_mac_eop_gen,FF_FullErr,Tx_mac_BE_dl1,Tx_mac_data_dl1};always @(Current_state_SYS or Tx_mac_wr_dl1) if ((Current_state_SYS==SYS_SOP||Current_state_SYS==SYS_EOP_ok|| Current_state_SYS==SYS_MOP||Current_state_SYS==SYS_EOP_err)&&Tx_mac_wr_dl1) Wr_en = 1; else Wr_en = 0; // always @ (posedge Reset or posedge Clk_SYS) if (Reset) Add_wr_gray <=0; else begin Add_wr_gray[`MAC_RX_FF_DEPTH-1] <=Add_wr[`MAC_RX_FF_DEPTH-1]; for (i=`MAC_RX_FF_DEPTH-2;i>=0;i=i-1) Add_wr_gray[i] <=Add_wr[i+1]^Add_wr[i]; end //always @ (posedge Clk_SYS or posedge Reset) if (Reset) Add_rd_gray_dl1 <=0; else Add_rd_gray_dl1 <=Add_rd_gray; always @ (posedge Clk_SYS or posedge Reset) if (Reset) Add_rd_jump_wr_pl1 <=0; else Add_rd_jump_wr_pl1 <=Add_rd_jump; always @ (posedge Clk_SYS or posedge Reset) if (Reset) Add_rd_ungray =0; else if (!Add_rd_jump_wr_pl1) begin Add_rd_ungray[`MAC_RX_FF_DEPTH-1] =Add_rd_gray_dl1[`MAC_RX_FF_DEPTH-1]; for (i=`MAC_RX_FF_DEPTH-2;i>=0;i=i-1) Add_rd_ungray[i] =Add_rd_ungray[i+1]^Add_rd_gray_dl1[i]; end assign Add_wr_pluse =Add_wr+1;assign Add_wr_pluse_pluse =Add_wr+4;always @ (Add_wr_pluse or Add_rd_ungray) if (Add_wr_pluse==Add_rd_ungray) Full =1; else Full =0;always @ (posedge Clk_SYS or posedge Reset) if (Reset) AlmostFull <=0; else if (Add_wr_pluse_pluse==Add_rd_ungray) AlmostFull <=1; else AlmostFull <=0; always @ (posedge Clk_SYS or posedge Reset) if (Reset) Add_wr <= 0; else if (Wr_en&&!Full) Add_wr <= Add_wr +1; //always @ (posedge Clk_SYS or posedge Reset) if (Reset) begin Packet_number_sub_dl1 <=0; Packet_number_sub_dl2 <=0; end else begin Packet_number_sub_dl1 <=Pkt_sub_apply; Packet_number_sub_dl2 <=Packet_number_sub_dl1; end always @ (posedge Clk_SYS or posedge Reset) if (Reset) Packet_number_sub_edge <=0; else if (Packet_number_sub_dl1&!Packet_number_sub_dl2) Packet_number_sub_edge <=1; else Packet_number_sub_edge <=0;always @ (posedge Clk_SYS or posedge Reset) if (Reset) Packet_number_add <=0; else if (Current_state_SYS==SYS_EOP_ok||Current_state_SYS==SYS_EOP_err) Packet_number_add <=1; else Packet_number_add <=0; always @ (posedge Clk_SYS or posedge Reset) if (Reset) Packet_number_inFF <=0; else if (Packet_number_add&&!Packet_number_sub_edge) Packet_number_inFF <=Packet_number_inFF + 1'b1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -