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 3

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

Line No. Rev Author Line
1 2 qaztronic
// --------------------------------------------------------------------
2
//
3
// --------------------------------------------------------------------
4
 
5
`timescale 1ns/10ps
6
 
7
 
8
module
9
  i2c_master_model
10
  #(
11
    parameter LOG_LEVEL = 3
12
  )
13
  (
14
    inout i2c_data,
15
    inout i2c_clk
16
  );
17
 
18
  localparam tBUF     = 4700;
19
  localparam tSU_STA  = 4700;
20
  localparam tSU_DAT  = 250;
21 3 qaztronic
  localparam tHD_DAT  = 300;
22 2 qaztronic
  localparam tHD_STA  = 4000;
23
  localparam tLOW     = 4700;
24
  localparam tHIGH    = 4000;
25
 
26
  // --------------------------------------------------------------------
27
  //  wires & regs
28
  wire i2c_data_in = i2c_data;
29
  wire i2c_clk_in  = i2c_clk;
30
 
31
  reg i2c_data_oe;
32
  reg i2c_clk_oe;
33
  reg i2c_data_out;
34
  reg i2c_clk_out;
35
 
36
  reg i2c_ack_in;
37
 
38
 
39
  // --------------------------------------------------------------------
40
  //  init 
41
  initial
42
    begin
43
      i2c_data_oe   = 1'b0;
44
      i2c_clk_oe    = 1'b0;
45
      i2c_data_out  = 1'b1;
46
      i2c_clk_out   = 1'b1;
47
    end
48
 
49
 
50
  // --------------------------------------------------------------------
51
  //  start
52
  task start;
53
    begin
54
 
55
      if( LOG_LEVEL > 2 )
56
        $display( "###- %m: I2C start at time %t. ", $time );
57
 
58 3 qaztronic
//       i2c_data_out  = 1'b1;
59
//       i2c_clk_out   = 1'b1;
60 2 qaztronic
 
61
      #tBUF;
62
 
63
      i2c_data_oe = 1'b1;
64
      i2c_clk_oe  = 1'b1;
65
 
66
      if( i2c_data != 1'b1 )
67
        begin
68
          #tHD_DAT;
69
          i2c_data_out = 1'b1;
70
        end
71
 
72
      if( i2c_clk != 1'b1 )
73
        begin
74
          i2c_clk_out = 1'b1;
75 3 qaztronic
          #tLOW;
76 2 qaztronic
        end
77
 
78
      #tSU_STA;
79
      i2c_data_out = 1'b0;
80
 
81
    end
82
  endtask
83
 
84
 
85
  // --------------------------------------------------------------------
86
  //  stop
87
  task stop;
88
    begin
89
 
90
      if( LOG_LEVEL > 2 )
91
        $display( "###- %m: I2C stop at time %t. ", $time );
92
 
93
      if( i2c_data != 1'b0 )
94
        begin
95
          #tHD_DAT;
96
          i2c_data_out = 1'b0;
97
        end
98
 
99
      if( i2c_clk != 1'b1 )
100
        begin
101
          i2c_clk_out = 1'b1;
102 3 qaztronic
          #tLOW;
103 2 qaztronic
        end
104
 
105
      i2c_data_out  = 1'b1;
106
      i2c_clk_out   = 1'b1;
107
 
108
      i2c_data_oe = 1'b0;
109
      i2c_clk_oe  = 1'b0;
110
 
111
    end
112
  endtask
113
 
114
 
115
  // --------------------------------------------------------------------
116
  //  write_bit
117
  task write_bit;
118
    input bit;
119
      begin
120
 
121
        #tHD_DAT;
122
        i2c_data_oe = 1'b1;
123
        i2c_data_out = bit;
124
        #tLOW;
125
 
126
        i2c_clk_out = 1'b1;
127
        #tHIGH;
128
        i2c_clk_out = 1'b0;
129
 
130
 
131
      end
132
  endtask
133
 
134
 
135
  // --------------------------------------------------------------------
136
  //  write_byte
137 3 qaztronic
  reg write_byte_r = 1'b0;
138
 
139 2 qaztronic
  task write_byte;
140
    input [7:0]  data;
141
      begin
142
 
143 3 qaztronic
        write_byte_r = 1'b1;
144
 
145 2 qaztronic
        if( LOG_LEVEL > 2 )
146
          $display( "###- %m: I2C write 0x%h at time %t. ", data, $time );
147
 
148
        #tHD_STA;
149
 
150
        i2c_clk_out = 1'b0;
151
 
152
        write_bit( data[7] );
153
        write_bit( data[6] );
154
        write_bit( data[5] );
155
        write_bit( data[4] );
156
        write_bit( data[3] );
157
        write_bit( data[2] );
158
        write_bit( data[1] );
159
        write_bit( data[0] );
160
 
161
        #tHD_DAT;
162
        i2c_data_oe = 1'b0;
163
        #tLOW;
164
 
165
        i2c_clk_out = 1'b1;
166
 
167
        i2c_ack_in = i2c_data;
168
 
169
        if( LOG_LEVEL > 2 )
170
          if( i2c_data )
171
            $display( "###- %m: I2C NACK at time %t. ", $time );
172
          else
173
            $display( "###- %m: I2C ACK at time %t. ", $time );
174
 
175
        #tHIGH;
176 3 qaztronic
        i2c_clk_out = 1'b0;
177
 
178
        write_byte_r = 1'b0;
179
        #1;
180 2 qaztronic
 
181
      end
182
  endtask
183
 
184
 
185
  // --------------------------------------------------------------------
186
  //  read_bit
187
  reg [7:0] i2c_buffer_in;
188
 
189
  task read_bit;
190
    input [3:0] bit;
191
      begin
192
 
193
        i2c_data_oe = 1'b0;
194
 
195
        #tHD_DAT;
196
        i2c_buffer_in[bit] = i2c_data_in;
197
        #tLOW;
198
 
199
        i2c_clk_out = 1'b1;
200
        #tHIGH;
201
        i2c_clk_out = 1'b0;
202
 
203
 
204
      end
205
  endtask
206
 
207
 
208
  // --------------------------------------------------------------------
209
  //  read_byte
210
  task read_byte;
211
      begin
212
 
213
        #tHD_STA;
214
 
215
        i2c_clk_out = 1'b0;
216
        i2c_data_oe = 1'b0;
217
 
218
        read_bit( 7 );
219
        read_bit( 6 );
220
        read_bit( 5 );
221
        read_bit( 4 );
222
        read_bit( 3 );
223
        read_bit( 2 );
224
        read_bit( 1 );
225
        read_bit( 0 );
226
 
227
        i2c_data_oe = 1'b1;
228
        #tHD_DAT;
229
        i2c_data_out = 1'b0;
230
        #(tLOW - tHD_DAT);
231
        i2c_clk_out = 1'b1;
232
 
233
        if( LOG_LEVEL > 2 )
234
          $display( "###- %m: I2C read 0x%h at time %t. ", i2c_buffer_in, $time );
235
 
236 3 qaztronic
        #tHIGH;
237
        i2c_clk_out = 1'b0;
238
 
239 2 qaztronic
      end
240
  endtask
241
 
242
 
243
  // --------------------------------------------------------------------
244
  //  outputs  
245
  assign i2c_data = i2c_data_oe ? i2c_data_out  : 1'bz;
246
  assign i2c_clk  = i2c_clk_oe  ? i2c_clk_out   : 1'bz;
247
 
248
 
249
endmodule
250
 

powered by: WebSVN 2.1.0

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