]> jspc29.x-matter.uni-frankfurt.de Git - trbnet.git/commitdiff
*** empty log message ***
authorhadeshyp <hadeshyp>
Tue, 8 May 2012 11:58:13 +0000 (11:58 +0000)
committerhadeshyp <hadeshyp>
Tue, 8 May 2012 11:58:13 +0000 (11:58 +0000)
gbe2_ecp3/ipcores_ecp3/sgmii33/rate_resolution.v [new file with mode: 0755]
gbe2_ecp3/ipcores_ecp3/sgmii33/register_interface_hb.v [new file with mode: 0755]
gbe2_ecp3/ipcores_ecp3/sgmii33/reset_controller_cdr.v [new file with mode: 0755]
gbe2_ecp3/ipcores_ecp3/sgmii33/reset_controller_pcs.v [new file with mode: 0755]
gbe2_ecp3/ipcores_ecp3/sgmii33/sgmii_channel_smi.v [new file with mode: 0644]

diff --git a/gbe2_ecp3/ipcores_ecp3/sgmii33/rate_resolution.v b/gbe2_ecp3/ipcores_ecp3/sgmii33/rate_resolution.v
new file mode 100755 (executable)
index 0000000..b9edbef
--- /dev/null
@@ -0,0 +1,66 @@
+//**************************************************************************\r
+// *************************************************************************\r
+// *                LATTICE SEMICONDUCTOR CONFIDENTIAL                     *\r
+// *                         PROPRIETARY NOTE                              *\r
+// *                                                                       *\r
+// *  This software contains information confidential and proprietary      *\r
+// *  to Lattice Semiconductor Corporation.  It shall not be reproduced    *\r
+// *  in whole or in part, or transferred to other documents, or disclosed *\r
+// *  to third parties, or used for any purpose other than that for which  *\r
+// *  it was obtained, without the prior written consent of Lattice        *\r
+// *  Semiconductor Corporation.  All rights reserved.                     *\r
+// *                                                                       *\r
+// *************************************************************************\r
+//**************************************************************************\r
+\r
+`timescale 1ns/100ps\r
+\r
+module rate_resolution (\r
+       gbe_mode,\r
+       sgmii_mode,\r
+       an_enable,\r
+       advertised_rate,\r
+       link_partner_rate,\r
+       non_an_rate,\r
+\r
+       operational_rate\r
+);\r
+\r
+input gbe_mode;\r
+input sgmii_mode;\r
+input an_enable;\r
+input [1:0] advertised_rate; // 00=10Mbps    01=100Mbps    10=1Gbps\r
+input [1:0] link_partner_rate;\r
+input [1:0] non_an_rate;\r
+\r
+output [1:0] operational_rate;\r
+reg [1:0] operational_rate;\r
+\r
+\r
+\r
+always @(gbe_mode or sgmii_mode or an_enable or advertised_rate or link_partner_rate or non_an_rate) begin\r
+       if (gbe_mode) begin\r
+               operational_rate <= 2'b10; // 1Gbps\r
+       end\r
+       else begin\r
+               if (an_enable) begin\r
+                       if (sgmii_mode) begin\r
+                               // PHY Mode\r
+                               operational_rate <= advertised_rate;\r
+                       end\r
+                       else begin\r
+                               // MAC Mode\r
+                               operational_rate <= link_partner_rate;\r
+                       end\r
+               end\r
+               else begin\r
+                       // If auto-negotiation disabled, then this becomes active rate\r
+                       operational_rate <= non_an_rate;\r
+               end\r
+       end\r
+end\r
+\r
+\r
+\r
+endmodule\r
+\r
diff --git a/gbe2_ecp3/ipcores_ecp3/sgmii33/register_interface_hb.v b/gbe2_ecp3/ipcores_ecp3/sgmii33/register_interface_hb.v
new file mode 100755 (executable)
index 0000000..73e0b86
--- /dev/null
@@ -0,0 +1,918 @@
+//**************************************************************************\r
+// *************************************************************************\r
+// *                LATTICE SEMICONDUCTOR CONFIDENTIAL                     *\r
+// *                         PROPRIETARY NOTE                              *\r
+// *                                                                       *\r
+// *  This software contains information confidential and proprietary      *\r
+// *  to Lattice Semiconductor Corporation.  It shall not be reproduced    *\r
+// *  in whole or in part, or transferred to other documents, or disclosed *\r
+// *  to third parties, or used for any purpose other than that for which  *\r
+// *  it was obtained, without the prior written consent of Lattice        *\r
+// *  Semiconductor Corporation.  All rights reserved.                     *\r
+// *                                                                       *\r
+// *************************************************************************\r
+//**************************************************************************\r
+\r
+`timescale 1ns/100ps\r
+\r
+module register_interface_hb (\r
+\r
+       // Control Signals\r
+       rst_n,\r
+       hclk,\r
+       gbe_mode,\r
+       sgmii_mode,\r
+\r
+       // Host Bus\r
+       hcs_n,\r
+       hwrite_n,\r
+       haddr,\r
+       hdatain,\r
+\r
+       hdataout,\r
+       hready_n,\r
+\r
+       // Register Inputs\r
+       mr_an_enable,\r
+       mr_restart_an,\r
+       mr_adv_ability,\r
+\r
+       // Register Outputs\r
+       mr_main_reset,\r
+       mr_an_complete,\r
+       mr_page_rx,\r
+       mr_lp_adv_ability\r
+       );\r
+\r
+\r
+input          rst_n ;\r
+input          hclk ;\r
+input          gbe_mode ;\r
+input          sgmii_mode ;\r
+\r
+input           hcs_n;\r
+input           hwrite_n;\r
+input    [3:0]  haddr;\r
+input    [7:0]  hdatain;\r
+\r
+output   [7:0]  hdataout;\r
+output          hready_n;\r
+\r
+input          mr_an_complete;\r
+input          mr_page_rx;\r
+input [15:0]   mr_lp_adv_ability;\r
+\r
+output         mr_an_enable;\r
+output         mr_restart_an;\r
+output [15:0]  mr_adv_ability;\r
+output         mr_main_reset;\r
+\r
+regs_hb   regs (\r
+       .rst_n (rst_n),\r
+       .hclk (hclk),\r
+\r
+       .gbe_mode (gbe_mode),\r
+       .sgmii_mode (sgmii_mode),\r
+\r
+       .hcs_n (hcs_n),\r
+       .hwrite_n (hwrite_n),\r
+       .haddr (haddr),\r
+       .hdatain (hdatain),\r
+\r
+       .hdataout (hdataout),\r
+       .hready_n (hready_n),\r
+\r
+       .mr_an_complete (mr_an_complete),\r
+       .mr_page_rx (mr_page_rx),\r
+       .mr_lp_adv_ability (mr_lp_adv_ability),\r
+\r
+       .mr_main_reset (mr_main_reset),\r
+       .mr_an_enable (mr_an_enable),\r
+       .mr_restart_an (mr_restart_an),\r
+       .mr_adv_ability (mr_adv_ability)\r
+);\r
+endmodule\r
+\r
+\r
+\r
+\r
+\r
+\r
+module register_0_hb (\r
+       rst_n,\r
+       clk, \r
+       cs_0,\r
+       cs_1,\r
+       write,\r
+       ready,\r
+       data_in,\r
+\r
+       data_out,\r
+       mr_main_reset,\r
+       mr_an_enable,\r
+       mr_restart_an\r
+);\r
+\r
+input           rst_n;\r
+input           clk;\r
+input           cs_0;\r
+input           cs_1;\r
+input           write;\r
+input           ready;\r
+input  [15:0]   data_in;\r
+\r
+output [15:0]   data_out;\r
+output          mr_main_reset; // bit D15 // R/W // Self Clearing\r
+output          mr_an_enable;  // bit D12 // R/W\r
+output          mr_restart_an; // bit D09 // R/W // Self Clearing\r
+\r
+reg [15:0]      data_out;\r
+reg             mr_main_reset;\r
+reg             mr_an_enable;\r
+reg             mr_restart_an;\r
+reg            m_m_r;\r
+reg            m_r_a;\r
+\r
+\r
+// Write Operations\r
+\r
+       // Low Portion of Register[D7:D0] has no\r
+       // implemented bits.  Therefore, no write\r
+       // operations here.\r
+\r
+       // High Portion of Register[D15:D8]\r
+       always @(posedge clk or negedge rst_n) begin\r
+               if (rst_n == 1'b0) begin\r
+                       mr_main_reset <= 0; // default value\r
+                       mr_an_enable <= 1;  // default value\r
+                       mr_restart_an <= 0; // default value\r
+                       m_m_r <= 0;\r
+                       m_r_a <= 0;\r
+               end\r
+               else begin\r
+\r
+                       // Do the Writes\r
+                       if (cs_1 && ready && write) begin\r
+                               mr_main_reset <= data_in[15];\r
+                               mr_an_enable <= data_in[12];\r
+                               mr_restart_an <= data_in[9];\r
+                       end\r
+\r
+                       // Delay the Self Clearing Register Bits\r
+                       m_m_r <= mr_main_reset;\r
+                       m_r_a <= mr_restart_an;\r
+\r
+                       // Do the Self Clearing\r
+                       if (m_m_r)\r
+                               mr_main_reset <= 0;\r
+\r
+                       if (m_r_a)\r
+                               mr_restart_an <= 0;\r
+               end\r
+       end\r
+\r
+\r
+\r
+\r
+\r
+// Read Operations\r
+       always @(*) begin\r
+                       data_out[7:0] = 8'b00000000;\r
+                       data_out[15] = mr_main_reset;\r
+                       data_out[14] = 0;\r
+                       data_out[13] = 0;\r
+                       data_out[12] = mr_an_enable;\r
+                       data_out[11] = 0;\r
+                       data_out[10] = 0;\r
+                       data_out[9]  = mr_restart_an;\r
+                       data_out[8]  = 0;\r
+       end\r
+endmodule\r
+\r
+module register_1_hb (\r
+       rst_n,\r
+       cs_0,\r
+       cs_1,\r
+       mr_an_complete,\r
+\r
+       data_out\r
+);\r
+\r
+input           rst_n;\r
+input           cs_0;\r
+input           cs_1;\r
+input           mr_an_complete; // bit D5 // Read-Only\r
+\r
+output [15:0]   data_out;\r
+\r
+reg [15:0]      data_out;\r
+\r
+\r
+// Read Operations\r
+\r
+       always @(*) begin\r
+                       data_out[7] <= 0;\r
+                       data_out[6] <= 0;\r
+                       data_out[5] <= mr_an_complete;\r
+                       data_out[4] <= 0;\r
+                       data_out[3] <= 0;\r
+                       data_out[2] <= 0;\r
+                       data_out[1] <= 0;\r
+                       data_out[0] <= 0;\r
+                       data_out[15:8] <= 8'b00000000;\r
+       end\r
+endmodule\r
+\r
+module register_4_hb (\r
+       rst_n,\r
+       clk, \r
+       gbe_mode,\r
+       sgmii_mode,\r
+       cs_0,\r
+       cs_1,\r
+       write,\r
+       ready,\r
+       data_in,\r
+\r
+       data_out,\r
+       mr_adv_ability\r
+);\r
+\r
+parameter [15:0] initval_gbe = 16'h0020;\r
+parameter [15:0] initval_phy = 16'hd801;\r
+parameter [15:0] initval_mac = 16'h4001;\r
+\r
+input           rst_n;\r
+input           clk;\r
+input           gbe_mode;\r
+input           sgmii_mode;\r
+input           cs_0;\r
+input           cs_1;\r
+input           write;\r
+input           ready;\r
+input  [15:0]   data_in;\r
+\r
+output [15:0]   data_out;\r
+output [15:0]   mr_adv_ability; // When sgmii_mode == 1 == PHY\r
+                               // all bits D15-D0 are R/W,\r
+                               ///////////////////////////////////\r
+                               // D15 = Link Status (1=up, 0=down)\r
+                               // D14 = Can be written but has no effect\r
+                               //           on autonegotiation.  Instead\r
+                               //           the autonegotiation state machine\r
+                               //           controls the utilization of this bit.\r
+                               // D12 = Duplex Mode (1=full, 0=half)\r
+                               // D11:10 = Speed (11=reserved)\r
+                               //                (10=1000Mbps)\r
+                               //                (01=100 Mbps)\r
+                               //                (00=10  Mbps)\r
+                               // D0 = 1\r
+                               // all other bits = 0\r
+                               ///////////////////////////////////\r
+                               //When sgmii_mode == 0 = MAC\r
+                               // all bits D15-D0 are R/W,\r
+                               // D14 = Can be written but has no effect\r
+                               //           on autonegotiation.  Instead\r
+                               //           the autonegotiation state machine\r
+                               //           controls the utilization of this bit.\r
+                               // D0 = 1\r
+                               // all other bits = 0\r
+                               ///////////////////////////////////\r
+\r
+\r
+reg [15:0]      data_out;\r
+reg [15:0]      mr_adv_ability;\r
+reg             rst_d1;\r
+reg             rst_d2;\r
+reg             rst_d3;\r
+reg             rst_d4;\r
+reg             rst_d5;\r
+reg             rst_d6;\r
+reg             rst_d7;\r
+reg             rst_d8;\r
+reg             sync_reset;\r
+reg             sgmii_mode_d1;\r
+reg             sgmii_mode_d2;\r
+reg             sgmii_mode_d3;\r
+reg             sgmii_mode_d4;\r
+reg             sgmii_mode_change;\r
+reg            gbe_mode_d1;\r
+reg            gbe_mode_d2;\r
+reg            gbe_mode_d3;\r
+reg            gbe_mode_d4;\r
+reg            gbe_mode_change;\r
+\r
+// generate a synchronous reset signal\r
+//    note: this method is used so that\r
+//          an initval can be applied during\r
+//         device run-time, instead of at compile time\r
+always @(posedge clk or negedge rst_n) begin\r
+       if (rst_n == 1'b0) begin\r
+               rst_d1 <= 0;\r
+               rst_d2 <= 0;\r
+               rst_d3 <= 0;\r
+               rst_d4 <= 0;\r
+               rst_d5 <= 0;\r
+               rst_d6 <= 0;\r
+               rst_d7 <= 0;\r
+               rst_d8 <= 0;\r
+               sync_reset <= 0;\r
+       end\r
+       else begin\r
+               rst_d1 <= 1;\r
+               rst_d2 <= rst_d1;\r
+               rst_d3 <= rst_d2;\r
+               rst_d4 <= rst_d3;\r
+               rst_d5 <= rst_d4;\r
+               rst_d6 <= rst_d5;\r
+               rst_d7 <= rst_d6;\r
+               rst_d8 <= rst_d7;\r
+\r
+               // asserts on rising edge of rst_d8\r
+               sync_reset <= !rst_d8 & rst_d7; \r
+       end\r
+end\r
+\r
+\r
+// Detect change in sgmii_mode\r
+always @(posedge clk or negedge rst_n) begin\r
+       if (rst_n == 1'b0) begin\r
+               sgmii_mode_d1 <= 0;\r
+               sgmii_mode_d2 <= 0;\r
+               sgmii_mode_d3 <= 0;\r
+               sgmii_mode_d4 <= 0;\r
+               sgmii_mode_change <= 0;\r
+       end\r
+       else begin\r
+\r
+               // deboggle\r
+               sgmii_mode_d1 <= sgmii_mode;\r
+               sgmii_mode_d2 <= sgmii_mode_d1;\r
+\r
+               // delay \r
+               sgmii_mode_d3 <= sgmii_mode_d2;\r
+               sgmii_mode_d4 <= sgmii_mode_d3;\r
+\r
+               // detect change\r
+               if (sgmii_mode_d3 != sgmii_mode_d4)\r
+                       sgmii_mode_change <= 1;\r
+               else\r
+                       sgmii_mode_change <= 0;\r
+       end\r
+end\r
+\r
+\r
+// Detect change in gbe_mode\r
+always @(posedge clk or negedge rst_n) begin\r
+       if (rst_n == 1'b0) begin\r
+               gbe_mode_d1 <= 0;\r
+               gbe_mode_d2 <= 0;\r
+               gbe_mode_d3 <= 0;\r
+               gbe_mode_d4 <= 0;\r
+               gbe_mode_change <= 0;\r
+       end\r
+       else begin\r
+\r
+               // deboggle\r
+               gbe_mode_d1 <= gbe_mode;\r
+               gbe_mode_d2 <= gbe_mode_d1;\r
+\r
+               // delay \r
+               gbe_mode_d3 <= gbe_mode_d2;\r
+               gbe_mode_d4 <= gbe_mode_d3;\r
+\r
+               // detect change\r
+               if (gbe_mode_d3 != gbe_mode_d4)\r
+                       gbe_mode_change <= 1;\r
+               else\r
+                       gbe_mode_change <= 0;\r
+       end\r
+end\r
+\r
+\r
+// Write Operations\r
+       // Low Portion of Register[D7:D0]\r
+       always @(posedge clk or negedge rst_n) begin\r
+               if (rst_n == 1'b0) begin\r
+                       mr_adv_ability[7:0] <= 8'h01;\r
+               end\r
+               else if (sync_reset || sgmii_mode_change || gbe_mode_change) begin\r
+                       if (gbe_mode_d4)\r
+                               mr_adv_ability[7:0] <= initval_gbe[7:0];\r
+                       else if (sgmii_mode)\r
+                               mr_adv_ability[7:0] <= initval_phy[7:0];\r
+                       else\r
+                               mr_adv_ability[7:0] <= initval_mac[7:0];\r
+               end\r
+               else begin\r
+                       if (cs_0 && ready && write && (sgmii_mode || gbe_mode)) begin\r
+                               mr_adv_ability[7:0] <= data_in[7:0];\r
+                       end\r
+               end\r
+       end\r
+\r
+\r
+       // High Portion of Register[D15:D8]\r
+       always @(posedge clk or negedge rst_n) begin\r
+               if (rst_n == 1'b0) begin\r
+                       mr_adv_ability[15:8] <= 8'h40; // default\r
+               end\r
+               else if (sync_reset || sgmii_mode_change || gbe_mode_change) begin\r
+                       if (gbe_mode_d4)\r
+                               mr_adv_ability[15:8] <= initval_gbe[15:8];\r
+                       else if (sgmii_mode)\r
+                               mr_adv_ability[15:8] <= initval_phy[15:8];\r
+                       else\r
+                               mr_adv_ability[15:8] <= initval_mac[15:8];\r
+               end\r
+               else begin\r
+                       if (cs_1 && ready && write && (sgmii_mode || gbe_mode)) begin\r
+                               mr_adv_ability[15:8] <= data_in[15:8];\r
+                       end\r
+               end\r
+       end\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+// Read Operations\r
+\r
+       always @(*) begin\r
+                       data_out[7:0] <= mr_adv_ability[7:0];\r
+                       data_out[15:8] <= mr_adv_ability[15:8];\r
+       end\r
+\r
+endmodule\r
+\r
+\r
+\r
+\r
+\r
+\r
+module register_5_hb (\r
+       rst_n,\r
+       mr_lp_adv_ability,\r
+       cs_0,\r
+       cs_1,\r
+       ready,\r
+\r
+       data_out\r
+);\r
+\r
+input           rst_n;\r
+input           cs_0;\r
+input           cs_1;\r
+input           ready;\r
+input  [15:0]   mr_lp_adv_ability;\r
+                               // This entire register is read-only\r
+                               ///////////////////////////////////\r
+                               // When sgmii_mode == 0 == MAC\r
+                               ///////////////////////////////////\r
+                               // D15 = PHY Link Status (1=up, 0=down)\r
+                               // D14 = PHY Autonegotiation Handshake\r
+                               // D12 = PHY Duplex Mode (1=full, 0=half)\r
+                               // D11:10 = PHY Speed (11=reserved)\r
+                               //                    (10=1000Mbps)\r
+                               //                    (01=100 Mbps)\r
+                               //                    (00=10  Mbps)\r
+                               // D0 = 1\r
+                               // all other bits = 0\r
+                               ///////////////////////////////////\r
+                               //When sgmii_mode == 1 = PHY\r
+                               // D14 = MAC Autonegotiation Handshake\r
+                               // D0 = 1\r
+                               // all other bits = 0\r
+                               ///////////////////////////////////\r
+output [15:0]   data_out;\r
+\r
+reg [15:0]      data_out;\r
+\r
+// Read Operations\r
+\r
+       always @(*) begin\r
+                       data_out[7:0] <= mr_lp_adv_ability[7:0];\r
+                       data_out[15:8] <= mr_lp_adv_ability[15:8];\r
+       end\r
+endmodule\r
+\r
+module register_6_hb (\r
+       rst_n,\r
+       clk,\r
+       mr_page_rx,\r
+       cs_0,\r
+       cs_1,\r
+       write,\r
+       ready,\r
+\r
+       data_out\r
+);\r
+\r
+input           rst_n;\r
+input           clk;\r
+input           cs_0;\r
+input           cs_1;\r
+input           write;\r
+input           ready;\r
+input           mr_page_rx;\r
+output [15:0]   data_out;\r
+\r
+reg [15:0]      data_out;\r
+reg             mr_page_rx_latched;\r
+reg             clear_on_read;\r
+reg             read_detect;\r
+reg             rd_d1;\r
+reg             rd_d2;\r
+\r
+// generate clear-on-read signal\r
+       always @(posedge clk or negedge rst_n) begin\r
+               if (rst_n == 1'b0) begin\r
+                       clear_on_read <= 0;\r
+                       read_detect <= 0;\r
+                       rd_d1 <= 0;\r
+                       rd_d2 <= 0;\r
+               end\r
+               else begin\r
+                       if (!write && ready && cs_0)\r
+                               read_detect <= 1;\r
+                       else \r
+                               read_detect <= 0;\r
+\r
+                       rd_d1 <= read_detect;\r
+                       rd_d2 <= rd_d1;\r
+\r
+                       // assert on falling edge of rd_d2\r
+                       clear_on_read <= !rd_d1 & rd_d2;\r
+               end\r
+       end\r
+\r
+\r
+// Latch and Clear\r
+       always @(posedge clk or negedge rst_n) begin\r
+               if (rst_n == 1'b0) begin\r
+                       mr_page_rx_latched <= 0;\r
+               end\r
+               else begin\r
+                       if (clear_on_read)\r
+                               mr_page_rx_latched <= 0;\r
+                       else if (mr_page_rx)\r
+                               mr_page_rx_latched <= 1;\r
+               end\r
+       end\r
+\r
+\r
+// Read Operations\r
+\r
+       always @(*) begin\r
+                       data_out[15:2] <= 14'd0;\r
+                       data_out[1] <= mr_page_rx_latched;\r
+                       data_out[0] <= 0;\r
+       end\r
+endmodule\r
+\r
+\r
+module regs_hb (\r
+       rst_n,\r
+       hclk,\r
+       gbe_mode,\r
+       sgmii_mode,\r
+       hcs_n,\r
+       hwrite_n,\r
+       haddr,\r
+       hdatain,\r
+\r
+       hdataout,\r
+       hready_n,\r
+\r
+       mr_an_complete,\r
+       mr_page_rx,\r
+       mr_lp_adv_ability,\r
+\r
+       mr_main_reset,\r
+       mr_an_enable,\r
+       mr_restart_an,\r
+       mr_adv_ability\r
+);\r
+\r
+input           rst_n;\r
+input           hclk;\r
+input           gbe_mode;\r
+input           sgmii_mode;\r
+input           hcs_n;\r
+input           hwrite_n;\r
+input    [3:0]  haddr;\r
+input    [7:0]  hdatain;\r
+\r
+output   [7:0]  hdataout;\r
+output          hready_n;\r
+\r
+input           mr_an_complete;\r
+input           mr_page_rx;\r
+input    [15:0] mr_lp_adv_ability;\r
+\r
+output          mr_main_reset;\r
+output          mr_an_enable;\r
+output          mr_restart_an;\r
+output   [15:0] mr_adv_ability;\r
+\r
+///////////////////////////////////\r
+\r
+\r
+\r
+reg   [7:0]  hdataout;\r
+reg hr;\r
+reg hready_n;\r
+\r
+reg hcs_n_delayed;\r
+\r
+wire reg0_cs_0;\r
+wire reg0_cs_1;\r
+\r
+wire reg1_cs_0;\r
+wire reg1_cs_1;\r
+\r
+wire reg4_cs_0;\r
+wire reg4_cs_1;\r
+\r
+wire reg5_cs_0;\r
+wire reg5_cs_1;\r
+\r
+wire reg6_cs_0;\r
+wire reg6_cs_1;\r
+\r
+wire [15:0] data_out_reg_0;\r
+wire [15:0] data_out_reg_1;\r
+wire [15:0] data_out_reg_4;\r
+wire [15:0] data_out_reg_5;\r
+wire [15:0] data_out_reg_6;\r
+\r
+\r
+\r
+register_addr_decoder ad_dec (\r
+       .rst_n(rst_n),\r
+       .addr(haddr),\r
+       .cs_in(~hcs_n),\r
+\r
+       .reg0_cs_0 (reg0_cs_0),\r
+       .reg0_cs_1 (reg0_cs_1),\r
+       .reg1_cs_0 (reg1_cs_0),\r
+       .reg1_cs_1 (reg1_cs_1),\r
+       .reg4_cs_0 (reg4_cs_0),\r
+       .reg4_cs_1 (reg4_cs_1),\r
+       .reg5_cs_0 (reg5_cs_0),\r
+       .reg5_cs_1 (reg5_cs_1),\r
+       .reg6_cs_0 (reg6_cs_0),\r
+       .reg6_cs_1 (reg6_cs_1)\r
+);\r
+\r
+\r
+register_0_hb   register_0 (\r
+       .rst_n (rst_n),\r
+       .clk (hclk), \r
+       .cs_0 (reg0_cs_0),\r
+       .cs_1 (reg0_cs_1),\r
+       .write (~hwrite_n),\r
+       .ready (1'b1),\r
+       .data_in ({hdatain, hdatain}),\r
+\r
+       .data_out (data_out_reg_0),\r
+       .mr_main_reset (mr_main_reset),\r
+       .mr_an_enable (mr_an_enable),\r
+       .mr_restart_an (mr_restart_an)\r
+);\r
+\r
+\r
+register_1_hb   register_1 (\r
+       .rst_n (rst_n),\r
+       .cs_0 (reg1_cs_0),\r
+       .cs_1 (reg1_cs_1),\r
+       .mr_an_complete (mr_an_complete),\r
+\r
+       .data_out (data_out_reg_1)\r
+);\r
+\r
+\r
+register_4_hb   register_4 (\r
+       .rst_n (rst_n),\r
+       .clk (hclk), \r
+       .gbe_mode (gbe_mode),\r
+       .sgmii_mode (sgmii_mode),\r
+       .cs_0 (reg4_cs_0),\r
+       .cs_1 (reg4_cs_1),\r
+       .write (~hwrite_n),\r
+       .ready (1'b1),\r
+       .data_in ({hdatain, hdatain}),\r
+\r
+       .data_out (data_out_reg_4),\r
+       .mr_adv_ability (mr_adv_ability)\r
+);\r
+\r
+\r
+register_5_hb   register_5 (\r
+       .rst_n (rst_n),\r
+       .mr_lp_adv_ability (mr_lp_adv_ability),\r
+       .cs_0 (reg5_cs_0),\r
+       .cs_1 (reg5_cs_1),\r
+       .ready (1'b1),\r
+\r
+       .data_out (data_out_reg_5)\r
+);\r
+\r
+\r
+register_6_hb   register_6 (\r
+       .rst_n (rst_n),\r
+       .clk (hclk), \r
+       .mr_page_rx (mr_page_rx),\r
+       .cs_0 (reg6_cs_0),\r
+       .cs_1 (reg6_cs_1),\r
+       .write (~hwrite_n),\r
+       .ready (1'b1),\r
+\r
+       .data_out (data_out_reg_6)\r
+);\r
+\r
+\r
+\r
+// generate an ack\r
+always @(posedge hclk or negedge rst_n) begin\r
+       if (rst_n == 1'b0) begin\r
+               hcs_n_delayed <= 1'b1;\r
+               hr <= 1'b1;\r
+               hready_n <= 1'b1;\r
+       end\r
+       else begin\r
+               hcs_n_delayed <= hcs_n;\r
+\r
+               //assert on falling edge of delayed chip select\r
+               hr <= ~hcs_n & hcs_n_delayed;\r
+               hready_n <= ~hr;\r
+       end\r
+end\r
+\r
+\r
+\r
+// Mux Register Read-Data Outputs\r
+always @(posedge hclk or negedge rst_n)\r
+begin\r
+       if (rst_n == 1'b0) begin\r
+               hdataout <= 8'd0;\r
+       end\r
+       else begin\r
+               case (haddr[3:0])\r
+\r
+                       4'd0:\r
+                         begin\r
+                               hdataout <= data_out_reg_0[7:0];\r
+                         end\r
+\r
+\r
+                       4'd1:\r
+                         begin\r
+                               hdataout <= data_out_reg_0[15:8];\r
+                         end\r
+\r
+                       /////////////////////////////////////////////\r
+\r
+                       4'd2:\r
+                         begin\r
+                               hdataout <= data_out_reg_1[7:0];\r
+                         end\r
+\r
+\r
+                       4'd3:\r
+                         begin\r
+                               hdataout <= data_out_reg_1[15:8];\r
+                         end\r
+\r
+                       /////////////////////////////////////////////\r
+\r
+                       4'd8:\r
+                         begin\r
+                               hdataout <= data_out_reg_4[7:0];\r
+                         end\r
+\r
+\r
+                       4'd9:\r
+                         begin\r
+                               hdataout <= data_out_reg_4[15:8];\r
+                         end\r
+\r
+                       /////////////////////////////////////////////\r
+\r
+                       4'd10:\r
+                         begin\r
+                               hdataout <= data_out_reg_5[7:0];\r
+                         end\r
+\r
+\r
+                       4'd11:\r
+                         begin\r
+                               hdataout <= data_out_reg_5[15:8];\r
+                         end\r
+\r
+                       /////////////////////////////////////////////\r
+\r
+                       4'd12:\r
+                         begin\r
+                               hdataout <= data_out_reg_6[7:0];\r
+                         end\r
+\r
+\r
+                       4'd13:\r
+                         begin\r
+                               hdataout <= data_out_reg_6[15:8];\r
+                         end\r
+\r
+                       /////////////////////////////////////////////\r
+\r
+                       default:\r
+                         begin\r
+                               hdataout <= 8'd0;\r
+                         end\r
+               endcase\r
+       end\r
+end\r
+\r
+endmodule\r
+\r
+module register_addr_decoder (\r
+       rst_n,\r
+       addr,\r
+       cs_in,\r
+\r
+       reg0_cs_0,\r
+       reg0_cs_1,\r
+\r
+       reg1_cs_0,\r
+       reg1_cs_1,\r
+\r
+       reg4_cs_0,\r
+       reg4_cs_1,\r
+\r
+       reg5_cs_0,\r
+       reg5_cs_1,\r
+\r
+       reg6_cs_0,\r
+       reg6_cs_1\r
+);\r
+\r
+input           rst_n;\r
+input           cs_in;\r
+input [3:0]     addr;\r
+\r
+output          reg0_cs_0;\r
+output          reg0_cs_1;\r
+\r
+output          reg1_cs_0;\r
+output          reg1_cs_1;\r
+\r
+output          reg4_cs_0;\r
+output          reg4_cs_1;\r
+\r
+output          reg5_cs_0;\r
+output          reg5_cs_1;\r
+\r
+output          reg6_cs_0;\r
+output          reg6_cs_1;\r
+\r
+//////////////////////////\r
+\r
+wire             reg0_cs_0;\r
+wire             reg0_cs_1;\r
+\r
+wire             reg1_cs_0;\r
+wire             reg1_cs_1;\r
+\r
+wire             reg4_cs_0;\r
+wire             reg4_cs_1;\r
+\r
+wire             reg5_cs_0;\r
+wire             reg5_cs_1;\r
+\r
+wire             reg6_cs_0;\r
+wire             reg6_cs_1;\r
+\r
+//////////////////////////\r
+\r
+assign reg0_cs_0 = (addr == 4'h0) ? cs_in : 1'b0;\r
+assign reg0_cs_1 = (addr == 4'h1) ? cs_in : 1'b0;\r
+\r
+assign reg1_cs_0 = (addr == 4'h2) ? cs_in : 1'b0;\r
+assign reg1_cs_1 = (addr == 4'h3) ? cs_in : 1'b0;\r
+\r
+assign reg4_cs_0 = (addr == 4'h8) ? cs_in : 1'b0;\r
+assign reg4_cs_1 = (addr == 4'h9) ? cs_in : 1'b0;\r
+\r
+assign reg5_cs_0 = (addr == 4'ha) ? cs_in : 1'b0;\r
+assign reg5_cs_1 = (addr == 4'hb) ? cs_in : 1'b0;\r
+\r
+assign reg6_cs_0 = (addr == 4'hc) ? cs_in : 1'b0;\r
+assign reg6_cs_1 = (addr == 4'hd) ? cs_in : 1'b0;\r
+\r
+\r
+endmodule\r
+\r
diff --git a/gbe2_ecp3/ipcores_ecp3/sgmii33/reset_controller_cdr.v b/gbe2_ecp3/ipcores_ecp3/sgmii33/reset_controller_cdr.v
new file mode 100755 (executable)
index 0000000..fa0a645
--- /dev/null
@@ -0,0 +1,219 @@
+//**************************************************************************\r
+// *************************************************************************\r
+// *                LATTICE SEMICONDUCTOR CONFIDENTIAL                     *\r
+// *                         PROPRIETARY NOTE                              *\r
+// *                                                                       *\r
+// *  This software contains information confidential and proprietary      *\r
+// *  to Lattice Semiconductor Corporation.  It shall not be reproduced    *\r
+// *  in whole or in part, or transferred to other documents, or disclosed *\r
+// *  to third parties, or used for any purpose other than that for which  *\r
+// *  it was obtained, without the prior written consent of Lattice        *\r
+// *  Semiconductor Corporation.  All rights reserved.                     *\r
+// *                                                                       *\r
+// *************************************************************************\r
+//**************************************************************************\r
+\r
+////////////////////////////////////////////////////////////////////////\r
+// This module forces a RESET to the SERDES CDR\r
+//     when the CDR either loses lock  or loses signal\r
+////////////////////////////////////////////////////////////////////////\r
+\r
+`timescale 1ns/100ps\r
+\r
+module reset_controller_cdr (\r
+\r
+       rst_n,\r
+       clk,\r
+\r
+       cdr_lol,\r
+\r
+       cdr_rst_out\r
+       );\r
+\r
+input rst_n;\r
+input clk; // 125Mhz clock\r
+\r
+input cdr_lol;\r
+\r
+output cdr_rst_out;\r
+\r
+\r
+///////////////////////////////////////\r
+\r
+reg cdr_rst_out;\r
+\r
+reg cdr_lol_mstb_1;\r
+reg cdr_lol_mstb_2;\r
+\r
+\r
+reg sht_mx;\r
+reg [5:0] sht_count;\r
+\r
+reg lng_mx;\r
+reg [22:0] lng_count;\r
+\r
+reg cnt_rst;\r
+parameter\r
+       ASSRT_RST           = 3'd0,\r
+       WAIT_SHORT          = 3'd1,\r
+       DSSRT_RST           = 3'd2,\r
+       WAIT_LONG           = 3'd3,\r
+       SEEK_CDR_ERR        = 3'd4,\r
+       SEEK_SIGNAL_RESTORE = 3'd5;\r
+reg[2:0] fsm;\r
+\r
+//////////////////////////////////////\r
+//  Mestastability Filter\r
+//////////////////////////////////////\r
+always @(posedge clk or negedge rst_n)\r
+begin\r
+       if (rst_n == 1'b0) begin\r
+               cdr_lol_mstb_1 <= 1'b1;\r
+               cdr_lol_mstb_2 <= 1'b1;\r
+\r
+\r
+       end\r
+       else begin\r
+               cdr_lol_mstb_1 <= cdr_lol;\r
+               cdr_lol_mstb_2 <= cdr_lol_mstb_1;\r
+\r
+       end\r
+end \r
+\r
+\r
+\r
+///////////////////////////////////////\r
+//  Operate Short Timer (256 nsec)\r
+///////////////////////////////////////\r
+always @(posedge clk or negedge rst_n)\r
+begin\r
+       if (rst_n == 1'b0) begin\r
+               sht_mx <= 1'b0;\r
+               sht_count <= 6'd0;\r
+       end\r
+       else begin\r
+\r
+               // define max count\r
+               if (sht_count[5] && (!cnt_rst)) begin\r
+                       sht_mx <= 1'b1;\r
+               end\r
+               else begin\r
+                       sht_mx <= 1'b0;\r
+               end\r
+\r
+               // operate counter\r
+               if (cnt_rst) begin\r
+                       sht_count <= 6'd0; //clear\r
+               end\r
+               else if (sht_mx) begin\r
+                       sht_count <= sht_count; //hold\r
+               end\r
+               else begin\r
+                       sht_count <= sht_count + 1; //count\r
+               end\r
+       end\r
+end \r
+\r
+\r
+/////////////////////////////////////\r
+//  Operate Long Timer (33 msec)\r
+/////////////////////////////////////\r
+always @(posedge clk or negedge rst_n)\r
+begin\r
+       if (rst_n == 1'b0) begin\r
+               lng_mx <= 1'b0;\r
+               lng_count <= 23'd0;\r
+       end\r
+       else begin\r
+\r
+               // define max count\r
+               if (lng_count[22] && (!cnt_rst)) begin\r
+                       lng_mx <= 1'b1;\r
+               end\r
+               else begin\r
+                       lng_mx <= 1'b0;\r
+               end\r
+\r
+               // operate counter\r
+               if (cnt_rst) begin\r
+                       lng_count <= 6'd0; //clear\r
+               end\r
+               else if (lng_mx) begin\r
+                       lng_count <= lng_count; //hold\r
+               end\r
+               else begin\r
+                       lng_count <= lng_count + 1; //count\r
+               end\r
+       end\r
+end \r
+\r
+\r
+/////////////////////////////////////\r
+//  State Machine\r
+/////////////////////////////////////\r
+always @(posedge clk or negedge rst_n)\r
+begin\r
+       if (rst_n == 1'b0) begin\r
+               cdr_rst_out <= 1'b1;\r
+               cnt_rst <= 1'b1;\r
+               fsm <= ASSRT_RST;\r
+       end\r
+       else begin\r
+\r
+               // defaults\r
+               cnt_rst <= 1'b0;\r
+\r
+               case (fsm)\r
+                       ASSRT_RST: begin\r
+                               cdr_rst_out <= 1'b1; // assert\r
+                               cnt_rst <= 1'b1;\r
+                               fsm <= WAIT_SHORT;\r
+                       end\r
+\r
+                       WAIT_SHORT: begin\r
+                               // wait for 256 nsec\r
+                               if (sht_mx && (!cnt_rst)) begin\r
+                                       fsm <= DSSRT_RST;\r
+                               end\r
+                       end\r
+\r
+                       DSSRT_RST: begin\r
+                               cdr_rst_out <= 1'b0; // de-assert\r
+                               fsm <= WAIT_LONG;\r
+                       end\r
+\r
+                       WAIT_LONG: begin\r
+                               // wait for 33 msec\r
+                               if (lng_mx && (!cnt_rst)) begin\r
+                                       fsm <= SEEK_CDR_ERR;\r
+                               end\r
+                       end\r
+\r
+                       SEEK_CDR_ERR: begin\r
+\r
+                               cnt_rst <= 1'b1;\r
+\r
+\r
+                               // Wait for CDR to fail\r
+                               if (cdr_lol_mstb_2) begin\r
+                                       fsm <= ASSRT_RST;\r
+                               end\r
+                               else begin\r
+                                       fsm <= SEEK_CDR_ERR;\r
+                               end\r
+                       end\r
+\r
+\r
+\r
+                       default: begin\r
+                               fsm <= ASSRT_RST;\r
+                       end\r
+               endcase\r
+\r
+       end\r
+end \r
+\r
+\r
+\r
+endmodule\r
+\r
diff --git a/gbe2_ecp3/ipcores_ecp3/sgmii33/reset_controller_pcs.v b/gbe2_ecp3/ipcores_ecp3/sgmii33/reset_controller_pcs.v
new file mode 100755 (executable)
index 0000000..9d2e584
--- /dev/null
@@ -0,0 +1,226 @@
+//**************************************************************************\r
+// *************************************************************************\r
+// *                LATTICE SEMICONDUCTOR CONFIDENTIAL                     *\r
+// *                         PROPRIETARY NOTE                              *\r
+// *                                                                       *\r
+// *  This software contains information confidential and proprietary      *\r
+// *  to Lattice Semiconductor Corporation.  It shall not be reproduced    *\r
+// *  in whole or in part, or transferred to other documents, or disclosed *\r
+// *  to third parties, or used for any purpose other than that for which  *\r
+// *  it was obtained, without the prior written consent of Lattice        *\r
+// *  Semiconductor Corporation.  All rights reserved.                     *\r
+// *                                                                       *\r
+// *************************************************************************\r
+//**************************************************************************\r
+\r
+////////////////////////////////////////////////////////////////////////\r
+// This module implements the SERDES/PCS reset sequence as specified\r
+// in Figure 47 of Lattice Technical Note TN1176\r
+////////////////////////////////////////////////////////////////////////\r
+\r
+`timescale 1ns/100ps\r
+\r
+module reset_controller_pcs (\r
+\r
+       rst_n,\r
+       clk,\r
+\r
+       tx_plol,\r
+       rx_cdr_lol,\r
+\r
+       quad_rst_out,\r
+       tx_pcs_rst_out,\r
+       rx_pcs_rst_out\r
+       );\r
+\r
+input rst_n;\r
+input clk; // 125Mhz clock\r
+\r
+input tx_plol;\r
+input rx_cdr_lol;\r
+\r
+output quad_rst_out;\r
+output tx_pcs_rst_out;\r
+output rx_pcs_rst_out;\r
+\r
+\r
+///////////////////////////////////////\r
+\r
+reg quad_rst_out;\r
+reg tx_pcs_rst_out;\r
+reg rx_pcs_rst_out;\r
+\r
+reg q_mx;\r
+reg [3:0] q_count;\r
+\r
+reg rx_cdr_lol_mstb_1;\r
+reg rx_cdr_lol_mstb_2;\r
+\r
+reg wd_mx;\r
+reg wd_mx_d1;\r
+reg wd_mx_re;\r
+reg [22:0] wd_count;\r
+reg watchdog_flag;\r
+\r
+////////////////////////////////////////////////////////\r
+//  Assert Quad RST For 8 Clocks After Device Hard Reset\r
+////////////////////////////////////////////////////////\r
+always @(posedge clk or negedge rst_n)\r
+begin\r
+       if (rst_n == 1'b0) begin\r
+               q_mx <= 1'b0;\r
+               q_count <= 4'd0;\r
+               quad_rst_out <= 1'b1; // assert\r
+       end\r
+       else begin\r
+\r
+               // define max count\r
+               if (q_count[3]) begin\r
+                       q_mx <= 1'b1;\r
+               end\r
+               else begin\r
+                       q_mx <= 1'b0;\r
+               end\r
+\r
+               // operate counter\r
+               if (q_mx) begin\r
+                       q_count <= q_count; //hold\r
+               end\r
+               else begin\r
+                       q_count <= q_count + 1; //count\r
+               end\r
+\r
+               // operate quad reset\r
+               if (q_mx) begin\r
+                       quad_rst_out <= 1'b0; //de-assert on max-count\r
+               end\r
+               else begin\r
+                       quad_rst_out <= 1'b1; //assert otherwise\r
+               end\r
+       end\r
+end \r
+\r
+\r
+////////////////////////////////////////////////////////////////////\r
+//  Watchdog Timer -- In Case PLLs Don't Acquire Lock Within 33msec\r
+////////////////////////////////////////////////////////////////////\r
+always @(posedge clk or negedge rst_n)\r
+begin\r
+       if (rst_n == 1'b0) begin\r
+               wd_mx <= 1'b0;\r
+               wd_mx_d1 <= 1'b0;\r
+               wd_mx_re <= 1'b0;\r
+               wd_count <= 23'd0;\r
+               watchdog_flag <= 1'b0;\r
+       end\r
+       else begin\r
+\r
+               // define max count\r
+               if (wd_count[22]) begin\r
+                       wd_mx <= 1'b1;\r
+               end\r
+               else begin\r
+                       wd_mx <= 1'b0;\r
+               end\r
+\r
+               // operate counter\r
+               if (quad_rst_out) begin\r
+                       wd_count <= 23'd0; //clear\r
+               end\r
+               else if (wd_mx) begin\r
+                       wd_count <= wd_count; //hold\r
+               end\r
+               else begin\r
+                       wd_count <= wd_count + 1; //count\r
+               end\r
+\r
+               // detect rising edge of max_count flag\r
+               wd_mx_d1 <= wd_mx;\r
+\r
+               wd_mx_re <= wd_mx & (!wd_mx_d1);\r
+\r
+               // generate watchdog flag\r
+               watchdog_flag <= wd_mx_re;\r
+       end\r
+end \r
+\r
+\r
+\r
+\r
+////////////////////////////////////////////////\r
+//  De-Assert TX PCS After TX PLL Acquires Lock\r
+////////////////////////////////////////////////\r
+always @(posedge clk or negedge rst_n)\r
+begin\r
+       if (rst_n == 1'b0) begin\r
+               tx_pcs_rst_out <= 1'b1; // assert\r
+       end\r
+       else begin\r
+\r
+               case (tx_pcs_rst_out)\r
+                       1'b1: begin\r
+                               // if asserted, wait for PLL to acquire lock\r
+                               if ((!quad_rst_out && (!tx_plol))   ||   watchdog_flag) begin\r
+                                       tx_pcs_rst_out <= 1'b0; // deassert\r
+                               end\r
+                       end\r
+\r
+                       1'b0: begin\r
+                               // if de-asserted, stay that way\r
+                               tx_pcs_rst_out <= 1'b0; // deassert\r
+                       end\r
+\r
+                       default: begin\r
+                               tx_pcs_rst_out <= 1'b1; // assert\r
+                       end\r
+               endcase\r
+\r
+       end\r
+end \r
+\r
+\r
+\r
+\r
+\r
+///////////////////////////////////////////////////////\r
+//  De-Assert RX PCS-Chan-0 After RX CDR Acquires Lock\r
+///////////////////////////////////////////////////////\r
+always @(posedge clk or negedge rst_n)\r
+begin\r
+       if (rst_n == 1'b0) begin\r
+               rx_pcs_rst_out <= 1'b1; // assert\r
+               rx_cdr_lol_mstb_1 <= 1'b1;\r
+               rx_cdr_lol_mstb_2 <= 1'b1;\r
+       end\r
+       else begin\r
+\r
+               // metastability - filter\r
+               rx_cdr_lol_mstb_1 <= rx_cdr_lol;\r
+               rx_cdr_lol_mstb_2 <= rx_cdr_lol_mstb_1;\r
+\r
+               case (rx_pcs_rst_out)\r
+                       1'b1: begin\r
+                               // if asserted, wait for CDR to acquire lock\r
+                               if ((!quad_rst_out && (!rx_cdr_lol_mstb_2))   ||   watchdog_flag) begin\r
+                                       rx_pcs_rst_out <= 1'b0; // deassert\r
+                               end\r
+                       end\r
+\r
+                       1'b0: begin\r
+                               // if de-asserted, stay that way\r
+                               rx_pcs_rst_out <= 1'b0; // deassert\r
+                       end\r
+\r
+                       default: begin\r
+                               rx_pcs_rst_out <= 1'b1; // assert\r
+                       end\r
+               endcase\r
+\r
+       end\r
+end \r
+\r
+\r
+\r
+\r
+endmodule\r
+\r
diff --git a/gbe2_ecp3/ipcores_ecp3/sgmii33/sgmii_channel_smi.v b/gbe2_ecp3/ipcores_ecp3/sgmii33/sgmii_channel_smi.v
new file mode 100644 (file)
index 0000000..a97ca4f
--- /dev/null
@@ -0,0 +1,237 @@
+//**************************************************************************\r
+// *************************************************************************\r
+// *                LATTICE SEMICONDUCTOR CONFIDENTIAL                     *\r
+// *                         PROPRIETARY NOTE                              *\r
+// *                                                                       *\r
+// *  This software contains information confidential and proprietary      *\r
+// *  to Lattice Semiconductor Corporation.  It shall not be reproduced    *\r
+// *  in whole or in part, or transferred to other documents, or disclosed *\r
+// *  to third parties, or used for any purpose other than that for which  *\r
+// *  it was obtained, without the prior written consent of Lattice        *\r
+// *  Semiconductor Corporation.  All rights reserved.                     *\r
+// *                                                                       *\r
+// *************************************************************************\r
+//**************************************************************************\r
+\r
+`timescale 1ns/100ps\r
+\r
+module sgmii_channel_smi (\r
+\r
+       // Control Interface\r
+       rst_n,\r
+       gbe_mode,\r
+       sgmii_mode,\r
+       signal_detect,\r
+       debug_link_timer_short,\r
+       rx_compensation_err,\r
+       non_an_rate,\r
+\r
+       // G/MII Interface\r
+       in_clk_gmii,\r
+       in_clk_mii,\r
+       data_in_mii,\r
+       en_in_mii,\r
+       err_in_mii,\r
+\r
+       out_clk_gmii,\r
+       out_clk_mii,\r
+       data_out_mii,\r
+       dv_out_mii,\r
+       err_out_mii,\r
+       col_out_mii,\r
+       crs_out_mii,\r
+\r
+       // 8-bit Interface\r
+       data_out_8bi,\r
+       kcntl_out_8bi,\r
+       disparity_cntl_out_8bi,\r
+\r
+       serdes_recovered_clk,\r
+       data_in_8bi,\r
+       kcntl_in_8bi,\r
+       even_in_8bi,\r
+       disp_err_in_8bi,\r
+       cv_err_in_8bi,\r
+       err_decode_mode_8bi,\r
+\r
+       // MDIO Port\r
+       mdc,\r
+       mdio,\r
+       port_id\r
+   );\r
+\r
+\r
+\r
+// I/O Declarations\r
+input         rst_n ;       // System Reset, Active Low\r
+input         signal_detect ;\r
+input         gbe_mode ;  // GBE Mode   (0=SGMII    1=GBE)\r
+input         sgmii_mode ;  // SGMII PCS Mode   (0=MAC    1=PHY)\r
+input         debug_link_timer_short ;  // (0=NORMAL    1=SHORT)\r
+output        rx_compensation_err;  // Active high pulse indicating RX_CTC_FIFO either underflowed or overflowed\r
+input [1:0]   non_an_rate ; // MII Rate Used When Autonegotiation is Disabled (00=10Mbps; 01=100Mbps; 10=1Gbps)\r
+\r
+input         in_clk_mii ;      // G/MII Transmit clock 2.5Mhz/25Mhz/125Mhz \r
+input [7:0]   data_in_mii ;        // G/MII Tx data\r
+input         en_in_mii ;       // G/MII data valid\r
+input         err_in_mii ;       // G/MII Tx error\r
+\r
+input         out_clk_mii ;      // G/MII Receice clock 2.5Mhz/25Mhz/125MHz \r
+output [7:0]   data_out_mii ;       // G/MII Rx data\r
+output         dv_out_mii ;      // G/MII Rx data valid\r
+output         err_out_mii ;      // G/MII Rx error\r
+output         col_out_mii ;        // G/MII collision detect \r
+output         crs_out_mii ;        // G/MII carrier sense detect \r
+\r
+output [7:0]   data_out_8bi ;            // 8BI Tx Data\r
+output         kcntl_out_8bi ;           // 8BI Tx Kcntl\r
+output         disparity_cntl_out_8bi ;  // 8BI Tx Kcntl\r
+\r
+input         serdes_recovered_clk ;\r
+input [7:0]   data_in_8bi  ;     // 8BI Rx Data\r
+input         kcntl_in_8bi ;     // 8BI Rx Kcntl\r
+input         even_in_8bi ;      // 8BI Rx Even\r
+input         disp_err_in_8bi ;  // 8BI Rx Disparity Error\r
+input         cv_err_in_8bi ;    // 8BI Rx Coding Violation Error\r
+input         err_decode_mode_8bi ; // 8BI Error Decode Mode (0=NORMAL,  1=DECODE_MODE)\r
+\r
+input         in_clk_gmii ;     // GMII Transmit clock 125Mhz\r
+input         out_clk_gmii ;     // GMII Receive clock 125Mhz\r
+\r
+input          mdc;\r
+inout          mdio;\r
+input [4:0]    port_id;\r
+\r
+\r
+wire           mdin;\r
+wire           mdout;\r
+wire           mdout_en;\r
+\r
+// Internal Signals \r
+\r
+wire           mr_an_complete;\r
+wire           mr_page_rx;\r
+wire [15:0]    mr_lp_adv_ability;\r
+\r
+wire           mr_main_reset;\r
+wire           mr_an_enable;\r
+wire           mr_restart_an;\r
+wire [15:0]    mr_adv_ability;\r
+\r
+wire [1:0]     operational_rate;\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+// SGMII PCS\r
+sgmii33 sgmii33_U (\r
+       // Clock and Reset\r
+       .rst_n (rst_n ),\r
+       .signal_detect (signal_detect),\r
+       .gbe_mode (gbe_mode),\r
+       .sgmii_mode (sgmii_mode),\r
+       .debug_link_timer_short (debug_link_timer_short), \r
+       .operational_rate (operational_rate),\r
+       .rx_compensation_err (rx_compensation_err),\r
+       .tx_clk_125 (in_clk_gmii),\r
+       .serdes_recovered_clk (serdes_recovered_clk),\r
+       .rx_clk_125 (out_clk_gmii),\r
+\r
+       // Control\r
+\r
+\r
+       // (G)MII TX Port\r
+       .tx_clk_mii (in_clk_mii),\r
+       .tx_d (data_in_mii),\r
+       .tx_en (err_in_mii),\r
+       .tx_er (en_in_mii),\r
+\r
+       // (G)MII RX Port\r
+       .rx_clk_mii (out_clk_mii),\r
+       .rx_d (data_out_mii),\r
+       .rx_dv (dv_out_mii),\r
+       .rx_er (err_out_mii),\r
+       .col (col_out_mii),\r
+       .crs (crs_out_mii),\r
+                  \r
+       // 8BI TX Port\r
+       .tx_data (data_out_8bi),\r
+       .tx_kcntl (kcntl_out_8bi),\r
+       .tx_disparity_cntl (disparity_cntl_out_8bi),\r
+\r
+       // 8BI RX Port\r
+       .rx_data (data_in_8bi),\r
+       .rx_kcntl (kcntl_in_8bi),\r
+       .rx_even (even_in_8bi),\r
+       .rx_disp_err (disp_err_in_8bi),\r
+       .rx_cv_err (cv_err_in_8bi),\r
+       .rx_err_decode_mode (err_decode_mode_8bi),\r
+\r
+       // Management Interface  I/O\r
+       .mr_adv_ability (mr_adv_ability),\r
+       .mr_an_enable (mr_an_enable), \r
+       .mr_main_reset (mr_main_reset),  \r
+       .mr_restart_an (mr_restart_an),   \r
+\r
+       .mr_an_complete (mr_an_complete),   \r
+       .mr_lp_adv_ability (mr_lp_adv_ability), \r
+       .mr_page_rx (mr_page_rx)\r
+       );\r
+\r
+\r
+\r
+// SMI Register Interface for SGMII IP Core\r
+register_interface_smi   ri (\r
+\r
+       // Control Signals\r
+       .rst_n (rst_n),\r
+       .gbe_mode (gbe_mode),\r
+       .sgmii_mode (sgmii_mode),\r
+\r
+       // MDIO Port\r
+       .mdc (mdc),\r
+       .mdin (mdin),\r
+       .mdout (mdout),\r
+       .mdout_en (mdout_en),\r
+       .port_id (port_id),\r
+\r
+       // Register Outputs\r
+       .mr_an_enable (mr_an_enable),\r
+       .mr_restart_an (mr_restart_an),\r
+       .mr_main_reset (mr_main_reset),\r
+       .mr_adv_ability (mr_adv_ability),\r
+\r
+       // Register Inputs\r
+       .mr_an_complete (mr_an_complete),\r
+       .mr_page_rx (mr_page_rx),\r
+       .mr_lp_adv_ability (mr_lp_adv_ability)\r
+       );\r
+\r
+\r
+\r
+// (G)MII Rate Resolution for SGMII IP Core\r
+rate_resolution   rate_resolution (\r
+       .gbe_mode (gbe_mode),\r
+       .sgmii_mode (sgmii_mode),\r
+       .an_enable (mr_an_enable),\r
+       .advertised_rate (mr_adv_ability[11:10]),\r
+       .link_partner_rate (mr_lp_adv_ability[11:10]),\r
+       .non_an_rate (non_an_rate),\r
+\r
+       .operational_rate (operational_rate)\r
+);\r
+\r
+\r
+\r
+\r
+\r
+// Bidirectional Assignments\r
+assign mdio = mdout_en ? mdout : 1'bz; // MDIO Output\r
+assign mdin = mdio;                   // MDIO Input\r
+\r
+endmodule\r
+\r