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 61

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

powered by: WebSVN 2.1.0

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