module full_top(
    input CLK,
    input RST,
    input SDA_I,
    output SDA_O,
    input SCL,

    output PWM,

    output cam_SCL,
    output cam_SDA,
    output cam_SDA_IOEN
);

wire [15:0] cam_reg_addr;
wire [7:0]  cam_reg_value;
wire        cam_reg_write_start;
wire        cam_write_in_progress;
wire [15:0] new_pwm_duty_cycle;
wire        pwm_update;

reg [15:0]  pwm_duty_cycle;

always @(posedge CLK or posedge RST) begin
    if(RST) 
        pwm_duty_cycle <= 16'd240; // 10% of 2400, 0.1 duty cycle
    else begin
        if(pwm_update)
            pwm_duty_cycle <= new_pwm_duty_cycle;
    end
end

i2c_device_top u_i2c_ctrl(
    .CLK(CLK),
    .RST(RST),
    .SDA_I(SDA_I),
    .SDA_O(SDA_O),
    .SCL(SCL),

    .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_write_in_progress),

    .PWM_DUTY_CYCLE(new_pwm_duty_cycle),
    .PWM_UPDATE(pwm_update)
);

oc0ta1b_controller u_i2c_cam(
    .clk(CLK),
    .rstn(~RST),
    .config_finished(),
    .sioc(cam_SCL),
    .siod(cam_SDA),
    .siod_ioen(cam_SDA_IOEN),
    .ovw_send(cam_reg_write_start),
    .ovw_reg_addr(cam_reg_addr),
    .ovw_reg_value(cam_reg_value),
    .ovw_busy(cam_write_in_progress)
);

pwm_generator u_pwm(
    .CLK(CLK),
    .RESET(RST),
    .DUTY_CYCLE(pwm_duty_cycle),
    .PWM(PWM)
);


endmodule
