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 3

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 3 qaztronic
    parameter AW = 8
14 2 qaztronic
  )
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 3 qaztronic
 
23
    input   [3:0]       thd_dat,
24 2 qaztronic
 
25
    input   [(DW-1):0]  wb_data_i,
26
    output  [(DW-1):0]  wb_data_o,
27
    output  [(AW-1):0]  wb_addr_o,
28
    output  [3:0]       wb_sel_o,
29
    output              wb_we_o,
30
    output              wb_cyc_o,
31
    output              wb_stb_o,
32
    input               wb_ack_i,
33
    input               wb_err_i,
34
    input               wb_rty_i,
35
 
36
    input               wb_clk_i,
37
    input               wb_rst_i
38
  );
39
 
40
  // --------------------------------------------------------------------
41 3 qaztronic
  //  wires
42
//   wire tip_byte;
43
  wire tip_addr_byte;
44
  wire tip_read_byte;
45
  wire tip_write_byte;
46
  wire tip_wr_ack;
47
  wire tip_rd_ack;
48
  wire tip_addr_ack;
49
//   wire tip_ack;
50
//   wire tip_write;
51
//   wire tip_read;
52
 
53
  wire i2c_ack_out = 1'b0;
54
  wire i2c_ack_done;
55
 
56
  // --------------------------------------------------------------------
57 2 qaztronic
  //  glitch filter
58
 
59
  wire gf_i2c_data_in;
60
  wire gf_i2c_data_in_rise;
61
  wire gf_i2c_data_in_fall;
62
 
63
  glitch_filter
64
    i_gf_i2c_data_in(
65
    .in(i2c_data_in),
66
    .out(gf_i2c_data_in),
67
 
68
    .rise(gf_i2c_data_in_rise),
69
    .fall(gf_i2c_data_in_fall),
70
 
71
    .clk(wb_clk_i),
72
    .rst(wb_rst_i)
73
  );
74
 
75
  wire gf_i2c_clk_in;
76
  wire gf_i2c_clk_in_rise;
77
  wire gf_i2c_clk_in_fall;
78
 
79
  glitch_filter
80
    i_gf_i2c_clk_in(
81
    .in(i2c_clk_in),
82
    .out(gf_i2c_clk_in),
83
 
84
    .rise(gf_i2c_clk_in_rise),
85
    .fall(gf_i2c_clk_in_fall),
86
 
87
    .clk(wb_clk_i),
88
    .rst(wb_rst_i)
89
  );
90
 
91
 
92
  // --------------------------------------------------------------------
93 3 qaztronic
  //  i2c data 
94 2 qaztronic
 
95 3 qaztronic
  reg  [8:0]  i2c_data_in_r;    // add throw away bit for serial_out
96
  reg         parallel_load_r;
97
  wire        parallel_load       = ~parallel_load_r & tip_read_byte;
98
  wire [7:0]  parallel_load_data  = 8'h11;
99
  wire        serial_out          = i2c_data_in_r[8];
100 2 qaztronic
 
101
  always @(posedge wb_clk_i)
102 3 qaztronic
    parallel_load_r <= tip_read_byte;
103 2 qaztronic
 
104
  always @(posedge wb_clk_i)
105 3 qaztronic
    if( parallel_load )
106
      i2c_data_in_r[7:0] <= parallel_load_data;
107
    else if( (tip_write_byte & gf_i2c_clk_in_rise) | (tip_read_byte & gf_i2c_clk_in_fall) )
108
      i2c_data_in_r <= {i2c_data_in_r[7:0], gf_i2c_data_in};
109
 
110
 
111 2 qaztronic
  // --------------------------------------------------------------------
112 3 qaztronic
  //  wishbone stuff 
113 2 qaztronic
 
114 3 qaztronic
  reg [7:0] i2c_address_r;
115 2 qaztronic
  always @(posedge wb_clk_i)
116 3 qaztronic
    if( tip_addr_ack )
117
      i2c_address_r <= 8'h00;
118
    else if( i2c_ack_done )
119
      i2c_address_r <= i2c_address_r + 1;
120 2 qaztronic
 
121 3 qaztronic
 
122
  // --------------------------------------------------------------------
123
  //  state machine   
124
  i2c_to_wb_fsm
125
    i_i2c_to_wb_fsm
126
    (
127
      .i2c_data(gf_i2c_data_in),
128
      .i2c_data_rise(gf_i2c_data_in_rise),
129
      .i2c_data_fall(gf_i2c_data_in_fall),
130 2 qaztronic
 
131 3 qaztronic
      .i2c_clk(gf_i2c_clk_in),
132
      .i2c_clk_rise(gf_i2c_clk_in_rise),
133
      .i2c_clk_fall(gf_i2c_clk_in_fall),
134 2 qaztronic
 
135 3 qaztronic
      .i2c_bit_7(i2c_data_in_r[7]),
136
      .i2c_ack_done(i2c_ack_done),
137
 
138
      .tip_addr_byte(tip_addr_byte),
139
//       .tip_byte(tip_byte), 
140
      .tip_read_byte(tip_read_byte),
141
      .tip_write_byte(tip_write_byte),
142
      .tip_wr_ack(tip_wr_ack),
143
      .tip_rd_ack(tip_rd_ack),
144
      .tip_addr_ack(tip_addr_ack),
145
//       .tip_ack(tip_ack), 
146
//       .tip_write(tip_write), 
147
//       .tip_read(tip_read), 
148
 
149
      .state_out(),
150
 
151
      .wb_clk_i(wb_clk_i),
152
      .wb_rst_i(wb_rst_i)
153
    );
154 2 qaztronic
 
155 3 qaztronic
 
156 2 qaztronic
  // --------------------------------------------------------------------
157 3 qaztronic
  //  i2c_data out sync
158 2 qaztronic
 
159 3 qaztronic
  reg i2c_data_oe_r;
160 2 qaztronic
  always @(posedge wb_clk_i)
161
    if( wb_rst_i )
162 3 qaztronic
      i2c_data_oe_r <= 1'b0;
163
    else if( gf_i2c_clk_in_fall )
164
      i2c_data_oe_r <= tip_read_byte | tip_wr_ack;
165 2 qaztronic
 
166 3 qaztronic
  reg i2c_data_mux_select_r;
167
  always @(posedge wb_clk_i)
168
    if( gf_i2c_clk_in_fall )
169
      i2c_data_mux_select_r <= tip_wr_ack;
170
 
171
 
172 2 qaztronic
  // --------------------------------------------------------------------
173
  //  outputs  
174 3 qaztronic
 
175
  assign i2c_data_out = i2c_data_mux_select_r ? i2c_ack_out : serial_out;
176
  assign i2c_data_oe  = i2c_data_oe_r;
177 2 qaztronic
  assign i2c_clk_out  = 1'b1;
178
  assign i2c_clk_oe   = 1'b0;
179 3 qaztronic
 
180
  assign wb_cyc_o       = tip_wr_ack | tip_rd_ack;
181
  assign wb_addr_o[7:0] = i2c_address_r;
182
  assign wb_we_o        = tip_wr_ack;
183 2 qaztronic
 
184
 
185
endmodule
186
 

powered by: WebSVN 2.1.0

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