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

Subversion Repositories turbo8051

[/] [turbo8051/] [trunk/] [rtl/] [gmac/] [mac/] [g_cfg_mgmt.v] - Blame information for rev 29

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 12 dinesha
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  Tubo 8051 cores MAC Interface Module                        ////
4
////                                                              ////
5
////  This file is part of the Turbo 8051 cores project           ////
6
////  http://www.opencores.org/cores/turbo8051/                   ////
7
////                                                              ////
8
////  Description                                                 ////
9
////  Turbo 8051 definitions.                                     ////
10
////                                                              ////
11
////  To Do:                                                      ////
12
////    nothing                                                   ////
13
////                                                              ////
14
////  Author(s):                                                  ////
15
////      - Dinesh Annayya, dinesha@opencores.org                 ////
16
////                                                              ////
17
//////////////////////////////////////////////////////////////////////
18
////                                                              ////
19
//// Copyright (C) 2000 Authors and OPENCORES.ORG                 ////
20
////                                                              ////
21
//// This source file may be used and distributed without         ////
22
//// restriction provided that this copyright statement is not    ////
23
//// removed from the file and that any derivative work contains  ////
24
//// the original copyright notice and the associated disclaimer. ////
25
////                                                              ////
26
//// This source file is free software; you can redistribute it   ////
27
//// and/or modify it under the terms of the GNU Lesser General   ////
28
//// Public License as published by the Free Software Foundation; ////
29
//// either version 2.1 of the License, or (at your option) any   ////
30
//// later version.                                               ////
31
////                                                              ////
32
//// This source is distributed in the hope that it will be       ////
33
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
34
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
35
//// PURPOSE.  See the GNU Lesser General Public License for more ////
36
//// details.                                                     ////
37
////                                                              ////
38
//// You should have received a copy of the GNU Lesser General    ////
39
//// Public License along with this source; if not, download it   ////
40
//// from http://www.opencores.org/lgpl.shtml                     ////
41
////                                                              ////
42
//////////////////////////////////////////////////////////////////////
43
/***************************************************************
44
  Description:
45
  cfg_mgmt.v: contains the configuration, register information, Application
46
              read from any location. But can write to a limited set of locations,
47
              Please refer to the design data sheets for register locations
48
***********************************************************************/
49
//`timescale 1ns/100ps
50
module g_cfg_mgmt (
51
                 //List of Inputs
52
 
53
                 // Reg Bus Interface Signal
54
                 reg_cs,
55
                 reg_wr,
56
                 reg_addr,
57
                 reg_wdata,
58
                 reg_be,
59
 
60
                 // Outputs
61
                 reg_rdata,
62
                 reg_ack,
63
 
64
                 // Rx Status
65
                 rx_sts_vld,
66
                 rx_sts,
67
 
68
                 // Rx Status
69
                 tx_sts_vld,
70
                 tx_sts,
71
 
72
                 // MDIO READ DATA FROM PHY
73
                 md2cf_cmd_done,
74
                 md2cf_status,
75
                 md2cf_data,
76
 
77
                 app_clk,
78
                 app_reset_n,
79
 
80
                 //List of Outputs
81
                 // MII Control
82
                 cf2mi_loopback_en,
83
                 cf_mac_mode,
84
                 cf_chk_rx_dfl,
85
                 cf2mi_rmii_en,
86
 
87
                 cfg_uni_mac_mode_change_i,
88
                 cfg_crs_flow_ctrl_enb_i,
89
 
90
                 //CHANNEL enable
91
                 cf2tx_ch_en,
92
                 //CHANNEL CONTROL TX
93
                 cf_silent_mode,
94
                 cf2df_dfl_single,
95
                 cf2df_dfl_single_rx,
96
                 cf2tx_pad_enable,
97
                 cf2tx_append_fcs,
98
                 //CHANNEL CONTROL RX
99
                 cf2rx_ch_en,
100
                 cf2rx_strp_pad_en,
101
                 cf2rx_snd_crc,
102
                 cf2rx_pause_en,
103
                 cf2rx_addrchk_en,
104
                 cf2rx_runt_pkt_en,
105
                 cf2af_broadcast_disable,
106
                 cf_mac_sa,
107
                 cf2tx_pause_quanta,
108
                 cf2rx_max_pkt_sz,
109
                 cf2tx_force_bad_fcs,
110
                 cf2tx_tstate_mode,
111
                 //MDIO CONTROL & DATA
112
                 cf2md_datain,
113
                 cf2md_regad,
114
                 cf2md_phyad,
115
                 cf2md_op,
116
                 cf2md_go);
117
 
118
   parameter mac_mdio_en = 1'b1;
119
 
120
 
121
  //pin out definations
122
   //---------------------------------
123
   // Reg Bus Interface Signal
124
   //---------------------------------
125
   input             reg_cs         ;
126
   input             reg_wr         ;
127
   input [3:0]       reg_addr       ;
128
   input [31:0]      reg_wdata      ;
129
   input [3:0]       reg_be         ;
130
 
131
   // Outputs
132
   output [31:0]     reg_rdata      ;
133
   output            reg_ack        ;
134
 
135
   input             rx_sts_vld     ; // rx status valid indication, sync w.r.t app clk
136
   input [7:0]       rx_sts         ; // rx status bits
137
 
138
   input             tx_sts_vld     ; // tx status valid indication, sync w.r.t app clk
139
   input             tx_sts         ; // tx status bits
140
 
141
  //List of Inputs
142
 
143
  input         app_clk, app_reset_n;
144
  input         md2cf_cmd_done;         // Read/Write MDIO completed
145
  input         md2cf_status;             // MDIO transfer error
146
  input [15:0]   md2cf_data;          // Data from PHY for a
147
                                       // mdio read access
148
 
149
 
150
  //List of Outputs
151
  output        cf2mi_rmii_en;         // Working in RMII when set to 1
152
  output        cf_mac_mode;           // mac mode set this to 1 for 100Mbs/10Mbs
153
  output        cf_chk_rx_dfl;             // Check for RX Deferal 
154
  output [47:0]  cf_mac_sa;
155
  output [15:0]  cf2tx_pause_quanta;
156
  output        cf2tx_ch_en;              //enable the TX channel
157
  output        cf_silent_mode;           // PHY Inactive 
158
  output [7:0]   cf2df_dfl_single;            //number of clk ticks for dfl
159
  output [7:0]   cf2df_dfl_single_rx;            //number of clk ticks for dfl
160
 
161
  output        cf2tx_tstate_mode;            //used for OFN's tstate enable on authentication interface
162
  output        cf2tx_pad_enable;            //enable padding, < 64 bytes
163
  output        cf2tx_append_fcs;            //append CRC for TX frames
164
  output        cf2rx_ch_en;                 //Enable RX channel
165
  output        cf2rx_strp_pad_en;        //strip the padded bytes on RX frame
166
  output        cf2rx_snd_crc;            //send FCS to application, else strip
167
                                       //the FCS before sending to application
168
  output        cf2rx_pause_en;              //enable flow control for full duplex using
169
                                       //pause control frames
170
  output        cf2mi_loopback_en;           // TX to RX loop back enable
171
  output        cf2rx_addrchk_en;         //check the destination address, filter
172
  output        cf2rx_runt_pkt_en;       //don't throw packets less than 64 bytes
173
  output        cf2af_broadcast_disable;
174
  output [15:0]  cf2md_datain;
175
  output [4:0]   cf2md_regad;
176
  output [4:0]   cf2md_phyad;
177
  output        cf2md_op;
178
  output        cf2md_go;
179
 
180
  output [15:0] cf2rx_max_pkt_sz;               //max rx packet size
181
  output        cf2tx_force_bad_fcs;            //force bad fcs on tx
182
 
183
  output        cfg_uni_mac_mode_change_i;
184
  output        cfg_crs_flow_ctrl_enb_i;
185
 
186
 
187
// Wire assignments for output signals
188
  wire [15:0]    cf2md_datain;
189
  wire [4:0]     cf2md_regad;
190
  wire [4:0]     cf2md_phyad;
191
  wire          cf2md_op;
192
  wire          cf2md_go;
193
  wire          mdio_cmd_done_sync;
194
 
195
 wire           int_mdio_cmd_done_sync;
196
 assign mdio_cmd_done_sync = (mac_mdio_en) ? int_mdio_cmd_done_sync : 1'b0;
197
 
198
 s2f_sync U1_s2f_sync ( .sync_out_pulse(int_mdio_cmd_done_sync),
199
                          .in_pulse(md2cf_cmd_done),
200
                          .dest_clk(app_clk),
201
                          .reset_n(app_reset_n));
202
 
203
 
204
 
205
// Wire and Reg assignments for local signals
206
  reg         int_md2cf_status;
207
  wire [7:0]  mac_mode_out;
208
  wire [7:0]  tx_cntrl_out_1, rx_cntrl_out_1;
209
  wire [7:0]  tx_cntrl_out_2, rx_cntrl_out_2;
210
  wire [7:0]  dfl_params_rx_out;
211
  wire [7:0]  dfl_params1_out;
212
  wire [7:0]  slottime_out_1;
213
  wire [7:0]  slottime_out_2;
214
  wire [31:0] mdio_cmd_out;
215
  wire [7:0]  mdio_stat_out_1;
216
  wire [7:0]  mdio_stat_out_2;
217
  wire [7:0]  mdio_stat_out_3;
218
  wire [7:0]  mdio_stat_out_4;
219
  wire [7:0]  mdio_cmd_out_1;
220
  wire [7:0]  mdio_cmd_out_2;
221
  wire [7:0]  mdio_cmd_out_3;
222
  wire [7:0]  mdio_cmd_out_4;
223
  wire [7:0]  mac_sa_out_1;
224
  wire [7:0]  mac_sa_out_2;
225
  wire [7:0]  mac_sa_out_3;
226
  wire [7:0]  mac_sa_out_4;
227
  wire [7:0]  mac_sa_out_5;
228
  wire [7:0]  mac_sa_out_6;
229
  wire [7:0]  pause_quanta_out_1;
230
  wire [7:0]  pause_quanta_out_2;
231
  wire [47:0] cf_mac_sa;
232
  wire [15:0] cf2tx_pause_quanta;
233
  wire [15:0] cf2rx_max_pkt_sz;
234
  wire       cf2tx_force_bad_fcs;
235
  wire       cf2tx_tstate_mode;
236
  reg        force_bad_fcs;
237
  reg        cont_force_bad_fcs;
238
  wire [31:0]  mdio_stat_out;
239
  reg  cf2tx_force_bad_fcs_en;
240
  reg  cf2tx_cont_force_bad_fcs_en;
241
  reg [15:0]  int_mdio_stat_out;
242
 
243
//-----------------------------------------------------------------------
244
// Internal Wire Declarations
245
//-----------------------------------------------------------------------
246
 
247
wire           sw_rd_en;
248
wire           sw_wr_en;
249
wire  [3:0]    sw_addr ; // addressing 16 registers
250
wire  [3:0]    wr_be   ;
251
 
252
reg   [31:0]  reg_rdata      ;
253
reg           reg_ack     ;
254
 
255
wire [31:0]    reg_0;  // Software_Reg_0
256
wire [31:0]    reg_1;  // Software-Reg_1
257
wire [31:0]    reg_2;  // Software-Reg_2
258
wire [31:0]    reg_3;  // Software-Reg_3
259
wire [31:0]    reg_4;  // Software-Reg_4
260
wire [31:0]    reg_5;  // Software-Reg_5
261
wire [31:0]    reg_6;  // Software-Reg_6
262
wire [31:0]    reg_7;  // Software-Reg_7
263
wire [31:0]    reg_8;  // Software-Reg_8
264
wire [31:0]    reg_9;  // Software-Reg_9
265
wire [31:0]    reg_10; // Software-Reg_10
266
wire [31:0]    reg_11; // Software-Reg_11
267
wire [31:0]    reg_12; // Software-Reg_12
268
wire [31:0]    reg_13; // Software-Reg_13
269
wire [31:0]    reg_14; // Software-Reg_14
270
wire [31:0]    reg_15; // Software-Reg_15
271
reg  [31:0]    reg_out;
272
 
273
//-----------------------------------------------------------------------
274
// Internal Logic Starts here
275
//-----------------------------------------------------------------------
276
    assign sw_addr       = reg_addr [3:0];
277
    assign sw_rd_en      = reg_cs & !reg_wr;
278
    assign sw_wr_en      = reg_cs & reg_wr;
279
    assign wr_be         = reg_be;
280
 
281
 
282
//-----------------------------------------------------------------------
283
// Read path mux
284
//-----------------------------------------------------------------------
285
 
286
always @ (posedge app_clk or negedge app_reset_n)
287
begin : preg_out_Seq
288
   if (app_reset_n == 1'b0)
289
   begin
290
      reg_rdata [31:0]  <= 32'h0000_0000;
291
      reg_ack           <= 1'b0;
292
   end
293
   else if (sw_rd_en && !reg_ack)
294
   begin
295
      reg_rdata [31:0]  <= reg_out [31:0];
296
      reg_ack           <= 1'b1;
297
   end
298
   else if (sw_wr_en && !reg_ack)
299
      reg_ack           <= 1'b1;
300
   else
301
   begin
302
      reg_ack        <= 1'b0;
303
   end
304
end
305
 
306
 
307
//-----------------------------------------------------------------------
308
// register read enable and write enable decoding logic
309
//-----------------------------------------------------------------------
310
wire   sw_wr_en_0 = sw_wr_en & (sw_addr == 4'h0);
311
wire   sw_rd_en_0 = sw_rd_en & (sw_addr == 4'h0);
312
wire   sw_wr_en_1 = sw_wr_en & (sw_addr == 4'h1);
313
wire   sw_rd_en_1 = sw_rd_en & (sw_addr == 4'h1);
314
wire   sw_wr_en_2 = sw_wr_en & (sw_addr == 4'h2);
315
wire   sw_rd_en_2 = sw_rd_en & (sw_addr == 4'h2);
316
wire   sw_wr_en_3 = sw_wr_en & (sw_addr == 4'h3);
317
wire   sw_rd_en_3 = sw_rd_en & (sw_addr == 4'h3);
318
wire   sw_wr_en_4 = sw_wr_en & (sw_addr == 4'h4);
319
wire   sw_rd_en_4 = sw_rd_en & (sw_addr == 4'h4);
320
wire   sw_wr_en_5 = sw_wr_en & (sw_addr == 4'h5);
321
wire   sw_rd_en_5 = sw_rd_en & (sw_addr == 4'h5);
322
wire   sw_wr_en_6 = sw_wr_en & (sw_addr == 4'h6);
323
wire   sw_rd_en_6 = sw_rd_en & (sw_addr == 4'h6);
324
wire   sw_wr_en_7 = sw_wr_en & (sw_addr == 4'h7);
325
wire   sw_rd_en_7 = sw_rd_en & (sw_addr == 4'h7);
326
wire   sw_wr_en_8 = sw_wr_en & (sw_addr == 4'h8);
327
wire   sw_rd_en_8 = sw_rd_en & (sw_addr == 4'h8);
328
wire   sw_wr_en_9 = sw_wr_en & (sw_addr == 4'h9);
329
wire   sw_rd_en_9 = sw_rd_en & (sw_addr == 4'h9);
330
wire   sw_wr_en_10 = sw_wr_en & (sw_addr == 4'hA);
331
wire   sw_rd_en_10 = sw_rd_en & (sw_addr == 4'hA);
332
wire   sw_wr_en_11 = sw_wr_en & (sw_addr == 4'hB);
333
wire   sw_rd_en_11 = sw_rd_en & (sw_addr == 4'hB);
334
wire   sw_wr_en_12 = sw_wr_en & (sw_addr == 4'hC);
335
wire   sw_rd_en_12 = sw_rd_en & (sw_addr == 4'hC);
336
wire   sw_wr_en_13 = sw_wr_en & (sw_addr == 4'hD);
337
wire   sw_rd_en_13 = sw_rd_en & (sw_addr == 4'hD);
338
wire   sw_wr_en_14 = sw_wr_en & (sw_addr == 4'hE);
339
wire   sw_rd_en_14 = sw_rd_en & (sw_addr == 4'hE);
340
wire   sw_wr_en_15 = sw_wr_en & (sw_addr == 4'hF);
341
wire   sw_rd_en_15 = sw_rd_en & (sw_addr == 4'hF);
342
 
343
 
344
always @( *)
345
begin : preg_sel_Com
346
 
347
  reg_out [31:0] = 32'd0;
348
 
349
  case (sw_addr [3:0])
350
    4'b0000 : reg_out [31:0] = reg_0 [31:0];
351
    4'b0001 : reg_out [31:0] = reg_1 [31:0];
352
    4'b0010 : reg_out [31:0] = reg_2 [31:0];
353
    4'b0011 : reg_out [31:0] = reg_3 [31:0];
354
    4'b0100 : reg_out [31:0] = reg_4 [31:0];
355
    4'b0101 : reg_out [31:0] = reg_5 [31:0];
356
    4'b0110 : reg_out [31:0] = reg_6 [31:0];
357
    4'b0111 : reg_out [31:0] = reg_7 [31:0];
358
    4'b1000 : reg_out [31:0] = reg_8 [31:0];
359
    4'b1001 : reg_out [31:0] = reg_9 [31:0];
360
    4'b1010 : reg_out [31:0] = reg_10 [31:0];
361
    4'b1011 : reg_out [31:0] = reg_11 [31:0];
362
    4'b1100 : reg_out [31:0] = reg_12 [31:0];
363
    4'b1101 : reg_out [31:0] = reg_13 [31:0];
364
    4'b1110 : reg_out [31:0] = reg_14 [31:0];
365
    4'b1111 : reg_out [31:0] = reg_15 [31:0];
366
  endcase
367
end
368
 
369
 
370
  //instantiate all the registers
371
 
372
  //========================================================================//
373
  // TX_CNTRL_REGISTER : Address value 00H
374
  // BIT[0] = Transmit Channel Enable
375
  // BIT[1] = DONT CARE 
376
  // BIT[2] = Retry Packet in case of Collisions
377
  // BIT[3] = Enable padding
378
  // BIT[4] = Append CRC
379
  // BIT[5] = Perform a Two Part Deferral
380
  // BIT[6] = RMII Enable bit
381
  // BIT[7] = Force TX FCS Error
382
 
383
 
384
generic_register #(8,0  ) tx_cntrl_reg_1 (
385
              .we            ({8{sw_wr_en_0 &
386
                                 wr_be[0]   }}    ),
387
              .data_in       (reg_wdata[7:0]    ),
388
              .reset_n       (app_reset_n         ),
389
              .clk           (app_clk             ),
390
 
391
              //List of Outs
392
              .data_out      (tx_cntrl_out_1[7:0] )
393
          );
394
 
395
generic_register #(8,0  ) tx_cntrl_reg_2 (
396
              .we            ({8{sw_wr_en_0 &
397
                                 wr_be[1]   }}    ),
398
              .data_in       (reg_wdata[15:8]   ),
399
              .reset_n       (app_reset_n         ),
400
              .clk           (app_clk             ),
401
 
402
              //List of Outs
403
              .data_out      (tx_cntrl_out_2[7:0] )
404
          );
405
 
406
  assign cf2tx_ch_en = tx_cntrl_out_1[0];
407
  assign cf2tx_pad_enable = tx_cntrl_out_1[3];
408
  assign cf2tx_append_fcs = tx_cntrl_out_1[4];
409
  assign cf2tx_tstate_mode = tx_cntrl_out_1[6];
410
  assign cf2tx_force_bad_fcs = tx_cntrl_out_1[7];
411
 
412
assign reg_0[15:0] = {tx_cntrl_out_2,tx_cntrl_out_1};
413
 
414
  //=========================================================================//
415
  // RX_CNTRL_REGISTER 1 : Address Value 04H
416
  // BIT[0] = Receive Channel Enable
417
  // BIT[1] = Strip Padding from the Receive data
418
  // BIT[2] = Send CRC along with data to the host
419
  // BIT[3] = Enable pause frame detect
420
  // BIT[4] = Check RX Deferral
421
  // BIT[5] = Receive Address Check Enable
422
  // BIT[6] = Receive Runt Packet
423
  // BIT[7] = Broad Cast Rx Disable
424
  // BIT[31:8] = Reserved
425
  generic_register #(8,0  ) rx_cntrl_reg_1 (
426
              .we            ({8{sw_wr_en_1 &
427
                                 wr_be[0]   }}      ),
428
              .data_in       (reg_wdata[7:0]    ),
429
              .reset_n       (app_reset_n         ),
430
              .clk           (app_clk             ),
431
 
432
              //List of Outs
433
              .data_out      (rx_cntrl_out_1[7:0] )
434
          );
435
 
436
  assign cf2rx_ch_en             = rx_cntrl_out_1[0];
437
  assign cf2rx_strp_pad_en       = rx_cntrl_out_1[1];
438
  assign cf2rx_snd_crc           = rx_cntrl_out_1[2];
439
  assign cf2rx_pause_en          = rx_cntrl_out_1[3];
440
  assign cf_chk_rx_dfl           = rx_cntrl_out_1[4];
441
  assign cf2rx_addrchk_en        = rx_cntrl_out_1[5];
442
  assign cf2rx_runt_pkt_en       = rx_cntrl_out_1[6];
443
  assign cf2af_broadcast_disable = rx_cntrl_out_1[7];
444
 
445
 
446
assign reg_1[7:0] = {rx_cntrl_out_1};
447
  //========================================================================//
448
  //TRANSMIT DEFFERAL CONTROL REGISTER: Address value 08H
449
  //BIT[7:0] = Defferal TX
450
  //BIT[15:8] = Defferal RX
451
 
452
  generic_register #(8,0  ) dfl_params1_en_reg (
453
              .we            ({8{sw_wr_en_2 &
454
                                 wr_be[0]   }}      ),
455
              .data_in       (reg_wdata[7:0]    ),
456
              .reset_n       (app_reset_n         ),
457
              .clk           (app_clk             ),
458
 
459
              //List of Outs
460
              .data_out      (dfl_params1_out[7:0] )
461
          );
462
 
463
  assign cf2df_dfl_single = dfl_params1_out[7:0];
464
 
465
  generic_register #(8,0  ) dfl_params_rx_en_reg (
466
              .we            ({8{sw_wr_en_2 &
467
                                 wr_be[1]   }}    ),
468
              .data_in       (reg_wdata[15:8]   ),
469
              .reset_n       (app_reset_n         ),
470
              .clk           (app_clk             ),
471
 
472
              //List of Outs
473
              .data_out      (dfl_params_rx_out[7:0] )
474
          );
475
  assign cf2df_dfl_single_rx = dfl_params_rx_out[7:0];
476
 
477
assign reg_2[15:0] = {dfl_params_rx_out,dfl_params1_out};
478
 
479
  //========================================================================//
480
  // MAC_MODE  REGISTER: Address value 0CH
481
  // BIT[0] = 10/100 or 1000 1 1000, 0 is 10/100 Channel Enable
482
  // BIT[1] = Mii/Rmii Default is Mii
483
  // BIT[2] = MAC used in Loop back Mode 
484
  // BIT[3] = Burst Enable 
485
  // BIT[4] = Half Duplex 
486
  // BIT[5] = Silent Mode (During Loopback the Tx --> RX and NOT to PHY) 
487
  // BIT[6] = crs based flow control enable
488
  // BIT[7] = Mac Mode Change
489
 
490
  generic_register #(8,0  ) mac_mode_reg (
491
              .we            ({8{sw_wr_en_3 & wr_be[0]}}),
492
              .data_in       (reg_wdata[7:0]    ),
493
              .reset_n       (app_reset_n         ),
494
              .clk           (app_clk             ),
495
 
496
              //List of Outs
497
              .data_out      (mac_mode_out[7:0] )
498
          );
499
 
500
  assign cf_mac_mode                  = mac_mode_out[0];
501
  assign cf2mi_rmii_en                = mac_mode_out[1];
502
  assign cf2mi_loopback_en            = mac_mode_out[2];
503
  assign cf_silent_mode               = mac_mode_out[5];
504
  assign cfg_crs_flow_ctrl_enb_i      = mac_mode_out[6];
505
  assign cfg_uni_mac_mode_change_i    = mac_mode_out[7];
506
 
507
 
508
assign reg_3[7:0] = {mac_mode_out};
509
  //========================================================================//
510
  //MDIO COMMAND REGISTER: ADDRESS 10H
511
  //BIT[15:0] = MDIO DATA TO PHY
512
  //BIT[20:16] = MDIO REGISTER ADDR
513
  //BIT[25:21] = MDIO PHY ADDR
514
  //BIT[26] = MDIO COMMAND OPCODE READ/WRITE(0:read,1:write)
515
  //BIT[31] = GO MDIO
516
 
517
  generic_register #(8,0  ) mdio_cmd_reg_1 (
518
              .we            ({8{sw_wr_en_4 &
519
                                 wr_be[0]   }}      ),
520
              .data_in       (reg_wdata[7:0]    ),
521
              .reset_n       (app_reset_n         ),
522
              .clk           (app_clk             ),
523
 
524
              //List of Outs
525
              .data_out      (mdio_cmd_out_1[7:0] )
526
          );
527
 
528
  generic_register #(8,0  ) mdio_cmd_reg_2 (
529
              .we            ({8{sw_wr_en_4 &
530
                                 wr_be[1]   }}    ),
531
              .data_in       (reg_wdata[15:8]   ),
532
              .reset_n       (app_reset_n         ),
533
              .clk           (app_clk             ),
534
 
535
              //List of Outs
536
              .data_out      (mdio_cmd_out_2[7:0] )
537
          );
538
 
539
  generic_register #(8,0  ) mdio_cmd_reg_3 (
540
              .we            ({8{sw_wr_en_4 &
541
                                 wr_be[2]   }}    ),
542
              .data_in       (reg_wdata[23:16]  ),
543
              .reset_n       (app_reset_n         ),
544
              .clk           (app_clk             ),
545
 
546
              //List of Outs
547
              .data_out      (mdio_cmd_out_3[7:0] )
548
          );
549
 
550
 
551
 
552
  //byte_reg  mdio_cmd_reg_4 (.we({8{mdio_cmd_en_4 && cfg_rw}}), .data_in(reg_wdata),
553
  //                   .reset_n(app_reset_n), .clk(app_clk), .data_out(mdio_cmd_out_4));
554
 
555
 
556
  generic_register #(7,0  ) mdio_cmd_reg_4 (
557
              .we            ({7{sw_wr_en_4 &
558
                                 wr_be[3]   }}    ),
559
              .data_in       (reg_wdata[30:24]  ),
560
              .reset_n       (app_reset_n         ),
561
              .clk           (app_clk             ),
562
 
563
              //List of Outs
564
              .data_out      (mdio_cmd_out_4[6:0] )
565
          );
566
 
567
req_register #(0  ) u_mdio_req (
568
              .cpu_we       ({sw_wr_en_4 &
569
                             wr_be[3]   }       ),
570
              .cpu_req      (reg_wdata[31]    ),
571
              .hware_ack    (mdio_cmd_done_sync ),
572
              .reset_n       (app_reset_n       ),
573
              .clk           (app_clk           ),
574
 
575
              //List of Outs
576
              .data_out      (mdio_cmd_out_4[7] )
577
          );
578
 
579
 
580
  assign mdio_cmd_out = {mdio_cmd_out_4, mdio_cmd_out_3,mdio_cmd_out_2,mdio_cmd_out_1};
581
 
582
  assign reg_4 = {mdio_cmd_out};
583
 
584
  assign cf2md_datain = mdio_cmd_out[15:0];
585
  assign cf2md_regad = mdio_cmd_out[20:16];
586
  assign cf2md_phyad = mdio_cmd_out[25:21];
587
  assign cf2md_op = mdio_cmd_out[26];
588
  assign cf2md_go = mdio_cmd_out[31];
589
 
590
 
591
  //========================================================================//
592
  //MDIO STATUS REGISTER: ADDRESS 14H
593
  //BIT[15:0] = MDIO DATA FROM PHY
594
  //BIT[31] = STATUS OF MDIO TRANSFER
595
 
596
  always @(posedge app_clk
597
           or negedge app_reset_n)
598
    begin
599
      if(!app_reset_n) begin
600
        int_mdio_stat_out <= 16'b0;
601
        int_md2cf_status <= 1'b0;
602
      end
603
      else
604
        if(mdio_cmd_done_sync)
605
          begin
606
            int_mdio_stat_out[15:0] <= md2cf_data;
607
            // int_mdio_stat_out[30:16] <= int_mdio_stat_out[30:16];
608
            int_md2cf_status <= md2cf_status;
609
          end // else: !if(reset)
610
    end // always @ (posedge app_clk...
611
 
612
  assign mdio_stat_out = (mac_mdio_en == 1'b1) ? {int_md2cf_status, 15'b0, int_mdio_stat_out} : 32'b0;
613
 
614
 
615
  assign reg_5 = {mdio_stat_out};
616
 
617
  //========================================================================//
618
  //MAC Source Address Register 18-1C
619
 
620
  generic_register #(8,0  ) mac_sa_reg_1 (
621
              .we            ({8{sw_wr_en_6 & wr_be[0] }}),
622
              .data_in       (reg_wdata[7:0]    ),
623
              .reset_n       (app_reset_n         ),
624
              .clk           (app_clk             ),
625
 
626
              //List of Outs
627
              .data_out      (mac_sa_out_1[7:0] )
628
          );
629
  generic_register #(8,0  ) mac_sa_reg_2 (
630
              .we            ({8{sw_wr_en_6 & wr_be[1] }}),
631
              .data_in       (reg_wdata[15:8]    ),
632
              .reset_n       (app_reset_n         ),
633
              .clk           (app_clk             ),
634
 
635
              //List of Outs
636
              .data_out      (mac_sa_out_2[7:0] )
637
          );
638
 
639
  generic_register #(8,0  ) mac_sa_reg_3 (
640
              .we            ({8{sw_wr_en_6 & wr_be[2] }}),
641
              .data_in       (reg_wdata[23:16]    ),
642
              .reset_n       (app_reset_n         ),
643
              .clk           (app_clk             ),
644
 
645
              //List of Outs
646
              .data_out      (mac_sa_out_3[7:0] )
647
          );
648
 
649
  generic_register #(8,0  ) mac_sa_reg_4 (
650
              .we            ({8{sw_wr_en_6 & wr_be[3] }}),
651
              .data_in       (reg_wdata[31:24]    ),
652
              .reset_n       (app_reset_n         ),
653
              .clk           (app_clk             ),
654
 
655
              //List of Outs
656
              .data_out      (mac_sa_out_4[7:0] )
657
          );
658
 
659
  generic_register #(8,0  ) mac_sa_reg_5 (
660
              .we            ({8{sw_wr_en_7 & wr_be[0] }}),
661
              .data_in       (reg_wdata[7:0]    ),
662
              .reset_n       (app_reset_n         ),
663
              .clk           (app_clk             ),
664
 
665
              //List of Outs
666
              .data_out      (mac_sa_out_5[7:0] )
667
          );
668
 
669
  generic_register #(8,0  ) mac_sa_reg_6 (
670
              .we            ({8{sw_wr_en_7 & wr_be[1] }}),
671
              .data_in       (reg_wdata[15:8]    ),
672
              .reset_n       (app_reset_n         ),
673
              .clk           (app_clk             ),
674
 
675
              //List of Outs
676
              .data_out      (mac_sa_out_6[7:0] )
677
          );
678
 
679
//  assign cf_mac_sa = { mac_sa_out_1, mac_sa_out_2, mac_sa_out_3,
680
//                       mac_sa_out_4, mac_sa_out_5, mac_sa_out_6};
681
  assign cf_mac_sa = { mac_sa_out_6, mac_sa_out_5, mac_sa_out_4,
682
                       mac_sa_out_3, mac_sa_out_2, mac_sa_out_1};
683
 
684
  assign reg_6[31:0] = cf_mac_sa[31:0];
685
  assign reg_7[15:0] = cf_mac_sa[47:32];
686
//========================================================================//
687
//MAC max packet size Register 20
688
 
689
  generic_register #(8,0  ) max_pkt_sz_reg0 (
690
              .we            ({8{sw_wr_en_8 & wr_be[0] }}),
691
              .data_in       (reg_wdata[7:0]    ),
692
              .reset_n       (app_reset_n         ),
693
              .clk           (app_clk             ),
694
 
695
              //List of Outs
696
              .data_out      (cf2rx_max_pkt_sz[7:0] )
697
          );
698
 
699
  generic_register #(8,0  ) max_pkt_sz_reg1 (
700
              .we            ({8{sw_wr_en_8 & wr_be[1] }}),
701
              .data_in       (reg_wdata[15:8]    ),
702
              .reset_n       (app_reset_n         ),
703
              .clk           (app_clk             ),
704
 
705
              //List of Outs
706
              .data_out      (cf2rx_max_pkt_sz[15:8] )
707
          );
708
 
709
  assign reg_8[15:0] = cf2rx_max_pkt_sz[15:0];
710
  //========================================================================//
711
  //Pause Quanta Register 24
712
 
713
  generic_register #(8,0  ) pause_quanta_reg_1 (
714
              .we            ({8{sw_wr_en_9 & wr_be[0] }}),
715
              .data_in       (reg_wdata[7:0]    ),
716
              .reset_n       (app_reset_n         ),
717
              .clk           (app_clk             ),
718
 
719
              //List of Outs
720
              .data_out      (pause_quanta_out_1[7:0] )
721
          );
722
 
723
  generic_register #(8,0  ) pause_quanta_reg_2 (
724
              .we            ({8{sw_wr_en_9 & wr_be[1] }}),
725
              .data_in       (reg_wdata[15:8]    ),
726
              .reset_n       (app_reset_n         ),
727
              .clk           (app_clk             ),
728
 
729
              //List of Outs
730
              .data_out      (pause_quanta_out_2[7:0] )
731
          );
732
 
733
 
734
  assign cf2tx_pause_quanta = {pause_quanta_out_1 , pause_quanta_out_2};
735
 
736
 
737
  assign reg_9[15:0] = cf2tx_pause_quanta;
738
 
739
 
740
 
741
//-----------------------------------------------------------------------
742
// RX-Clock Static Counter Status Signal
743
//-----------------------------------------------------------------------
744
// Note: rx_sts_vld signal is only synchronised w.r.t application clock, and
745
//       assumption is rx_sts is stable untill next packet received
746
 assign  rx_good_frm_trig = rx_sts_vld && (rx_sts[7:0] == 'h0);
747
 assign  rx_bad_frm_trig  = rx_sts_vld && (rx_sts[7:0] != 'h0);
748
 
749
 
750
stat_counter #(16) u_stat_rx_good_frm  (
751
   // Clock and Reset Signals
752
         . sys_clk          (app_clk         ),
753
         . s_reset_n        (app_reset_n     ),
754
 
755
         . count_trigger    (rx_good_frm_trig),
756
 
757
         . reg_sel          (sw_wr_en_10     ),
758
         . reg_wr_data      (reg_wdata[15:0] ),
759
         . reg_wr           (wr_be[0]        ),  // Byte write not supported for cntr
760
 
761
         . cntr_intr        (                ),
762
         . cntrout          (reg_10[15:0]    )
763
   );
764
 
765
stat_counter #(16) u_stat_rx_bad_frm (
766
   // Clock and Reset Signals
767
         . sys_clk          (app_clk         ),
768
         . s_reset_n        (app_reset_n     ),
769
 
770
         . count_trigger    (rx_bad_frm_trig ),
771
 
772
         . reg_sel          (sw_wr_en_11     ),
773
         . reg_wr_data      (reg_wdata[15:0] ),
774
         . reg_wr           (wr_be[0]        ),  // Byte write not supported for cntr
775
 
776
         . cntr_intr        (                ),
777
         . cntrout          (reg_11[15:0]    )
778
   );
779
 
780
 
781
 wire    tx_good_frm_trig = tx_sts_vld ;
782
 
783
stat_counter #(16) u_stat_tx_good_frm (
784
   // Clock and Reset Signals
785
         . sys_clk          (app_clk           ),
786
         . s_reset_n        (app_reset_n       ),
787
 
788
         . count_trigger    (tx_good_frm_trig  ),
789
 
790
         . reg_sel          (sw_wr_en_12       ),
791
         . reg_wr_data      (reg_wdata[15:0]   ),
792
         . reg_wr           (wr_be[0]          ),  // Byte write not supported for cntr
793
 
794
         . cntr_intr        (                  ),
795
         . cntrout          (reg_12[15:0]      )
796
   );
797
 
798
// reg_13 is free
799
 
800
generic_intr_stat_reg   #(9) u_intr_stat (
801
                 //inputs
802
                 . clk              (app_clk                     ),
803
                 . reset_n          (app_reset_n                 ),
804
                 . reg_we           ({{1{sw_wr_en_13 & wr_be[1]}},
805
                                      {8{sw_wr_en_13 & wr_be[0]}}} ),
806
                 . reg_din          (reg_wdata[8:0]              ),
807
                 . hware_req        ({tx_sts,rx_sts[7:0]}        ),
808
 
809
                 //outputs
810
                 . data_out         (reg_14[8:0]                 )
811
              );
812
 
813
 
814
 
815
 
816
 
817
endmodule
818
 
819
 

powered by: WebSVN 2.1.0

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