module data_assemble #( parameter PIXEL_WIDTH = 8, // 单通道像素位宽 parameter GRAY_PIXEL_CNT = 32, // Gray模式:32个8bit→256bit parameter RGB_PIXEL_CNT = 8 // RGB模式:8个32bit(24bit数据+8bit补零)→256bit ) ( input wire clk, input wire rst_n, input wire en, // 拼接使能 input wire input_pixel_type, // 0=Gray,1=RGB input wire [PIXEL_WIDTH-1:0] ir_ch0, // CH0数据 input wire [PIXEL_WIDTH-1:0] ir_ch1, // CH1数据 input wire [PIXEL_WIDTH-1:0] ir_ch2, // CH2数据 input wire pixel_valid, // 像素有效 output reg done, // 拼接完成(256bit就绪) output reg [255:0] assembled_data // 拼接后256bit数据 ); // 内部信号 reg [4:0] gray_cnt; // Gray模式计数器(0~31) reg [2:0] rgb_cnt; // RGB模式计数器(0~7) reg [255:0] data_reg; // 拼接数据寄存器 reg sync_out,sync_out_r; // 拼接计数器复位逻辑 always @(posedge clk or negedge rst_n) begin if (!rst_n) begin gray_cnt <= 5'd0; rgb_cnt <= 3'd0; end else if (!en) begin gray_cnt <= 5'd0; rgb_cnt <= 3'd0; end else if (pixel_valid) begin case (input_pixel_type) 1'b0: begin // Gray模式 gray_cnt <= (gray_cnt == GRAY_PIXEL_CNT ) ? 5'd0 : gray_cnt + 5'd1; end 1'b1: begin // RGB模式 rgb_cnt <= (rgb_cnt == RGB_PIXEL_CNT ) ? 3'd0 : rgb_cnt + 3'd1; end endcase end end // 数据拼接逻辑 always @(posedge clk or negedge rst_n) begin if (!rst_n) begin data_reg <= 256'd0; assembled_data <= 256'd0; sync_out <= 'd0; sync_out_r <= 'd0; end else if (!en) begin sync_out <= 'd0; data_reg <= 256'd0; assembled_data <= 256'd0; done <= 'd0; end else if (pixel_valid) begin case (input_pixel_type) 1'b0: begin // Gray模式:32x8bit→256bit(高位到低位拼接) data_reg[(GRAY_PIXEL_CNT -1- gray_cnt) * PIXEL_WIDTH +: PIXEL_WIDTH] <= ir_ch0; // 计数器满:拼接完成,锁存数据 if (gray_cnt == GRAY_PIXEL_CNT -1 ) begin sync_out = 1'd1; //data_reg <= 256'd0; // 复位寄存器,准备下一轮 end end 1'b1: begin // RGB模式:8x32bit→256bit(32bit=8bit补零+CH2+CH1+CH0) reg [31:0] rgb_pixel; rgb_pixel = {8'd0, ir_ch2, ir_ch1, ir_ch0}; // 补零+三通道数据 data_reg[(RGB_PIXEL_CNT - 1 - rgb_cnt) * 32 +: 32] <= rgb_pixel; // 计数器满:拼接完成,锁存数据 if (gray_cnt == GRAY_PIXEL_CNT -1 ) begin sync_out = 1'd1; //data_reg <= 256'd0; // 复位寄存器,准备下一轮 end end endcase end end always @(posedge clk or negedge rst_n) begin if (!rst_n) begin sync_out_r <= 'd0; end else begin sync_out_r <= sync_out; end end always @(posedge clk or negedge rst_n) begin if (!rst_n) begin assembled_data <= 'd0; done <= 'd0; end else if (sync_out_r) begin assembled_data <= data_reg; done <= 1'b1; end end always @(posedge clk or negedge rst_n) begin if (done == 1'b1) begin done <= 'd0; end end endmodule