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 5

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 qaztronic
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
//// Copyright (C) 2009 Authors and OPENCORES.ORG                 ////
4
////                                                              ////
5
//// This source file may be used and distributed without         ////
6
//// restriction provided that this copyright statement is not    ////
7
//// removed from the file and that any derivative work contains  ////
8
//// the original copyright notice and the associated disclaimer. ////
9
////                                                              ////
10
//// This source file is free software; you can redistribute it   ////
11
//// and/or modify it under the terms of the GNU Lesser General   ////
12
//// Public License as published by the Free Software Foundation; ////
13
//// either version 2.1 of the License, or (at your option) any   ////
14
//// later version.                                               ////
15
////                                                              ////
16
//// This source is distributed in the hope that it will be       ////
17
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
18
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
19
//// PURPOSE.  See the GNU Lesser General Public License for more ////
20
//// details.                                                     ////
21
////                                                              ////
22
//// You should have received a copy of the GNU Lesser General    ////
23
//// Public License along with this source; if not, download it   ////
24
//// from http://www.opencores.org/lgpl.shtml                     ////
25
////                                                              ////
26
//////////////////////////////////////////////////////////////////////
27 2 qaztronic
 
28
 
29
`include "timescale.v"
30
 
31
 
32
module
33
  i2c_to_wb_top
34
  #(
35
    parameter DW = 32,
36 3 qaztronic
    parameter AW = 8
37 5 qaztronic
  )
38 2 qaztronic
  (
39
    input               i2c_data_in,
40
    input               i2c_clk_in,
41
    output              i2c_data_out,
42
    output              i2c_clk_out,
43
    output              i2c_data_oe,
44
    output              i2c_clk_oe,
45 5 qaztronic
 
46 2 qaztronic
    input   [(DW-1):0]  wb_data_i,
47
    output  [(DW-1):0]  wb_data_o,
48
    output  [(AW-1):0]  wb_addr_o,
49
    output  [3:0]       wb_sel_o,
50
    output              wb_we_o,
51
    output              wb_cyc_o,
52
    output              wb_stb_o,
53
    input               wb_ack_i,
54
    input               wb_err_i,
55
    input               wb_rty_i,
56 5 qaztronic
 
57 2 qaztronic
    input               wb_clk_i,
58 5 qaztronic
    input               wb_rst_i
59 2 qaztronic
  );
60 5 qaztronic
 
61 2 qaztronic
  // --------------------------------------------------------------------
62 3 qaztronic
  //  wires
63 5 qaztronic
  wire tip_addr_byte;
64
  wire tip_read_byte;
65
  wire tip_write_byte;
66 3 qaztronic
  wire tip_wr_ack;
67
  wire tip_rd_ack;
68
  wire tip_addr_ack;
69 5 qaztronic
 
70 4 qaztronic
//   wire i2c_ack_out = 1'b0;
71
  wire i2c_ack_out;
72 3 qaztronic
  wire i2c_ack_done;
73 5 qaztronic
 
74 4 qaztronic
  wire [7:0]  i2c_byte_out;
75
  wire        i2c_parallel_load;
76 5 qaztronic
 
77
 
78 3 qaztronic
  // --------------------------------------------------------------------
79 2 qaztronic
  //  glitch filter
80 5 qaztronic
 
81 2 qaztronic
  wire gf_i2c_data_in;
82
  wire gf_i2c_data_in_rise;
83
  wire gf_i2c_data_in_fall;
84 5 qaztronic
 
85 2 qaztronic
  glitch_filter
86
    i_gf_i2c_data_in(
87
    .in(i2c_data_in),
88
    .out(gf_i2c_data_in),
89 5 qaztronic
 
90 2 qaztronic
    .rise(gf_i2c_data_in_rise),
91
    .fall(gf_i2c_data_in_fall),
92 5 qaztronic
 
93 2 qaztronic
    .clk(wb_clk_i),
94 5 qaztronic
    .rst(wb_rst_i)
95 2 qaztronic
  );
96 5 qaztronic
 
97 2 qaztronic
  wire gf_i2c_clk_in;
98
  wire gf_i2c_clk_in_rise;
99
  wire gf_i2c_clk_in_fall;
100 5 qaztronic
 
101 2 qaztronic
  glitch_filter
102
    i_gf_i2c_clk_in(
103
    .in(i2c_clk_in),
104
    .out(gf_i2c_clk_in),
105 5 qaztronic
 
106 2 qaztronic
    .rise(gf_i2c_clk_in_rise),
107
    .fall(gf_i2c_clk_in_fall),
108 5 qaztronic
 
109 2 qaztronic
    .clk(wb_clk_i),
110 5 qaztronic
    .rst(wb_rst_i)
111 2 qaztronic
  );
112 5 qaztronic
 
113
 
114 2 qaztronic
  // --------------------------------------------------------------------
115 4 qaztronic
  //  i2c data shift register w/ parallel load
116 5 qaztronic
 
117 4 qaztronic
  reg  [8:0]  i2c_data_in_r;                    // add throw away bit for serial_out
118
  wire        serial_out = i2c_data_in_r[8];
119 5 qaztronic
 
120 2 qaztronic
  always @(posedge wb_clk_i)
121 4 qaztronic
    if( i2c_parallel_load )
122
      i2c_data_in_r[7:0] <= i2c_byte_out;
123 3 qaztronic
    else if( (tip_write_byte & gf_i2c_clk_in_rise) | (tip_read_byte & gf_i2c_clk_in_fall) )
124
      i2c_data_in_r <= {i2c_data_in_r[7:0], gf_i2c_data_in};
125 5 qaztronic
 
126
 
127 2 qaztronic
  // --------------------------------------------------------------------
128 5 qaztronic
  //  main state machine
129 3 qaztronic
  i2c_to_wb_fsm
130
    i_i2c_to_wb_fsm
131
    (
132
      .i2c_data(gf_i2c_data_in),
133
      .i2c_data_rise(gf_i2c_data_in_rise),
134
      .i2c_data_fall(gf_i2c_data_in_fall),
135 5 qaztronic
 
136 3 qaztronic
      .i2c_clk(gf_i2c_clk_in),
137
      .i2c_clk_rise(gf_i2c_clk_in_rise),
138
      .i2c_clk_fall(gf_i2c_clk_in_fall),
139 5 qaztronic
 
140 4 qaztronic
      .i2c_r_w_bit(i2c_data_in_r[0]),
141
      .i2c_ack_out(i2c_ack_out),
142 3 qaztronic
      .i2c_ack_done(i2c_ack_done),
143 5 qaztronic
 
144 3 qaztronic
      .tip_addr_byte(tip_addr_byte),
145
      .tip_read_byte(tip_read_byte),
146
      .tip_write_byte(tip_write_byte),
147 5 qaztronic
      .tip_wr_ack(tip_wr_ack),
148
      .tip_rd_ack(tip_rd_ack),
149
      .tip_addr_ack(tip_addr_ack),
150
 
151 3 qaztronic
      .state_out(),
152 4 qaztronic
      .i2c_error(),
153 5 qaztronic
 
154 3 qaztronic
      .wb_clk_i(wb_clk_i),
155 5 qaztronic
      .wb_rst_i(wb_rst_i)
156 3 qaztronic
    );
157 4 qaztronic
 
158 5 qaztronic
 
159 4 qaztronic
  // --------------------------------------------------------------------
160
  //  i2c_to_wb_config
161
  i2c_to_wb_config
162
    i_i2c_to_wb_config
163
    (
164
      .i2c_byte_in(i2c_data_in_r[7:0]),
165
      .tip_addr_ack(tip_addr_ack),
166
      .i2c_ack_out(i2c_ack_out),
167 5 qaztronic
 
168 4 qaztronic
      .wb_clk_i(wb_clk_i),
169
      .wb_rst_i(wb_rst_i)
170
    );
171
 
172 5 qaztronic
 
173 2 qaztronic
  // --------------------------------------------------------------------
174 4 qaztronic
  //  i2c_to_wb_if
175 5 qaztronic
  i2c_to_wb_if #( .DW(DW), .AW(AW) )
176 4 qaztronic
    i_i2c_to_wb_if(
177
      .i2c_data(gf_i2c_data_in),
178 5 qaztronic
      .i2c_ack_done(i2c_ack_done),
179 4 qaztronic
      .i2c_byte_in(i2c_data_in_r[7:0]),
180
      .i2c_byte_out(i2c_byte_out),
181
      .i2c_parallel_load(i2c_parallel_load),
182 5 qaztronic
      .tip_wr_ack(tip_wr_ack),
183
      .tip_rd_ack(tip_rd_ack),
184
      .tip_addr_ack(tip_addr_ack),
185
 
186 4 qaztronic
      .wb_data_i(wb_data_i),
187
      .wb_data_o(wb_data_o),
188
      .wb_addr_o(wb_addr_o),
189
      .wb_sel_o(wb_sel_o),
190
      .wb_we_o(wb_we_o),
191
      .wb_cyc_o(wb_cyc_o),
192
      .wb_stb_o(wb_stb_o),
193
      .wb_ack_i(wb_ack_i),
194
      .wb_err_i(wb_err_i),
195
      .wb_rty_i(wb_rty_i),
196 5 qaztronic
 
197 4 qaztronic
      .wb_clk_i(wb_clk_i),
198
      .wb_rst_i(wb_rst_i)
199
    );
200 5 qaztronic
 
201
 
202 4 qaztronic
  // --------------------------------------------------------------------
203 3 qaztronic
  //  i2c_data out sync
204 5 qaztronic
 
205 3 qaztronic
  reg i2c_data_oe_r;
206 2 qaztronic
  always @(posedge wb_clk_i)
207
    if( wb_rst_i )
208 3 qaztronic
      i2c_data_oe_r <= 1'b0;
209
    else if( gf_i2c_clk_in_fall )
210
      i2c_data_oe_r <= tip_read_byte | tip_wr_ack;
211 5 qaztronic
 
212 3 qaztronic
  reg i2c_data_mux_select_r;
213
  always @(posedge wb_clk_i)
214
    if( gf_i2c_clk_in_fall )
215
      i2c_data_mux_select_r <= tip_wr_ack;
216 5 qaztronic
 
217
 
218 2 qaztronic
  // --------------------------------------------------------------------
219 5 qaztronic
  //  outputs
220
 
221 3 qaztronic
  assign i2c_data_out = i2c_data_mux_select_r ? i2c_ack_out : serial_out;
222
  assign i2c_data_oe  = i2c_data_oe_r;
223 2 qaztronic
  assign i2c_clk_out  = 1'b1;
224
  assign i2c_clk_oe   = 1'b0;
225 5 qaztronic
 
226 2 qaztronic
endmodule
227
 

powered by: WebSVN 2.1.0

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