OpenCores
URL https://opencores.org/ocsvn/ethernet_tri_mode/ethernet_tri_mode/trunk

Subversion Repositories ethernet_tri_mode

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /ethernet_tri_mode/trunk/rtl/verilog/RMON
    from Rev 19 to Rev 33
    Reverse comparison

Rev 19 → Rev 33

/RMON_addr_gen.v
0,0 → 1,292
//////////////////////////////////////////////////////////////////////
//// ////
//// RMON_addr_gen.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: not supported by cvs2svn $
// Revision 1.3 2006/01/19 14:07:55 maverickist
// verification is complete.
//
// Revision 1.2 2005/12/16 06:44:19 Administrator
// replaced tab with space.
// passed 9.6k length frame test.
//
// Revision 1.1.1.1 2005/12/13 01:51:45 Administrator
// no message
//
module RMON_addr_gen(
Clk ,
Reset ,
//RMON
Pkt_type_rmon ,
Pkt_length_rmon ,
Apply_rmon ,//pluse signal looks like eop
Pkt_err_type_rmon ,
//
Reg_apply ,
Reg_addr ,
Reg_data ,
Reg_next ,
//CPU
Reg_drop_apply
);
input Clk ;
input Reset ;
//RMON
input [2:0] Pkt_type_rmon ;
input [15:0] Pkt_length_rmon ;
input Apply_rmon ;//pluse signal looks like eop
input [2:0] Pkt_err_type_rmon ;
//RMON_ctrl
output Reg_apply ;
output [4:0] Reg_addr ;
output [15:0] Reg_data ;
input Reg_next ;
//CPU
output Reg_drop_apply ;
 
//******************************************************************************
//internal signals
//******************************************************************************
parameter StateIdle =4'd0;
parameter StatePktLength =4'd1;
parameter StatePktNumber =4'd2;
parameter StatePktType =4'd3;
parameter StatePktRange =4'd4;
 
reg [3:0] CurrentState /* synthesys syn_keep=1 */;
reg [3:0] NextState;
reg [2:0] PktTypeReg ;
reg [15:0] PktLengthReg ;
reg [2:0] PktErrTypeReg ;
reg Reg_apply ;
reg [4:0] Reg_addr ;
reg [15:0] Reg_data ;
reg Reg_drop_apply ;
//******************************************************************************
//register boundery signals
//******************************************************************************
reg Apply_rmon_dl1;
reg Apply_rmon_dl2;
reg Apply_rmon_pulse;
reg [2:0] Pkt_type_rmon_dl1 ;
reg [15:0] Pkt_length_rmon_dl1 ;
reg [2:0] Pkt_err_type_rmon_dl1 ;
 
always @(posedge Clk or posedge Reset)
if (Reset)
begin
Pkt_type_rmon_dl1 <=0;
Pkt_length_rmon_dl1 <=0;
Pkt_err_type_rmon_dl1 <=0;
end
else
begin
Pkt_type_rmon_dl1 <=Pkt_type_rmon ;
Pkt_length_rmon_dl1 <=Pkt_length_rmon ;
Pkt_err_type_rmon_dl1 <=Pkt_err_type_rmon ;
end
 
always @(posedge Clk or posedge Reset)
if (Reset)
begin
Apply_rmon_dl1 <=0;
Apply_rmon_dl2 <=0;
end
else
begin
Apply_rmon_dl1 <=Apply_rmon;
Apply_rmon_dl2 <=Apply_rmon_dl1;
end
always @(Apply_rmon_dl1 or Apply_rmon_dl2)
if (Apply_rmon_dl1&!Apply_rmon_dl2)
Apply_rmon_pulse =1;
else
Apply_rmon_pulse =0;
 
 
always @(posedge Clk or posedge Reset)
if (Reset)
begin
PktTypeReg <=0;
PktLengthReg <=0;
PktErrTypeReg <=0;
end
else if (Apply_rmon_pulse&&CurrentState==StateIdle)
begin
PktTypeReg <=Pkt_type_rmon_dl1 ;
PktLengthReg <=Pkt_length_rmon_dl1 ;
PktErrTypeReg <=Pkt_err_type_rmon_dl1 ;
end
 
//******************************************************************************
//State Machine
//******************************************************************************
always @(posedge Clk or posedge Reset)
if (Reset)
CurrentState <=StateIdle;
else
CurrentState <=NextState;
always @(CurrentState or Apply_rmon_pulse or Reg_next)
case (CurrentState)
StateIdle:
if (Apply_rmon_pulse)
NextState =StatePktLength;
else
NextState =StateIdle;
StatePktLength:
if (Reg_next)
NextState =StatePktNumber;
else
NextState =CurrentState;
StatePktNumber:
if (Reg_next)
NextState =StatePktType;
else
NextState =CurrentState;
StatePktType:
if (Reg_next)
NextState =StatePktRange;
else
NextState =CurrentState;
StatePktRange:
if (Reg_next)
NextState =StateIdle;
else
NextState =CurrentState;
default:
NextState =StateIdle;
endcase
//******************************************************************************
//gen output signals
//******************************************************************************
//Reg_apply
always @ (CurrentState)
if (CurrentState==StatePktLength||CurrentState==StatePktNumber||
CurrentState==StatePktType||CurrentState==StatePktRange)
Reg_apply =1;
else
Reg_apply =0;
//Reg_addr
always @ (posedge Clk or posedge Reset)
if (Reset)
Reg_addr <=0;
else case (CurrentState)
StatePktLength:
Reg_addr <=5'd00;
StatePktNumber:
Reg_addr <=5'd01;
StatePktType:
case(PktTypeReg)
3'b011:
Reg_addr <=5'd02; //broadcast
3'b001:
Reg_addr <=5'd03; //multicast
3'b100:
Reg_addr <=5'd16; //pause frame
default:
Reg_addr <=5'd04; //unicast
endcase
StatePktRange:
case(PktErrTypeReg)
3'b001:
Reg_addr <=5'd05;
3'b010:
Reg_addr <=5'd06;
3'b011:
Reg_addr <=5'd07;
3'b100:
if (PktLengthReg<64)
Reg_addr <=5'd08;
else if (PktLengthReg==64)
Reg_addr <=5'd09;
else if (PktLengthReg<128)
Reg_addr <=5'd10;
else if (PktLengthReg<256)
Reg_addr <=5'd11;
else if (PktLengthReg<512)
Reg_addr <=5'd12;
else if (PktLengthReg<1024)
Reg_addr <=5'd13;
else if (PktLengthReg<1519)
Reg_addr <=5'd14;
else
Reg_addr <=5'd15;
default:
Reg_addr <=5'd05;
endcase
default:
Reg_addr <=5'd05;
endcase
//Reg_data
always @ (CurrentState or PktLengthReg)
case (CurrentState)
StatePktLength:
Reg_data =PktLengthReg;
StatePktNumber:
Reg_data =1;
StatePktType:
Reg_data =1;
StatePktRange:
Reg_data =1;
default:
Reg_data =0;
endcase
//Reg_drop_apply
always @ (posedge Clk or posedge Reset)
if (Reset)
Reg_drop_apply <=0;
else if (CurrentState!=StateIdle&&Apply_rmon_pulse)
Reg_drop_apply <=1;
else
Reg_drop_apply <=0;
 
endmodule
/RMON_ctrl.v
0,0 → 1,287
//////////////////////////////////////////////////////////////////////
//// ////
//// RMON_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: not supported by cvs2svn $
// Revision 1.3 2006/01/19 14:07:55 maverickist
// verification is complete.
//
// Revision 1.2 2005/12/16 06:44:19 Administrator
// replaced tab with space.
// passed 9.6k length frame test.
//
// Revision 1.1.1.1 2005/12/13 01:51:45 Administrator
// no message
//
module RMON_CTRL (
Clk ,
Reset ,
//RMON_CTRL
Reg_apply_0 ,
Reg_addr_0 ,
Reg_data_0 ,
Reg_next_0 ,
Reg_apply_1 ,
Reg_addr_1 ,
Reg_data_1 ,
Reg_next_1 ,
//dual-port ram
Addra ,
Dina ,
Douta ,
Wea ,
//CPU
CPU_rd_addr ,
CPU_rd_apply ,
CPU_rd_grant ,
CPU_rd_dout
 
);
input Clk ;
input Reset ;
//RMON_CTRL
input Reg_apply_0 ;
input [4:0] Reg_addr_0 ;
input [15:0] Reg_data_0 ;
output Reg_next_0 ;
input Reg_apply_1 ;
input [4:0] Reg_addr_1 ;
input [15:0] Reg_data_1 ;
output Reg_next_1 ;
//dual-port ram
//port-a for Rmon
output [5:0] Addra ;
output [31:0] Dina ;
input [31:0] Douta ;
output Wea ;
//CPU
input [5:0] CPU_rd_addr ;
input CPU_rd_apply ;
output CPU_rd_grant ;
output [31:0] CPU_rd_dout ;
 
 
 
 
//******************************************************************************
//internal signals
//******************************************************************************
 
parameter StateCPU =4'd00;
parameter StateMAC0 =4'd01;
parameter StateMAC1 =4'd02;
 
 
reg [3:0] CurrentState /* synthesys syn_keep=1 */;
reg [3:0] NextState;
reg [3:0] CurrentState_reg;
 
reg [4:0] StepCounter;
reg [31:0] DoutaReg;
reg [5:0] Addra ;
reg [31:0] Dina;
reg Reg_next_0 ;
reg Reg_next_1 ;
reg Write;
reg Read;
reg Pipeline;
reg [31:0] CPU_rd_dout ;
reg CPU_rd_apply_reg ;
//******************************************************************************
//State Machine
//******************************************************************************
 
always @(posedge Clk or posedge Reset)
if (Reset)
CurrentState <=StateMAC0;
else
CurrentState <=NextState;
always @(posedge Clk or posedge Reset)
if (Reset)
CurrentState_reg <=StateMAC0;
else if(CurrentState!=StateCPU)
CurrentState_reg <=CurrentState;
always @(CurrentState or CPU_rd_apply_reg or Reg_apply_0 or CurrentState_reg
or Reg_apply_1
or StepCounter
)
case(CurrentState)
StateMAC0:
if(!Reg_apply_0&&CPU_rd_apply_reg)
NextState =StateCPU;
else if(!Reg_apply_0)
NextState =StateMAC1;
else
NextState =CurrentState;
StateMAC1:
if(!Reg_apply_1&&CPU_rd_apply_reg)
NextState =StateCPU;
else if(!Reg_apply_1)
NextState =StateMAC0;
else
NextState =CurrentState;
StateCPU:
if (StepCounter==3)
case (CurrentState_reg)
StateMAC0 :NextState =StateMAC0 ;
StateMAC1 :NextState =StateMAC1 ;
default :NextState =StateMAC0;
endcase
else
NextState =CurrentState;
default:
NextState =StateMAC0;
endcase
 
 
always @(posedge Clk or posedge Reset)
if (Reset)
StepCounter <=0;
else if(NextState!=CurrentState)
StepCounter <=0;
else if (StepCounter!=4'hf)
StepCounter <=StepCounter + 1;
 
//******************************************************************************
//temp signals
//******************************************************************************
always @(StepCounter)
if( StepCounter==1||StepCounter==4||
StepCounter==7||StepCounter==10)
Read =1;
else
Read =0;
 
always @(StepCounter or CurrentState)
if( StepCounter==2||StepCounter==5||
StepCounter==8||StepCounter==11)
Pipeline =1;
else
Pipeline =0;
always @(StepCounter or CurrentState)
if( StepCounter==3||StepCounter==6||
StepCounter==9||StepCounter==12)
Write =1;
else
Write =0;
always @(posedge Clk or posedge Reset)
if (Reset)
DoutaReg <=0;
else if (Read)
DoutaReg <=Douta;
//******************************************************************************
//gen output signals
//******************************************************************************
//Addra
always @(*)
case(CurrentState)
StateMAC0 : Addra={1'd0 ,Reg_addr_0 };
StateMAC1 : Addra={1'd1 ,Reg_addr_1 };
StateCPU: Addra=CPU_rd_addr;
default: Addra=0;
endcase
//Dina
always @(posedge Clk or posedge Reset)
if (Reset)
Dina <=0;
else
case(CurrentState)
StateMAC0 : Dina<=Douta+Reg_data_0 ;
StateMAC1 : Dina<=Douta+Reg_data_1 ;
StateCPU: Dina<=0;
default: Dina<=0;
endcase
assign Wea =Write;
//Reg_next
always @(CurrentState or Pipeline)
if(CurrentState==StateMAC0)
Reg_next_0 =Pipeline;
else
Reg_next_0 =0;
always @(CurrentState or Pipeline)
if(CurrentState==StateMAC1)
Reg_next_1 =Pipeline;
else
Reg_next_1 =0;
 
 
//CPU_rd_grant
reg CPU_rd_apply_dl1;
reg CPU_rd_apply_dl2;
//rising edge
always @ (posedge Clk or posedge Reset)
if (Reset)
begin
CPU_rd_apply_dl1 <=0;
CPU_rd_apply_dl2 <=0;
end
else
begin
CPU_rd_apply_dl1 <=CPU_rd_apply;
CPU_rd_apply_dl2 <=CPU_rd_apply_dl1;
end
 
always @ (posedge Clk or posedge Reset)
if (Reset)
CPU_rd_apply_reg <=0;
else if (CPU_rd_apply_dl1&!CPU_rd_apply_dl2)
CPU_rd_apply_reg <=1;
else if (CurrentState==StateCPU&&Write)
CPU_rd_apply_reg <=0;
 
assign CPU_rd_grant =!CPU_rd_apply_reg;
 
always @ (posedge Clk or posedge Reset)
if (Reset)
CPU_rd_dout <=0;
else if (Pipeline&&CurrentState==StateCPU)
CPU_rd_dout <=Douta;
 
endmodule
/RMON_dpram.v
0,0 → 1,46
module RMON_dpram(
Reset ,
Clk ,
//port-a for Rmon
Addra,
Dina,
Douta,
Wea,
//port-b for CPU
Addrb,
Doutb
);
 
input Reset ;
input Clk ;
//port-a for Rmon
input [5:0] Addra;
input [31:0] Dina;
output [31:0] Douta;
input Wea;
//port-b for CPU
input [5:0] Addrb;
output [31:0] Doutb;
//******************************************************************************
//internal signals
//******************************************************************************
 
wire Clka;
wire Clkb;
assign Clka=Clk;
assign #2 Clkb=Clk;
//******************************************************************************
 
duram #(32,6,"M4K") U_duram(
.data_a (Dina ),
.data_b (32'b0 ),
.wren_a (Wea ),
.wren_b (1'b0 ),
.address_a (Addra ),
.address_b (Addrb ),
.clock_a (Clka ),
.clock_b (Clkb ),
.q_a (Douta ),
.q_b (Doutb ));
 
endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.