i2c passthru bridge from rpi to tuner
[trilby-hat-fpga] / i2c.v
1 `include "i2c_bridge.v"
2
3 module top(
4         input clk,
5
6         inout rtc_sda,
7         inout rtc_scl,
8
9         inout tuner_sda,
10         inout tuner_scl,
11
12         output green_led_d7,
13         output orange_led_d8,
14         output red_led_d5,
15         output yellow_led_d6
16 );
17
18         assign green_led_d7  = 1;
19         assign orange_led_d8 = 1;
20         assign red_led_d5    = 1;
21         assign yellow_led_d6 = 1;
22
23   localparam bridge_clk_div = 3; // div = 1+2^n, 24/(1+2^2)=4 MHz
24   reg [bridge_clk_div:0] bridge_cnt;
25   always @(posedge clk) // 24 MHz
26   begin
27     if(bridge_cnt[bridge_clk_div])
28       bridge_cnt <= 0;
29     else
30       bridge_cnt <= bridge_cnt + 1;
31   end
32   wire clk_bridge_en = bridge_cnt[bridge_clk_div];
33
34   wire [1:0] i2c_sda_i = {rtc_sda, tuner_sda};
35   wire [1:0] i2c_sda_t;
36   i2c_bridge i2c_sda_bridge_i
37   (
38     .clk(clk),
39     .clk_en(clk_bridge_en),
40     .i(i2c_sda_i),
41     .t(i2c_sda_t)
42   );
43   assign rtc_sda = i2c_sda_t[1] ? 1'bz : 1'b0;
44   assign tuner_sda = i2c_sda_t[0] ? 1'bz : 1'b0;
45
46   wire [1:0] i2c_scl_i = {rtc_scl, tuner_scl};
47   wire [1:0] i2c_scl_t;
48   i2c_bridge i2c_scl_bridge_i
49   (
50     .clk(clk),
51     .clk_en(clk_bridge_en),
52     .i(i2c_scl_i),
53     .t(i2c_scl_t)
54   );
55   assign rtc_scl = i2c_scl_t[1] ? 1'bz : 1'b0;
56   assign tuner_scl = i2c_scl_t[0] ? 1'bz : 1'b0;
57
58 endmodule