fix DPC and reconstruct isp
This commit is contained in:
		@@ -1,4 +1,3 @@
 | 
			
		||||
`timescale 1ns/1ps
 | 
			
		||||
// 三通道图像合成一个RGB图像
 | 
			
		||||
module ColorBlender #(
 | 
			
		||||
    parameter reg [4:0] IN_DEPTH  = 12,  // 输入图像的色深
 | 
			
		||||
@@ -76,9 +75,9 @@ module ColorBlender #(
 | 
			
		||||
 | 
			
		||||
        CALC_DATA: begin
 | 
			
		||||
          if (enable) begin
 | 
			
		||||
            data_cal[0] <= (data_cal[0] * {16'b0, gain_red}) >> 16;
 | 
			
		||||
            data_cal[0] <= (data_cal[0] * {16'b0, gain_blue}) >> 16;
 | 
			
		||||
            data_cal[1] <= (data_cal[1] * {16'b0, gain_green}) >> 16;
 | 
			
		||||
            data_cal[2] <= (data_cal[2] * {16'b0, gain_blue}) >> 16;
 | 
			
		||||
            data_cal[2] <= (data_cal[2] * {16'b0, gain_red}) >> 16;
 | 
			
		||||
          end else begin
 | 
			
		||||
            data_cal[0] <= data_cal[0] >> 8;
 | 
			
		||||
            data_cal[1] <= data_cal[1] >> 8;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,37 +1,34 @@
 | 
			
		||||
`timescale 1ns / 1ps
 | 
			
		||||
 | 
			
		||||
// 三通道图像合成一个RGB图像
 | 
			
		||||
module ColorBlender_Pipeline #(
 | 
			
		||||
    parameter reg [4:0] DATA_WIDTH = 12,  // 输入图像的色深
 | 
			
		||||
    parameter reg [4:0] OUT_DEPTH = 8    // 输出图像的色深
 | 
			
		||||
    parameter reg [4:0] OUT_DEPTH  = 8    // 输出图像的色深
 | 
			
		||||
) (
 | 
			
		||||
    input wire clk,
 | 
			
		||||
    input wire reset,
 | 
			
		||||
 | 
			
		||||
    input wire [DATA_WIDTH - 1:0] in_data [3],
 | 
			
		||||
    output reg [OUT_DEPTH - 1:0] out_data [3],
 | 
			
		||||
    input wire [DATA_WIDTH - 1:0] in_data[3],
 | 
			
		||||
    input wire [7:0] in_user,
 | 
			
		||||
    output reg [OUT_DEPTH - 1:0] out_data[3],
 | 
			
		||||
    output wire [7:0] out_user,
 | 
			
		||||
 | 
			
		||||
    input wire in_valid,
 | 
			
		||||
    input  wire in_valid,
 | 
			
		||||
    output wire out_valid,
 | 
			
		||||
 | 
			
		||||
    input wire in_ready,
 | 
			
		||||
    input  wire in_ready,
 | 
			
		||||
    output wire out_ready,
 | 
			
		||||
 | 
			
		||||
    input wire in_hsync,
 | 
			
		||||
    input wire in_fsync,
 | 
			
		||||
 | 
			
		||||
    output wire out_hsync,
 | 
			
		||||
    output wire out_fsync,
 | 
			
		||||
 | 
			
		||||
    // 颜色校正
 | 
			
		||||
    input wire [15:0] gain_red,
 | 
			
		||||
    input wire [15:0] gain_green,
 | 
			
		||||
    input wire [15:0] gain_blue,
 | 
			
		||||
    input wire enable
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
  localparam PIPELINE = 4;
 | 
			
		||||
 | 
			
		||||
  reg [PIPELINE-1:0] pipeline_hsync, pipeline_fsync, pipeline_valid;
 | 
			
		||||
  reg [7:0] pipeline_user[PIPELINE];
 | 
			
		||||
 | 
			
		||||
  reg [PIPELINE-1:0] pipeline_valid;
 | 
			
		||||
  wire pipeline_flag;
 | 
			
		||||
  assign pipeline_flag = (pipeline_valid[PIPELINE-1] == 0) | (in_ready);
 | 
			
		||||
 | 
			
		||||
@@ -39,9 +36,7 @@ module ColorBlender_Pipeline #(
 | 
			
		||||
  assign out_ready = pipeline_flag;
 | 
			
		||||
  //out_valid :只要本模块有数据要发送就一直拉高
 | 
			
		||||
  assign out_valid = pipeline_valid[PIPELINE-1];
 | 
			
		||||
 | 
			
		||||
  assign out_hsync = pipeline_hsync[PIPELINE-1];
 | 
			
		||||
  assign out_fsync = pipeline_fsync[PIPELINE-1];
 | 
			
		||||
  assign out_user = pipeline_user[PIPELINE-1];
 | 
			
		||||
 | 
			
		||||
  reg [32 - 1:0] data_cal0[3];
 | 
			
		||||
  reg [32 - 1:0] data_cal1[3];
 | 
			
		||||
@@ -49,31 +44,30 @@ module ColorBlender_Pipeline #(
 | 
			
		||||
 | 
			
		||||
  integer i;
 | 
			
		||||
  always @(posedge clk) begin
 | 
			
		||||
    if(reset) begin
 | 
			
		||||
    if (reset) begin
 | 
			
		||||
      pipeline_valid <= 0;
 | 
			
		||||
      pipeline_hsync <= 0;
 | 
			
		||||
      pipeline_fsync <= 0;
 | 
			
		||||
      for(i=0;i<3;i=i+1) data_cal0[i] <= 0;
 | 
			
		||||
      for(i=0;i<3;i=i+1) data_cal1[i] <= 0;
 | 
			
		||||
      for(i=0;i<3;i=i+1) data_cal2[i] <= 0;
 | 
			
		||||
      for(i=0;i<3;i=i+1) out_data[i] <= 0;
 | 
			
		||||
    end else if(pipeline_flag) begin
 | 
			
		||||
      for (i = 0; i < 3; i = i + 1) data_cal0[i] <= 0;
 | 
			
		||||
      for (i = 0; i < 3; i = i + 1) data_cal1[i] <= 0;
 | 
			
		||||
      for (i = 0; i < 3; i = i + 1) data_cal2[i] <= 0;
 | 
			
		||||
      for (i = 0; i < 3; i = i + 1) out_data[i] <= 0;
 | 
			
		||||
      for (i = 0; i < PIPELINE; i = i + 1) pipeline_user[i] <= 0;
 | 
			
		||||
    end else if (pipeline_flag) begin
 | 
			
		||||
      /*************   流水    ************/
 | 
			
		||||
      pipeline_valid <= {pipeline_valid[PIPELINE-2:0], in_valid};
 | 
			
		||||
      pipeline_hsync <= {pipeline_hsync[PIPELINE-2:0], in_hsync};
 | 
			
		||||
      pipeline_fsync <= {pipeline_fsync[PIPELINE-2:0], in_fsync};
 | 
			
		||||
      /************* 1:计算1   ************/
 | 
			
		||||
      if(in_valid) begin 
 | 
			
		||||
      if (in_valid) begin
 | 
			
		||||
        pipeline_user[0] <= in_user;
 | 
			
		||||
        data_cal0[0] <= (in_data[0]) << (8 - (DATA_WIDTH - OUT_DEPTH));
 | 
			
		||||
        data_cal0[1] <= (in_data[1]) << (8 - (DATA_WIDTH - OUT_DEPTH));
 | 
			
		||||
        data_cal0[2] <= (in_data[2]) << (8 - (DATA_WIDTH - OUT_DEPTH));
 | 
			
		||||
      end
 | 
			
		||||
      /************* 2:计算2   ************/
 | 
			
		||||
      if(pipeline_valid[0]) begin 
 | 
			
		||||
        if(enable) begin
 | 
			
		||||
          data_cal1[0] <= (data_cal0[0] * {16'b0, gain_blue}) >> 16;
 | 
			
		||||
      if (pipeline_valid[0]) begin
 | 
			
		||||
        pipeline_user[1] <= pipeline_user[0];
 | 
			
		||||
        if (enable) begin
 | 
			
		||||
          data_cal1[0] <= (data_cal0[0] * {16'b0, gain_red}) >> 16;
 | 
			
		||||
          data_cal1[1] <= (data_cal0[1] * {16'b0, gain_green}) >> 16;
 | 
			
		||||
          data_cal1[2] <= (data_cal0[2] * {16'b0, gain_red}) >> 16;
 | 
			
		||||
          data_cal1[2] <= (data_cal0[2] * {16'b0, gain_blue}) >> 16;
 | 
			
		||||
        end else begin
 | 
			
		||||
          data_cal1[0] <= data_cal0[0] >> 8;
 | 
			
		||||
          data_cal1[1] <= data_cal0[1] >> 8;
 | 
			
		||||
@@ -81,13 +75,15 @@ module ColorBlender_Pipeline #(
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
      /************* 3:计算3   ************/
 | 
			
		||||
      if(pipeline_valid[1]) begin 
 | 
			
		||||
      if (pipeline_valid[1]) begin
 | 
			
		||||
        pipeline_user[2] <= pipeline_user[1];
 | 
			
		||||
        data_cal2[0] <= (|data_cal1[0][31 : OUT_DEPTH]) ? {32{1'b1}} : data_cal1[0];
 | 
			
		||||
        data_cal2[1] <= (|data_cal1[1][31 : OUT_DEPTH]) ? {32{1'b1}} : data_cal1[1];
 | 
			
		||||
        data_cal2[2] <= (|data_cal1[2][31 : OUT_DEPTH]) ? {32{1'b1}} : data_cal1[2];
 | 
			
		||||
      end
 | 
			
		||||
      /************* 4:发送结果  ************/
 | 
			
		||||
      if(pipeline_valid[2]) begin 
 | 
			
		||||
      if (pipeline_valid[2]) begin
 | 
			
		||||
        pipeline_user[3] <= pipeline_user[2];
 | 
			
		||||
        out_data[0] <= data_cal2[0][OUT_DEPTH-1:0];
 | 
			
		||||
        out_data[1] <= data_cal2[1][OUT_DEPTH-1:0];
 | 
			
		||||
        out_data[2] <= data_cal2[2][OUT_DEPTH-1:0];
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,3 @@
 | 
			
		||||
`timescale 1ns / 1ps
 | 
			
		||||
 | 
			
		||||
module GammaCorrection #(
 | 
			
		||||
    parameter reg [4:0] COLOR_DEPTH   = 8
 | 
			
		||||
  ) (
 | 
			
		||||
 
 | 
			
		||||
@@ -1,42 +1,91 @@
 | 
			
		||||
`timescale 1ns / 1ps
 | 
			
		||||
`include "common"
 | 
			
		||||
`include "vector"
 | 
			
		||||
`include "color"
 | 
			
		||||
 | 
			
		||||
module GammaCorrection_Pipeline
 | 
			
		||||
  import common::*;
 | 
			
		||||
#(
 | 
			
		||||
    parameter bit [4:0] COLOR_DEPTH = 8
 | 
			
		||||
    parameter uint COLOR_DEPTH = 8
 | 
			
		||||
) (
 | 
			
		||||
    input var clk,
 | 
			
		||||
    input var reset,
 | 
			
		||||
    input var rst,
 | 
			
		||||
 | 
			
		||||
    input var in_ready,
 | 
			
		||||
    input var in_valid,
 | 
			
		||||
    input var [COLOR_DEPTH - 1 : 0] in_data[3],
 | 
			
		||||
    input var i_ready,
 | 
			
		||||
    input var i_valid,
 | 
			
		||||
    input var [COLOR_DEPTH - 1 : 0] i_data[3],
 | 
			
		||||
 | 
			
		||||
    output var out_ready,
 | 
			
		||||
    output var out_valid,
 | 
			
		||||
    output var [COLOR_DEPTH - 1 : 0] out_data[3],
 | 
			
		||||
    output var o_ready,
 | 
			
		||||
    output var o_valid,
 | 
			
		||||
    output var [COLOR_DEPTH - 1 : 0] o_data[3],
 | 
			
		||||
 | 
			
		||||
    output var out_hsync,
 | 
			
		||||
    output var out_fsync,
 | 
			
		||||
    input var  i_hsync,
 | 
			
		||||
    input var  i_fsync,
 | 
			
		||||
    output var o_hsync,
 | 
			
		||||
    output var o_fsync,
 | 
			
		||||
 | 
			
		||||
    input var [7:0] in_Gtable[256],
 | 
			
		||||
    input var in_enable
 | 
			
		||||
    input var [COLOR_DEPTH - 1:0] i_Gtable[2 ** COLOR_DEPTH],
 | 
			
		||||
    input var i_enable
 | 
			
		||||
);
 | 
			
		||||
  Color color;
 | 
			
		||||
  // pipeline level
 | 
			
		||||
  localparam uint PIPELINELEVEL = 2;
 | 
			
		||||
 | 
			
		||||
  assign out_ready = in_ready;
 | 
			
		||||
  // Define Color
 | 
			
		||||
  `Typedef_Color(color_t, 8) color_t;
 | 
			
		||||
  `Typedef_Vector(Vector_Color, color_t, PIPELINELEVEL - 1, PIPELINELEVEL - 1) Vector_Color;
 | 
			
		||||
  Vector_Color color;
 | 
			
		||||
 | 
			
		||||
  // shift queue: horizon sync and flame sync
 | 
			
		||||
  `Typedef_Vector(Vector_Sync, bit, PIPELINELEVEL - 1, PIPELINELEVEL - 1) Vector_Sync;
 | 
			
		||||
  Vector_Sync hsync, fsync;
 | 
			
		||||
 | 
			
		||||
  always_ff @(posedge clock) begin : blockName
 | 
			
		||||
    if (reset) begin
 | 
			
		||||
      out_valid   <= 0;
 | 
			
		||||
      out_data[0] <= 0;
 | 
			
		||||
      out_data[1] <= 0;
 | 
			
		||||
      out_data[2] <= 0;
 | 
			
		||||
  // Pipeline status
 | 
			
		||||
  `Typedef_Vector(Vector_Pipe, bit, PIPELINELEVEL, PIPELINELEVEL) Vector_Pipe;
 | 
			
		||||
  Vector_Pipe pipeline_status;
 | 
			
		||||
 | 
			
		||||
  assign o_ready = i_ready;
 | 
			
		||||
 | 
			
		||||
  // Pipeline in: Read data
 | 
			
		||||
  always_ff @(posedge clk) begin : Pipeline_in
 | 
			
		||||
    if (rst) begin
 | 
			
		||||
      pipeline_status <= `Vector_Pipe::f_clearWith(0);
 | 
			
		||||
      hsync <= `Vector_Sync::f_clearWith(0);
 | 
			
		||||
      fsync <= `Vector_Sync::f_clearWith(0);
 | 
			
		||||
    end else begin
 | 
			
		||||
 | 
			
		||||
    end
 | 
			
		||||
      // read sync edge signal and push front
 | 
			
		||||
      hsync <= `Vector_Sync::f_pushFront(i_hsync, hsync);
 | 
			
		||||
      fsync <= `Vector_Sync::f_pushFront(i_fsync, fsync);
 | 
			
		||||
 | 
			
		||||
      // push front i_valid signal
 | 
			
		||||
      pipeline_status <= `Vector_Pipe::f_pushFront(i_valid, pipeline_status);
 | 
			
		||||
 | 
			
		||||
      // read color data
 | 
			
		||||
      if (i_valid) begin
 | 
			
		||||
        color <= `Vector_Color::f_pushFront(`color_t::f_fromRGB(i_data[2], i_data[1], i_data[0]), color);
 | 
			
		||||
      end else begin
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  // Pipeline 2: Send data
 | 
			
		||||
  always_ff @(posedge clk) begin : Pipeline_1
 | 
			
		||||
    if (rst) begin
 | 
			
		||||
      o_data  <= {0, 0, 0};
 | 
			
		||||
      o_hsync <= 0;
 | 
			
		||||
      o_fsync <= 0;
 | 
			
		||||
    end else begin
 | 
			
		||||
 | 
			
		||||
      // send the last sync signal from queue
 | 
			
		||||
      o_hsync <= `Vector_Sync::f_getBack(hsync);
 | 
			
		||||
      o_fsync <= `Vector_Sync::f_getBack(fsync);
 | 
			
		||||
 | 
			
		||||
      // read adjust data from gamma table
 | 
			
		||||
      // {o_data[2], o_data[1], o_data[0]} <= {
 | 
			
		||||
      //   i_Gtable[color.red], i_Gtable[color.green], i_Gtable[color.blue]
 | 
			
		||||
      // };
 | 
			
		||||
      o_valid <= 1;
 | 
			
		||||
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,3 @@
 | 
			
		||||
 | 
			
		||||
`timescale 1ns / 1ps
 | 
			
		||||
 | 
			
		||||
// 三通道图像合成一个RGB图像
 | 
			
		||||
module GreyWorld #(
 | 
			
		||||
    parameter reg [4:0] COLOR_DEPTH = 8,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,3 @@
 | 
			
		||||
`timescale 1ns / 1ps
 | 
			
		||||
 | 
			
		||||
module SaturationCorrection #(
 | 
			
		||||
    parameter reg [4:0] COLOR_DEPTH = 8
 | 
			
		||||
) (
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,3 @@
 | 
			
		||||
`timescale 1ns / 1ps
 | 
			
		||||
 | 
			
		||||
// 三通道图像合成一个RGB图像
 | 
			
		||||
module WhiteBalance #(
 | 
			
		||||
    parameter reg [4:0] IN_DEPTH = 12,  // 输入图像的色深
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user