remove debugging code
[debian/gnuradio] / usrp2 / fpga / opencores / ethernet_tri_mode / rtl / verilog / miim / eth_clockgen.v
1 //////////////////////////////////////////////////////////////////////
2 ////                                                              ////
3 ////  eth_clockgen.v                                              ////
4 ////                                                              ////
5 ////  This file is part of the Ethernet IP core project           ////
6 ////  http://www.opencores.org/projects/ethmac/                   ////
7 ////                                                              ////
8 ////  Author(s):                                                  ////
9 ////      - Igor Mohor (igorM@opencores.org)                      ////
10 ////                                                              ////
11 ////  All additional information is avaliable in the Readme.txt   ////
12 ////  file.                                                       ////
13 ////                                                              ////
14 //////////////////////////////////////////////////////////////////////
15 ////                                                              ////
16 //// Copyright (C) 2001 Authors                                   ////
17 ////                                                              ////
18 //// This source file may be used and distributed without         ////
19 //// restriction provided that this copyright statement is not    ////
20 //// removed from the file and that any derivative work contains  ////
21 //// the original copyright notice and the associated disclaimer. ////
22 ////                                                              ////
23 //// This source file is free software; you can redistribute it   ////
24 //// and/or modify it under the terms of the GNU Lesser General   ////
25 //// Public License as published by the Free Software Foundation; ////
26 //// either version 2.1 of the License, or (at your option) any   ////
27 //// later version.                                               ////
28 ////                                                              ////
29 //// This source is distributed in the hope that it will be       ////
30 //// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
31 //// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
32 //// PURPOSE.  See the GNU Lesser General Public License for more ////
33 //// details.                                                     ////
34 ////                                                              ////
35 //// You should have received a copy of the GNU Lesser General    ////
36 //// Public License along with this source; if not, download it   ////
37 //// from http://www.opencores.org/lgpl.shtml                     ////
38 ////                                                              ////
39 //////////////////////////////////////////////////////////////////////
40 //
41 // CVS Revision History
42 //
43 // $Log: eth_clockgen.v,v $
44 // Revision 1.2  2005/12/13 12:54:49  maverickist
45 // first simulation passed
46 //
47 // Revision 1.1.1.1  2005/12/13 01:51:45  Administrator
48 // no message
49 //
50 // Revision 1.2  2005/04/27 15:58:45  Administrator
51 // no message
52 //
53 // Revision 1.1.1.1  2004/12/15 06:38:54  Administrator
54 // no message
55 //
56 // Revision 1.3  2002/01/23 10:28:16  mohor
57 // Link in the header changed.
58 //
59 // Revision 1.2  2001/10/19 08:43:51  mohor
60 // eth_timescale.v changed to timescale.v This is done because of the
61 // simulation of the few cores in a one joined project.
62 //
63 // Revision 1.1  2001/08/06 14:44:29  mohor
64 // A define FPGA added to select between Artisan RAM (for ASIC) and Block Ram (For Virtex).
65 // Include files fixed to contain no path.
66 // File names and module names changed ta have a eth_ prologue in the name.
67 // File eth_timescale.v is used to define timescale
68 // All pin names on the top module are changed to contain _I, _O or _OE at the end.
69 // Bidirectional signal MDIO is changed to three signals (Mdc_O, Mdi_I, Mdo_O
70 // and Mdo_OE. The bidirectional signal must be created on the top level. This
71 // is done due to the ASIC tools.
72 //
73 // Revision 1.1  2001/07/30 21:23:42  mohor
74 // Directory structure changed. Files checked and joind together.
75 //
76 // Revision 1.3  2001/06/01 22:28:55  mohor
77 // This files (MIIM) are fully working. They were thoroughly tested. The testbench is not updated.
78 //
79 //
80
81 module eth_clockgen(Clk, Reset, Divider, MdcEn, MdcEn_n, Mdc);
82    
83    parameter Tp=1;
84    
85    input     Clk;              // Input clock (Host clock)
86    input     Reset;            // Reset signal
87    input [7:0] Divider;          // Divider (input clock will be divided by the Divider[7:0])
88    
89    output      Mdc;              // Output clock
90    output      MdcEn;            // Enable signal is asserted for one Clk period before Mdc rises.
91    output      MdcEn_n;          // Enable signal is asserted for one Clk period before Mdc falls.
92    
93    reg         Mdc;
94    reg [7:0]   Counter;
95    
96    wire        CountEq0;
97    wire [7:0]  CounterPreset;
98    wire [7:0]  TempDivider;
99    
100    
101    assign      TempDivider[7:0]   = (Divider[7:0]<2)? 8'h02 : Divider[7:0]; // If smaller than 2
102    assign      CounterPreset[7:0] = (TempDivider[7:0]>>1) -1;               // We are counting half of period
103    
104    
105    // Counter counts half period
106    always @ (posedge Clk or posedge Reset)
107      begin
108         if(Reset)
109           Counter[7:0] <= #Tp 8'h1;
110         else
111           begin
112              if(CountEq0)
113                begin
114                   Counter[7:0] <= #Tp CounterPreset[7:0];
115                end
116              else
117                Counter[7:0] <= #Tp Counter - 8'h1;
118           end
119      end
120    
121    
122    // Mdc is asserted every other half period
123    always @ (posedge Clk or posedge Reset)
124      begin
125         if(Reset)
126           Mdc <= #Tp 1'b0;
127         else
128           begin
129              if(CountEq0)
130                Mdc <= #Tp ~Mdc;
131           end
132      end
133    
134    
135    assign CountEq0 = Counter == 8'h0;
136    assign MdcEn = CountEq0 & ~Mdc;
137    assign MdcEn_n = CountEq0 & Mdc;
138    
139 endmodule // eth_clockgen
140
141
142