`timescale 1ns/1ps

// 三通道图像合成一个RGB图像
module chanels_to_RGB #(
    parameter IN_DEPTH = 12,        // 输入图像的色深
    parameter OUT_DEPTH = 8         // 输出图像的色深
) (
    input clk,
    input reset,

    input in_en,
    input [IN_DEPTH - 1:0] data_in [2:0], // 0:R 1:G 2:B

    // 输出相关
    input data_que,                                 // 数据请求
    output out_en,
    output [3 * OUT_DEPTH - 1:0] data_out
);
    reg [31:0] data_cal [2:0]; // 用于保存运算结果，防止溢出
    reg fifo_en;
    reg [3 * OUT_DEPTH - 1:0] fifo_in; // 输入fifo中缓存
    wire fifo_empty;
    // wire fifo_alempty;

    always @(posedge clk or posedge reset) begin
        if (reset) begin
            // 初始化
            data_cal[0] <= 0;
            data_cal[1] <= 0;
            data_cal[2] <= 0;
            fifo_en <= 0;
            fifo_in <= 0;
        end
        else begin
            if (in_en) begin
                data_cal[0] <= data_in[0] * OUT_DEPTH / IN_DEPTH;
                data_cal[1] <= data_in[1] * OUT_DEPTH / IN_DEPTH;
                data_cal[2] <= data_in[2] * OUT_DEPTH / IN_DEPTH;

                fifo_in <= {data_cal[0][OUT_DEPTH - 1:0], data_cal[1][OUT_DEPTH - 1:0],data_cal[2][OUT_DEPTH - 1:0]};
                // data_out <= {data_cal[0][OUT_DEPTH - 1:0], data_cal[1][OUT_DEPTH - 1:0],data_cal[2][OUT_DEPTH - 1:0]};
            end
            fifo_en <= in_en;
        end
    end

    // 存在数据请求且FIFO不为空时，才发送数据
    assign out_en = (data_que && !fifo_empty) ? 1 : 0;

    async_fifo #(
        .DSIZE(3 * OUT_DEPTH),
        .ASIZE(128),
    ) RGB_FIFO (
        .wclk(clk),
        .rclk(clk),
        .wrst_n(reset),
        .rrst_n(reset),

        .winc(fifo_en),
        .wdata(fifo_in),
        /* verilator lint_off PINCONNECTEMPTY */
        .wfull(),
        /* verilator lint_off PINCONNECTEMPTY */
        .awfull(),
        
        /* verilator lint_off PINCONNECTEMPTY */
        .arempty(),
        .rempty(fifo_empty),
        .rdata(data_out),
        .rinc(out_en)
    );

endmodule
