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

Subversion Repositories i2c_master_slave

[/] [i2c_master_slave/] [web_uploads/] [i2c_core_v02.vhd] - Blame information for rev 6

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 6 root
--
2
-- VHDL Architecture i2c.i2c_core_v02.arc
3
--
4
-- Created:
5
--          by - Eli&Natalie.UNKNOWN (ELI)
6
--          at - 20:01:49 06/11/2008
7
--
8
-- using Mentor Graphics HDL Designer(TM) 2007.1 (Build 19)
9
--
10
LIBRARY ieee;
11
USE ieee.std_logic_1164.all;
12
USE ieee.std_logic_arith.all;
13
 
14
ENTITY i2c_core_v02 IS
15
  generic
16
    (
17
     CLK_FREQ : natural := 25000000
18
    );
19
  PORT
20
    (
21
     --INPUTS
22
     sys_clk  : IN     std_logic;
23
     sys_rst  : IN     std_logic;
24
     start    : IN     std_logic;
25
     stop     : IN     std_logic;
26
     read     : IN     std_logic;
27
     write    : IN     std_logic;
28
     send_ack : IN     std_logic;
29
     mstr_din : IN     std_logic_vector ( 7 DOWNTO 0 );
30
     slv_din  : IN     std_logic_vector ( 7 DOWNTO 0 );
31
     slv_a0   : IN     std_logic;
32
     slv_a1   : IN     std_logic;
33
     slv_a2   : IN     std_logic;
34
     slv_a3   : IN     std_logic;
35
     slv_a4   : IN     std_logic;
36
     slv_a5   : IN     std_logic;
37
     slv_a6   : IN     std_logic;
38
     reg_exist: IN     std_logic;
39
     --OUTPUTS
40
     sda      : INOUT  std_logic;
41
     scl      : INOUT  std_logic;
42
     slv_read : OUT    std_logic;
43
     slv_write: OUT    std_logic;
44
     slv_busy : OUT    std_logic; --slave is busy
45
     slv_int  : OUT    std_logic; --interrupt from the slave to its interface
46
     free     : OUT    std_logic;
47
     rec_ack  : OUT    std_logic;
48
     ready    : OUT    std_logic;
49
     mstr_slv : OUT    std_logic;
50
     mstr_dout: OUT    std_logic_vector( 7 downto 0 );
51
     slv_dout : OUT    std_logic_vector( 7 DOWNTO 0 )
52
    );
53
END ENTITY i2c_core_v02;
54
 
55
--
56
ARCHITECTURE arc OF i2c_core_v02 IS
57
 
58
  constant FRAME     : natural := 11; -- number of bits in frame: start, stop, 8 bits data, 1 bit acknoledge
59
  constant BAUD      : natural := 200000;
60
--  constant CLK_FREQ  : natural := 25000000;
61
  constant FULL_BIT  : natural := CLK_FREQ / BAUD;
62
  constant HALF_BIT  : natural := FULL_BIT / 2;
63
  constant GAP_WIDTH : natural := FULL_BIT * 2;
64
 
65
  signal i_mstr_slv : std_logic; --for master-slave arbitration 1 - master, 0 - slave
66
  signal i_free     : std_logic;
67
  signal i_ready    : std_logic;
68
  signal i_sda_mstr : std_logic;
69
  signal i_scl_mstr : std_logic;
70
  signal i_scl_cntr : natural range 0 to 511;
71
  signal i_bit_cntr_mstr : natural range 0 to 7;
72
  signal i_ack_mstr : std_logic;
73
  signal i_mstr_rd_data : std_logic_vector( 7 downto 0 );
74
 
75
  signal i_mstr_ad  : std_logic_vector( 7 downto 0 ); --latched address and data
76
  alias  fld_rd_wr  : std_logic is i_mstr_ad( 0 ); --1 - read, 0 - write
77
 
78
  -- slave signals 
79
 
80
  signal i_slv_sda_fall : std_logic;
81
  signal i_slv_sda_rise : std_logic;
82
  signal i_slv_scl_fall : std_logic;
83
  signal i_slv_scl_rise : std_logic;
84
 
85
  signal i_sda_sam : std_logic_vector( 1 downto 0 );
86
  signal i_scl_sam : std_logic_vector( 1 downto 0 );
87
 
88
  signal i_sda_slv : std_logic;
89
 
90
  signal i_slv_data     : std_logic_vector( 7 downto 0 );
91
  signal i_slv_addr     : std_logic_vector( 7 downto 0 );
92
  signal i_slv_reg_addr : std_logic_vector( 7 downto 0 );
93
  signal i_slv_bit_cnt  : natural range 0 to 10;
94
  signal i_slv_stop_bit : std_logic;
95
  signal i_slv_strt_bit : std_logic;
96
  signal i_slv_dout     : std_logic_vector( 7 downto 0 );
97
 
98
  --address "1111111" not legal
99
  signal SLAVE_ADDR : std_logic_vector( 6 downto 0 );
100
 
101
  type i2c_master_state is ( mstr_idle, mstr_start_cnt , mstr_active , mstr_wait_first_half , mstr_wait_second_half ,
102
                             mstr_wait_full , mstr_wait_ack , mstr_wait_ack_second_half , mstr_wait_ack_third_half ,
103
                             mstr_wait_ack_fourth_half , mstr_rd_wait_low , mstr_rd_wait_half , mstr_rd_read , mstr_stop ,
104
                             mstr_rd_wait_last_half , mstr_rd_wait_ack , mstr_rd_get_ack , mstr_restart , mstr_gap );
105
 
106
  signal stm_mstr : i2c_master_state;
107
 
108
  type i2c_slave_state is ( slv_idle , slv_get_addr , slv_rd_wr , slv_read_reg_addr , slv_write_data , slv_send_addr_ack, slv_wait_ack , slv_send_data_ack ,
109
                            slv_wait_data_ack , slv_read_data , slv_get_data_ack , slv_get_wait_data_ack );
110
  signal stm_slv : i2c_slave_state;
111
 
112
BEGIN
113
  sda   <= i_sda_mstr when ( i_mstr_slv = '1' ) else i_sda_slv;
114
  scl   <= i_scl_mstr;
115
  free  <= i_free;
116
  ready <= i_ready;
117
  mstr_slv <= i_mstr_slv;
118
 
119
  arbitration:
120
  process( sys_clk , sys_rst )
121
    begin
122
      if ( sys_rst = '1' ) then
123
        i_mstr_slv <= '1';
124
       -- i_slv_stop_bit <= '0';
125
      elsif rising_edge( sys_clk ) then
126
 
127
        SLAVE_ADDR <= slv_a6 & slv_a5 & slv_a4 & slv_a3 & slv_a2 & slv_a1 & slv_a0;
128
 
129
        i_scl_sam( 0 ) <= scl;
130
        i_scl_sam( 1 ) <= i_scl_sam( 0 );
131
 
132
        i_sda_sam( 0 ) <= sda;
133
        i_sda_sam( 1 ) <= i_sda_sam( 0 );
134
 
135
        if ( sda = '0' ) and ( scl = '1' ) and ( stm_mstr = mstr_idle ) then
136
          i_mstr_slv <= '0'; --slave
137
        elsif ( i_slv_sda_rise = '1' ) and ( to_X01( scl ) = '1' ) then
138
          i_mstr_slv <= '1'; --master
139
        end if;
140
      end if;
141
    end process arbitration;
142
 
143
  i_slv_sda_fall <= not i_sda_sam( 0 ) and i_sda_sam( 1 );
144
  i_slv_sda_rise <= i_sda_sam( 0 ) and not i_sda_sam( 1 );
145
 
146
  i_slv_scl_fall <= not i_scl_sam( 0 ) and i_scl_sam( 1 );
147
  i_slv_scl_rise <= i_scl_sam( 0 ) and not i_scl_sam( 1 );
148
 
149
  i_slv_stop_bit <= '1' when ( i_slv_sda_rise = '1' ) and ( to_X01( scl ) = '1' ) else '0';
150
  i_slv_strt_bit <= '1' when ( i_slv_sda_fall = '1' ) and ( to_X01( scl ) = '1' ) else '0';
151
 
152
  rec_ack <= not i_ack_mstr;
153
 
154
  i2c_master:
155
  process( sys_clk , sys_rst )
156
    begin
157
      if ( sys_rst = '1' ) then
158
        stm_mstr   <= mstr_idle;
159
        i_free     <= '0';
160
        i_ready    <= '0';
161
        i_sda_mstr <= 'Z';
162
        i_scl_mstr <= 'Z';
163
        i_scl_cntr <= 0;
164
        i_bit_cntr_mstr <= 7;
165
        i_ack_mstr <= '1';
166
        i_mstr_rd_data <= ( others => '0' );
167
        mstr_dout <= ( others => '0' );
168
        i_mstr_ad <= ( others => '0' );
169
      elsif rising_edge( sys_clk ) then
170
        if ( i_mstr_slv = '1' ) then
171
          case stm_mstr is
172
          -------------------  
173
          when mstr_idle =>
174
            i_free <= '1';
175
            i_ready <= '0';
176
            i_sda_mstr <= 'Z';
177
            i_scl_mstr <= 'Z';
178
            if ( start = '1' ) then
179
              stm_mstr <= mstr_start_cnt;
180
              i_free <= '0';
181
            else
182
              stm_mstr <= mstr_idle;
183
            end if;
184
          -------------------
185
          when mstr_start_cnt =>
186
            i_sda_mstr <= '0';
187
            i_scl_mstr <= '1';
188
            if ( i_scl_cntr < HALF_BIT ) then
189
              i_scl_cntr <= i_scl_cntr + 1;
190
              stm_mstr <= mstr_start_cnt;
191
            else
192
              i_scl_cntr <= 0;
193
              stm_mstr <= mstr_active;
194
              i_scl_mstr <= '0';
195
            end if;
196
          -------------------
197
          when mstr_active =>
198
            i_ready <= '1';
199
            i_scl_mstr <= '0';
200
            i_sda_mstr <= '0';
201
            i_bit_cntr_mstr <= 7;
202
            if ( read = '1' ) then
203
              stm_mstr <= mstr_rd_wait_low;
204
              i_ready <= '0';
205
            elsif ( write = '1' ) then
206
              i_mstr_ad <= mstr_din;
207
              i_ready <= '0';
208
              stm_mstr <= mstr_wait_first_half;
209
            elsif ( stop = '1' ) then
210
              stm_mstr <= mstr_stop;
211
            elsif ( start = '1' ) then
212
              stm_mstr <= mstr_restart;
213
            end if;
214
          --------------------
215
          --####################
216
          --##### WRITE ########
217
          --####################
218
          when mstr_wait_first_half =>
219
            if ( i_scl_cntr < HALF_BIT ) then
220
              i_scl_mstr <= '0';
221
              i_scl_cntr <= i_scl_cntr + 1;
222
            else
223
              i_scl_cntr <= 0;
224
              stm_mstr <= mstr_wait_second_half;
225
              i_sda_mstr <= i_mstr_ad( i_bit_cntr_mstr );
226
            end if;
227
          --------------------
228
          when mstr_wait_second_half =>
229
            if ( i_scl_cntr < HALF_BIT ) then
230
              i_scl_cntr <= i_scl_cntr + 1;
231
              stm_mstr <= mstr_wait_second_half;
232
            else
233
              i_scl_cntr <= 0;
234
              stm_mstr <= mstr_wait_full;
235
            end if;
236
          ---------------------
237
          when mstr_wait_full =>
238
            if ( i_scl_cntr < FULL_BIT ) then
239
              i_scl_mstr <= '1';
240
              i_scl_cntr <= i_scl_cntr + 1;
241
              stm_mstr <= mstr_wait_full;
242
            else
243
              i_scl_cntr <= 0;
244
              if ( i_bit_cntr_mstr >= 1 ) then
245
                i_bit_cntr_mstr <= i_bit_cntr_mstr - 1;
246
                stm_mstr <= mstr_wait_first_half;
247
              elsif ( i_bit_cntr_mstr = 0 ) then
248
                --i_sda_mstr <= 'Z';              
249
                stm_mstr <= mstr_wait_ack;
250
              end if;
251
            end if;
252
          --------------------
253
          --####################
254
          --#### ACKNOWLEDGE ###
255
          --####################
256
          when mstr_wait_ack =>
257
            i_scl_mstr <= '0';
258
            if ( i_scl_cntr < HALF_BIT ) then
259
              i_scl_cntr <= i_scl_cntr + 1;
260
            else
261
              i_scl_cntr <= 0;
262
              i_sda_mstr <= 'Z';
263
              stm_mstr <= mstr_wait_ack_second_half;
264
            end if;
265
          --------------------
266
          when mstr_wait_ack_second_half =>
267
            if ( i_scl_cntr < HALF_BIT ) then
268
              i_scl_cntr <= i_scl_cntr + 1;
269
            else
270
              i_scl_cntr <= 0;
271
              i_sda_mstr <= 'Z';
272
              stm_mstr <= mstr_wait_ack_third_half;
273
            end if;
274
          --------------------  
275
          when mstr_wait_ack_third_half =>
276
            i_scl_mstr <= '1';
277
            if ( i_scl_cntr < HALF_BIT ) then
278
              i_scl_cntr <= i_scl_cntr + 1;
279
            else
280
              i_scl_cntr <= 0;
281
              i_sda_mstr <= 'Z';
282
              i_ack_mstr <= sda;
283
              stm_mstr <= mstr_wait_ack_fourth_half;
284
            end if;
285
          --------------------
286
          when mstr_wait_ack_fourth_half =>
287
            if ( i_scl_cntr < HALF_BIT ) then
288
              i_scl_cntr <= i_scl_cntr + 1;
289
            else
290
              i_scl_cntr <= 0;
291
              i_sda_mstr <= 'Z';
292
              stm_mstr <= mstr_active;
293
            end if;
294
          --------------------
295
          --####################
296
          --###### READ ########
297
          --####################
298
          when mstr_rd_wait_low =>
299
            i_scl_mstr <= '0';
300
            i_sda_mstr <= 'Z';
301
            if ( i_scl_cntr < FULL_BIT ) then
302
              i_scl_cntr <= i_scl_cntr + 1;
303
              stm_mstr <= mstr_rd_wait_low;
304
            else
305
              i_scl_cntr <= 0;
306
              stm_mstr <= mstr_rd_wait_half;
307
            end if;
308
          --------------------
309
          when mstr_rd_wait_half =>
310
            i_scl_mstr <= '1';
311
            if ( i_scl_cntr < HALF_BIT ) then
312
              i_scl_cntr <= i_scl_cntr + 1;
313
              stm_mstr <= mstr_rd_wait_half;
314
            else
315
              i_scl_cntr <= 0;
316
              i_mstr_rd_data <= i_mstr_rd_data( 6 downto 0 ) & sda;
317
              stm_mstr <= mstr_rd_read;
318
            end if;
319
          --------------------- 
320
          when mstr_rd_read =>
321
            i_scl_mstr <= '1';
322
            if ( i_scl_cntr < HALF_BIT ) then
323
              i_scl_cntr <= i_scl_cntr + 1;
324
              stm_mstr <= mstr_rd_read;
325
            else
326
              i_scl_cntr <= 0;
327
              if ( i_bit_cntr_mstr > 0 ) then
328
                i_bit_cntr_mstr <= i_bit_cntr_mstr - 1;
329
                i_scl_mstr <= '0';
330
                stm_mstr <= mstr_rd_wait_low;
331
              else
332
                i_mstr_ad <= ( others => '0' );
333
                mstr_dout <= i_mstr_rd_data;
334
                stm_mstr <= mstr_rd_wait_ack;
335
              end if;
336
            end if;
337
          ---------------------
338
          --#######################
339
          --### SEND ACKNOWELEDGE #
340
          --#######################
341
          when mstr_rd_wait_ack =>
342
            i_scl_mstr <= '0';
343
            if ( i_scl_cntr < HALF_BIT ) then
344
              i_scl_cntr <= i_scl_cntr + 1;
345
              stm_mstr <= mstr_rd_wait_ack;
346
            else
347
              i_scl_cntr <= 0;
348
              i_sda_mstr <= not send_ack;
349
              stm_mstr <= mstr_rd_get_ack;
350
            end if;
351
          ----------------------              
352
          when mstr_rd_get_ack =>
353
            i_scl_mstr <= '0';
354
            if ( i_scl_cntr < HALF_BIT ) then
355
              i_scl_cntr <= i_scl_cntr + 1;
356
              stm_mstr <= mstr_rd_get_ack;
357
            else
358
              i_scl_cntr <= 0;
359
              --i_ack_mstr <= sda;
360
              stm_mstr <= mstr_rd_wait_last_half;
361
            end if;
362
          ----------------------
363
          when mstr_rd_wait_last_half =>
364
            i_scl_mstr <= '1';
365
            if ( i_scl_cntr < FULL_BIT ) then
366
              i_scl_cntr <= i_scl_cntr + 1;
367
              stm_mstr <= mstr_rd_wait_last_half;
368
            else
369
              i_scl_cntr <= 0;
370
              stm_mstr <= mstr_active;
371
            end if;
372
          ---------------------- 
373
          --######################
374
          --######## STOP ########
375
          --######################                                        
376
          when mstr_stop =>
377
            i_scl_mstr <= '1';
378
            i_sda_mstr <= '0';
379
            if ( i_scl_cntr < HALF_BIT ) then
380
              i_scl_cntr <= i_scl_cntr + 1;
381
              stm_mstr <= mstr_stop;
382
            else
383
              i_scl_cntr <= 0;
384
              i_sda_mstr <= '1';
385
              stm_mstr <= mstr_gap;
386
            end if;
387
          ---------------------  
388
          when mstr_gap =>
389
            if ( i_scl_cntr < GAP_WIDTH ) then
390
              i_scl_cntr <= i_scl_cntr + 1;
391
              stm_mstr <= mstr_gap;
392
            else
393
              i_scl_cntr <= 0;
394
              stm_mstr <= mstr_idle;
395
            end if;
396
          --#####################
397
          --###### RESTART ######        
398
          --#####################
399
          when mstr_restart =>
400
            i_scl_mstr <= '1';
401
            i_sda_mstr <= '0';
402
            if ( i_scl_cntr < HALF_BIT ) then
403
              i_scl_cntr <= i_scl_cntr + 1;
404
              stm_mstr <= mstr_restart;
405
            else
406
              i_scl_cntr <= 0;
407
              i_sda_mstr <= '1';
408
              stm_mstr <= mstr_start_cnt;
409
            end if;
410
          when others => stm_mstr <= mstr_idle;
411
          end case;
412
        end if;
413
      end if;
414
    end process i2c_master;
415
 --##############################################    
416
 --##############################################
417
 --##############################################
418
 --##############################################
419
 --##############################################
420
 --##############################################     
421
     slv_dout <= i_slv_dout;
422
     i2c_slave:
423
     process( sys_clk , sys_rst )
424
       begin
425
         if ( sys_rst = '1' ) then
426
           stm_slv <= slv_idle;
427
           slv_busy <= '0';
428
           i_slv_bit_cnt <= 0;
429
           i_slv_addr <= ( others => '0' );
430
           i_sda_slv <= 'Z';
431
           i_slv_reg_addr <= ( others => '0' );
432
           i_slv_data <= ( others => '0' );
433
           slv_read <= '0';
434
           slv_write <= '0';
435
           i_slv_dout <=  ( others => '0' );
436
         elsif rising_edge( sys_clk ) then
437
           case stm_slv is
438
           ----------------------
439
           when slv_idle =>
440
             slv_busy <= '0';
441
             i_sda_slv <= 'Z';
442
             i_slv_bit_cnt <= 0;
443
             if ( i_mstr_slv = '0' ) and ( i_slv_strt_bit = '1' ) then
444
               stm_slv <= slv_get_addr;
445
               slv_busy <= '1';
446
             else
447
               stm_slv <= slv_idle;
448
             end if;
449
           ----------------------
450
           when slv_get_addr =>
451
             i_sda_slv <= 'Z';
452
             if ( i_slv_stop_bit = '0' ) then
453
               if ( i_slv_scl_rise = '1' ) then
454
                 if ( i_slv_bit_cnt < 8 ) then
455
                   i_slv_addr <= i_slv_addr( 6 downto 0 ) & sda;
456
                   i_slv_bit_cnt <= i_slv_bit_cnt + 1;
457
                   stm_slv <= slv_get_addr;
458
                 elsif( i_slv_bit_cnt = 8 ) then
459
                   i_slv_addr <= i_slv_addr( 6 downto 0 ) & sda;
460
                   i_slv_bit_cnt <= 0;
461
                   stm_slv <= slv_send_addr_ack;
462
                 end if;
463
               elsif ( i_slv_scl_fall = '1' ) and ( i_slv_bit_cnt = 8 ) then
464
                 stm_slv <= slv_send_addr_ack;
465
                 i_slv_bit_cnt <= 0;
466
               else
467
                 stm_slv <= slv_get_addr;
468
               end if;
469
             else
470
               stm_slv <= slv_idle;
471
             end if;
472
           -----------------------      
473
           when slv_send_addr_ack =>
474
             if ( i_slv_addr( 7 downto 1 ) = SLAVE_ADDR ) then
475
               if ( i_slv_scl_rise = '1' ) then
476
                 i_sda_slv <= '0';
477
                 stm_slv <= slv_wait_ack;
478
               end if;
479
             else
480
               stm_slv <= slv_idle;
481
             end if;
482
           -----------------------     
483
           when slv_wait_ack =>
484
             if ( i_slv_scl_fall = '1' ) then
485
               if ( reg_exist = '1' ) then
486
                 stm_slv <= slv_read_reg_addr;
487
               elsif ( i_slv_addr( 0 ) = '0' ) then
488
                 stm_slv <= slv_write_data;
489
                 slv_read <= '1';
490
               elsif ( i_slv_addr( 0 ) = '1' ) then
491
                 stm_slv <= slv_read_reg_addr;
492
               end if;
493
             else
494
               stm_slv <= slv_wait_ack;
495
             end if;
496
           -----------------------             
497
           when slv_rd_wr =>
498
             i_sda_slv <= 'Z';
499
             i_slv_data <= slv_din;
500
             i_slv_dout <= i_slv_reg_addr;
501
             if ( i_slv_addr( 0 ) = '1' ) then
502
               slv_write <= '1';
503
               stm_slv <= slv_read_data;
504
             else
505
               stm_slv <= slv_write_data;
506
               slv_read <= '1';
507
             end if;
508
           -----------------------
509
           when slv_read_reg_addr =>
510
             slv_write <= '0';
511
             i_sda_slv <= 'Z';
512
             if ( i_slv_stop_bit = '0' ) then
513
               if ( i_slv_scl_rise = '1' ) then
514
                 if ( i_slv_bit_cnt < 7 ) then
515
                   i_slv_reg_addr <= i_slv_reg_addr( 6 downto 0 ) & sda;
516
                   i_slv_bit_cnt <= i_slv_bit_cnt + 1;
517
                   stm_slv <= slv_read_reg_addr;
518
                 elsif ( i_slv_bit_cnt = 7 ) then
519
                   i_slv_reg_addr <= i_slv_reg_addr( 6 downto 0 ) & sda;
520
                   i_slv_bit_cnt <= 0;
521
                   stm_slv <= slv_send_data_ack;
522
                 end if;
523
               else
524
                 stm_slv <= slv_read_reg_addr;
525
               end if;
526
             else
527
               stm_slv <= slv_idle;
528
             end if;
529
           -----------------------  
530
           when slv_send_data_ack =>
531
             if ( i_slv_scl_rise = '1' ) then
532
               i_sda_slv <= '0';
533
               stm_slv <= slv_wait_data_ack;
534
             end if;
535
           -----------------------
536
           when slv_wait_data_ack =>
537
             if ( i_slv_scl_fall = '1' ) then
538
               stm_slv <= slv_rd_wr;
539
             else
540
               stm_slv <= slv_wait_data_ack;
541
             end if;
542
           -----------------------  
543
           when slv_write_data =>
544
             slv_read <= '0';
545
             if ( i_slv_stop_bit = '0' ) then
546
               i_sda_slv <= i_slv_data( 7 );
547
               if ( i_slv_scl_fall = '1' ) then
548
                 if ( i_slv_bit_cnt < 7 ) then
549
                  -- i_sda_slv <= i_slv_data( 7 );
550
                   i_slv_data <= i_slv_data( 6 downto 0 ) & '0';
551
                   i_slv_bit_cnt <= i_slv_bit_cnt + 1;
552
                   stm_slv <= slv_write_data;
553
                 elsif ( i_slv_bit_cnt = 7 ) then
554
                   i_sda_slv <= i_slv_data( 7 );
555
                   i_slv_bit_cnt <= 0;
556
                   stm_slv <= slv_get_wait_data_ack;
557
                 end if;
558
               end if;
559
             else
560
               stm_slv <= slv_idle;
561
             end if;
562
           ----------------------- 
563
           when slv_get_wait_data_ack =>
564
             i_sda_slv <= 'Z';
565
             if ( i_slv_scl_rise = '1' ) then
566
               stm_slv <= slv_get_data_ack;
567
             else
568
               stm_slv <= slv_get_wait_data_ack;
569
             end if;
570
           -----------------------
571
           when slv_get_data_ack =>
572
             i_sda_slv <= 'Z';
573
             if ( i_slv_scl_fall = '1' ) then
574
               if ( sda = '0' ) and ( i_slv_sda_fall = '0' ) then
575
                 stm_slv <= slv_rd_wr;
576
               else
577
                 stm_slv <= slv_idle;
578
               end if;
579
             else
580
               stm_slv <= slv_get_data_ack;
581
             end if;
582
           ------------------------  
583
           when slv_read_data =>
584
             slv_write <= '0';
585
             if ( i_slv_stop_bit = '1' ) then
586
               stm_slv <= slv_idle;
587
             else
588
               if ( i_slv_scl_rise = '1' ) then
589
                 if ( i_slv_bit_cnt < 7 ) then
590
                   i_slv_reg_addr <= i_slv_reg_addr( 6 downto 0 ) & sda;
591
                   i_slv_bit_cnt <= i_slv_bit_cnt + 1;
592
                   stm_slv <= slv_read_data;
593
                 elsif ( i_slv_bit_cnt = 7 ) then
594
                   i_slv_reg_addr <= i_slv_reg_addr( 6 downto 0 ) & sda;
595
                   i_slv_bit_cnt <= 0;
596
                   stm_slv <= slv_send_data_ack;
597
                 end if;
598
               else
599
                 stm_slv <= slv_read_data;
600
               end if;
601
             end if;
602
           -------------------------  
603
           when others => stm_slv <= slv_idle;
604
           end case;
605
         end if;
606
       end process i2c_slave;
607
END ARCHITECTURE arc;
608
 

powered by: WebSVN 2.1.0

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