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

Subversion Repositories sgmii

[/] [sgmii/] [trunk/] [sim/] [BFMs/] [SGMII_altera/] [testbench/] [model/] [mdio_slave.v] - Blame information for rev 9

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

Line No. Rev Author Line
1 9 jefflieu
// -------------------------------------------------------------------------
2
// -------------------------------------------------------------------------
3
//
4
// Revision Control Information
5
//
6
// $RCSfile: $
7
// $Source: $
8
//
9
// $Revision: #1 $
10
// $Date: 2011/11/10 $
11
// Check in by : $Author: max $
12
// Author      : SKNg/TTChong
13
//
14
// Project     : Triple Speed Ethernet - 10/100/1000 MAC
15
//
16
// Description : (Simulation only)
17
//
18
// MDIO slave's register interface controller 
19
// Instantiated in top_mdio_slave (top_mdio_slave.v)
20
//
21
// 
22
// ALTERA Confidential and Proprietary
23
// Copyright 2006 (c) Altera Corporation
24
// All rights reserved
25
//
26
// -------------------------------------------------------------------------
27
// -------------------------------------------------------------------------
28
 
29
`timescale 1 ns / 10 ps
30
//`include "common_header.verilog" 
31
 
32
module mdio_slave (reset,
33
   mdc,
34
   mdio,
35
   dev_addr,
36
   reg_addr,
37
   reg_read,
38
   reg_write,
39
   reg_dout,
40
   reg_din);
41
input   reset; //  asynch reset
42
input   mdc; //  system clock
43
inout   mdio; //  Data Bus
44
input   [4:0] dev_addr; //  Device address
45
output   [4:0] reg_addr; //  Address register
46
output   reg_read; //  Read register         
47
output   reg_write; //  Write register         
48
output   [15:0] reg_dout; //  Data Bus OUT
49
input   [15:0] reg_din; //  Data Bus IN
50
wire    VHDL2V_mdio;
51
wire    mdio;
52
wire    [4:0] reg_addr;
53
wire    reg_read;
54
wire    reg_write;
55
wire    [15:0] reg_dout;
56
reg     [4:0] phy_add; //  Phy Address
57
reg     [4:0] reg_add; //  Register Address
58
reg     [15:0] reg_out; //  Register data out
59
reg     [15:0] reg_in; //  Register data in
60
reg     en_phy_add; //  Write phy Address
61
reg     en_reg_add; //  Write register Address
62
reg     en_data_out; //  Write register data out
63
wire    en_data_in; //  Write register data in
64
wire    shift_data_in; //  Send register data in
65
wire    phy_add_ok; //  Phy Address correct
66
reg     [4:0] cnt_32; //  Frame Bit counter
67
wire    run_cnt_32; //  Run Frame Bit counter
68
wire    ok_32; //  Preambule length reached
69
wire    ok_16; //  Data length reached
70
wire    ok_10; //  Reg address length reach
71
wire    ok_5; //  Phy address length reach
72
reg     cd_oe; //  Output Enable command
73
wire    mux_0; //  Mux zero
74
reg     mdio_wait; //  Wait state of State machine
75
reg     [16:0] mdio_run; //  State machine core
76
// =====================================================================
77
//  Data logic structure  
78
// =====================================================================
79
 
80
always @(posedge mdc or posedge reset)
81
   begin : p_data
82
   if (reset == 1'b 1)
83
      begin
84
      phy_add <= {5{1'b 0}};    //  Phy Address
85
      reg_add <= {5{1'b 0}};    //  Register Address
86
      reg_out <= {16{1'b 0}};   //  Register data out
87
      reg_in <= {16{1'b 0}};    //  Register data in
88
// 
89
      cnt_32 <= {5{1'b 0}}; //  Frame Bit counter
90
// 
91
      end
92
   else
93
      begin
94
// ----------------------
95
//  Phy Address
96
// ----------------------
97
      if (en_phy_add == 1'b 1)
98
         begin
99
         phy_add[4:0] <= {phy_add[3:0], mdio};
100
         end
101
      else
102
         begin
103
         phy_add <= phy_add;
104
         end
105
// ----------------------
106
// -----------------------
107
//  Register Address 
108
// -----------------------  
109
      if (en_reg_add == 1'b 1)
110
         begin
111
         reg_add[4:0] <= {reg_add[3:0], mdio};
112
         end
113
      else
114
         begin
115
         reg_add <= reg_add;
116
         end
117
// -----------------------
118
// -----------------------
119
//  Register data out 
120
// -----------------------  
121
      if (en_data_out == 1'b 1)
122
         begin
123
         reg_out[15:0] <= {reg_out[14:0], mdio};
124
         end
125
      else
126
         begin
127
         reg_out <= reg_out;
128
         end
129
// -----------------------
130
// -----------------------------------------
131
//  Register data in
132
// -----------------------------------------
133
      if (en_data_in == 1'b 1)
134
         begin
135
         reg_in[15:0] <= reg_din;
136
         end
137
      else if (shift_data_in == 1'b 1 )
138
         begin
139
         reg_in[15:1] <= reg_in[14:0];
140
         end
141
      else
142
         begin
143
         reg_in <= reg_in;
144
         end
145
//     
146
// ------------------------------------------
147
// --------------------
148
//  Frame Bit counter
149
// -------------------
150
      if (run_cnt_32 == 1'b 1)
151
         begin
152
         cnt_32 <= cnt_32 + 1'b 1;
153
         end
154
      else
155
         begin
156
         cnt_32 <= 5'b 00000;
157
         end
158
// -------------------
159
      end
160
   end
161
// 
162
// --------------------------
163
//  Phy Address correct
164
// --------------------------
165
assign phy_add_ok = phy_add == dev_addr ? 1'b 1 :
166
    1'b 0;
167
// 
168
// ---------------------------
169
//  Preambule length reached
170
// ---------------------------
171
assign ok_32 = cnt_32 == 5'b 11110 ? 1'b 1 :
172
    1'b 0;
173
//   
174
// --------------------------
175
//  Data length reached
176
// --------------------------
177
assign ok_16 = cnt_32 == 5'b 01111 ? 1'b 1 :
178
    1'b 0;
179
//  
180
// --------------------------
181
//  Reg address length reach
182
// --------------------------
183
assign ok_10 = cnt_32 == 5'b 01010 ? 1'b 1 :
184
    1'b 0;
185
//   
186
// --------------------------
187
//  Phy address length reach
188
// --------------------------
189
assign ok_5 = cnt_32 == 5'b 00101 ? 1'b 1 :
190
    1'b 0;
191
//                       
192
// ----------------------
193
//  -- Address register
194
// ----------------------
195
assign reg_addr = reg_add;
196
// 
197
// ----------------------
198
//  Data Bus OUT
199
// ----------------------
200
assign reg_dout = reg_out;
201
// 
202
// ----------------------
203
//  Mux zero
204
// ----------------------
205
assign mux_0 = mdio_run[8] == 1'b 1 ? 1'b 0 :
206
    reg_in[15];
207
// 
208
// ----------------------
209
//  Data Bus
210
// ----------------------
211
assign #(5) mdio = cd_oe == 1'b 0 ? mux_0 :
212
    1'b Z;
213
//         
214
// =====================================================================
215
// =====================================================================
216
//  State machine body  
217
// =====================================================================
218
always @(posedge mdc or posedge reset)
219
   begin : p_state
220
   if (reset == 1'b 1)
221
      begin
222
      mdio_wait <= 1'b 1;   //  Wait state of State machine
223
      mdio_run <= {17{1'b 0}};  //  State machine core
224
// 
225
      cd_oe <= 1'b 1;   //  Output Enable command
226
// 
227
      en_phy_add <= 1'b 0;  //  Write phy Address
228
      en_reg_add <= 1'b 0;  //  Write register Address
229
      en_data_out <= 1'b 0; //  Write register data out
230
// 
231
//  
232
      end
233
   else
234
      begin
235
// --------------------------------------
236
//  wait for a frame
237
// --------------------------------------
238
      if (mdio_wait == 1'b 1 & mdio == 1'b 0 |
239
    mdio_run[0] == 1'b 1 & mdio == 1'b 0 |
240
    mdio_run[2] == 1'b 1 & mdio == 1'b 0 |
241
    mdio_run[4] == 1'b 1 & mdio == 1'b 1 |
242
    mdio_run[6] == 1'b 1 & phy_add_ok == 1'b 0 |
243
    mdio_run[7] == 1'b 1 & mdio == 1'b 0 |
244
    mdio_run[9] == 1'b 1 & ok_16 == 1'b 1 |
245
    mdio_run[10] == 1'b 1 & mdio == 1'b 0 |
246
    mdio_run[12] == 1'b 1 & phy_add_ok == 1'b 0 |
247
    mdio_run[13] == 1'b 1 & mdio == 1'b 0 |
248
    mdio_run[14] == 1'b 1 & mdio == 1'b 1 |
249
    mdio_run[16] == 1'b 1 | mdio_run[0] == 1'b 0 &
250
    mdio_run[1] == 1'b 0 & mdio_run[2] == 1'b 0 &
251
    mdio_run[3] == 1'b 0 & mdio_run[4] == 1'b 0 &
252
    mdio_run[5] == 1'b 0 & mdio_run[6] == 1'b 0 &
253
    mdio_run[7] == 1'b 0 & mdio_run[8] == 1'b 0 &
254
    mdio_run[9] == 1'b 0 & mdio_run[10] == 1'b 0 &
255
    mdio_run[11] == 1'b 0 & mdio_run[12] == 1'b 0 &
256
    mdio_run[13] == 1'b 0 & mdio_run[14] == 1'b 0 &
257
    mdio_run[15] == 1'b 0 & mdio_run[16] == 1'b 0)
258
         begin
259
         mdio_wait <= 1'b 1;
260
         end
261
      else
262
         begin
263
         mdio_wait <= 1'b 0;
264
         end
265
// 
266
// --------------------------------------------
267
//  Check preambule
268
// --------------------------------------------
269
      if (mdio_wait == 1'b 1 & mdio == 1'b 1 |
270
    mdio_run[0] == 1'b 1 & mdio == 1'b 1 &
271
    ok_32 == 1'b 0)
272
         begin
273
         mdio_run[0] <= 1'b 1;
274
         end
275
      else
276
         begin
277
         mdio_run[0] <= 1'b 0;
278
         end
279
// 
280
      if (mdio_run[0] == 1'b 1 & mdio == 1'b 1 &
281
    ok_32 == 1'b 1 | mdio_run[1] == 1'b 1 &
282
    mdio == 1'b 1)
283
         begin
284
         mdio_run[1] <= 1'b 1;
285
         end
286
      else
287
         begin
288
         mdio_run[1] <= 1'b 0;
289
         end
290
// --------------------------------------------
291
//  Check ST
292
// --------------------------------------------
293
      if (mdio_run[1] == 1'b 1 & mdio == 1'b 0)
294
         begin
295
         mdio_run[2] <= 1'b 1;
296
         end
297
      else
298
         begin
299
         mdio_run[2] <= 1'b 0;
300
         end
301
//    
302
      if (mdio_run[2] == 1'b 1 & mdio == 1'b 1)
303
         begin
304
         mdio_run[3] <= 1'b 1;
305
         end
306
      else
307
         begin
308
         mdio_run[3] <= 1'b 0;
309
         end
310
// --------------------------------------------
311
//  Check OP
312
// --------------------------------------------      
313
      if (mdio_run[3] == 1'b 1 & mdio == 1'b 1)
314
         begin
315
         mdio_run[4] <= 1'b 1;
316
         end
317
      else
318
         begin
319
         mdio_run[4] <= 1'b 0;
320
         end
321
// --------------------------------------------
322
//  Read OP
323
// --------------------------------------------              
324
      if (mdio_run[4] == 1'b 1 & mdio == 1'b 0 |
325
    mdio_run[5] == 1'b 1 & ok_5 == 1'b 0)
326
         begin
327
         mdio_run[5] <= 1'b 1;
328
         end
329
      else
330
         begin
331
         mdio_run[5] <= 1'b 0;
332
         end
333
//  
334
      if (mdio_run[5] == 1'b 1 & ok_5 == 1'b 1 |
335
    mdio_run[6] == 1'b 1 & ok_10 == 1'b 0 &
336
    phy_add_ok == 1'b 1)
337
         begin
338
         mdio_run[6] <= 1'b 1;
339
         end
340
      else
341
         begin
342
         mdio_run[6] <= 1'b 0;
343
         end
344
// 
345
      if (mdio_run[6] == 1'b 1 & ok_10 == 1'b 1 &
346
    phy_add_ok == 1'b 1)
347
         begin
348
         mdio_run[7] <= 1'b 1;
349
         end
350
      else
351
         begin
352
         mdio_run[7] <= 1'b 0;
353
         end
354
// 
355
      if (mdio_run[7] == 1'b 1 & mdio != 1'b 0)
356
         begin
357
         mdio_run[8] <= 1'b 1;
358
         end
359
      else
360
         begin
361
         mdio_run[8] <= 1'b 0;
362
         end
363
// 
364
      if (mdio_run[8] == 1'b 1 | mdio_run[9] == 1'b 1 &
365
    ok_16 == 1'b 0)
366
         begin
367
         mdio_run[9] <= 1'b 1;
368
         end
369
      else
370
         begin
371
         mdio_run[9] <= 1'b 0;
372
         end
373
// 
374
// --------------------------------------------
375
//  Write OP
376
// --------------------------------------------                   
377
      if (mdio_run[3] == 1'b 1 & mdio == 1'b 0)
378
         begin
379
         mdio_run[10] <= 1'b 1;
380
         end
381
      else
382
         begin
383
         mdio_run[10] <= 1'b 0;
384
         end
385
//  
386
      if (mdio_run[10] == 1'b 1 & mdio == 1'b 1 |
387
    mdio_run[11] == 1'b 1 & ok_5 == 1'b 0)
388
         begin
389
         mdio_run[11] <= 1'b 1;
390
         end
391
      else
392
         begin
393
         mdio_run[11] <= 1'b 0;
394
         end
395
//  
396
      if (mdio_run[11] == 1'b 1 & ok_5 == 1'b 1 |
397
    mdio_run[12] == 1'b 1 & ok_10 == 1'b 0 &
398
    phy_add_ok == 1'b 1)
399
         begin
400
         mdio_run[12] <= 1'b 1;
401
         end
402
      else
403
         begin
404
         mdio_run[12] <= 1'b 0;
405
         end
406
// 
407
      if (mdio_run[12] == 1'b 1 & ok_10 == 1'b 1 &
408
    phy_add_ok == 1'b 1)
409
         begin
410
         mdio_run[13] <= 1'b 1;
411
         end
412
      else
413
         begin
414
         mdio_run[13] <= 1'b 0;
415
         end
416
// 
417
      if (mdio_run[13] == 1'b 1 & mdio == 1'b 1)
418
         begin
419
         mdio_run[14] <= 1'b 1;
420
         end
421
      else
422
         begin
423
         mdio_run[14] <= 1'b 0;
424
         end
425
//  
426
      if (mdio_run[14] == 1'b 1 & mdio == 1'b 0 |
427
    mdio_run[15] == 1'b 1 & ok_16 == 1'b 0)
428
         begin
429
         mdio_run[15] <= 1'b 1;
430
         end
431
      else
432
         begin
433
         mdio_run[15] <= 1'b 0;
434
         end
435
// 
436
      if (mdio_run[15] == 1'b 1 & ok_16 == 1'b 1)
437
         begin
438
         mdio_run[16] <= 1'b 1;
439
         end
440
      else
441
         begin
442
         mdio_run[16] <= 1'b 0;
443
         end
444
// 
445
// ----------------------------    
446
// --------------------
447
//  Write phy Address    
448
// --------------------          
449
      if (mdio_run[4] == 1'b 1 & mdio == 1'b 0 |
450
    mdio_run[5] == 1'b 1 & ok_5 == 1'b 0 |
451
    mdio_run[10] == 1'b 1 & mdio == 1'b 1 |
452
    mdio_run[11] == 1'b 1 & ok_5 == 1'b 0)
453
         begin
454
         en_phy_add <= 1'b 1;
455
         end
456
      else
457
         begin
458
         en_phy_add <= 1'b 0;
459
         end
460
//             
461
// -------------------
462
// --------------------------           
463
//  Write register Address
464
// --------------------------
465
      if (mdio_run[5] == 1'b 1 & ok_5 == 1'b 1 |
466
    mdio_run[6] == 1'b 1 & ok_10 == 1'b 0 |
467
    mdio_run[11] == 1'b 1 & ok_5 == 1'b 1 |
468
    mdio_run[12] == 1'b 1 & ok_10 == 1'b 0)
469
         begin
470
         en_reg_add <= 1'b 1;
471
         end
472
      else
473
         begin
474
         en_reg_add <= 1'b 0;
475
         end
476
// ---------------------------
477
// --------------------------           
478
//  Write register data out
479
// --------------------------
480
      if (mdio_run[14] == 1'b 1 & mdio == 1'b 0 |
481
    mdio_run[15] == 1'b 1 & ok_16 == 1'b 0)
482
         begin
483
         en_data_out <= 1'b 1;
484
         end
485
      else
486
         begin
487
         en_data_out <= 1'b 0;
488
         end
489
// ---------------------------
490
// --------------------------           
491
//  Output Enable command
492
// --------------------------
493
      if (mdio_run[7] == 1'b 1 & mdio != 1'b 0 |
494
    mdio_run[8] == 1'b 1 | mdio_run[9] == 1'b 1 &
495
    ok_16 == 1'b 0)
496
         begin
497
         cd_oe <= 1'b 0;
498
         end
499
      else
500
         begin
501
         cd_oe <= 1'b 1;
502
         end
503
// ---------------------------
504
      end
505
   end
506
// 
507
// -------------------------
508
//  Write register data in
509
// -------------------------
510
assign en_data_in = mdio_run[8];
511
// 
512
// -------------------------
513
//  Send register data in   
514
// -------------------------          
515
assign shift_data_in = mdio_run[9];
516
//     
517
// -------------------------          
518
//  Read register 
519
// -------------------------          
520
assign reg_read = mdio_run[7] == 1'b 1 & mdio != 1'b 0 |
521
    mdio_run[8] == 1'b 1 ? 1'b 1 :
522
    1'b 0;
523
//                              
524
// -------------------------  
525
//  Write register
526
// -------------------------
527
assign reg_write = mdio_run[16];
528
//       
529
// --------------------------------
530
//  Run Frame Bit counter
531
// ---------------------------------
532
assign run_cnt_32 = mdio_wait == 1'b 1 & mdio == 1'b 1 |
533
    mdio_run[0] == 1'b 1 & mdio == 1'b 1 &
534
    ok_32 == 1'b 0 | mdio_run[4] == 1'b 1 &
535
    mdio == 1'b 0 | mdio_run[5] == 1'b 1 &
536
    ok_5 == 1'b 0 | mdio_run[5] == 1'b 1 &
537
    ok_5 == 1'b 1 | mdio_run[6] == 1'b 1 &
538
    ok_10 == 1'b 0 | mdio_run[9] == 1'b 1 |
539
    mdio_run[10] == 1'b 1 & mdio == 1'b 1 |
540
    mdio_run[11] == 1'b 1 & ok_5 == 1'b 0 |
541
    mdio_run[11] == 1'b 1 & ok_5 == 1'b 1 |
542
    mdio_run[12] == 1'b 1 & ok_10 == 1'b 0 |
543
    mdio_run[15] == 1'b 1 & ok_16 == 1'b 0 ? 1'b 1 :
544
    1'b 0;
545
// ---------------------------------
546
// 
547
// =====================================================================
548
 
549
endmodule // module mdio_slave
550
 

powered by: WebSVN 2.1.0

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