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

Subversion Repositories i2c

[/] [i2c/] [trunk/] [rtl/] [verilog/] [i2c_master_top.v] - Blame information for rev 27

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

Line No. Rev Author Line
1 14 rherveille
/////////////////////////////////////////////////////////////////////
2
////                                                             ////
3 27 rherveille
////  WISHBONE revB.2 compliant I2C Master controller Top-level  ////
4 14 rherveille
////                                                             ////
5
////                                                             ////
6
////  Author: Richard Herveille                                  ////
7
////          richard@asics.ws                                   ////
8
////          www.asics.ws                                       ////
9
////                                                             ////
10
////  Downloaded from: http://www.opencores.org/projects/i2c/    ////
11
////                                                             ////
12
/////////////////////////////////////////////////////////////////////
13
////                                                             ////
14
//// Copyright (C) 2001 Richard Herveille                        ////
15
////                    richard@asics.ws                         ////
16
////                                                             ////
17
//// This source file may be used and distributed without        ////
18
//// restriction provided that this copyright statement is not   ////
19
//// removed from the file and that any derivative work contains ////
20
//// the original copyright notice and the associated disclaimer.////
21
////                                                             ////
22
////     THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY     ////
23
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED   ////
24
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS   ////
25
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR      ////
26
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,         ////
27
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES    ////
28
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE   ////
29
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR        ////
30
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  ////
31
//// LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT  ////
32
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT  ////
33
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE         ////
34
//// POSSIBILITY OF SUCH DAMAGE.                                 ////
35
////                                                             ////
36
/////////////////////////////////////////////////////////////////////
37
 
38
//  CVS Log
39 10 rherveille
//
40 27 rherveille
//  $Id: i2c_master_top.v,v 1.6 2002-11-30 22:24:40 rherveille Exp $
41 10 rherveille
//
42 27 rherveille
//  $Date: 2002-11-30 22:24:40 $
43
//  $Revision: 1.6 $
44 14 rherveille
//  $Author: rherveille $
45
//  $Locker:  $
46
//  $State: Exp $
47 10 rherveille
//
48 14 rherveille
// Change History:
49
//               $Log: not supported by cvs2svn $
50 27 rherveille
//               Revision 1.5  2001/11/10 10:52:55  rherveille
51
//               Changed PRER reset value from 0x0000 to 0xffff, conform specs.
52
//
53 10 rherveille
 
54 27 rherveille
// synopsys translate_off
55 10 rherveille
`include "timescale.v"
56 27 rherveille
// synopsys translate_on
57
 
58 10 rherveille
`include "i2c_master_defines.v"
59
 
60
module i2c_master_top(
61
        wb_clk_i, wb_rst_i, arst_i, wb_adr_i, wb_dat_i, wb_dat_o,
62
        wb_we_i, wb_stb_i, wb_cyc_i, wb_ack_o, wb_inta_o,
63
        scl_pad_i, scl_pad_o, scl_padoen_o, sda_pad_i, sda_pad_o, sda_padoen_o );
64
 
65 11 rherveille
        // parameters
66
        parameter ARST_LVL = 1'b0; // asynchronous reset level
67
 
68 10 rherveille
        //
69
        // inputs & outputs
70
        //
71
 
72
        // wishbone signals
73
        input        wb_clk_i;     // master clock input
74
        input        wb_rst_i;     // synchronous active high reset
75
        input        arst_i;       // asynchronous reset
76
        input  [2:0] wb_adr_i;     // lower address bits
77
        input  [7:0] wb_dat_i;     // databus input
78
        output [7:0] wb_dat_o;     // databus output
79
        input        wb_we_i;      // write enable input
80
        input        wb_stb_i;     // stobe/core select signal
81
        input        wb_cyc_i;     // valid bus cycle input
82
        output       wb_ack_o;     // bus cycle acknowledge output
83
        output       wb_inta_o;    // interrupt request signal output
84 27 rherveille
 
85
        reg [7:0] wb_dat_o;
86
        reg wb_ack_o;
87 10 rherveille
        reg wb_inta_o;
88
 
89
        // I2C signals
90
        // i2c clock line
91
        input  scl_pad_i;       // SCL-line input
92
        output scl_pad_o;       // SCL-line output (always 1'b0)
93
        output scl_padoen_o;    // SCL-line output enable (active low)
94 27 rherveille
 
95 10 rherveille
        // i2c data line
96
        input  sda_pad_i;       // SDA-line input
97
        output sda_pad_o;       // SDA-line output (always 1'b0)
98
        output sda_padoen_o;    // SDA-line output enable (active low)
99
 
100
 
101
        //
102
        // variable declarations
103
        //
104
 
105
        // registers
106
        reg  [15:0] prer; // clock prescale register
107
        reg  [ 7:0] ctr;  // control register
108
        reg  [ 7:0] txr;  // transmit register
109
        wire [ 7:0] rxr;  // receive register
110
        reg  [ 7:0] cr;   // command register
111
        wire [ 7:0] sr;   // status register
112
 
113
        // done signal: command completed, clear command register
114
        wire done;
115
 
116
        // core enable signal
117
        wire core_en;
118 13 rherveille
        wire ien;
119 10 rherveille
 
120
        // status register signals
121
        wire irxack;
122
        reg  rxack;       // received aknowledge from slave
123
        reg  tip;         // transfer in progress
124
        reg  irq_flag;    // interrupt pending flag
125
        wire i2c_busy;    // bus busy (start signal detected)
126
 
127
        //
128
        // module body
129
        //
130
 
131
        // generate internal reset
132 11 rherveille
        wire rst_i = arst_i ^ ARST_LVL;
133 27 rherveille
 
134 10 rherveille
        // generate acknowledge output signal
135 27 rherveille
        always @(posedge wb_clk_i)
136
          wb_ack_o <= #1 wb_cyc_i & wb_stb_i & ~wb_ack_o; // because timing is always honored
137 10 rherveille
 
138
        // assign DAT_O
139 27 rherveille
        always @(posedge wb_clk_i)
140 10 rherveille
        begin
141 27 rherveille
          case (wb_adr_i) // synopsis full_case parallel_case
142
            3'b000: wb_dat_o = prer[ 7:0];
143
            3'b001: wb_dat_o = prer[15:8];
144
            3'b010: wb_dat_o = ctr;
145
            3'b011: wb_dat_o = rxr; // write is transmit register (txr)
146
            3'b100: wb_dat_o = sr;  // write is command register (cr)
147
            3'b101: wb_dat_o = txr;
148
            3'b110: wb_dat_o = cr;
149
            3'b111: wb_dat_o = 0;   // reserved
150
          endcase
151 10 rherveille
        end
152
 
153
 
154
        // generate registers
155 27 rherveille
        always @(posedge wb_clk_i or negedge rst_i)
156
          if (!rst_i)
157
            begin
158
                prer <= #1 16'hffff;
159
                ctr  <= #1  8'h0;
160
                txr  <= #1  8'h0;
161
                cr   <= #1  8'h0;
162
            end
163
          else if (wb_rst_i)
164
            begin
165
                prer <= #1 16'hffff;
166
                ctr  <= #1  8'h0;
167
                txr  <= #1  8'h0;
168
                cr   <= #1  8'h0;
169
            end
170
          else
171
            if (wb_cyc_i && wb_stb_i && wb_we_i)
172
              begin
173
                  if (!wb_adr_i[2])
174
                    case (wb_adr_i[1:0]) // synopsis full_case parallel_case
175
                      2'b00 : prer [ 7:0] <= #1 wb_dat_i;
176
                      2'b01 : prer [15:8] <= #1 wb_dat_i;
177
                      2'b10 : ctr         <= #1 wb_dat_i;
178
                      2'b11 : txr         <= #1 wb_dat_i;
179
                    endcase
180
                  else
181
                    if (core_en && (wb_adr_i[1:0] == 2'b00) ) // only take new commands when i2c core enabled, pending commands are finished
182
                      cr <= #1 wb_dat_i;
183
              end
184
            else
185
              begin
186
                  if (done)
187
                    cr[7:4] <= #1 4'h0; // clear command bits when done
188 10 rherveille
 
189 27 rherveille
                  cr[2:1] <= #1 2'b00;  // reserved bits
190
                  cr[0]   <= #1 cr[0] && irq_flag; // clear when irq_flag cleared
191
              end
192 10 rherveille
 
193
 
194
        // decode command register
195
        wire sta  = cr[7];
196
        wire sto  = cr[6];
197
        wire rd   = cr[5];
198
        wire wr   = cr[4];
199
        wire ack  = cr[3];
200
        wire iack = cr[0];
201
 
202
        // decode control register
203
        assign core_en = ctr[7];
204 13 rherveille
        assign ien = ctr[6];
205 10 rherveille
 
206
        // hookup byte controller block
207
        i2c_master_byte_ctrl byte_controller (
208 27 rherveille
                .clk      ( wb_clk_i     ),
209
                .rst      ( wb_rst_i     ),
210
                .nReset   ( rst_i        ),
211
                .ena      ( core_en      ),
212
                .clk_cnt  ( prer         ),
213
                .start    ( sta          ),
214
                .stop     ( sto          ),
215
                .read     ( rd           ),
216
                .write    ( wr           ),
217
                .ack_in   ( ack          ),
218
                .din      ( txr          ),
219
                .cmd_ack  ( done         ),
220
                .ack_out  ( irxack       ),
221
                .dout     ( rxr          ),
222
                .i2c_busy ( i2c_busy     ),
223
                .scl_i    ( scl_pad_i    ),
224
                .scl_o    ( scl_pad_o    ),
225
                .scl_oen  ( scl_padoen_o ),
226
                .sda_i    ( sda_pad_i    ),
227
                .sda_o    ( sda_pad_o    ),
228
                .sda_oen  ( sda_padoen_o )
229 10 rherveille
        );
230
 
231
 
232
        // status register block + interrupt request signal
233 27 rherveille
        always @(posedge wb_clk_i or negedge rst_i)
234
          if (!rst_i)
235
            begin
236
                rxack    <= #1 1'b0;
237
                tip      <= #1 1'b0;
238
                irq_flag <= #1 1'b0;
239
            end
240
          else if (wb_rst_i)
241
            begin
242
                rxack    <= #1 1'b0;
243
                tip      <= #1 1'b0;
244
                irq_flag <= #1 1'b0;
245
            end
246
          else
247
            begin
248
                rxack    <= #1 irxack;
249
                tip      <= #1 (rd | wr);
250
                irq_flag <= #1 (done | irq_flag) & ~iack; // interrupt request flag is always generated
251
            end
252 10 rherveille
 
253 27 rherveille
        // generate interrupt request signals
254
        always @(posedge wb_clk_i or negedge rst_i)
255
          if (!rst_i)
256
            wb_inta_o <= #1 1'b0;
257
          else if (wb_rst_i)
258
            wb_inta_o <= #1 1'b0;
259
          else
260
            wb_inta_o <= #1 irq_flag && ien; // interrupt signal is only generated when IEN (interrupt enable bit is set)
261 10 rherveille
 
262 27 rherveille
        // assign status register bits
263
        assign sr[7]   = rxack;
264
        assign sr[6]   = i2c_busy;
265
        assign sr[5:2] = 4'h0; // reserved
266
        assign sr[1]   = tip;
267
        assign sr[0]   = irq_flag;
268 10 rherveille
 
269
endmodule

powered by: WebSVN 2.1.0

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