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

Subversion Repositories sgmii

[/] [sgmii/] [trunk/] [src/] [mRegisters.v] - Diff between revs 13 and 15

Only display areas with differences | Details | Blame | View Log

Rev 13 Rev 15
/*
/*
Developed By Subtleware Corporation Pte Ltd 2011
Copyright © 2012 JeffLieu-lieumychuong@gmail.com
 
 
 
        This file is part of SGMII-IP-Core.
 
    SGMII-IP-Core is free software: you can redistribute it and/or modify
 
    it under the terms of the GNU General Public License as published by
 
    the Free Software Foundation, either version 3 of the License, or
 
    (at your option) any later version.
 
 
 
    SGMII-IP-Core 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 General Public License for more details.
 
 
 
    You should have received a copy of the GNU General Public License
 
    along with SGMII-IP-Core.  If not, see <http://www.gnu.org/licenses/>.
 
 
File            :
File            :
Description     :
Description     :
Remarks         :
Remarks         :
Revision        :
Revision        :
        Date    Author          Description
        Date    Author          Description
02/09/12        Jefflieu
02/09/12        Jefflieu
*/
*/
`timescale 1ns/100ps
`timescale 1ns/100ps
`include "SGMIIDefs.v"
`include "SGMIIDefs.v"
module mRegisters(
module mRegisters(
        input w_ARstLogic_L,
        input w_ARstLogic_L,
        input i_Clk,
        input i_Clk,
        input i_Cyc,
        input i_Cyc,
        input i_Stb,
        input i_Stb,
        input i_WEn,
        input i_WEn,
        input [07:00] i8_Addr,
        input [07:00] i8_Addr,
        input [31:00] i32_WrData,
        input [31:00] i32_WrData,
        output reg [31:00] o32_RdData,
        output reg [31:00] o32_RdData,
        output reg o_Ack,
        output reg o_Ack,
        output o_Stall,
        output o_Stall,
 
 
        inout io_Mdio,
        inout io_Mdio,
        input i_Mdc,
        input i_Mdc,
 
 
        //This is used in Phy-Side SGMII 
        //This is used in Phy-Side SGMII 
        input   i_PhyLink,
        input   i_PhyLink,
        input   i_PhyDuplex,
        input   i_PhyDuplex,
        input   [1:0] i2_PhySpeed,
        input   [1:0] i2_PhySpeed,
 
 
        //MAC-Side Speed,
        //MAC-Side Speed,
        output  [01:00] o2_SGMIISpeed,
        output  [01:00] o2_SGMIISpeed,
        //MAC-Side Duplex,
        //MAC-Side Duplex,
        output  o_SGMIIDuplex,
        output  o_SGMIIDuplex,
 
 
 
 
        //Register in and out,
        //Register in and out,
        output  [20:00] o21_LinkTimer,
        output  [20:00] o21_LinkTimer,
 
 
        input   [02:00] i3_XmitState,
        input   [02:00] i3_XmitState,
        input   [15:00] i16_TxConfigReg,
        input   [15:00] i16_TxConfigReg,
        output o_MIIRst_L,
        output o_MIIRst_L,
        output o_ANEnable,
        output o_ANEnable,
        output o_ANRestart,
        output o_ANRestart,
        output o_Loopback,
        output o_Loopback,
        output o_GXBPowerDown,
        output o_GXBPowerDown,
        output [15:00] o16_LcAdvAbility,
        output [15:00] o16_LcAdvAbility,
        input   i_ANComplete,
        input   i_ANComplete,
        input   i_SyncStatus,
        input   i_SyncStatus,
        input [15:00] i16_LpAdvAbility);
        input [15:00] i16_LpAdvAbility);
 
 
        //TODO: Local BUs interface to setup registers
        //TODO: Local BUs interface to setup registers
        //Register Write        
        //Register Write        
        wire    w_Write;
        wire    w_Write;
        reg     r_Write;
        reg     r_Write;
        wire    w_WritePulse;
        wire    w_WritePulse;
        wire    [04:00] w5_Addr;
        wire    [04:00] w5_Addr;
        wire    [15:00] w16_WrData;
        wire    [15:00] w16_WrData;
        reg     [15:00] r16_CtrlReg0;
        reg     [15:00] r16_CtrlReg0;
        reg     [15:00] r16_CtrlReg4;
        reg     [15:00] r16_CtrlReg4;
        wire    [15:00] w16_StatusReg1;
        wire    [15:00] w16_StatusReg1;
        reg             [15:00] r16_ModeReg;
        reg             [15:00] r16_ModeReg;
        wire    [15:00] w16_LcAdvAbility;
        wire    [15:00] w16_LcAdvAbility;
        wire    w_UseAsSGMII;
        wire    w_UseAsSGMII;
        reg     r_Read;
        reg     r_Read;
        wire    w_Read;
        wire    w_Read;
        wire    w_ReadPulse;
        wire    w_ReadPulse;
        wire    w_SGMII_PHY;
        wire    w_SGMII_PHY;
        reg [20:00] r21_LinkTimer;
        reg [20:00] r21_LinkTimer;
        reg [15:00] r16_ScratchRev;
        reg [15:00] r16_ScratchRev;
        wire w_UseLcConfig;
        wire w_UseLcConfig;
 
 
        assign o21_LinkTimer = r21_LinkTimer;
        assign o21_LinkTimer = r21_LinkTimer;
        assign w5_Addr = i8_Addr[6:2];
        assign w5_Addr = i8_Addr[6:2];
        assign w16_WrData = i32_WrData[15:00];
        assign w16_WrData = i32_WrData[15:00];
        assign w_Write = (i_Cyc & i_Stb & i_WEn);
        assign w_Write = (i_Cyc & i_Stb & i_WEn);
        assign w_WritePulse = w_Write & (~r_Write);
        assign w_WritePulse = w_Write & (~r_Write);
        assign w_Read = (i_Cyc & i_Stb & (~i_WEn));
        assign w_Read = (i_Cyc & i_Stb & (~i_WEn));
        assign w_ReadPulse = w_Read & (~r_Read);
        assign w_ReadPulse = w_Read & (~r_Read);
        assign o_Stall = (w_Write|w_Read)&(~o_Ack);
        assign o_Stall = (w_Write|w_Read)&(~o_Ack);
        always@(posedge i_Clk or negedge w_ARstLogic_L)
        always@(posedge i_Clk or negedge w_ARstLogic_L)
        if(w_ARstLogic_L==1'b0)
        if(w_ARstLogic_L==1'b0)
                begin
                begin
                        r16_CtrlReg4 <= `cReg4Default;
                        r16_CtrlReg4 <= `cReg4Default;
                        r16_CtrlReg0 <= `cReg0Default;
                        r16_CtrlReg0 <= `cReg0Default;
                        r16_ModeReg  <= `cRegXDefault;
                        r16_ModeReg  <= `cRegXDefault;
                        r21_LinkTimer <= `cRegLinkTimerDefault;
                        r21_LinkTimer <= `cRegLinkTimerDefault;
                        r16_ScratchRev <= 16'h1_0_00;
                        r16_ScratchRev <= 16'h1_0_00;
                end
                end
        else
        else
        begin
        begin
                //Write Controller
                //Write Controller
                r_Write <= w_Write;
                r_Write <= w_Write;
                o_Ack  <= w_WritePulse|w_ReadPulse;
                o_Ack  <= w_WritePulse|w_ReadPulse;
                //Control Register 0
                //Control Register 0
                if(w_WritePulse && w5_Addr==5'b00000) r16_CtrlReg0 <= w16_WrData;
                if(w_WritePulse && w5_Addr==5'b00000) r16_CtrlReg0 <= w16_WrData;
                else begin
                else begin
                        if(i3_XmitState==`cXmitCONFIG) r16_CtrlReg0[9] <= 1'b0;
                        if(i3_XmitState==`cXmitCONFIG) r16_CtrlReg0[9] <= 1'b0;
                        r16_CtrlReg0[15] <= 1'b0;
                        r16_CtrlReg0[15] <= 1'b0;
                end
                end
 
 
 
 
                if(w_WritePulse && w5_Addr==5'b00100) r16_CtrlReg4 <= w16_WrData;
                if(w_WritePulse && w5_Addr==5'b00100) r16_CtrlReg4 <= w16_WrData;
 
 
                if(w_WritePulse && w5_Addr==5'b01000) r21_LinkTimer[15:00] <= w16_WrData;
                if(w_WritePulse && w5_Addr==5'b01000) r21_LinkTimer[15:00] <= w16_WrData;
                if(w_WritePulse && w5_Addr==5'b01001) r21_LinkTimer[20:16] <= w16_WrData[4:0];
                if(w_WritePulse && w5_Addr==5'b01001) r21_LinkTimer[20:16] <= w16_WrData[4:0];
                if(w_WritePulse && w5_Addr==5'b01010) r16_ScratchRev    <= w16_WrData;
                if(w_WritePulse && w5_Addr==5'b01010) r16_ScratchRev    <= w16_WrData;
                if(w_WritePulse && w5_Addr==5'b11111) r16_ModeReg               <= w16_WrData;
                if(w_WritePulse && w5_Addr==5'b11111) r16_ModeReg               <= w16_WrData;
 
 
                //Read Controller
                //Read Controller
                r_Read <= w_Read;
                r_Read <= w_Read;
 
 
                if(w_ReadPulse)
                if(w_ReadPulse)
                        case(w5_Addr)
                        case(w5_Addr)
                        5'h00:          o32_RdData <= {16'h0,r16_CtrlReg0};
                        5'h00:          o32_RdData <= {16'h0,r16_CtrlReg0};
                        5'h01:          o32_RdData <= {16'h0,w16_StatusReg1};
                        5'h01:          o32_RdData <= {16'h0,w16_StatusReg1};
                        5'h02:          o32_RdData <= 32'h0;
                        5'h02:          o32_RdData <= 32'h0;
                        5'h03:          o32_RdData <= 32'h0;
                        5'h03:          o32_RdData <= 32'h0;
                        5'h04:          o32_RdData <= {16'h0,w16_LcAdvAbility};
                        5'h04:          o32_RdData <= {16'h0,w16_LcAdvAbility};
                        5'h05:          o32_RdData <= {16'h0,i16_LpAdvAbility};
                        5'h05:          o32_RdData <= {16'h0,i16_LpAdvAbility};
                        5'h08:          o32_RdData <= {16'h0,r21_LinkTimer[15:00]};
                        5'h08:          o32_RdData <= {16'h0,r21_LinkTimer[15:00]};
                        5'h09:          o32_RdData <= {16'h0,11'h0,r21_LinkTimer[20:16]};
                        5'h09:          o32_RdData <= {16'h0,11'h0,r21_LinkTimer[20:16]};
                        5'h0A:          o32_RdData <= r16_ScratchRev;
                        5'h0A:          o32_RdData <= r16_ScratchRev;
                        5'h1F:          o32_RdData <= r16_ModeReg;
                        5'h1F:          o32_RdData <= r16_ModeReg;
                        default:        o32_RdData <= 32'h0;
                        default:        o32_RdData <= 32'h0;
                        endcase
                        endcase
        end
        end
        assign o_ANRestart              = r16_CtrlReg0[9];
        assign o_ANRestart              = r16_CtrlReg0[9];
        assign o_MIIRst_L               = ~r16_CtrlReg0[15];
        assign o_MIIRst_L               = ~r16_CtrlReg0[15];
        assign o_ANEnable               = r16_CtrlReg0[12];
        assign o_ANEnable               = r16_CtrlReg0[12];
        assign o_Loopback               = r16_CtrlReg0[14];
        assign o_Loopback               = r16_CtrlReg0[14];
        assign o_GXBPowerDown   = r16_CtrlReg0[11];
        assign o_GXBPowerDown   = r16_CtrlReg0[11];
        assign o16_LcAdvAbility = w16_LcAdvAbility;
        assign o16_LcAdvAbility = w16_LcAdvAbility;
 
 
        assign w16_LcAdvAbility = (w_UseAsSGMII==1'b0)?({1'b0,i16_TxConfigReg[15],r16_CtrlReg4[13:12],3'b000,r16_CtrlReg4[8:7],2'b01,5'b00000})://1000-X mode
        assign w16_LcAdvAbility = (w_UseAsSGMII==1'b0)?({1'b0,i16_TxConfigReg[15],r16_CtrlReg4[13:12],3'b000,r16_CtrlReg4[8:7],2'b01,5'b00000})://1000-X mode
                                                                ((w_SGMII_PHY==1'b1)?({i_PhyLink,i16_TxConfigReg[15],1'b0,(i_PhyDuplex|r16_CtrlReg4[12]),(i2_PhySpeed|r16_CtrlReg4[11:10]),10'h1})://SGMII mode - PHY Side
                                                                ((w_SGMII_PHY==1'b1)?({i_PhyLink,i16_TxConfigReg[15],1'b0,(i_PhyDuplex|r16_CtrlReg4[12]),(i2_PhySpeed|r16_CtrlReg4[11:10]),10'h1})://SGMII mode - PHY Side
                                                                ({1'b0,i16_TxConfigReg[15],1'b0,3'b000,10'h1}));//SGMII mode - MAC Side
                                                                ({1'b0,i16_TxConfigReg[15],1'b0,3'b000,10'h1}));//SGMII mode - MAC Side
 
 
        assign w16_StatusReg1 = {9'h0,i_ANComplete,2'b01,i_SyncStatus,2'b0};
        assign w16_StatusReg1 = {9'h0,i_ANComplete,2'b01,i_SyncStatus,2'b0};
        assign w_UseAsSGMII     = r16_ModeReg[0];
        assign w_UseAsSGMII     = r16_ModeReg[0];
        assign w_SGMII_PHY              = r16_ModeReg[1];
        assign w_SGMII_PHY              = r16_ModeReg[1];
        assign w_UseLcConfig    = r16_ModeReg[2];
        assign w_UseLcConfig    = r16_ModeReg[2];
        assign o2_SGMIISpeed    = (w_UseAsSGMII==1'b0)?2'b10:((w_UseLcConfig==1'b0)?i16_LpAdvAbility[11:10]:{r16_CtrlReg0[6]|i2_PhySpeed[1],r16_CtrlReg0[13]|i2_PhySpeed[0]});
        assign o2_SGMIISpeed    = (w_UseAsSGMII==1'b0)?2'b10:((w_UseLcConfig==1'b0)?i16_LpAdvAbility[11:10]:{r16_CtrlReg0[6]|i2_PhySpeed[1],r16_CtrlReg0[13]|i2_PhySpeed[0]});
        assign o_SGMIIDuplex    = (w_UseAsSGMII==1'b0)?1'b1:((w_UseLcConfig==1'b0)?i16_LpAdvAbility[12]:{r16_CtrlReg0[8]|i_PhyDuplex});
        assign o_SGMIIDuplex    = (w_UseAsSGMII==1'b0)?1'b1:((w_UseLcConfig==1'b0)?i16_LpAdvAbility[12]:{r16_CtrlReg0[8]|i_PhyDuplex});
 
 
endmodule
endmodule
 
 

powered by: WebSVN 2.1.0

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