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

Subversion Repositories i2c_to_wb

[/] [i2c_to_wb/] [trunk/] [sim/] [models/] [i2c_master_model.v] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 qaztronic
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
//// Copyright (C) 2009 Authors and OPENCORES.ORG                 ////
4
////                                                              ////
5
//// This source file may be used and distributed without         ////
6
//// restriction provided that this copyright statement is not    ////
7
//// removed from the file and that any derivative work contains  ////
8
//// the original copyright notice and the associated disclaimer. ////
9
////                                                              ////
10
//// This source file is free software; you can redistribute it   ////
11
//// and/or modify it under the terms of the GNU Lesser General   ////
12
//// Public License as published by the Free Software Foundation; ////
13
//// either version 2.1 of the License, or (at your option) any   ////
14
//// later version.                                               ////
15
////                                                              ////
16
//// This source is distributed in the hope that it will be       ////
17
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
18
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
19
//// PURPOSE.  See the GNU Lesser General Public License for more ////
20
//// details.                                                     ////
21
////                                                              ////
22
//// You should have received a copy of the GNU Lesser General    ////
23
//// Public License along with this source; if not, download it   ////
24
//// from http://www.opencores.org/lgpl.shtml                     ////
25
////                                                              ////
26
//////////////////////////////////////////////////////////////////////
27 2 qaztronic
 
28 4 qaztronic
 
29 2 qaztronic
`timescale 1ns/10ps
30
 
31
 
32
module
33
  i2c_master_model
34
  #(
35
    parameter LOG_LEVEL = 3
36
  )
37
  (
38
    inout i2c_data,
39
    inout i2c_clk
40
  );
41
 
42
  localparam tBUF     = 4700;
43
  localparam tSU_STA  = 4700;
44
  localparam tSU_DAT  = 250;
45 3 qaztronic
  localparam tHD_DAT  = 300;
46 2 qaztronic
  localparam tHD_STA  = 4000;
47
  localparam tLOW     = 4700;
48
  localparam tHIGH    = 4000;
49
 
50
  // --------------------------------------------------------------------
51
  //  wires & regs
52
  wire i2c_data_in = i2c_data;
53
  wire i2c_clk_in  = i2c_clk;
54
 
55
  reg i2c_data_oe;
56
  reg i2c_clk_oe;
57
  reg i2c_data_out;
58
  reg i2c_clk_out;
59
 
60
  reg i2c_ack_in;
61
 
62
 
63
  // --------------------------------------------------------------------
64
  //  init 
65
  initial
66
    begin
67
      i2c_data_oe   = 1'b0;
68
      i2c_clk_oe    = 1'b0;
69
      i2c_data_out  = 1'b1;
70
      i2c_clk_out   = 1'b1;
71
    end
72
 
73
 
74
  // --------------------------------------------------------------------
75
  //  start
76 4 qaztronic
  reg start_r = 1'b0;
77
 
78 2 qaztronic
  task start;
79
    begin
80
 
81 4 qaztronic
      start_r = 1'b1;
82
 
83 2 qaztronic
      if( LOG_LEVEL > 2 )
84
        $display( "###- %m: I2C start at time %t. ", $time );
85 4 qaztronic
 
86 2 qaztronic
      #tBUF;
87
 
88
      if( i2c_data != 1'b1 )
89
        begin
90 4 qaztronic
          if( i2c_clk != 1'b0 )
91
            #tHIGH;
92
 
93
          i2c_clk_out = 1'b0;
94
          i2c_clk_oe  = 1'b1;
95 2 qaztronic
          #tHD_DAT;
96
          i2c_data_out = 1'b1;
97 4 qaztronic
          i2c_data_oe  = 1'b1;
98
        end
99 2 qaztronic
 
100
      if( i2c_clk != 1'b1 )
101 4 qaztronic
        #tLOW;
102 2 qaztronic
 
103 4 qaztronic
      i2c_clk_out = 1'b1;
104
      i2c_clk_oe  = 1'b1;
105 2 qaztronic
      #tSU_STA;
106
      i2c_data_out = 1'b0;
107 4 qaztronic
      i2c_data_oe  = 1'b1;
108
 
109
      start_r = 1'b0;
110 2 qaztronic
 
111
    end
112
  endtask
113
 
114
 
115
  // --------------------------------------------------------------------
116
  //  stop
117
  task stop;
118
    begin
119
 
120
      if( LOG_LEVEL > 2 )
121
        $display( "###- %m: I2C stop at time %t. ", $time );
122
 
123
      if( i2c_data != 1'b0 )
124
        begin
125
          #tHD_DAT;
126
          i2c_data_out = 1'b0;
127
        end
128
 
129
      if( i2c_clk != 1'b1 )
130
        begin
131
          i2c_clk_out = 1'b1;
132 3 qaztronic
          #tLOW;
133 2 qaztronic
        end
134
 
135
      i2c_data_out  = 1'b1;
136
      i2c_clk_out   = 1'b1;
137
 
138
      i2c_data_oe = 1'b0;
139
      i2c_clk_oe  = 1'b0;
140
 
141
    end
142
  endtask
143
 
144
 
145
  // --------------------------------------------------------------------
146
  //  write_bit
147
  task write_bit;
148
    input bit;
149
      begin
150
 
151
        #tHD_DAT;
152
        i2c_data_oe = 1'b1;
153
        i2c_data_out = bit;
154
        #tLOW;
155
 
156
        i2c_clk_out = 1'b1;
157
        #tHIGH;
158
        i2c_clk_out = 1'b0;
159
 
160
 
161
      end
162
  endtask
163
 
164
 
165
  // --------------------------------------------------------------------
166
  //  write_byte
167 3 qaztronic
  reg write_byte_r = 1'b0;
168
 
169 2 qaztronic
  task write_byte;
170
    input [7:0]  data;
171
      begin
172
 
173 3 qaztronic
        write_byte_r = 1'b1;
174
 
175 2 qaztronic
        if( LOG_LEVEL > 2 )
176
          $display( "###- %m: I2C write 0x%h at time %t. ", data, $time );
177
 
178
        #tHD_STA;
179
 
180
        i2c_clk_out = 1'b0;
181
 
182
        write_bit( data[7] );
183
        write_bit( data[6] );
184
        write_bit( data[5] );
185
        write_bit( data[4] );
186
        write_bit( data[3] );
187
        write_bit( data[2] );
188
        write_bit( data[1] );
189
        write_bit( data[0] );
190
 
191
        #tHD_DAT;
192
        i2c_data_oe = 1'b0;
193
        #tLOW;
194
 
195
        i2c_clk_out = 1'b1;
196
 
197
        i2c_ack_in = i2c_data;
198
 
199
        if( LOG_LEVEL > 2 )
200
          if( i2c_data )
201
            $display( "###- %m: I2C NACK at time %t. ", $time );
202
          else
203
            $display( "###- %m: I2C ACK at time %t. ", $time );
204
 
205
        #tHIGH;
206 3 qaztronic
        i2c_clk_out = 1'b0;
207 4 qaztronic
        #tHD_DAT;
208
        i2c_data_oe = 1'b1;
209
        #tLOW;
210
 
211 3 qaztronic
        write_byte_r = 1'b0;
212 2 qaztronic
 
213
      end
214
  endtask
215
 
216
 
217
  // --------------------------------------------------------------------
218
  //  read_bit
219
  reg [7:0] i2c_buffer_in;
220
 
221
  task read_bit;
222
    input [3:0] bit;
223
      begin
224
 
225
        i2c_data_oe = 1'b0;
226
 
227
        #tHD_DAT;
228
        i2c_buffer_in[bit] = i2c_data_in;
229
        #tLOW;
230
 
231
        i2c_clk_out = 1'b1;
232
        #tHIGH;
233
        i2c_clk_out = 1'b0;
234
 
235
 
236
      end
237
  endtask
238
 
239
 
240
  // --------------------------------------------------------------------
241
  //  read_byte
242
  task read_byte;
243 4 qaztronic
    input ack;
244 2 qaztronic
      begin
245
 
246
        #tHD_STA;
247
 
248
        i2c_clk_out = 1'b0;
249
        i2c_data_oe = 1'b0;
250
 
251
        read_bit( 7 );
252
        read_bit( 6 );
253
        read_bit( 5 );
254
        read_bit( 4 );
255
        read_bit( 3 );
256
        read_bit( 2 );
257
        read_bit( 1 );
258
        read_bit( 0 );
259
 
260 4 qaztronic
        #tHD_DAT;
261
        i2c_data_out = ack;
262 2 qaztronic
        i2c_data_oe = 1'b1;
263
        #(tLOW - tHD_DAT);
264
        i2c_clk_out = 1'b1;
265
 
266
        if( LOG_LEVEL > 2 )
267
          $display( "###- %m: I2C read 0x%h at time %t. ", i2c_buffer_in, $time );
268
 
269 3 qaztronic
        #tHIGH;
270
        i2c_clk_out = 1'b0;
271 4 qaztronic
        #tLOW;
272 3 qaztronic
 
273 2 qaztronic
      end
274
  endtask
275
 
276
 
277
  // --------------------------------------------------------------------
278
  //  outputs  
279
  assign i2c_data = i2c_data_oe ? i2c_data_out  : 1'bz;
280
  assign i2c_clk  = i2c_clk_oe  ? i2c_clk_out   : 1'bz;
281
 
282
 
283
endmodule
284
 

powered by: WebSVN 2.1.0

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