`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