module i2c_device_top(
    input CLK
,   input RST
,   input SDA_I
,   output SDA_O
,   input SCL

    // control outputs
    // Camera I2C commands
,   output [15:0] CAM_REG_ADDR
,   output [7:0] CAM_REG_VALUE
,   output CAM_REG_WRITE_START
,   input CAM_REG_WRITE_IN_PROGRESS

    // IR LED pulse control
,   output [15:0] PRE_PULSE_COUNT
,   output [15:0] PULSE_LENGTH_COUNT
,   output PRE_PULSE_UPDATE
,   output PULSE_LENGTH_UPDATE

,   input [13:0] I_LEFT_RUN
,   input [13:0] I_RIGHT_RUN
,   input [13:0] I_LEFT_IDLE
,   input [13:0] I_RIGHT_IDLE
,   input [7:0] I_ERRORS

// Current limits
,   output [15:0] RUN_CURRENT_LIMIT
,   output [15:0] IDLE_CURRENT_LIMIT

// Debugging stuff
,   input RESET_USB
);

wire [7:0] reg_addr;
wire [7:0] reg_new_val;
wire        reg_wr_en;
wire [7:0] reg_cur_val;

i2c_device u_i2c
(
    .clk(CLK)
,   .rst(RST)
,   .sda_i(SDA_I)
,   .sda_o(SDA_O)
,   .scl(SCL)
,   .reg_addr(reg_addr)
,   .reg_rx_data(reg_new_val)
,   .reg_wr_en(reg_wr_en)
,   .reg_tx_data(reg_cur_val)
);

i2c_system_control u_i2c_ctrl
(
    .CLK(CLK)
,   .RESET(RST)
,   .REG_ADDR(reg_addr)
,   .REG_NEW_VALUE(reg_new_val)
,   .REG_WR_EN(reg_wr_en)
,   .REG_CUR_VALUE(reg_cur_val)
,   .CAM_REG_ADDR(CAM_REG_ADDR)
,   .CAM_REG_VALUE(CAM_REG_VALUE)
,   .CAM_REG_WRITE_START(CAM_REG_WRITE_START)
,   .CAM_REG_WRITE_IN_PROGRESS(CAM_REG_WRITE_IN_PROGRESS)
,   .PRE_PULSE_COUNT(PRE_PULSE_COUNT)
,   .PULSE_LENGTH_COUNT(PULSE_LENGTH_COUNT)
,   .PRE_PULSE_UPDATE(PRE_PULSE_UPDATE)
,   .PULSE_LENGTH_UPDATE(PULSE_LENGTH_UPDATE)

,   .I_LEFT_RUN(I_LEFT_RUN)
,   .I_RIGHT_RUN(I_RIGHT_RUN)
,   .I_LEFT_IDLE(I_LEFT_IDLE)
,   .I_RIGHT_IDLE(I_RIGHT_IDLE)
,   .I_ERRORS(I_ERRORS)
,   .RUN_CURRENT_LIMIT(RUN_CURRENT_LIMIT)
,   .IDLE_CURRENT_LIMIT(IDLE_CURRENT_LIMIT)
,   .RESET_USB(RESET_USB)
);

endmodule
