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 2

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
  localparam tHD_DAT  = 0;
22
  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
      i2c_data_out  = 1'b1;
59
      i2c_clk_out   = 1'b1;
60
 
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
          #tSU_DAT;
76
        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
          #tSU_DAT;
103
        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
  task write_byte;
138
    input [7:0]  data;
139
      begin
140
 
141
        if( LOG_LEVEL > 2 )
142
          $display( "###- %m: I2C write 0x%h at time %t. ", data, $time );
143
 
144
        #tHD_STA;
145
 
146
        i2c_clk_out = 1'b0;
147
 
148
        write_bit( data[7] );
149
        write_bit( data[6] );
150
        write_bit( data[5] );
151
        write_bit( data[4] );
152
        write_bit( data[3] );
153
        write_bit( data[2] );
154
        write_bit( data[1] );
155
        write_bit( data[0] );
156
 
157
        #tHD_DAT;
158
        i2c_data_oe = 1'b0;
159
        #tLOW;
160
 
161
        i2c_clk_out = 1'b1;
162
 
163
        i2c_ack_in = i2c_data;
164
 
165
        if( LOG_LEVEL > 2 )
166
          if( i2c_data )
167
            $display( "###- %m: I2C NACK at time %t. ", $time );
168
          else
169
            $display( "###- %m: I2C ACK at time %t. ", $time );
170
 
171
        #tHIGH;
172
 
173
      end
174
  endtask
175
 
176
 
177
  // --------------------------------------------------------------------
178
  //  read_bit
179
  reg [7:0] i2c_buffer_in;
180
 
181
  task read_bit;
182
    input [3:0] bit;
183
      begin
184
 
185
        i2c_data_oe = 1'b0;
186
 
187
        #tHD_DAT;
188
        i2c_buffer_in[bit] = i2c_data_in;
189
        #tLOW;
190
 
191
        i2c_clk_out = 1'b1;
192
        #tHIGH;
193
        i2c_clk_out = 1'b0;
194
 
195
 
196
      end
197
  endtask
198
 
199
 
200
  // --------------------------------------------------------------------
201
  //  read_byte
202
  task read_byte;
203
      begin
204
 
205
        #tHD_STA;
206
 
207
        i2c_clk_out = 1'b0;
208
        i2c_data_oe = 1'b0;
209
 
210
        read_bit( 7 );
211
        read_bit( 6 );
212
        read_bit( 5 );
213
        read_bit( 4 );
214
        read_bit( 3 );
215
        read_bit( 2 );
216
        read_bit( 1 );
217
        read_bit( 0 );
218
 
219
        i2c_data_oe = 1'b1;
220
        #tHD_DAT;
221
        i2c_data_out = 1'b0;
222
        #(tLOW - tHD_DAT);
223
        i2c_clk_out = 1'b1;
224
 
225
        if( LOG_LEVEL > 2 )
226
          $display( "###- %m: I2C read 0x%h at time %t. ", i2c_buffer_in, $time );
227
 
228
      end
229
  endtask
230
 
231
 
232
  // --------------------------------------------------------------------
233
  //  outputs  
234
  assign i2c_data = i2c_data_oe ? i2c_data_out  : 1'bz;
235
  assign i2c_clk  = i2c_clk_oe  ? i2c_clk_out   : 1'bz;
236
 
237
 
238
endmodule
239
 

powered by: WebSVN 2.1.0

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