2024-10-03 15:13:24 +08:00
|
|
|
|
`timescale 1ns / 1ps
|
|
|
|
|
|
2024-10-03 17:06:40 +08:00
|
|
|
|
module isp_Pipeline #(
|
2024-10-03 15:13:24 +08:00
|
|
|
|
parameter reg [15:0] IN_WIDTH = 1936,
|
|
|
|
|
parameter reg [15:0] IN_HEIGHT = 1088,
|
|
|
|
|
parameter OFFSET_X = 7,
|
|
|
|
|
parameter OFFSET_Y = 3,
|
|
|
|
|
parameter reg [15:0] OUT_WIDTH = 1920,
|
|
|
|
|
parameter reg [15:0] OUT_HEIGHT = 1080,
|
|
|
|
|
parameter reg [ 4:0] COLOR_DEPTH = 8, // Can't Change!!!
|
|
|
|
|
parameter reg [ 1:0] RAW_TYPE = 3 // 0:grbg 1:rggb 2:bggr 3:gbrg
|
|
|
|
|
) (
|
|
|
|
|
// 基本信号
|
|
|
|
|
input wire clk,
|
|
|
|
|
input wire reset,
|
|
|
|
|
|
|
|
|
|
// 数据线
|
|
|
|
|
input wire [15:0] in_data[3], // 数据输入线,0、1、2分别表示第一、二、三行
|
|
|
|
|
output wire [3 * COLOR_DEPTH - 1:0] out_data,
|
|
|
|
|
|
|
|
|
|
// 数据有效信号
|
|
|
|
|
input wire in_valid,
|
|
|
|
|
output wire out_valid,
|
|
|
|
|
|
|
|
|
|
// 准备信号
|
|
|
|
|
input wire in_ready,
|
|
|
|
|
output wire out_ready,
|
|
|
|
|
|
|
|
|
|
// 颜色校正,低八位为小数位,高八位为整数位
|
|
|
|
|
input wire [15:0] gain_red,
|
|
|
|
|
input wire [15:0] gain_green,
|
|
|
|
|
input wire [15:0] gain_blue,
|
|
|
|
|
input wire blender_enable // 是否启用颜色校正
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
wire [15:0] Demosaic2_data[3];
|
|
|
|
|
wire [15:0] Windows_data[9];
|
|
|
|
|
wire [COLOR_DEPTH - 1 : 0] Blender_data[3];
|
|
|
|
|
wire [COLOR_DEPTH - 1 : 0] Crop_data[3];
|
|
|
|
|
wire Windows_valid, Demosaic2_valid, Blender_valid, Crop_valid;
|
|
|
|
|
wire Windows_ready, Demosaic2_ready, Blender_ready, Crop_ready;
|
|
|
|
|
wire Demosaic2_hsync, Blender_hsync, Crop_hsync;
|
|
|
|
|
wire Demosaic2_fsync, Blender_fsync, Crop_fsync;
|
|
|
|
|
assign out_valid = Crop_valid;
|
|
|
|
|
assign out_ready = Windows_ready;
|
|
|
|
|
assign out_data = {Crop_data[2], Crop_data[1], Crop_data[0]};
|
|
|
|
|
|
|
|
|
|
Windows #(
|
|
|
|
|
.DATA_WIDTH(16)
|
|
|
|
|
) Windows_inst (
|
|
|
|
|
.clk (clk),
|
|
|
|
|
.reset (reset),
|
|
|
|
|
.in_data (in_data),
|
|
|
|
|
.out_data (Windows_data),
|
|
|
|
|
.in_valid (in_valid),
|
|
|
|
|
.out_valid(Windows_valid),
|
|
|
|
|
.in_ready (Demosaic2_ready),
|
|
|
|
|
.out_ready(Windows_ready)
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
2024-10-03 17:06:40 +08:00
|
|
|
|
Demosaic_Pipeline #(
|
2024-10-03 15:13:24 +08:00
|
|
|
|
.WINDOW_LENGTH(3),
|
|
|
|
|
.TOTAL_WIDTH (IN_WIDTH),
|
|
|
|
|
.TOTAL_HEIGHT (IN_HEIGHT),
|
|
|
|
|
.RAW_TYPE (RAW_TYPE),
|
|
|
|
|
.DATA_WIDTH (16)
|
|
|
|
|
) Demosaic2_inst (
|
|
|
|
|
.clk (clk),
|
|
|
|
|
.reset (reset),
|
|
|
|
|
.in_data (Windows_data),
|
|
|
|
|
.out_data (Demosaic2_data),
|
|
|
|
|
.in_valid (Windows_valid),
|
|
|
|
|
.out_valid(Demosaic2_valid),
|
|
|
|
|
.in_ready (Blender_ready),
|
|
|
|
|
.out_ready(Demosaic2_ready),
|
|
|
|
|
.out_hsync(Demosaic2_hsync),
|
|
|
|
|
.out_fsync(Demosaic2_fsync)
|
|
|
|
|
);
|
|
|
|
|
|
2024-10-03 17:06:40 +08:00
|
|
|
|
ColorBlender_Pipeline #(
|
2024-10-03 15:13:24 +08:00
|
|
|
|
.IN_DEPTH(12), // 输入图像的色深
|
|
|
|
|
.OUT_DEPTH(COLOR_DEPTH) // 输出图像的色深
|
|
|
|
|
) ColorBlender_inst (
|
|
|
|
|
.clk (clk),
|
|
|
|
|
.reset (reset),
|
|
|
|
|
.in_data (Demosaic2_data),
|
|
|
|
|
.out_data (Blender_data),
|
|
|
|
|
.in_valid (Demosaic2_valid),
|
|
|
|
|
.out_valid(Blender_valid),
|
|
|
|
|
.in_ready (Crop_ready),
|
|
|
|
|
.out_ready(Blender_ready),
|
|
|
|
|
.in_hsync (Demosaic2_hsync),
|
|
|
|
|
.in_fsync (Demosaic2_fsync),
|
|
|
|
|
.out_hsync(Blender_hsync),
|
|
|
|
|
.out_fsync(Blender_fsync),
|
|
|
|
|
|
|
|
|
|
.gain_red (gain_red),
|
|
|
|
|
.gain_green(gain_green),
|
|
|
|
|
.gain_blue (gain_blue),
|
|
|
|
|
.enable (blender_enable)
|
|
|
|
|
);
|
|
|
|
|
|
2024-10-03 17:06:40 +08:00
|
|
|
|
Crop_Pipeline #(
|
2024-10-03 15:13:24 +08:00
|
|
|
|
.IN_WIDTH (IN_WIDTH),
|
|
|
|
|
.IN_HEIGHT (IN_HEIGHT),
|
|
|
|
|
.OFFSET_X (OFFSET_X),
|
|
|
|
|
.OFFSET_Y (OFFSET_Y),
|
|
|
|
|
.OUT_WIDTH (OUT_WIDTH),
|
|
|
|
|
.OUT_HEIGHT (OUT_HEIGHT),
|
|
|
|
|
.COLOR_DEPTH(COLOR_DEPTH)
|
|
|
|
|
) Crop_inst (
|
|
|
|
|
.clk (clk),
|
|
|
|
|
.reset (reset),
|
|
|
|
|
.in_data (Blender_data),
|
|
|
|
|
.out_data (Crop_data),
|
|
|
|
|
.in_valid (Blender_valid),
|
|
|
|
|
.out_valid(Crop_valid),
|
|
|
|
|
.in_ready (in_ready),
|
|
|
|
|
.out_ready(Crop_ready),
|
|
|
|
|
.in_hsync (Blender_hsync),
|
|
|
|
|
.in_fsync (Blender_fsync),
|
|
|
|
|
.out_hsync(Crop_hsync),
|
|
|
|
|
.out_fsync(Crop_fsync)
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// reg [15:0] data_out_temp[8192];
|
|
|
|
|
// reg [31:0] now;
|
|
|
|
|
// reg [2:0] cnt_www;
|
|
|
|
|
// reg flag_ifdataerror;
|
|
|
|
|
|
|
|
|
|
// initial cnt_www = 0;
|
|
|
|
|
// always @(posedge reset) begin
|
|
|
|
|
// cnt_www <= cnt_www + 1;
|
|
|
|
|
// end
|
|
|
|
|
|
|
|
|
|
// integer i;
|
|
|
|
|
// always @(posedge clk) begin
|
|
|
|
|
// if(reset) begin
|
|
|
|
|
// flag_ifdataerror <= 0;
|
|
|
|
|
// if(cnt_www==1) for(i=0;i<8192;i=i+1) data_out_temp[i] <= 0;
|
|
|
|
|
// now <= 0;
|
|
|
|
|
// end else if(Crop_valid && in_ready)begin
|
|
|
|
|
// now <= now + 1;
|
|
|
|
|
// if(cnt_www==1)begin
|
|
|
|
|
// if(now<8192) data_out_temp[now] <= Crop_data[0];
|
|
|
|
|
// end else if(cnt_www==2)begin
|
|
|
|
|
// flag_ifdataerror <= (data_out_temp[now] != Crop_data[0]);
|
|
|
|
|
// end else flag_ifdataerror <= flag_ifdataerror;
|
|
|
|
|
// end
|
|
|
|
|
// end
|
|
|
|
|
|
|
|
|
|
endmodule
|