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

Subversion Repositories i2c_to_wb

[/] [i2c_to_wb/] [trunk/] [src/] [i2c_to_wb_top.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
 
6
`include "timescale.v"
7
 
8
 
9
module
10
  i2c_to_wb_top
11
  #(
12
    parameter DW = 32,
13
    parameter AW = 32
14
  )
15
  (
16
    input               i2c_data_in,
17
    input               i2c_clk_in,
18
    output              i2c_data_out,
19
    output              i2c_clk_out,
20
    output              i2c_data_oe,
21
    output              i2c_clk_oe,
22
 
23
    input   [(DW-1):0]  wb_data_i,
24
    output  [(DW-1):0]  wb_data_o,
25
    output  [(AW-1):0]  wb_addr_o,
26
    output  [3:0]       wb_sel_o,
27
    output              wb_we_o,
28
    output              wb_cyc_o,
29
    output              wb_stb_o,
30
    input               wb_ack_i,
31
    input               wb_err_i,
32
    input               wb_rty_i,
33
 
34
    input               wb_clk_i,
35
    input               wb_rst_i
36
  );
37
 
38
 
39
  // --------------------------------------------------------------------
40
  //  glitch filter
41
 
42
  wire gf_i2c_data_in;
43
  wire gf_i2c_data_in_rise;
44
  wire gf_i2c_data_in_fall;
45
 
46
  glitch_filter
47
    i_gf_i2c_data_in(
48
    .in(i2c_data_in),
49
    .out(gf_i2c_data_in),
50
 
51
    .rise(gf_i2c_data_in_rise),
52
    .fall(gf_i2c_data_in_fall),
53
 
54
    .clk(wb_clk_i),
55
    .rst(wb_rst_i)
56
  );
57
 
58
  wire gf_i2c_clk_in;
59
  wire gf_i2c_clk_in_rise;
60
  wire gf_i2c_clk_in_fall;
61
 
62
  glitch_filter
63
    i_gf_i2c_clk_in(
64
    .in(i2c_clk_in),
65
    .out(gf_i2c_clk_in),
66
 
67
    .rise(gf_i2c_clk_in_rise),
68
    .fall(gf_i2c_clk_in_fall),
69
 
70
    .clk(wb_clk_i),
71
    .rst(wb_rst_i)
72
  );
73
 
74
 
75
  // --------------------------------------------------------------------
76
  //  bit counter 
77
  reg [3:0] bit_count;
78
  wire ack_done = (bit_count > 4'h8) & gf_i2c_clk_in_rise;
79
 
80
  always @(posedge wb_clk_i or posedge wb_rst_i)
81
    if( wb_rst_i | ack_done )
82
      bit_count <= 4'h0;
83
    else if( gf_i2c_clk_in_fall )
84
      bit_count <= bit_count + 1;
85
 
86
 
87
  // --------------------------------------------------------------------
88
  //  start & stop 
89
 
90
  reg gf_i2c_data_in_fall_reg;
91
  always @(posedge wb_clk_i)
92
    gf_i2c_data_in_fall_reg <= gf_i2c_data_in_fall;
93
 
94
  reg gf_i2c_data_in_rise_reg;
95
  always @(posedge wb_clk_i)
96
    gf_i2c_data_in_rise_reg <= gf_i2c_data_in_rise;
97
 
98
  wire start_detected = gf_i2c_data_in_fall_reg & gf_i2c_clk_in;
99
  wire stop_detected  = gf_i2c_data_in_rise_reg & gf_i2c_clk_in;
100
 
101
 
102
  // --------------------------------------------------------------------
103
  //  transmition in progress 
104
 
105
  reg tip_slave_address;
106
 
107
  always @(posedge wb_clk_i)
108
    if( ack_done | wb_rst_i )
109
      tip_slave_address <= 1'b0;
110
    else if( start_detected )
111
      tip_slave_address <= 1'b1;
112
 
113
  reg tip;
114
 
115
  always @(posedge wb_clk_i)
116
    if( wb_rst_i )
117
      tip <= 0;
118
    else if( start_detected | stop_detected )
119
      tip <= start_detected;
120
 
121
  wire bit_ack_detected = (bit_count == 4'h9) & tip;
122
 
123
 
124
  // --------------------------------------------------------------------
125
  //  ack flop 
126
  reg ack_bit_r;
127
 
128
  always @(posedge wb_clk_i)
129
    if( wb_rst_i )
130
      ack_bit_r <= 1'b0;
131
    else if( bit_ack_detected & gf_i2c_clk_in_fall )
132
      ack_bit_r <= i2c_data_in;
133
 
134
 
135
  // --------------------------------------------------------------------
136
  //  outputs  
137
  assign i2c_data_out = 1'b1;
138
  assign i2c_clk_out  = 1'b1;
139
  assign i2c_data_oe  = 1'b0;
140
  assign i2c_clk_oe   = 1'b0;
141
 
142
 
143
endmodule
144
 

powered by: WebSVN 2.1.0

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