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 76

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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